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

 

Текущее состояние моего эксперимента.

 После исправления ошибок в коде, на моих данных, я, по факту, имею следующие результаты на валидации.

 

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

 

Как видно, у меня есть уже положительное МО для ряда пар. Для EURUSD макисмальное. При этом я делаю эксперимент еще точнее, используя актуальные спреды для всех пар (от моего ДЦ):

 

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

 

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

 

До связи. 

 
Alexey Burnakov:

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

 

Тут шкалирование в интервал не моможет. 

Не всё так плохо. Если рассматривать каждый обучающий пример отдельно (тоесть при нормализации работать по одной строчке из обучающей таблицы), то можно нормализовать все данные по группам, отдельно в каждом обучающем примере. Например взять колонки o,h,l,c за все 100 баров (итого 400) в пределах одного обучающего примера, найти их минимум и максимум, и проскалировать. Поочерёдно повторить такое для каждого обучающего примера отдельно. Такая нормализация обеспечит что цена в обучающей таблице, в каждой строке всегда будет находиться в интервале строго [0..1]. Теперь если в будущем попадётся новый пример, цена в котором ушла далеко за пределы цен во время тренировки - то нормализация вернёт её в пределы [0..1], и это не будет каким-то новым неизвестным для нейронки регионом данных. Обученная модель вполне может найти и распознавать какие-то правила вроде "цена за последних N баров была хоть раз выше 0.8", и это правило будет распространяться на любые новые данные, даже если цена упадёт в два раза.

Если делать нормализацию по каждой колонке отдельно, как принято, то результаты модели во фронттесте будут хуже. Теряются зависимости между однотипными предикторами в пределах одного обучающего примера. ( например Open[1], Open[2], Open[3],.. из одного и тогоже обучающего примера будут проскалированы в разные интервалы, согласно всем обучающим примерам). Плюс тут ещё есть проблема что нормализацию во время обучения будем делать основываясь на тысячах обучающих примеров, а при реальной торговле будет одна единственная строка, которую как-то нужно проскалировать по клолнкам с самой собой, что непонятно и странно.

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

Это всё относится строго к нейронке, из опыта. 

 

Поработал ещё немного с y-scale pca. Нашёл хорошую статью с формулами дисперсий http://www.chemometrics.ru/materials/textbooks/pca.htm, сделал такое в R.

Основной код из всё той же статьи http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
Нужно выполнить код "princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" и остановиться. Дальше:

extractProjection <- function(ndim,princ) {
  return(princ$rotation[,1:ndim]) #Эта функция уже была определена ранее, но в этот раз нельзя менять знаки в матрицах как раньше
}
countOfComponentsToUse <- ncol(princ$x) # сюда можно в цикле подставлять числа от 2 до ncol(princ$x), увеличивая число компонент до необходимой точности
PCnameList <- colnames(princ$x)[1:countOfComponentsToUse]
proj <- extractProjection(countOfComponentsToUse, princ)
residualsMatrix <- dmTrain - ((princ$x[,1:countOfComponentsToUse]) %*% (t(proj)))
V0 <- sum(residualsMatrix*residualsMatrix)/nrow(dmTrain)
TRV <- V0/ncol(dmTrain)                           #полная дисперсия остатков (средний квадрат ошибок)
ERV <- 1-nrow(dmTrain)*V0/sum(dmTrain*dmTrain)    #объяснённая дисперсия остатков, нужно увеличивать число компонент если ERV < 0.95

Суть примерно такая: объект princ содержит матрицу счетов (princ$x) и матрицу нагрузок (princ$rotation). Если перемножить эти две матрицы princ$x %*% t(princ$rotation) то мы получим назад исходную таблицу с данными dmTrain (с шкалированием по Y, без целевой переменной).

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

Для числа компонент N, исходные данные определяются так: princ$x[,1:N] %*% t(princ$rotation[,1:N]). Погрешность можно посчитать отняв полученную матрицу от dmTrain, получится матрица остатков residualsMatrix. Это ошибки, насколько реальные данные отличаются от найденных. TRV - среднее квадратов ошибок. ERV - что-то вроде средней погрешности. При ERV=0.8 исходные данные будут отличаться от найденных на ~20% в каждой ячейке таблицы. Тоесть если найдено число 10, то в исходных данных было скорее всего от 8 до 12. Это очень грубое определение, но так понятней сам смысл. И именно ERV должно быть как минимум 0.95 для того чтобы считалось что PCA модель содержит достаточно компонент.

Что это даёт? Теперь можно добавить новый параметр tol в  princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01), чтобы не генерировать тысячи главных компонент, а генерация остановиться когда sdev новой компоненты будет < sdev(PC1) * tol. После этого число используемых компонент можно подобрать функцией выше, начав с 2 и постепенно повышая на 1.

