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

 
Alexey Burnakov:
ОК, можно подумать. Представьте, например, что на каждой итерации нейросеть делаеть не стандартное обратное распространение ошибки на основе отклонения цели от предсказания, а получает данные о том, что на предыдущей версии весов реальная торговля отличается от идеала на такое-то количество пунктов. И на основе этой информации обновляет веса. То есть инфа в машину должна идти параллельным потоком. Может быть, это реально сделать.

А зачем вам веса? Почему вы про них заговорили вообще? 

 

Я так понял что нужны предыдущие веса, теперь я понял что я ничего не понял)  

 
mytarmailS:

А зачем вам веса? Почему вы про них заговорили вообще? 

 

Я так понял что нужны предыдущие веса, теперь я понял что я ничего не понял)  

Ну, похоже на то ))

 

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

Веса обновляются алгоритмом. 

 

Вот, простая функция работает. Более сложную надо пробовать делать. Она должна еще дифференцироваться, вот в чем заскок.

library(neuralnet)


y <- as.data.frame(matrix(runif(n = 10000, min = -15, max = 15), ncol = 2))

y$V3 <- runif(n = 5000,  min = -15, max = 15)

y$V4 <- runif(n = 5000,  min = -15, max = 15)

y$V5 <- runif(n = 5000,  min = -15, max = 15)

y$V6 <- runif(n = 5000,  min = -15, max = 15)

y$V7 <- runif(n = 5000,  min = -15, max = 15)

y$V8 <- y$V1 ^ 2 + y$V2 ^ 2

colnames(y) <- c('input_1', 'input_2', 'noise_1', 'noise_2', 'noise_3', 'noise_4', 'noise_5', 'output')


f_f <- function(x, y){

1/2*(y-x)^2

}


print(

nn_model <- neuralnet(formula = output ~ input_1 + input_2 + noise_1

, data = y

, hidden = 1

, threshold = 0.01

, stepmax = 1e+05

, rep = 100

, startweights = NULL

, learningrate.limit = NULL

, learningrate.factor = list(minus = 0.5, plus = 1.2)

, learningrate=NULL

, lifesign = "none"

, lifesign.step = 10

, algorithm = "rprop+"

, err.fct = f_f #"sse"

, act.fct = "logistic"

, linear.output = F

, exclude = NULL

, constant.weights = NULL

, likelihood = FALSE

)

)

 

f_f <- function(x, y)      1/2*(y-x)^2

 f_f   - считает ошибку для сети верно?

х - это то каким должно быть значение (идеальная кривая)

у - это то каким оно есть по факту (реальная кривая)

разница между ними и есть ошибка 

 

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

 
mytarmailS:

f_f <- function(x, y)      1/2*(y-x)^2

 f_f   - считает ошибку для сети верно?

х - это то каким должно быть значение (идеальная кривая)

у - это то каким оно есть по факту (реальная кривая)

разница между ними и есть ошибка 

 

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

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

Ну как. Надо прямо в теле функции описать логику открытия поз и ввести спред. Записать результат по открытым позам в в вектор и посчитать на векторе интнгральную характеристику.

Типа: buy<-(y-spread)[x>0]. Это будет вектор лонгов.т также для шортов. Потом all<-append(buy, sell).

Но скорее всего не сработает. Там много ограничений на вид функции (.
 
А я тем временем продолжаю эксперимент. Обучил машину только на паре eurusd и получил небольшое положительное МО на валидации.

Во вложении скриншот текущей проверки модели в МТ4. Стадия обучения пока идет... Полные результаты будут только завтра. Расчеты довольно долгие в связке с R и на каждой минуте, если нет открытых сделок. Начал с 1999 года. Валидация начнется с 2010.09. текущий график по 2003 год.

Использую спред 10 пятизначных пунктов. Ожидаю на валидации МО 7-8 пунктов. Не густо.... но сейчас уже можно найти ДЦ, где спред 10 пунктов, поэтому считаю результат практически значимым.
Файлы:
 

Подкинул один коллега ссылку на курс по теме машинного обучения, посмотрите плз, как оцените? Курс бесплатный, но блин на Питоне зачем-то ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

 
Alexey Volchanskiy:

Подкинул один коллега ссылку на курс по теме машинного обучения, посмотрите плз, как оцените? Курс бесплатный, но блин на Питоне зачем-то ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

Самое эффективное:

1. ставите R - 5 минут

2. скачиваете пакет rattle, который оформлен как GUI, а посему не требует познаний в R.

3. Для сокращения первоначальных затрат берете мою статью. В ней есть пояснения, а главное прицеплен готовый файл. Один раз увидев мой файл Вы запросто сможете подготовить свой. 

4. Получаете шесть моделей. 

5. Главное в рамках rattle вы можете увидеть полный цикл машинного обучения:

  • первоначальная подготовка данных (data mining)
  • моделирование
  • оценка результатов 
  • как бонус текст на R всех Ваших действий в rattle. Этот текст можно будет использовать вне  rattle.

Все это даст Вам некий фундамент без пробелов, а главное конкретный опыт машинного обучения с привязкой к форексу.

 

ПС.

rattle будет Вам очень полезен не только на первых шагах, но и в дальнейшем: минимальные затраты, чтобы что-то прикинуть, поэкспериментировать...  

 

ПСПС

Конечно, без книг не обойтись. Вот здесь их полно. Поиск работает отлично. 

 
mytarmailS:

Спасибо за подробные прояснения Dr.Trader!

 Вы знаете наверное самое лучшее и правильное было бы обучать на самих разворотах даже того же зигзага, то есть давать три состояния 1)разворот вверх

