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

 
Mihail Marchukajtes:
Ну да, я лаги делал потому что в предыдущих версиях, они увеличивали обощающую способность, сейчас с усовершенствованием алгоритма перебора предиктов это думаю не требуется так что пробую тренировать без них. Смотрим, наблюдаем. Позже отпишусь о результате сегодняшнем...

Если фокус не получится, т.е. обобщающая способность без лагов не повысится, то скорее всего 13-я и 14-я версия - какое-то неуниверсальное направление, заточенное под узкий круг задач?

В таком случае придётся откатить GIT назад, чтобы двигать jPrediction другим, более универсальным путём.

Хотя есть и вторая гипотеза: наличие лагов в выборке - узкое и неуниверсальное направление, под которое были заточены предыдущие версии?

 
Yury Reshetov:

Если фокус не получится, т.е. обобщающая способность без лагов не повысится, то скорее всего 13-я и 14-я версия - какое-то неуниверсальное направление, заточенное под узкий круг задач?

В таком случае придётся откатить GIT назад, чтобы двигать jPrediction другим, более универсальным путём.

Хотя есть и вторая гипотеза: наличие лагов в выборке - узкое и неуниверсальное направление, под которое были заточены предыдущие версии?

Ну посмотрим что да как... как потренится сразуже отпишусь...
 
Dr.Trader:

Я здесь тогда отвечу.

#пара строк из той таблицы, не буду я всё текстом копировать, потом первая строка повторена ещё дважды
dat <- data.frame(cluster1=c(24,2,13,23,6), cluster2=c(5,15,13,28,12), cluster3=c(18,12,16,22,20), cluster4=c(21,7,29,10,25), cluster5=c(16,22,24,4,11), target.label=c(1,1,0,1,0))
dat <- rbind(dat, dat[1,], dat[1,])
#результат последней строки поменян на 0 для эксперимента
dat[7,"target.label"]=0

library(sqldf)
#для sqldf точек в названиях колонок быть не должно
colnames(dat)[6] <- "target"

dat1 <- sqldf( "select cluster1, cluster2, cluster3, cluster4, cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1, cluster2, cluster3, cluster4, cluster5" )
dat1
dat1[ dat1$target_count>=10 & dat1$target_avg>0.63 , ]
dat1[ dat1$target_count>=10 & ( dat1$target_avg<0.37 | dat1$target_avg>0.63 ), ] #на случай если оба "0" или "1" встречаются чаще 70%

Спасибо, очень компактное решение!!

Помогите пожалуйста еще с одним нюансом в строке


dat1 <- sqldf( "select cluster1, cluster2, cluster3, cluster4, cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1, cluster2, cluster3, cluster4, cluster5" )

 как мне выделительные названия кластеров заменить одной переменной скажем  

colnames_dat <- colnamed(dat) [-"target"]
dat1 <- sqldf( "select colnames_dat, avg(target) as target_avg, count(target) as target_count from dat group by colnames_dat" )

потому что кластеров в реале будет и 500 и может даже 1000, каждое имя кластера писать вручную будет нереально, а в лоб решение не работает
 

 
Mihail Marchukajtes:
Ну посмотрим что да как... как потренится сразуже отпишусь...

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

В 14-й версии вероятность обработки для всех предикторов примерно одинакова. Но это создаёт другую проблему. Ведь алгоритм подбора предикторов работает по методу градиентного поиска, каждый раз смещаясь на один шаг в сторону увеличения обобщающей способности. При этом у него имеется ненулевой риск "застрять" на локальном экстремуме, как и у других градиентных методов. До 12-й версии этот риск уменьшался за счёт предварительного ранжирования предикторов в выборке.

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

 
mytarmailS:

> clusternames <- paste(colnames(dat)[-ncol(dat)], collapse=",")
>
clusternames
[1] "cluster1,cluster2,cluster3,cluster4,cluster5"
> sql_query <- paste0("select ", clusternames, ", avg(target) as target_avg, count(target) as target_count from dat group by ", clusternames)
>
sql_query
[1] "select cluster1,cluster2,cluster3,cluster4,cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1,cluster2,cluster3,cluster4,cluster5"
> dat1 <- sqldf( sql_query )
>
dat1

 
Yury Reshetov:

чтобы "перепрыгивать" через "овраги".

Иногда в нейронки встраивают L-BFGS оптимизацию, она позволяет вылезать из оврагов. Пакет нейронки nnet например.

Там много математики, я хз как оно работает, но суть в том чтоб спускаться не по градиенту, а по градиенту от градиента (производная от производной).

 
Vizard_:
1) Правильно понял и примитивный пример(если сети или пр. негде взять, то она начинает "придумывать")))
2)  Только накуя искать 70%, когда мона найти и юзать 100(не для цены разумеется).

1)  ну да, ну да, есть у них такой грешок )) я это описал в пунктах про плюсы "моего" подхода

2)  я буду искать комбинации на развороты, те не просто направление или цвет свечи а  - разворот вверх, разворот вниз, не разворот

Те у меня изначально будет намного меньше нужных мне наблюдений, но если все сработает то я буду рад и 40% срабатываний, даже 70% не надо так как при такой целевой риск прибыль будет от 1 к 5 

Dr.Trader:

 Спасибо большое, буду потихоньку подготавливать данные, потом кластеризировать, потом искать паттерны, о результатах сообщу

 
Dr.Trader:

Иногда в нейронки встраивают L-BFGS оптимизацию, она позволяет вылезать из оврагов. Пакет нейронки nnet например.

BFGS и производные от него, такие как L-BFGS, предназначены для решения той задачи, которая в jPrediction уже решена, а именно для нахождения локальных экстремумов. Т.е. эти алгоритмы позволяют "вылазить" из "оврагов" в направлении ближайших экстремумов, а не "перепрыгивать" через овраги, с целью поискать альтернативные экстремумы.

Нужны алгоритмы "прыгуны". И желательно чтобы они "прыгали" не рандомно, а в какую-то потенциально перспективную сторону. Теоретически это можно реализовать через генетику, там подобные "прыжки" осуществляются посредством мутаций. Но генетические алгоритмы шибко медленные и больше подходят для тех задач, где потенциальных потомков можно протестировать на вшивость с минимальными временными затратами. Обучение нейронки для вычисления её обобщающей способности требует много времени, потому генетика здесь будет слишком тормозной.

Ладно, за неимением лучшего, в данный момент тестирую вариант с рандомными "прыжками".

 

Еще одна книга по R. Прицеплю здесь, так как не понятно куда еще можно.  Пусть будет

С.Э. Мастицкий, В.К. Шитиков

СТАТИСТИЧЕСКИЙ АНАЛИЗ И ВИЗУАЛИЗАЦИЯ ДАННЫХ С ПОМОЩЬЮ R 

Файлы:
 

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

Грубо говоря, чтоб конкретное окно с новыми данными попало в какой-то найденный ранее паттерн, оно должно попасть в такие вериткальные ограничители, присущие каждому паттерну. 

Если взять и найти 1000 паттернов, то ширина "канала" у каждого из них будет небольшой. А поскольку новые данные всегда немного отличаются от тренировочных - попасть в такой узкий канал будет сложно, это приведёт к ошибкам. 

Я бы руководствовался бритой Оккама - если можно уменьшить число паттернов и получить тот-же результат без ухудшений, то лучше таки уменьшить. 

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