tnn

Tensorflow Neural Network Framework for Algorithmic Traders


Keywords
neural, network, tensorflow, algorithmic, trading, stock, exchange
License
MIT
Install
pip install tnn==0.0.4

Documentation

TNN: Trading with Neural Networks. A Framework for Algorithmic Traders

version 0.0.4

Important notice: Nothing important yet... :)

CONTENTS / СОДЕРЖАНИЕ

Network - The constructor / Конструктор.
learn - Обучение, тестирование и созранение параметров сети.
calcOutput - Рассчитывает ответ сети на заданный "инпут".
loadNetwork - Загружает сеть, ранее сохраненную функцией learn
prepareData - Пересчитывает котировки в "инпуты" и "аутпуты" сети.
Related documents: CalcData Class library, Historic Rates Format
Functions

Network

The constructor creates a Network object. / Конструктор, создает объект Network. Модуль: tnn.network (для использования небходимо: from tnn.network import Network).

Network(numLayers=1, numNodes=[10], numFeatures=10, numLabels=2, stdDev=0.03, activationFuncs=None )
numLayers (integer, default:1) - Число hidden-слоев сети
numNodes (list of integers, default:[10]) - Число узлов в каждом слое
numFeatures (integer, default:10) - Размерность "инпутов" 
    (x, они же "samples", в каждом sample присутствует numFeatures значений).
numLabels (integer, default:2) - Размерность "аутпутов" 
    (y, они же "labels").
stdDev (float, default:0.03) - Стандартное отклонение для первичной генерации весов сети.  
activationFuncs (list, default:None) - функции активации, размерность numLayers+1 
    (число hidden-слоев + 1). 
    Если activationFuncs is None, то активация hidden-слоев будет осуществляться 
    через relu, а output-слоя - через softmax.
    Если не "None", то элемент списка может быть:
    1) строкой: "relu", "sigmoid", "softmax";
    2) непосредственно функцией активации.
weights (list of 2d numpy arrays, default:None) - список, состоящий из двумерных матриц, 
    хранящих весовые коэффициенты слоев сети. Если weights==None, весовые коэффициенты 
    будут сгенерированы автоматически.
bs (list of 1d numpy arrays, default:None) - список, состоящий из векторов, 
    хранящих весовые bias-коэффициенты (свободные члены) сети. 
    Если bs is None, коэффициенты будут сгенерированы автоматически.

Returns (float) - the Network object. / Возвращает - объект Network

See the sample code here / Пример кода см. здесь

learn

The method of the Network object. Provides the whole cycle of network learning. / Метод объекта Network. Обучает сеть. Модуль: tnn.network (для использования необходимо: from tnn.network import Network).

learn( x, y, profit=None, xTest=None, yTest=None, 
    profitTest=None, shortTradesHaveNegativeProfit=True, 
    learningRate=0.05, balancer=0.0, autoBalancers=False, optimizer=None, numBatches=1, 
    tradingLabel=None, prognoseProb=None, 
    numEpochs=1000, summaryDir=None, printRate=20, learnIndicators=False, 
    saveRate=None, saveDir=None )
x (2d numpy array, np.float64) - "инпуты" (samples) для обучения сети,  
    размерность numSamples x numFeatures -> в placeholder self.x
y (2d numpy array, np.float64) - "аутпуты" (labels) для обучения сети,   
    размерность numSamples x numLabels -> в placeholder self.y  
profit (1d numpy array, np.float64, default: None) - значения прибыли (убытка) по каждому sample,   
    размерность: numSamples (как у x и y по оси 0).    
xTest (2d numpy array, np.float64, default:None) - "инпуты" (samples) для тестирования сети,   
    размерность: numSamples x numFeatures.  
yTest (2d numpy array, np.float64, default:None) - "аутпуты" (labels) для тестирования сети,  
    размерность: numSamples x numLabels.  
profitTest (1d numpy array, np.float64, default: None) - значения прибыли (убытка) по 
    каждому sample, размерность: numSamples (как у xTest и yTest по оси 0).  
shortTradesHaveNegativeProfit (boolean, default:True) - указывает на знак величин     
    в массивах profit и profitTest. Если True, то прибыль по сделкам SHORT     
    должна быть задана в этих массивах отрицательным числом, а если False - то положительным.    
