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

 
Dr.Trader:

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

Занимался этим последние недели, сейчас лучший результат получается так: (очень много вычислений, изучаю такой подход вообще на таймфрейме 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 модель я не обучаю, остановился покачто на такой функции для предварительного отсева предикторов:

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

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

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

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


 

Поздравляю, спасибо, что выложили результат.

Буду надеяться, что этот Ваш пост будет оценен по достоинству - Вы если не решили, ТО ПРИБЛИЗИЛИСЬ К РЕШЕНИЮ БАЗОВОЙ ПРОБЛЕМЫ ТРЕЙДИНГА, ЭТО БЕЗ ПРЕУВЕЛИЧЕНИЯ.  

Все остальное приложится.

Еще раз мои поздравления, успехов! 

 
Dr.Trader:

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

Занимался этим последние недели, сейчас лучший результат получается так: (очень много вычислений, изучаю такой подход вообще на таймфрейме 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 модель я не обучаю, остановился покачто на такой функции для предварительного отсева предикторов:

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

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

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

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

 

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

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

Я использую стандартные индикаторы как основу для создания предикторов.

...

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

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

... 

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

Не покидает чувство, что расчет ПОЛНОСТЬЮ идет на авось! Предикторы - сплошной мусор. Авось среди них бриллиант появится, ведь Жизнь смогла же зародиться из "супа"!

Получается, при таком подходе идет грамотная оптимизация вычислений. Когда идет не брутфорс, а более разумные алгоритмы. Но на входе все тот же мусор.

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

 
Alexey Volchanskiy:

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

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

Здесь все лучше показано.

Удачи

 
Anton Zverev:

Не покидает чувство, что расчет ПОЛНОСТЬЮ идет на авось! Предикторы - сплошной мусор. Авось среди них бриллиант появится, ведь Жизнь смогла же зародиться из "супа"!

.... Печально. 

Вы совершенно не правы!

Поясню на примере.

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

Теперь для определенности предположим, что собираемся торговать тренды. Какие из имеющихся индикаторов в кодобазе будут полезны для торговли тренда? Будем судить из названия, или интуитивно? А сколько практически можно отобрать, чтобы попробовать? 10, 20, 100? Думаю что 100 - это через тестер на всю жизнь, учитывая из комбинации.

Но самое главное не только в количестве опробуемых индикаторов. Главное в том, а будет ли советник работать в будущем. А будет советник работать в будущем только в одном случае - если он не переобучен (не сверх подогнан). Главная проблема в построении механических торговых систем - это проблема переобучения (сверх подгонки). Многим ли удалось эту проблему преодолеть?  

Я думаю, что Dr.Trader  не от фонаря собирал свои предикторы, а имел некоторую идею - в данный момент идея порождения такого количества предикторов не интересна. 

Интересно совершенно другое.

Интересно то, на что Вы не обратили внимание.

Из тысяч своих предикторов Dr.Trader умеет отбирать такие, которые не будут приводить к переобучению (сверх подгонке) советников. 

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

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

Вы совершенно не правы!

Поясню на примере.

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

Мусор, конечно! Ну взять в качестве предикторов всю кодобазу...

Из тысяч своих предикторов Dr.Trader умеет отбирать такие, которые не будут приводить к переобучению (сверх подгонке) советников. 

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

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

Или здесь кто-то способен обосновать, что такой-то индикатор - это не мусор? И в цифрах показать относительную значимость этого предиктора?

 

Да, у меня во многом получается действие на авось, согласен. Но нельзя просто взять один индикатор и сделать на нём советник, вы быстро уйдёте в минус с ним. Индикаторы это не 100% мусор, но и сами по одиночке они не несут достаточно информации для предсказания движения цены. Зато, у меня в исследовании определилось что комбинируя индикаторы можно увеличивать их предсказательную способность, то есть из мусора можно действительно собрать бриллиант. Проблема в том что возможных комбинаций тысячи, а полезны лишь десятки из них, а какие индикаторы первоначально лучше других я ещё не знаю. Покачто это проблема решается как я написал раньше, действую грубым перебором и долгими вычислениями. Со временем наберу статистики о том какие индикаторы чаще попадают в финальные предикторы, можно будет работать уже только с ними, всё пойдёт быстрее.

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

 
Dr.Trader:

Да, у меня во многом получается действие на авось, согласен. Но нельзя просто взять один индикатор и сделать на нём советник, вы быстро уйдёте в минус с ним. Индикаторы это не 100% мусор, но и сами по одиночке они не несут достаточно информации для предсказания движения цены. Зато, у меня в исследовании определилось что комбинируя индикаторы можно увеличивать их предсказательную способность, то есть из мусора можно действительно собрать бриллиант. Проблема в том что возможных комбинаций тысячи, а полезны лишь десятки из них, а какие индикаторы первоначально лучше других я ещё не знаю. Покачто это проблема решается как я написал раньше, действую грубым перебором и долгими вычислениями. Со временем наберу статистики о том какие индикаторы чаще попадают в финальные предикторы, можно будет работать уже только с ними, всё пойдёт быстрее.

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

 

Эти два обстоятельства (выделил жирным) видятся странными, если не сказать жестче.

 

Методы машинного обучения научились по картинкам узнавать предметы (собаку, апельсин и прочее). Т.е. научились распознавать то, что Человек или некоторые виды животных могут осознать. Когда же Человек или животное видит ценовой ВР, то он ничего не осознает. Т.е. сопоставления како-то в своей НС сделать не в состоянии. Однако, когда Человек смотрит сразу на несколько ВР, то он видит похожести даже невооруженным взглядом. И эти похожести, действительно, осознаются. Поэтому именно на осознание какого-либо объекта и логично натравлять методы машинного обучения.

 

Сначала сами осознаем, затем пробуем алгоритмы. Думаю, Вы поняли, о чем я.

 

Когда-то EURGBP ночной был очень крут (профитен). Ваши НС его бы не распознали. Прибыль же срубили, кто осознал причины ночной крутости. И далее натравили алгоритмы на эти куски истории EURGBP, чтобы найти дату, с которой он, вдруг, стал крут. Чтобы не портить стату данными, что были до этой крутости. Стали исследовать. И многие на этом тогда неплохо заработали - достаточно почитать форумы.

 

А теперь представьте, что сейчас крут GOLD/SILVER. Такой пары нет, но торговать ее можно. Но Вы же ограничили себя единственным ВР. А логично искать именно взамосвязи между разными ВР. Тогда и такие "GOLD/SILVER" могут выскочить. Ну и интервалы недели, суток и т.д. тоже играют огромную роль. Поведение людей зависит от времени суток и от дня недели. Это осознанные данные, поэтому там надо копать, ИМХО.

 
Anton Zverev:

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

 ...

Сначала сами осознаем, затем пробуем алгоритмы. Думаю, Вы поняли, о чем я.

 

... 

Но Вы же ограничили себя единственным ВР. А логично искать именно взамосвязи между разными ВР. Тогда и такие "GOLD/SILVER" могут выскочить. Ну и интервалы недели, суток и т.д. тоже играют огромную роль. Поведение людей зависит от времени суток и от дня недели. Это осознанные данные, поэтому там надо копать, ИМХО.

Мы тут пока пробуем найти зависимость условно "будущего" от "прошлого" на одном вр. ряду. Но это не значит, что мы не попробуем сделать это и для комбинации рядов.

ПРо узнавание. Вот для апельсинов ваши рассуждения применимы. Даже может быть эксперт отличит несколько сортов апельсина.

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

Я солидарен с Др.Трейдер в попытке сначала набрать много мусора, а потом из него вытащить ценные входы. Ценность этих входов проверяется обучением модели и ее валидацией. Если это не шум, на валидации будет плюс. Вот и весь курс машинного обучения. )

Я пробовал такие сырые входы:

 

> names(sampleA)

  [1] "lag_diff_2"        "lag_diff_3"        "lag_diff_4"        "lag_diff_6"        "lag_diff_8"        "lag_diff_11"       "lag_diff_16"     

  [8] "lag_diff_23"       "lag_diff_32"       "lag_diff_45"       "lag_diff_64"       "lag_diff_91"       "lag_diff_128"      "lag_diff_181"    

 [15] "lag_diff_256"      "lag_diff_362"      "lag_diff_512"      "lag_diff_724"      "lag_mean_diff_2"   "lag_mean_diff_3"   "lag_mean_diff_4" 

 [22] "lag_mean_diff_6"   "lag_mean_diff_8"   "lag_mean_diff_11"  "lag_mean_diff_16"  "lag_mean_diff_23"  "lag_mean_diff_32"  "lag_mean_diff_45"

 [29] "lag_mean_diff_64"  "lag_mean_diff_91"  "lag_mean_diff_128" "lag_mean_diff_181" "lag_mean_diff_256" "lag_mean_diff_362" "lag_mean_diff_512"

[36] "lag_mean_diff_724" "lag_max_diff_2"    "lag_max_diff_3"    "lag_max_diff_4"    "lag_max_diff_6"    "lag_max_diff_8"    "lag_max_diff_11" 

 [43] "lag_max_diff_16"   "lag_max_diff_23"   "lag_max_diff_32"   "lag_max_diff_45"   "lag_max_diff_64"   "lag_max_diff_91"   "lag_max_diff_128"

 [50] "lag_max_diff_181"  "lag_max_diff_256"  "lag_max_diff_362"  "lag_max_diff_512"  "lag_max_diff_724"  "lag_min_diff_2"    "lag_min_diff_3"  

 [57] "lag_min_diff_4"    "lag_min_diff_6"    "lag_min_diff_8"    "lag_min_diff_11"   "lag_min_diff_16"   "lag_min_diff_23"   "lag_min_diff_32" 

 [64] "lag_min_diff_45"   "lag_min_diff_64"   "lag_min_diff_91"   "lag_min_diff_128"  "lag_min_diff_181"  "lag_min_diff_256"  "lag_min_diff_362"

 [71] "lag_min_diff_512"  "lag_min_diff_724"  "lag_sd_2"          "lag_sd_3"          "lag_sd_4"          "lag_sd_6"          "lag_sd_8"        

 [78] "lag_sd_11"         "lag_sd_16"         "lag_sd_23"         "lag_sd_32"         "lag_sd_45"         "lag_sd_64"         "lag_sd_91"       

 [85] "lag_sd_128"        "lag_sd_181"        "lag_sd_256"        "lag_sd_362"        "lag_sd_512"        "lag_sd_724"        "lag_range_2"     

 [92] "lag_range_3"       "lag_range_4"       "lag_range_6"       "lag_range_8"       "lag_range_11"      "lag_range_16"      "lag_range_23"    

 [99] "lag_range_32"      "lag_range_45"      "lag_range_64"      "lag_range_91"      "lag_range_128"     "lag_range_181"     "lag_range_256"   

[106] "lag_range_362"     "lag_range_512"     "lag_range_724"     "symbol"            "month"             "day"               "week_day"        

[113] "hour"              "minute"            "future_lag_2"      "future_lag_3"      "future_lag_4"      "future_lag_6"      "future_lag_8"    

[120] "future_lag_11"     "future_lag_16"     "future_lag_23"     "future_lag_32"     "future_lag_45"     "future_lag_64"     "future_lag_91"   

[127] "future_lag_128"    "future_lag_181"    "future_lag_256"    "future_lag_362"    "future_lag_512"    "future_lag_724"

 

Тут и время и всякие метрики движения цены есть. Потом также делал отсев. Вот, посмотрите, что получилось.

Это часть советника, который берет сигналы из обученной машины в R. Там указаны отобранные входы. И на первом месте, кстати, час, когда открывается сделка. То есть, время важно!

 

 

Это тест советника на всей истории с 1999.02 по 2016.06:

 

 Получилось кривовато, но на указанных входах машина все-же учится НЕ шуму, а зависимостям.

 Поэтому мы то в плюсе. По крайней мере, мы улучшаем результаты экспериментов.

Файлы:
Причина обращения: