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

 
Dr.Trader:

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

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

 Хотя, давайте я еще раз попробую. И отпишусь.

Алексей 

 

Я подозреваю что в этих данных чего-то не хватает. Это как в вашем задании из первого поста - если убрать из выборки хоть один из тех 6 входов, то результат становится непредсказуемым. Форекс явно зависит от собственной прошлой цены, от времени суток, итд. И вот этого "итд" как раз не хватает в моих данных, и поэтому модели просто не могут адекватно найти какие-то закономерности и описать логику. Лес видимо не может при оптимизации пробовать разные комбинации типа "отнять high от low" и брать лучшие из них, и такие вещи нужно добавлять в выборку самому. Я сейчас переделываю свой скрипт который форекс данные сохраняет в csv, добавляю туда много дельт, плюс дистанции до прошлых вершин зигзага, согласно советам. Потом выложу новый файл с данными для экспериментов.

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

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

Я смог повторить тот описанный процесс. По результатам - набор моих предикторов описывает результат с достоверностью 0,1%, или как-то так... Там много теории за пределами моих знаний, я понял далеко не всё.

Я добавил 3 файла. Там можно просто поменять путь к csv файлу и можно запускать. Требуемый результат должен быть в последней колонке в csv, всё остальное - предикторы. Предварительно самому ничего не нормализовать, подавать данные как есть.

 

1)  Principal Components Regression 01. Какой-то код из вводной части статьи, по-моему в нём чего-то не хватает ибо у меня ошибки при запуске кода. Он должен дать каждому входу оценку, и нарисовать график, тут к сожалению не пойму что к чему и как это применять.

 

2)  Principal Components Regression 03. Principal Components Regression, Pt. 2: Y-Aware Methods. Я пропустил первую часть, ибо в статье написано что первая часть это другой, более слабый алгоритм.
Код поделен на пару частей, нужно их запускать по очереди чтобы после каждой части посмотреть на нарисованный в R график.

Первый запуск - из файла нужно скопировать и запустить всё до начала второго шага (начало второго шага выделено жирненькими буквами STEP 2). В консоли R будет видна таблица, где чем меньшее значение у входа, тем он лучше. Значение = 1 = мусор. Плюс график, там чем длиннее линия тем хуже, аналогично таблице.

Дальше  нужно запустить код из второго шага. В конце будет график, там чем длиннее линия относится ко входу, тем он надёжней (в шаге 1 было наоборот). Ещё в коде есть переменная examplePruneSig  отвечающая за отсев входов согласно значению psig из таблицы шага 1. Можно установить значение переменной =1, если есть желание посмотреть на трансформированное значение достоверности всех входов. Ибо может быть что в первом шаге вход был оценен плохо, но на втором стал лучше. Рекомендуется брать или какое-то пороговое значение, или examplePruneSig  = 1/количествово_входов, но точных указаний нету.

третий шаг - делается сам Principal Component Analysis (prcomp). Тут для меня опять что-то новое, но суть в том что эта функция пытается вывести много "principal component" (PC) (что-то вроде внутренних переменных, от которых зависит требуемый результат). Каждая из этих внутренних переменных опирается на свой набор входных данных. Дальше задача сводится к тому чтобы набрать минимальный набор таких PC, которые могут достоверно определить результат. А сама результативная выборка предикторов - это предикторы тех PC которые попадают в тот минимальный набор. 
В самой статье эта задача не решена, там просто берут первых 2 PC и смотрят на то получилось или нет. Но я мог что-то не понять или пропустить, лучше почитайте сами если понимаете prcomp.
Зато, в конце шага будет нарисована диаграмма из первых 5 PC, и использованными ими входами. Чем длиннее линия на графике, тем вход важнее.

четвёртый, пятый, шестой шаги - оценка результата на тренировочных и тестовых данных.


3)  Principal Components Regression 04. Какая-то функция из другого пакета, которая делает всё тоже самое что и в Principal Components Regression 03. Но, бонус в том что она сама отсеивает PC, и оставляет минимальный набор тех которые могут описать результат с точностью 95%.
Но тут нету адекватных примеров и графиков, я полагаю нужно что-то использовать из Principal Components Regression 03.


 

tl;dr:

1) Отсев шумных значений. Берём файл "Principal Components Regression 03", запускаем только код до второго шага (не включая второй). в R будет таблица, нужно брать только входы со значением psig меньше порога. Значение "1" - шум и рандом. "0" - хорошо. Неуверенно рекомендуется порог в (1/кол-во входов). Этот способ не даёт никаких гарантий на правильность выборки входов, скорее просто позволяет убрать действительно рандомные и шумные значения.