2)разворот вниз

3)не разворот

 но обучиться ли, это довольно сложно ловить развороты, плюс перекос по количеству наблюдений ,   классов "не разворот" будет в десятки а может и в сотни раз больше

 А какие вы предикторы используете и какие результаты?

 Я вот начал спектральный анализ осваивать, первые пробы оказались на много качественней  чем просто с индикаторами, запускал через rattle , ошибка на обучении и проверке получилась 6% , но когда начал переносить код в R то ошибка сильно поднялась где то до 30% если не ошибаюсь, Сан Саныч говорит что переобучение , в общем пока мне многое не понятно

 Также есть способ через спектральный анализ узнавать какие периоды доминируют в рынке и эти периоды можно подставлять в индикаторы, получаться адаптивные индикаторы а не подогнанные под историю, первые тесты обнадежили, но что то никак с силами не соберусь эту всю кучю в голове по полочкам разложыть

Я использую стандартные индикаторы как основу для создания предикторов. Пока-что ещё сам экспериментирую с этим, пробую идеи из этой темы форума. 

Занимался этим последние недели, сейчас лучший результат получается так: (очень много вычислений, изучаю такой подход вообще на таймфрейме D1 чтобы было быстрее, потом перейду на тф помельче)

1) экспорт из mt5 в csv: ohlc, время, индикаторы, всё за последние 10 баров. Недавно начал брать время только с самого нового бара, считаю что время остальных баров является вычисляемым, и следовательно не несёт новой информации. Выходит несколько сотен "первичных" предикторов. Требуемый результат обучения - "1" или "0"  - рост или падение цены за следующий бар. С зигзагами у меня всё выходит нестабильно и сложно, у меня сейчас лучше получается работать с ценами закрытия. Когда отработаю полный алгоритм обучения модели с нуля - можно будет браться и за зигзаги и предсказание трендов.

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

3) Очевидно, что мусора после второго шага больше чем нужно. Я его отсеиваю по методу из статьи про основные компоненты http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/, про это тут ранее писал СанСаныч. Саму PCR модель я не обучаю, остановился покачто на такой функции для предварительного отсева предикторов:

library('vtreat')
PrunePredictors <- function(srcTable, pruneSig = -1) {
        targetName <- tail(colnames(srcTable), 1)
        
        treatmentsN <- designTreatmentsN(srcTable,setdiff(colnames(srcTable),targetName),targetName, verbose=FALSE)
        if(pruneSig<0){
                pruneSig = 1.0/(ncol(srcTable)-1)
        }

        scoreFrameSorted <- treatmentsN$scoreFrame[,c("origName", "psig", "code")]
        scoreFrameSorted <- subset( scoreFrameSorted, code == "clean")[,1:2]
        scoreFrameSorted <- scoreFrameSorted[with(scoreFrameSorted, order(psig)), ]
        
        scoreFrameSortedPruned <- subset( scoreFrameSorted, psig < pruneSig)
        scoreFrameSortedPruned <- scoreFrameSortedPruned[,1] 
        
        cat("Minimal psig:", scoreFrameSorted[1,2], "\n")
        cat("Maximal psig:", scoreFrameSorted[nrow(scoreFrameSorted),2], "\n")
        cat("Threshold:", pruneSig, "\n")
        cat("Good predictors:", nrow(subset( scoreFrameSorted, psig < pruneSig)), "\n")
        
        return(scoreFrameSortedPruned)
}

 srcTable - таблица с предикторами, последняя колонка должна быть требуемым результатом обучения. pruneSig лучше оставить -1.

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

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

5) Далее согласно статье нужно обучить саму модель основных компонент. С этим у меня проблемы, покачто лучший r-squared для обученной модели = 0.1, этого мало, в статье пишут что надо хотя-бы 0.95. Но, на полученных предикторах можно обучить какую-то другую модель из R, и результат будет лучше. У меня больше всего опыта с нейронкой, лучший результат во фронттесте с ней выходит с ошибкой около 37%. PCE модель по идее должна быть стабильней, без переобучения, итд, но пока не получается набрать для неё предикторов.

 

Если у вас ошибка в 30% во фронттесте то это уже вполне прибыльная модель, делайте по ней советник для mt5 и проверяйте в тестере стратегий.

 
Alexey Volchanskiy:

Подкинул один коллега ссылку на курс по теме машинного обучения, посмотрите плз, как оцените? Курс бесплатный, но блин на Питоне зачем-то ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

Я начал смотреть этот курс, там очень много внимания уделяется фреймворку Pandas на Питоне. Первые уроки больше похожи на туториал по этому самому фреймворку а не по анализу данных. Но ведущие выглядят адекватно, без типичного "я гуру форекса, сейчас вам открою глаза и вы сделаете  миллионы" как во многих других бесполезных трейннингах, это даёт надежду что и до конца будут рассказывать адекватные вещи. Но ещё стоит учесть что этот курс расчитан для торговли акциями, а не для форекса, я не знаю схожи ли процессы обучения моделей в этих двух сферах.
Причина обращения: