Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 195
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну да, я лаги делал потому что в предыдущих версиях, они увеличивали обощающую способность, сейчас с усовершенствованием алгоритма перебора предиктов это думаю не требуется так что пробую тренировать без них. Смотрим, наблюдаем. Позже отпишусь о результате сегодняшнем...
Если фокус не получится, т.е. обобщающая способность без лагов не повысится, то скорее всего 13-я и 14-я версия - какое-то неуниверсальное направление, заточенное под узкий круг задач?
В таком случае придётся откатить GIT назад, чтобы двигать jPrediction другим, более универсальным путём.
Хотя есть и вторая гипотеза: наличие лагов в выборке - узкое и неуниверсальное направление, под которое были заточены предыдущие версии?
Если фокус не получится, т.е. обобщающая способность без лагов не повысится, то скорее всего 13-я и 14-я версия - какое-то неуниверсальное направление, заточенное под узкий круг задач?
В таком случае придётся откатить GIT назад, чтобы двигать jPrediction другим, более универсальным путём.
Хотя есть и вторая гипотеза: наличие лагов в выборке - узкое и неуниверсальное направление, под которое были заточены предыдущие версии?
Я здесь тогда отвечу.
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" )
как мне выделительные названия кластеров заменить одной переменной скажем
потому что кластеров в реале будет и 500 и может даже 1000, каждое имя кластера писать вручную будет нереально, а в лоб решение не работает
Ну посмотрим что да как... как потренится сразуже отпишусь...
Суть в том, что до 13-й версии те предикторы, которые были ближе к началу выборки обрабатывались с большей вероятностью. А те что находились в конце выборки (ближе к целевой переменной) с меньшей. Т.е. если наиболее значимые предикторы заранее разместить в выборке левее, а наименее значимые правее, то получим хорошую обобщающую способность. А если наоборот, то плохую. Проблема заключалась в том, что для этого надо было заранее знать, какие предикторы наиболее значимы, т.е. предварительно отранжировать их в выборке по значимости. Но в таком случае, сам алгоритм подбора предикторов становился не слишком эффективным.
В 14-й версии вероятность обработки для всех предикторов примерно одинакова. Но это создаёт другую проблему. Ведь алгоритм подбора предикторов работает по методу градиентного поиска, каждый раз смещаясь на один шаг в сторону увеличения обобщающей способности. При этом у него имеется ненулевой риск "застрять" на локальном экстремуме, как и у других градиентных методов. До 12-й версии этот риск уменьшался за счёт предварительного ранжирования предикторов в выборке.
В общем, проблемы имеют место и в первом и во втором варианте алгоритма и надо их как-то проанализировать, дабы устранить. Например, ввести в алгоритм какие-нибудь рандомные скачки на несколько шагов в разные стороны от текущего состояния, чтобы "перепрыгивать" через "овраги".
> 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
чтобы "перепрыгивать" через "овраги".
Иногда в нейронки встраивают L-BFGS оптимизацию, она позволяет вылезать из оврагов. Пакет нейронки nnet например.
Там много математики, я хз как оно работает, но суть в том чтоб спускаться не по градиенту, а по градиенту от градиента (производная от производной).
1) Правильно понял и примитивный пример(если сети или пр. негде взять, то она начинает "придумывать")))
2) Только накуя искать 70%, когда мона найти и юзать 100(не для цены разумеется).
1) ну да, ну да, есть у них такой грешок )) я это описал в пунктах про плюсы "моего" подхода
2) я буду искать комбинации на развороты, те не просто направление или цвет свечи а - разворот вверх, разворот вниз, не разворот
Те у меня изначально будет намного меньше нужных мне наблюдений, но если все сработает то я буду рад и 40% срабатываний, даже 70% не надо так как при такой целевой риск прибыль будет от 1 к 5
Спасибо большое, буду потихоньку подготавливать данные, потом кластеризировать, потом искать паттерны, о результатах сообщу
Иногда в нейронки встраивают L-BFGS оптимизацию, она позволяет вылезать из оврагов. Пакет нейронки nnet например.
BFGS и производные от него, такие как L-BFGS, предназначены для решения той задачи, которая в jPrediction уже решена, а именно для нахождения локальных экстремумов. Т.е. эти алгоритмы позволяют "вылазить" из "оврагов" в направлении ближайших экстремумов, а не "перепрыгивать" через овраги, с целью поискать альтернативные экстремумы.
Нужны алгоритмы "прыгуны". И желательно чтобы они "прыгали" не рандомно, а в какую-то потенциально перспективную сторону. Теоретически это можно реализовать через генетику, там подобные "прыжки" осуществляются посредством мутаций. Но генетические алгоритмы шибко медленные и больше подходят для тех задач, где потенциальных потомков можно протестировать на вшивость с минимальными временными затратами. Обучение нейронки для вычисления её обобщающей способности требует много времени, потому генетика здесь будет слишком тормозной.
Ладно, за неимением лучшего, в данный момент тестирую вариант с рандомными "прыжками".
Еще одна книга по R. Прицеплю здесь, так как не понятно куда еще можно. Пусть будет
С.Э. Мастицкий, В.К. Шитиков
СТАТИСТИЧЕСКИЙ АНАЛИЗ И ВИЗУАЛИЗАЦИЯ ДАННЫХ С ПОМОЩЬЮ R
Если искать паттерны как mytarmailS, скользящим окном по барам - каждый паттерн будет нести в себе информацию о том в каком интервале могут находиться значения на каждом баре. Чем больше паттернов - тем меньший интервал будет отведён на каждый бар.
Грубо говоря, чтоб конкретное окно с новыми данными попало в какой-то найденный ранее паттерн, оно должно попасть в такие вериткальные ограничители, присущие каждому паттерну.
Если взять и найти 1000 паттернов, то ширина "канала" у каждого из них будет небольшой. А поскольку новые данные всегда немного отличаются от тренировочных - попасть в такой узкий канал будет сложно, это приведёт к ошибкам.
Я бы руководствовался бритой Оккама - если можно уменьшить число паттернов и получить тот-же результат без ухудшений, то лучше таки уменьшить.