2) Более сложный подход. Хитрый алгоритм создаёт некие Principal Components, по которым можно вычислить результат. PC это нечто вроде функции, которая описывает некий внутренний процесс происходящий в моделируемой модели. А сам результат модели это совокупность взаимодействий PC. Далее берём минимальный набор PC который описывает результат с высокой точностью, смотрим на входы используемые для этих PC. Эти входы и есть нужный нам набор без мусора. файл "Principal Components Regression 04" позволяет получить минимальный набор таких PC, но что с ним дальше делать как-то непонятно, нужно ещё вытащить используемые предикторы.

 

Вот сама статья ещё раз, и код к ней.

http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

https://github.com/WinVector/Examples/blob/master/PCR/YAwarePCA.Rmd


Principal Components Regression, Pt. 2: Y-Aware Methods | R-bloggers
Principal Components Regression, Pt. 2: Y-Aware Methods | R-bloggers
  • Nina Zumel
  • www.r-bloggers.com
In our previous note, we discussed some problems that can arise when using standard principal components analysis (specifically, principal components regression) to model the relationship between independent (x) and dependent (y) variables. In this note, we present some dimensionality reduction techniques that alleviate some of those problems...
 
Dr.Trader:

Я подозреваю что в этих данных чего-то не хватает. Это как в вашем задании из первого поста - если убрать из выборки хоть один из тех 6 входов, то результат становится непредсказуемым. Форекс явно зависит от собственной прошлой цены, от времени суток, итд. И вот этого "итд" как раз не хватает в моих данных, и поэтому модели просто не могут адекватно найти какие-то закономерности и описать логику. Лес видимо не может при оптимизации пробовать разные комбинации типа "отнять high от low" и брать лучшие из них, и такие вещи нужно добавлять в выборку самому. Я сейчас переделываю свой скрипт который форекс данные сохраняет в csv, добавляю туда много дельт, плюс дистанции до прошлых вершин зигзага, согласно советам. Потом выложу новый файл с данными для экспериментов.

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

 

 А вот и мои данные по форексу: https://drive.google.com/drive/folders/0B_Au3ANgcG7CYnhVNWxvbmFjd3c

 dat_train_final - файл для обучения модели. Там история по 5 валютным парам за 10 лет и все мои предикторы.

 many_samples - нужно load в R. Это list - в каждом элементе лежит валидационная выборка, и всего их 49. На любой или на всех можно провести валидацию. 

Meet Google Drive – One place for all your files
  • accounts.google.com
Google Drive is a free way to keep your files backed up and easy to reach from any phone, tablet, or computer. Start with 15GB of Google storage – free.
 

Не вижу ваши файлы, по ссылке просто пустая папка.

В общем вот мой новый файл для тренировки модели на eurusd (h1, 5 баров, target это рост/падение цены за следующий бар). Проанализировал его по упомянутой выше статье principal-components-regression-pt-2-y-aware-methods, получилось что данные достоверно описывают меньше 1% результатов.
(У RData от СанСаныча это число больше 10% для Rat_DF1), так что видимо у меня опять мусор. Натренировать модель на этом файле вряд ли получился, это больше подходит если кто хочет потренироваться отсеивать предикторы.

В архиве 2 файла, условие работы с ними такое - обучаете модель на первом файле (удобнее и его разбить на несколько кусков, для теста и валидации, Rattle по дефолту делит его на 75%/15%/15%), затем когда отобраны входы и модель обучена - делаете фмнальный тест на втором файле. Если ошибка будет меньше 45% - есть шанс торговать такой моделью на форексе. Профита может и не будет, но можно набрать бонусы брокеров за количество сделок, и рибейты. Если ошибка классификации на втором файле меньше 40% - это уже прибыльная стратегия.

Файлы:
 
Dr.Trader: 

2)  Principal Components Regression 03. Principal Components Regression, Pt. 2: Y-Aware Methods. Я пропустил первую часть, ибо в статье написано что первая часть это другой, более слабый алгоритм.

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

Из имеющихся предикторов создать новые предикторы, которые бы обладали некоторыми новыми полезными свойствами.

Результат представляется в виде таблицы, в заголовке которой стоят символы РС1, РС2..., наименования строк таблицы - это имена Ваших предикторов, а в столбцах под каждым РС находятся цифры - это коэффициенты, на которые необходимо умножить Ваш исходный предиктор для образования значения РС. Т.е.: для конкретного бара берем значения исходных предикторов, умножаем на коэффициенты и получаем значение РС, затем следующий бар и т.д. В результате кроме Ваших исходных векторов, например Ask, получаем еще один вектор

Все РС в таблице упорядочены. Первым стоит РС, которая более всего объясняет изменчивость в исходном наборе, вторым стоит РС, который более всего объясняет изменчивость от того, что осталось от первого РС. Например, РС1 = 0.6, РС2 = 0.2, то в сумме РС1+РС2 объясняют 0.8 изменчивости. Обычно для больших наборов предикторов хватает 5-6 этих самых "главных компонент", которые объясняют свыше 95% изменчивости. Это в том случае, если большинство предикторов являются шумовыми и среди них реально имеются "главные"!

 

Я описал классику "главных компонент". Для нас статья интересна тем, что она, в отличии от классики, вычисляет изменчивость по отношению к целевой переменной. Пороги же нужны для того, чтобы из совершенно безнадежного набора предикторов выделить хоть что-то. Как мне кажется, для нас это не актуально. Это актуально, например, для статистики в социологии, где собрать что-либо дополнительно, весьма затруднительно. У нас же даже на одной валютной паре можно наваять немеренное количество предикторов.   

 

Быть может сделаете еще один заезд (наезд) на эти принципиальные компоненты?

 

ПС.

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

2. Полученные главные компоненты обладают замечательным свойством - они независимы друг от друга. 

3. Главные компоненты можно предсказывать 

 

Теперь понял, спасибо за разъяснение. Про эту модель я только из статьи и узнал. Я думал что PC1 и PC2,3,4,.. соответствуют разным наборам предикторов, а не коэфициентов. Таблицу коэфициентов я таки видел, сейчас быстро нашёл откуда что брать. 

Код из PrincipalComponentRegression04.txt какой-то слишком сложный. Плюс, там вроде нету определения изменчивости по отношению к целевой переменной, я вернулся к PrincipalComponentRegression03.txt из того архива что я с утра приложил.

Нужно выполнить первых 5 шагов.

далее,

> model$coefficients

 (Intercept)         PC1         PC2 

 0.02075519  0.40407635 -0.42250678 

результат выполнения должен быть intercept + coef1 * PC1 + coef2 * PC2 + ... + остальные PC если есть

 

Сами значения PC1, PC2.. :

> proj

> proj

                     PC1            PC2

X_clean    0.00516309881  0.00477076325

X1_clean   0.00142866076  0.00149863842

X2_clean  -0.00008292268  0.00001010802

.....

PC1 =  X_clean * 0.00516309881 + X1_clean*0.00142866076 +...

Для меня сейчас загадка - является ли постфикс "clean" отсылкой к тому что нужно брать оригинальное значение входов, X, X1, X2,... до нормализаций и трансформаций, или нет.

 

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

 

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

Ещё одна проблема - сколько брать PC компонент. Если достоверность меньше 95% то нужно возвращаться на третий шаг, и изменить proj <- extractProjection(2,princ) с двойки на три, потом выполнить шаги 3,4,5, посчитать ошибку, и если она меньше 95% - возвращаться на 3 шаг и опять увеличивать число компонент.

Вообще, код из статьи имеет также проверку на фронттесте, тоесть если бы из MT5 был прямой доступ к R то мы уже имели бы готовую обученную модель способную к торговле, к концу статьи. Я так понимаю проблемой переобученности эта модель не страдает, очень хорошо если так и есть. Тоесть добился достоверности 10%, и уже хорошо.

Про модель вроде как почти всё ясно. Было бы очень хорошо реализовать её в MT5, реализовать только логику принятния решения по коэффициентам. Не ясно как R с MT5 подружить. Можно экспортить все данные из mt5 писать в csv, далее их обрабатывать в R, обучать модель, коэфициенты писать в другой csv. CSV с коэфициентами читать из советника. А дальше будет очень плохо, ибо в R куча функций занимается нормализвцией данных перед тем как посчитать из них PC. Повторить такой код для нормализации в MT5 вряд ли возможно. Надо думать.

 
Dr.Trader:

Теперь понял, спасибо за разъяснение. Про эту модель я только из статьи и узнал. Я думал что PC1 и PC2,3,4,.. соответствуют разным наборам предикторов, а не коэфициентов. Таблицу коэфициентов я таки видел, сейчас быстро нашёл откуда что брать. 

Код из PrincipalComponentRegression04.txt какой-то слишком сложный. Плюс, там вроде нету определения изменчивости по отношению к целевой переменной, я вернулся к PrincipalComponentRegression03.txt из того архива что я с утра приложил.

Нужно выполнить первых 5 шагов.

далее,

 (Intercept)         PC1         PC2 

 0.02075519  0.40407635 -0.42250678 

результат выполнения должен быть intercept + coef1 * PC1 + coef2 * PC2 + ... + остальные PC если есть

 

Сами значения PC1, PC2.. :

> proj

                     PC1            PC2

X_clean    0.00516309881  0.00477076325

X1_clean   0.00142866076  0.00149863842

X2_clean  -0.00008292268  0.00001010802

.....

PC1 =  X_clean * 0.00516309881 + X1_clean*0.00142866076 +...

Для меня сейчас загадка - является ли постфикс "clean" отсылкой к тому что нужно брать оригинальное значение входов, X, X1, X2,... до нормализаций и трансформаций, или нет.

 

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

 

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

Ещё одна проблема - сколько брать PC компонент. Если достоверность меньше 95% то нужно возвращаться на третий шаг, и изменить proj <- extractProjection(2,princ) с двойки на три, потом выполнить шаги 3,4,5, посчитать ошибку, и если она меньше 95% - возвращаться на 3 шаг и опять увеличивать число компонент.

Вообще, код из статьи имеет также проверку на фронттесте, тоесть если бы из MT5 был прямой доступ к R то мы уже имели бы готовую обученную модель способную к торговле, к концу статьи. Я так понимаю проблемой переобученности эта модель не страдает, очень хорошо если так и есть. Тоесть добился достоверности 10%, и уже хорошо.

Про модель вроде как почти всё ясно. Было бы очень хорошо реализовать её в MT5, реализовать только логику принятния решения по коэффициентам. Не ясно как R с MT5 подружить. Можно экспортить все данные из mt5 писать в csv, далее их обрабатывать в R, обучать модель, коэфициенты писать в другой csv. CSV с коэфициентами читать из советника. А дальше будет очень плохо, ибо в R куча функций занимается нормализвцией данных перед тем как посчитать из них PC. Повторить такой код для нормализации в MT5 вряд ли возможно. Надо думать.

 

Как мне кажется надо пользовать раздел Principal Components Regression, Pt. 2: Y-Aware Methods

Как понял из поверхностного взгляда на текст, изюминка состоит в том, что масштабирование ведется с учетом целевой функции. В обычном РСА целевая функция вообще не учитывается. Из-за этого, якобы, первыми компонентами оказываются компоненты наиболее важные для объяснения целевой функции, а не объяснения изменчивости всего набора предикторов! 


Ещё одна проблема - сколько брать PC компонент

 Из-за этого и весь сыр бор. Интуитивно так, без всяких там порогов. Если первые 5 компонент не объясняют свыше 95% изменчивости, то надо искать новый набор предикторов. Хотя может и не прав.

Про модель вроде как почти всё ясно. Было бы очень хорошо реализовать её в MT5

Все прекрасно работает в МТ4. Там есть библиотека на паскале с исходным кодом. Сам не пробовал, но по мне, если МТ4  способен обратится к библиотеке на паскале, то МТ5 должен и подавно.

Само обращение к R выглядит так.

1. в OnInit устанавливается связь с R. Если имеются специально заготовленные данные, то грузится рабочая область. Кроме этого грузится код на R оформленный в одну или много функций. Количество строк в каждой функции естественно произвольное - определяется логикой.

2. В теле советника или индикатора обращаются к этим функциям.

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

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

Как не парадоксально, но классификация это та же регрессия.

Только для для регрессии выход это вещественное, а для классификации - вероятность.

И целевая для регрессии - непрерывная кривая, а для классификации импульсы (0, 1) или (-1,+1).

Это потом этот выход переводят в соответствующий класс (ifelse(y > 0.5, 1, 0).

 
Dr.Trader:

Не вижу ваши файлы, по ссылке просто пустая папка.


это обучение: https://drive.google.com/file/d/0B_Au3ANgcG7CN2tTUHBkdEdpVEU/view?usp=sharing 

это валидация: https://drive.google.com/file/d/0B_Au3ANgcG7CZmFWclFOd0RqNFk/view?usp=sharing

валидацию нужно обработать так load(validation_file) 

в каждом элементе list содержится уникальная валидационная выборка, где независимые наблюдения. Между собой валидационные выборки почти не пересекаются, так как наблюдения в них взяты из случайных временных точек. Каждую валидационную выборку можно рассматривать как точечную оценку торговли.

 

Это сделано с тем, чтобы не моделировать совершение сделок на каждой минуте. Сделки смоделированы примерно через каждые 12 часов. 

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