Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 47

 
mytarmailS:

1) Да возможно вы правы, но эта сеть умеет сама обучаться как принимать решения, те это не обычная классификация без учителя, а значит можно в ней реализовать ту концепцию о которой я давно уже говорил - можно ее учить не стандартной целевой в виде бай-сел-бай или 00011101011, а более абстрактно например тупо поставить условия типа: Сеть! мне пофиг как ты там будешь торговать но я хочу чтоб твой заработок в день составлял не мение 1% просадке 0.5% и она сама будет искать правила , комбинации  для решения этой задачи. Если я где то тут не прав и наговорил ахинеи то поправьте меня для моего же блага )  

Точно, не подумал об этом, всё правильно. Тогда лучше дать нейронной сети условие на максимизацию sharpe ratio (или recovery factor), и сделать в R что-то вроде простого форекс тестера на реальных котировках для теста модели для оценки эволюции. Но чудо само по себе не произойдёт, проблема переобучения останется, нужно по прежнему делить данные на тренировочную и тестовые выборки, делать кроссвалидации для финальной оценки модели при эволюции. Как работать с sharpe ratio при кроссвалидации я придумать по быстрому не смог, по-моему тут не получится убрать рандомные бары в тестовую выборку, ведь важна будет не точность на каждом баре, а сама непрерывная торговля, со всеми просадками, спредами и комиссиями от каждой новой сделки. 

Alexey Burnakov:

Они там вроде пакет для R готовят. Надо взять на заметку. 

Пакет уже есть, только не знаю насколько процентов он готов, покачто на гитхабе. Вот более простой пример, продолжение статьи. Учат сеть извлекать корень.

http://gekkoquant.com/2016/07/17/rneat-square-root-neural-net-trained-using-augmenting-topologies-simple-example/

 

Дописал позже:

Сделал по примеру классификацию ирисов, код в атачменте (модель не смогла классификацию, я все классы заменил числами для регрессии, и результаты округлил к ближайшим числовым уровням. Наверное это можно было сделать как-то проще).
Для тренировки взял всего 50% данных, на валидации успех 95%, вполне хорошо. Судя по графику модель даже сама убрала первый предиктор.

Форекс сложнее ирисов :) , там результат будет гораздо хуже. 

Ещё заметил что в 3 и 4 частях статьи используются разные функции для обучения модели.
3 часть для моделирования каких-либо динамических процессов, например модель может наблюдать за форекс графиком, и открывать/закрывать сделки в реальном времени. 
4 часть - просто обучить модель на готовых примерах, и спрогнозировать результат

Файлы:
 
Dr.Trader:

1)   Точно, не подумал об этом, всё правильно. Тогда лучше дать нейронной сети условие на максимизацию sharpe ratio (или recovery factor), и сделать в R что-то вроде простого форекс тестера на реальных котировках

2)   Ещё заметил что в 3 и 4 частях статьи используются разные функции для обучения модели.
3 часть для моделирования каких-либо динамических процессов, например модель может наблюдать за форекс графиком, и открывать/закрывать сделки в реальном времени. 
4 часть - просто обучить модель на готовых примерах, и спрогнозировать результат

1) Абсолютно верно! именно это я и имел ввиду, прибыль/просадка просто для примера ,  я думал взять фактор восстановления,  но и шарп в принципе ничем не хуже

 

2) Правильно заметили, в 4 статье автор уже создал что то типа пакета при чем по всем стандартам "R" те максимально просто есть модель - есть целевой вектор - через "predict" прогноз   -   но именно этот подход нам и не подойдет потому что все функции уже скрыты в пакете...  Нужно разбираться с исходным кодом и писать все под себя, потому и говорил что помогите разобраться так как тут все гораздо сложнее чем с "готовым пакетом с примерами к нему"  Мне кажется что даже  функций из 3 части будет не достаточно для того что нам надо. Так что было бы просто сказочно если бы мы все включились в это дело

 
mytarmailS:

1) Абсолютно верно! именно это я и имел ввиду, прибыль/просадка просто для примера ,  я думал взять фактор восстановления,  но и шарп в принципе ничем не хуже

 