learningRate (float, default:0.05) - self explained   
numEpochs (int, defaul:1000) - self explained  
balancer (float, default:0.0) - Если balancer > 0.0, то при вычислении   
    cost-функции совпадение/несовпадение по "ТОРГОВОМУ" бину (см. параметр tradingLabel)   
    получит весовой коэффициент (1.0+balancer),в то время как по остальным бинам   
    коэффициент будет 1.0.
   Если balancer == 0.0, при рассчете cost-функции совпадения/несовпадения по всем бинам   
    учитываются одинаково.  
autoBalancers (boolean, default:False) - Если autoBalancers==True, то при вычислении сost-функции
    диспропорции по количеству примеров для каждого label (imbalances) уравновешиваются
    с помощью автоматически рассчитываемых коэффициентов. 
optimizer (string или object, default:None) - способ оптимизации.   
    Если optimizer=None, то используется GradientDescentOptimizer.   
    Если optimizer is not None, то способ оптимизации может быть задан:  
    1) строкой (возможные варианты: "GradientDescent", "Adadelta", "Adagrad",   
        "Adam", "Ftrl", "RMSProp" и т.д.)  
    2) напрямую объектом, например: tf.train.GradientDescentOptimizer(learning_rate=0.01)  
numBatches (int, default:1) - число "пакетов" на которое надо разбить обучающую выборку 
    (test samples), чтобы внутри эпохи обучать сеть поэтапно - пакет за пакетом.
    Если numBatches==1 разбиения на пакеты не просиходит.
tradingLabel (int, default:None) - Указывает какой бин (label) является т.н. "торговым"   
    (по которому сеть дает сигнал на сделку).   
    Используется при подсчете доходности, а также при рассчете cost-функции   
    (см. параметр balancer). Если tradingLabel is None, по умолчанию считается,   
    что "торговый" бин - последний.  
flipOverTrading (boolean, default:False) - Если flipOverTrading==True, моделируется   
    торговля 0-м (SHORT) и (numLabels-1)-м (LONG) бинами, причем позиция никогда не   
    закрывается, а либо сохраняется (при поступлении повторного сигнала или отсутствии сигнала)   
    либо меняется на противоположную (при поступлении сигнала противоположного   
    открытой в данный момент позиции).   
prognoseProb (float, default:None) - пороговое значение оценки вероятности.  
    При превышении этого значения "аутпутом" (y) в "торгующем" бине мы считаем,   
    что сеть дает сигнал на сделку.   
    Если prognoseProb==None, по сигнал на сделку дается, если значение "аутпута"     
    в "торгующеи" бине больше, чем значения в остальных бинах.   
summaryDir (string, default:None) - папка, куда tensorflow пишет summary ("отчет").   
    Если summaryDir is None, отчеты записываться не будут.  
    Если summaryDir=="", то имя папки будет сгенерировано автоматически из текущих даты и   
    времени (только числа, без других знаков).  
printRate (int, default:20) - частота, с которой во время обучения на терминал выводятся     
    параметры обучения и тестирования сети (значение cost-функции, точность и др.).   
    Если printRate is None, то вывода параметров не будет  
learnIndicators (boolean, default:False) - если learnIndicators==True, для каждой эпохи в   
    процессе обучения будут записываться пары значений (для train и test данных):   
    - cost-функция на train'е vs cost-функция на train (self.costTrain и self.costTest)  
    - точность на train'е vs точность на test'е (self.accuracyTrain и self.accuracyTest)  
    - "торговая" точность на train'е vs точность на test'е, то есть точность, рассчитанная   
      только по "торговым" бинам: <число прибыльных позиций>/<число открытых позиций>   
      (self.tradeAccuracyTrain и self.tradeAccuracyTest).     
    - доходность на train'е vs доходность на test'е (self.profitTrain и self.profitTest).   
    По этим парам значений можно будет построить регрессионную зависимость.  
saveRate (integer, default:None) - задает как часто надо сохранять сеть (веса сети) в   
    процессе обучения. Сеть сохраняется в папку saveDir (см. ниже) в файл, имя которого   
    состоит из номера эпохи и текущих значений параметров оптимизации:    
    cost-функции (см. переменную cost в теле функции),    
    точности модели (см. переменную accuracy) и прибыльности (см. переменную profit).    
    Если saveRate is None, сеть не сохраняется.      
    Сохраненную сеть можно позже прочитать функцией loadNetwork (см.).  
saveDir (string, default:None) - задает имя папки, в которую будет сохранен   
    файл с сетью (весами сети). Если saveDir is None, имя папки будет сгенерировано   
    на основе текущих даты и времени.  

Returns - Nothing. / Возвращает - ничего.

See the sample code here / Пример кода см. здесь

calcOutput

Calculates the output of the Network. / Вычисляет "аутпут" (ответ) сети.
Модуль: tnn.network (для использования необходимо: from tnn.network import Network).

*calcOutput*( x )
x (1d numpy array, np.float) - "инпут", размерность: numFeatures [x0,x1,...,xn] 
(это число задается при создании сети - см. конструктор)

Returns a 1d numpy array of length 'numLabels' (the value previously passed to the constructor).
Возвращает 1d numpy array размерностью 'numLables' (число numLabels задается при создании сети - см. конструктор Network)

See the sample code here / Пример кода см. здесь

loadNetwork

Loads network from file 'fileName'. / Загружает сеть из файла 'fileName'.
Модуль: tnn.io (для использования необходимо: from tnn.io import loadNetwork).

*loadNetwork*( fileName )
fileName (string) - Файл, в котором хранятся веса и функции активации сети.
Файл должен был быть предварительно сохранен в процессе обучения сети, для чего
при вызове функции learn() параметру saveRate должно было быть присвоено 
значение, отличное от 'None' или '0'

См. также: функцию learn().

Returns the Network object or 'None' if fails.  
Возвращает объект Network в случае успеха и 'None' в случае ошибки.

See the sample code here / Пример кода см. здесь

prepareData

Prepares data for network training and testing. / Готовит данные для обучения и тестирования сети. Модуль: tnn.io (для использования необходимо: from tnn.io import prepareData)

prepareData( fileWithRates=None, rates=None, normalize=True, detachTest=20, 
    calcData=None, precalcData=None )

Пример:
    trainData, testData = prepareData( "RTS_1D.csv", detachTest=20 )
	fileWithRates (string) - файл с котировками в формате finam. 
		Если указать fileWithRates==None, котировки можно передать 
        через параметр "rates" (см. ниже).
    rates (dict, default:None) - словарь с массивами котировок.
        Если указан fileWithRates, значение этого параметра игнорируется. 
        Формат котировок должен быть такой же, какой возвращает функция taft.readFinam: 
            rates['op'] (numpy array) - цены open,  
            rates['hi'] (numpy array) - цены high, 
            rates['lo'] (numpy array) - цены low, 
            rates['cl'] (numpy array) - цены close, 
            rates['vol'] (numpy array) - объемы.
            0-й индекс вышеуказанных массивов соответствует последним 
            по времени поступления данным.
    normalize (boolean, default:True) - Если normalize==True, данные будут нормализованы.
    detachTest (int, default:20) - Указывает, какой процент последних по времени поступения 
        котировок будет преобразован в отдельный блок данных для тестирования сети.
    calcData (function, defalut:None) - Функция, которая берет на входе котировки и 
        выдает "инпуты" (inputs), "аутпуты" (labels) и доходность (profit);
        эти данные будут использованы для обучения и тестирования сети.
        Функция запускается для каждой точки временного ряда (для каждого индекса
        массивов, в которых хранятся данные временного ряда). 
        Если указать None, все данные будут сгенерированы встроенной функцией.
        Функция должны быть определена так:
        def myCalcData( pastRates, futureRates ): где 
            "pastRates" - словарь с котировками для рассчета "инпутов" (формат см. выше).
                0-й индекс массивов словаря соответствует "текущему моменту" - точке 
                временного ряда, для которой мы считаем "инпуты". 
                Самая последняя по времени поступления котировка - это rates['cl'][0].
                По мере увеличения индекса мы двигаемся "назад" во времени. 
            "futureRates" - словарь с котировками для рассчета "аутпутов" (labels) и 
                доходности (формат см. выше); 
                По мере увеличения индекса мы двигаемся "вперед" во времени.
                Ближайшая к нам котировка, таким образом, это futureRates['op'][0] 
                (цена открытия ближайшего периода).
        Функция должна вернуть массив (список) "инпутов", а также
        массив (список) "аутпутов" в формате "one-hot" (один элемент равен 1, остальные 0) и 
        float переменную, которая хранит доходность потенциальной сделки, открытой в 
        данной точке временного ряда, например:
        return [0.2234, 0.43234,..., 0.9934], [0,0,1], 525.2
        Если аутпуты подсчитать не удается, функция должна вернуть "None, None, None" или просто "None".

Другой вариант использования параметра calcData - через этот параметр можно передать объект CalcData

    precalcData (function, defalut:None) - Функция, которая будет вызвана один раз перед тем как 
        prepareData в цикле начнет формировать данные для каждой точки временного ряда.
        Своим единственным параметром precalcData должна иметь котировки (формат 
        тот же, что и у параметра pastRates, см. выше). Функция precalcData может быть
        использована в паре с пользовательской функцией calcData, например, для предварительного
        подсчета статистических характеристик временного ряда.

Пример реализации встроенной функции calcData() см. здесь

	Функция prepareData возвращает две переменные (обе словари): trainData и testData. 
    Если detachTest is None, testData не создается и функция должна вернуть "None".
	Формат обеих переменных следующий:
		data['numSamples'] - число примеров, на которых мы обучаем или тестируем,
            равное размерности массивов data['inputs'] и data['labels'] (см. ниже) 
            по оси 0.
		data['numFeatures'] - число переменных, которые "принимает в расчет" сеть,
            равное размерности массива data['inputs'] (см. ниже) по оси 1.
		data['numLabels'] - число "бинов" (классов или labels), которые распознает сеть.
		data['inputs'] - "инпуты" (numpy array, np.float64), на которых обучается или
            тестируется сеть; размерность: data['numSamples'] x data['NumFeatures'].
		data['labels'] - "аутпуты" (numpy array, np.float64), то есть 
            "правильные" ответы сети в формате "one-hot"; 
            размерность: data['numSamples'] x data['numLabels'].
		data['profit'] - доходность по потенциальным сделкам (numpy array, np.float64);
            размерность: data['numSamples'].
			Примечание: для 0-го бина, соответствующего сделкам SHORT, значения доходности 
            обычно надо делать отрицательной величиной.
			Положительные значения доходности по SHORT следует присваивать только, если 
            сеть будет "эксклюзивно" обучаться на 0-й бин (label), причем в этом случае 
            в функцию learn надо передать параметр shortTradesHaveNegativeProfit=False.
		data['mean'] -  среднее, вычисленное для нормализации значений (numpy array);
            размерность: data['numFeatures'].
		data['std'] - СКО, вычисленное для нормализации значений (numpy array);
            размерность: data['numFeatures'].

    precalcData (function, defalut:None) - Функция, которая берет на входе котировки 
        (формат описан выше - он такой же, как и для функции calcData) и
        делает предварительную обработку данных, по которым затем будут рассчитаны
        данные для обучения сети. Например, с помощью этой функции можно рассчитать 
        среднее движение цен за определенный период, а потом использовать эту величину 
        при разделении "аутпутов" на классы (labels).

[See the sample code here / Пример кода см. здесь](samples/sample.py) 


## data_handler.InputsShape

A container class for a schema used to generate network inputs from raw data

def init(self, indicators, history, num_cand_inds):

    indicators - List of values to be included into the inputs, in order. Example: ["<OPEN>", "<CLOSE>", "<RSI>"]
    Full list of possible values: "<OPEN>", "<CLOSE>", "<HIGH>", "<LOW>", "<VOL>", "RETURN", "ADX","ATR","BOLLINGER","CCI","EMA","RSI","SMA"
    history - how many candles back are used.
    num_cand_inds - how many candles are used to calculate indicators

def num_inputs(self):

    returns the total size of one input. For example, with indicators = ["<OPEN>", "<CLOSE>", "<RSI>"], and history=6, num_inputs would equal 18.

## data_hander.RawData

A class to read data from Finam files and convert it into network-compatible form


def init(self, filename):

    filename - path to the finam data file
    

def form_inputs(self, inputs_shape):

    inputs_shape - a data_handler.InputsShape object
    Returns an array of numpy.arrays, each corresponding to an input, latest to earliest
    

def normalize_inputs(self, norm=None, std=None):

    If previously formed inputs, will return the normalized version. If norm and std are not provided, they will be automatically calculated
    

def dump_to_file(self, filename):

    Wrties the inputs into a shelve file