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

 
Dr.Trader:

Выглядит сложно, и нет уверенности в результате, я пас.
В R есть пакет GMDH ("МГУА" по английски).

Сложно потому что там много всяких алгоритмов описано и легко запутаться

пакет есть но он "тухлый"

 

Попробую пояснить проще и короче...

 Не физическая самоорганизующаяся комбинаторная модель это

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

 

 Что я предлагаю....

Мы все знаем что можно любую функцию разложить в ряд Фурье, как на рис.

 ч

 

верно и обратное, что с помощью нужных комбинаций гармоник , можно получить любую нужную нам функцию 

 

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

Все что нужно это

1) взять некий адекватный диапазон гармоник 

2) создать целевую

3) начать перебирать всевозможные комбинации между гармониками и смотреть OOS

Те понимаете?? как просто и как глубоко,  мы не знаем где искать СЗ но мы можем сами ее сгенерировать синтетически!!, а узнаем мы что это СЗ через OOS.

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

Но есть большое НО!, комбинаций там будет  триллионы, нужно как то это обойти и в этом нужна ваша помощь

 может генетикой как то искать хорошие комбинации? 

какие вообще мысли по идее и ее реализации  

 

БРЕД!!! ......

 

То что вы описали - это подгон результата под "хорошо на OOS". Сначала вы подберёте параметры модели (комбинации гармоник) такими, чтобы был хороший результат на sample. Затем из них вы выберите те параметры которые хороши на oos. Это двойная подгонка под хороший результат, и на новых торговых данных модель будет скорее всего бесполезна.

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

 
mytarmailS:

Сложно потому что там много всяких алгоритмов описано и легко запутаться

пакет есть но он "тухлый"

 

Попробую пояснить проще и короче...

 Не физическая самоорганизующаяся комбинаторная модель это

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

 

 Что я предлагаю....

Мы все знаем что можно любую функцию разложить в ряд Фурье, как на рис.

 

 

верно и обратное, что с помощью нужных комбинаций гармоник , можно получить любую нужную нам функцию 

 

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

Все что нужно это

1) взять некий адекватный диапазон гармоник 

2) создать целевую

3) начать перебирать всевозможные комбинации между гармониками и смотреть OOS

Те понимаете?? как просто и как глубоко,  мы не знаем где искать СЗ но мы можем сами ее сгенерировать синтетически!!, а узнаем мы что это СЗ через OOS.

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

Но есть большое НО!, комбинаций там будет  триллионы, нужно как то это обойти и в этом нужна ваша помощь

 может генетикой как то искать хорошие комбинации? 

какие вообще мысли по идее и ее реализации  

Примерно такой смысл я реализовывал в индикаторе. Очень ресурсозатратно получается. Можно подогнать на истории в 1000 баров, можно на истррии в 10000. Итог такой: иногда работает идеально, предсказывает пункт в пукт цену. Но в другие моменты даже близко не попадает. Это все по тому что все эти периоды начинают плавать на рынке, после расчетной точки. Можно ввести наверное коррекции -+ от текущих значений, но у меня не получилось.
 
Dr.Trader:

То что вы описали - это подгон результата под "хорошо на OOS". Сначала вы подберёте параметры модели (комбинации гармоник) такими, чтобы был хороший результат на sample. Затем из них вы выберите те параметры которые хороши на oos. Это двойная подгонка под хороший результат, и на новых торговых данных модель будет скорее всего бесполезна..

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

 Но вот вопрос, а почему тогда не подгонка все остальное?  Ведь тогда получается что любое обучение с проверкой на OOS есть подгонка под OOS, ну верно же? если не верно то почему?

 

Dr.Trader:

 почему вы считаете что результат МГУА будет положительным? 

 Я сам в этом совсем не разбираюсь пока, может и никогда не разберусь..

Просто в личной переписке Николай мне порекомендовал - молв если хочешь начать строить что дельное ознакомься с МГУА  и изучи спектральный анализ 

Он сказал что с этого он сам начинал, и когда создал первого рабочего робота то пользовался всего двумя книгами , одна Ивахненка "МГУА" другая Марпл "спектр. анал" 

перевод названий книг не верный, просто обобщил чтобы понятно было о чем вообще речь 

Кто такой Николай? Помимо того что скромный и очень умный человек

Это к.т.н по искуственному интеллекту, около 20-ти лет уже строит роботов, последние его роботы выглядят вот так :

 я

То есть человек вертел как хотел этими сетями лет 30 назад, те в то время когда мы еще таких слов не знали как "нейронная сеть"  .....

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

 
Maxim Romanov:
Примерно такой смысл я реализовывал в индикаторе. Очень ресурсозатратно получается. Можно подогнать на истории в 1000 баров, можно на истррии в 10000. Итог такой: иногда работает идеально, предсказывает пункт в пукт цену. Но в другие моменты даже близко не попадает. Это все по тому что все эти периоды начинают плавать на рынке, после расчетной точки. Можно ввести наверное коррекции -+ от текущих значений, но у меня не получилось.
Ну понятно,подгонка как подгонка)) я согласен с тем что был не прав..
 

вопрос

есть вектор "х" и матрица "у"  

нужно максимально быстро посчитать евклидову дистанцию между  "х" и каждой строчкой матрицы "у"  

штатную функцию "dist()" обогнал , написав свою

штатная

system.time(for(i in 1:nrow(m)) {dist.ve[i] <- dist(rbind(x,m[i,]))})

   user  system elapsed
   4.38    0.00    4.39

самописная

system.time(for(i in 1:nrow(m)) {dist.ve[i] <- euc.dist(x,m[i,])})
   user  system elapsed
   0.65    0.00    0.67

но  этого мало, хотелось бы ускорить до второго нуля 0,0....

что еще такого можно придумать?

 

код:

x <- rnorm(10)
m <- matrix(data = rnorm(1000000),ncol = 10)

euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))

dist.ve <- rep(0,nrow(m)) # distance vector
system.time(for(i in 1:nrow(m)) {dist.ve[i] <- dist(rbind(x,m[i,]))})
system.time(for(i in 1:nrow(m)) {dist.ve[i] <- euc.dist(x,m[i,])})
 
mytarmailS:

Но вот вопрос, а почему тогда не подгонка все остальное?  Ведь тогда получается что любое обучение с проверкой на OOS есть подгонка под OOS, ну верно же? если не верно то почему?

Кроссвалидация и oos тест на стационарных данных (имеющие постоянные неизменяющиеся зависимости)  - это полезно. На нестационарных - бесполезно.

Вы можете например обучить кучку моделей по одному алгоритму, но на данных с разного времени; для каждой модели найти прибыль на sample и oos и найти корреляцию для этих двух прибылей. Для общеизвестных моделей на форексе такая корреляция обычно отсутствует, т.е. прибыль на sample ничего не гарантирует, в таком случае бесполезно делать кроссвалидацию для попыток улучшить результат на новых данных.
С другой стороны, если корреляция будет велика и позитивна, то модель имеет какой-то потенциал, и можете смело делать кроссвалидацию для подбора параметров модели и улучшения результата.

 

Вот пример для предыдущего сообщения. Берутся цены открытия eurusd за пару месяцев, на них обучается модель (randomForest), и используется для предсказания на небольшом участке времени новых данных. Целевое значение - прирост цены за следующий бар (два класса 0 и 1). Это всё повторяется 1000 раз для разных промежутков времени, потом находится корреляция.

В конце видна корреляция результатов на тренировке и на новых данных, в этом случае вышло около 0.1, т.е. нужно что-то поменять в обучении, такой подход не принесёт прибыли. Хороший результат на тренировочных данных не даёт гарантии хорошего результата в будущем.

В функцию TrainModel можно подставлять обучение своих моделей, там-же делать кроссвалидацию, подбор параметров генетикой, итд.

Файлы:
 
Dr.Trader:

Вот пример для предыдущего сообщения. Берутся цены открытия eurusd за пару месяцев, на них обучается модель (randomForest), и используется для предсказания на небольшом участке времени новых данных. Целевое значение - прирост цены за следующий бар (два класса 0 и 1). Это всё повторяется 1000 раз для разных промежутков времени, потом находится корреляция.

В конце видна корреляция результатов на тренировке и на новых данных, в этом случае вышло около 0.1, т.е. нужно что-то поменять в обучении, такой подход не принесёт прибыли. Хороший результат на тренировочных данных не даёт гарантии хорошего результата в будущем.

В функцию TrainModel можно подставлять обучение своих моделей, там-же делать кроссвалидацию, подбор параметров генетикой, итд.

1. почему вы нормализируете вручную? есть же scale()

2. почему по корреляции -1 и 1 хорошо?  только если 1 это хорошо -1 это очень плохо,  если я правильно понимаю мысль , -1 это же обратная корреляция  

3. а не пробовали ли вы в скользящем окне мониторить ошибку обученой модели и если она не устраивает переобучать модель и смотреть что будет

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

 

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

пакет называется  - "тренд" 

 https://cran.r-project.org/web/packages/trend/trend.pdf

 

в пакете реализованы разные тесты на трендовость и еще всякие штуки 

 

например функция

mk.test()  - дает характеристики тренда, ну там вверх или вниз , еще что то...

 pettitt.test() - как я понял, находит точку в векторе от куда начался тренд 

sens.slope() - с этой функцией можно посчитать углы наклона тренда  

 и еще там всякие разные плюшки

 

Думаю раз можно как то научно смотреть тренд, то нужно проверить)  Посчитал   mk.test()$Zg в скользящем окне 200 знач, по клоузу , получилось что то типа индикатора 

выше нуля тренд вверх, ниже нуля тренд вниз

 й

А что? тренды ловит и напрвление цены не путает как macd-ки и  stochastc-ки там всякие.... В общем что импонирует что всегда позиция в сторону тренда открыта...

на некоторых периодах не плохо зарабатывает даже,

 с

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

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