Пытался придумать как это можно применить для отсева предикторов, пока ничего в голову не лезет. Можно например в princ$rotation заменить нагрузку на 0 для одного предиктора, заново рассчитать ERV и посмотреть насколько ухудшится результат. Правда не вижу смысла в этом действии, непонятно как этот результат применить. Возможно так можно найти коррелирующие предикторы, которые не несут никакой новой информации, и поэтому их отсев возможно не ухудшит результат. Хотелось бы найти шумовые предикторы, но в этих матрицах нет никакой связи с целевыми переменными, то есть вообще нету критерия что шум, а что нет.

 
Dr.Trader:

Поработал ещё немного с y-scale pca. Нашёл хорошую статью с формулами дисперсий http://www.chemometrics.ru/materials/textbooks/pca.htm, сделал такое в R.

Основной код из всё той же статьи http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Заново просмотрел статью. Такое впечатление, что Вы не пытаетесть повторить пример в статье, тупо пункт за пунктом, заменив на свои данные. Или я что-то пропустил? Если не пропустил, то почему? 
 

Пример я повторил. Заменил на свои данные, получил 100+ главных компонент для дисперсии 0.95. Посмотрел на графики лоадингов, явно выделяющихся хороших предикторов не увидел. Тоесть в то время как автор статьи на своих данных видит на графиках что можно оставить 2 главные компоненты, и 5 предикторов - я на своих данных вижу 100+ компонент и 1000+ предикторов (лоадинги плавно убывают, даже не ясно какое пороговое значения лоадингов отсеивать).

Хотя стоит отдать должное y-aware pca, я просто подставил свои данные без предварительного отсева, построил на них Y-Aware PCA модель, и получил ошибку 45% во фронттесте. Для форекса это ещё не прибыльно, но статья на этом заканчивается, поэтому если мне использовать y-aware pca то нужно придумать что-то ещё.

Другими способами я могу оставить всего десяток предикторов, обучить nnet, и получить ошибку во фронттесте всего 30%. Хотелось бы получить подобный результат с y-aware pca.
 
Dr.Trader:

Пример я повторил. Заменил на свои данные, получил 100+ главных компонент для дисперсии 0.95. Посмотрел на графики лоадингов, явно выделяющихся хороших предикторов не увидел. Тоесть в то время как автор статьи на своих данных видит на графиках что можно оставить 2 главные компоненты, и 5 предикторов - я на своих данных вижу 100+ компонент и 1000+ предикторов (лоадинги плавно убывают, даже не ясно какое пороговое значения лоадингов отсеивать).

Хотя стоит отдать должное y-aware pca, я просто подставил свои данные без предварительного отсева, построил на них Y-Aware PCA модель, и получил ошибку 45% во фронттесте. Для форекса это ещё не прибыльно, но статья на этом заканчивается, поэтому если мне использовать y-aware pca то нужно придумать что-то ещё.

Другими способами я могу оставить всего десяток предикторов, обучить nnet, и получить ошибку во фронттесте всего 30%. Хотелось бы получить подобный результат с y-aware pca.
Мне кажется надо повторить буква в букву. Там используются пакет, кроме рса, которого я у Вас не увидел.
 

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Тут R код из статьи, файлы _03.txt и _04.txt, я это всё уже выполнял на своих данных. Даже добавлял проверку на фронттест данных в _04.txt. Единственную разницу что я вижу это пакет etal предложенный в конце статьи. Но там даже примеров нету, просто предлагают попробовать и сравнить результат с тем что делает vtreat prune.

 
Dr.Trader:

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Тут R код из статьи, файлы _03.txt и _04.txt, я это всё уже выполнял на своих данных. Даже добавлял проверку на фронттест данных в _04.txt. Единственную разницу что я вижу это пакет etal предложенный в конце статьи. Но там даже примеров нету, просто предлагают попробовать и сравнить результат с тем что делает vtreat prune.

Выглядит вполне солидно.

И что, полезного результата нет? 

 

Моя статья про feature selection. 

 https://habrahabr.ru/company/aligntechnology/blog/303750/ 

Методические заметки об отборе информативных признаков (feature selection)
Методические заметки об отборе информативных признаков (feature selection)
  • habrahabr.ru
Всем привет! Меня зовут Алексей. Я Data Scientist в компании Align Technology. В этом материале я расскажу вам о подходах к feature selection, которые мы практикуем в ходе экспериментов по анализу данных. В нашей компании статистики и инженеры machine learning анализируют большие объемы клинической информации, связанные с лечением пациентов...
 

Здравствуйте!

Есть у меня идейка одна, хочу проверить но не знаю инструмента для реализации... нужен алгоритм который по моим данным мог бы прогнозировать на несколько точек вперед скажем на 3 или 5 (желательно чтоб это была нейросеть)

Я до этого работал только с класификацыей  потому даже как то не понимаю как это должно выглядеть,  подскажите кто нибудь  как это делается  или пакет порекомендуйте в R

 

 п.с. Отличная статья Алексей

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