2) Правильно заметили, в 4 статье автор уже создал что то типа пакета при чем по всем стандартам "R" те максимально просто есть модель - есть целевой вектор - через "predict" прогноз   -   но именно этот подход нам и не подойдет потому что все функции уже скрыты в пакете...  Нужно разбираться с исходным кодом и писать все под себя, потому и говорил что помогите разобраться так как тут все гораздо сложнее чем с "готовым пакетом с примерами к нему"  Мне кажется что даже  функций из 3 части будет не достаточно для того что нам надо. Так что было бы просто сказочно если бы мы все включились в это дело

А кто вас научит кроме вас самих? Вот вы возьмитесь за исходный код . Поизучайте. А заодно про дифференцируемость функции. В сеть надо подать какую-то гладкую функцию. И нам расскажете ) а уж мы насоветуем.
 
Alexey Burnakov:
В сеть надо подать какую-то гладкую функцию. И нам расскажете ) а уж мы насоветуем.

Простите, что вмешиваюсь, но не только гладкую, но ещё и нормализованную.

Чтобы НС никогда не выходила за пределы известных ей областей.

Как-то так. 

 

Не могу понять, чего вцепились в эти сети?

Ведь вышли за рамки убогих пакетов на просторы R! Так нет, старые грехи тянут и тянут ... 

Возьмем к примеру caret. Там не только полторы сотни моделей, так еще куча полезных функций предварительной обработки,предсказания...

Так нет, сети и сети... 

 
СанСаныч Фоменко:

Не могу понять, чего вцепились в эти сети?

Ведь вышли за рамки убогих пакетов на просторы R! Так нет, старые грехи тянут и тянут ... 

Возьмем к примеру caret. Там не только полторы сотни моделей, так еще куча полезных функций предварительной обработки,предсказания...

Так нет, сети и сети... 

Так покажите же скорее ваш caret и полторы сотни моделей в деле! :) 

 
Vadim Shishkin:

Так покажите же скорее ваш caret и полторы сотни моделей в деле! :) 

Кстати, я сам юзаю caret и получаю удовлетворительные результаты на форексе.

Пример кода из моих экспериментов:

 

####
##########
############## start experiment
##########
####

library(caret)
library(gbm)
library(doParallel)

        
# tuning GBM - перебор параметров обучения по сетке
gbmGrid <- expand.grid(interaction.depth = seq(from = 3, to = 9, by = 2)
                  , n.trees = seq(from = 600, to = 1200, by = 300)
                  , shrinkage = seq(from = 0.01, to = 0.02, by = 0.005)
                  , n.minobsinnode = seq(from = 30, to = 60, by = 30))

######################
# start training cycle - ввод основных переменных и массива для результатов

validating_arr <- data.frame()
max_best_models <- 1
counter <- 1
max_inputs <- 15
max_cv_folds <- 5
max_bag_fract <- 1
distributions <- c('gaussian', 'laplace')
start <- Sys.time()
        
for (best_inp_num in seq(from = 3, to = max_inputs, by = 3)){
        
        for (cv_folds in 2:max_cv_folds){
                
                for (bag_frac in seq(from = 0.2, to = max_bag_fract, by = 0.2)){

#########################
# prepare training scheme - параметры caret
                                        gbmControl <- trainControl(method = 'cv'
                                                                      , number = cv_folds
                                                                      , verboseIter = F
                                                                      , returnData = F
                                                                      , returnResamp = 'all'
                                                                      , savePredictions = 'none'
                                                                      , summaryFunction = mymetrics
                                                                      , search = 'grid'
                                                                      , allowParallel = T)

########################
# initiate paralleling
                        cores <- 4 #detectCores()
                        cl <- makePSOCKcluster(cores)
                        registerDoParallel(cl)
                        
                        # train the model - обучение моделей с кроссвалидацией. Используется GBM.
                        best_models <- train(training[, ncol(training)] ~.
                                                , data = training[, 1:(ncol(training) - 1)]
                                                , method = 'gbm'
                                                , distribution = distributions[2]
                                                , bag.fraction = bag_frac
                                                , metric = 'mae_improve'
                                                , maximize = T
                                                , trControl = gbmControl
                                                , tuneGrid = gbmGrid)
                        
                        # stop paralleling
                        stopCluster(cl)
                        
                        # summarize the model - сохранение n лучших моделей
                        best_models_arr <- as.data.frame(cbind(best_models[[4]][1]
                                                                    , best_models[[4]][2]
                                                                    , best_models[[4]][3]
                                                                    , best_models[[4]][4]
                                                                    , best_models[[4]][5]
                                                                    , best_models[[4]][6]
                                                                    , best_models[[4]][7]
                                                                    , best_models[[4]][8]))
                        
                        rm(best_models)
                        
                        best_models_arr_ordered <- best_models_arr[order(best_models_arr$mae_improve, decreasing = T), ]

# далее - обучение лучших моделей и их валидация


 
Спасибо. :)
 
СанСаныч Фоменко:

Не могу понять, чего вцепились в эти сети?

Ведь вышли за рамки убогих пакетов на просторы R! Так нет, старые грехи тянут и тянут ... 

Возьмем к примеру caret. Там не только полторы сотни моделей, так еще куча полезных функций предварительной обработки,предсказания...

Так нет, сети и сети... 

Обычно библиотека может или очень много но средненько, или что-то одно и качественно. Caret это первый случай, с ней легко проверить в деле десятки моделей и сравнить результаты, но сложно что-то улучшить под свою задачу. Я упёрся в огромные сложности при отборе предикторов по моим правилам - caret умеет simulated annealing для их перебора (и генетику), но не умеет просто взять мою фитнесс функцию для оценки. Нужно создавать новую модель для caret с тренировочной, валидационной и фитнесс функциями; но caret при этом всё равно будет контролировать тренировочные и тестовые выборки данных по своим правилам, со своими кроссвалидациями.
Мне проще взять пакет GA или GenSA для перебора предикторов, и написать всего одну фитнесс-функцию в которой будет и создание модели, и кросс-валидация по нужным мне правилам.

Нейронка не хуже леса, у меня с ней результаты таки в плюсе, или в худшем случае просто без слива депозита. В силу разных алгоритмов, нейронка будет предпочитать другие предикторы чем лес, но все правила отбора предикторов полностью те же что и для леса.

Перенести нейронку в mt5 советник это дело на пару минут (сохранить веса из R в csv, прочитать их в советнике). Перенести лес в mt5 будет намного сложнее, поэтому я предпочитаю нейронку.

 

Ещё немного поэкспериментировал с RNeat, пришёл к выводу что с ней нельзя работать также как с обычными нейронными сетями.

1) в отличие от обычных моделей, обучение RNeat не использует исходные данные. Модель как-бы рандомно генерируется, улучшается, и только в конце тестируется на исходных данных. Обычно модели используют исходные данные, строят на них свою логику, а дальше на валидационной выборке можно узнать о том правильна ли логика модели, или она просто заучила исходные примеры. В отличие от остальных, RNeat вообще не способна запоминать исходные данные ибо она не знает о них, всё что модель знает это требуемые результаты и насколько она близка к ним.

2) кроссвалидация не поможет улучшить результаты фронттеста. Мы вроде все согласны что можно обучить обычную модель, провести пару кроссвалидаций, и как-то обработать ошибки на всех выборках для итоговой фитнесс оценки модели. Поскольку RNeat не знает исходных данных, для неё не важно в какой выборке находятся данные - тренировочной или тестовой, она будет подстраивать свою логику на нужный результат в любом случае. Теоретически она будет "обучаться" (точнее мутировать :) ) на всех выборках которые используются в фитнесс функции. Всё что можно - обучить модель до нужной точности, и надеяться что она не переобучилась, довольно рискованный подход для форекса. Кроссвалидацию можно использовать только после обучения, как финальную оценку возможного результата во фронттесте, и ни в коем случае не использовать эту валидационную выборку внутри фитнесс функции.

Причина обращения: