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

 
mytarmailS:
уже делал так, нейросеть не учиться на большем горизонте с той целевой что я ей задал

Я улыбаюсь с ваших слов.

Это не нейросеть не учится, а вы ее заставляете не учиться, буквально. Нейросеть будет учиться там, где кроме шумов есть еще и сигнал, а ваша задача энтот сигнал выделить из шума с помощью Великой Нейросети, не дав ей ПЕРЕобучиться.

 
Alexey Burnakov:
Вот это более правильный ответ ) Надо попробовать разные методы.

Уж как-то предлагал такой подход.

Берем советник, можно из кодобазы. Главное чтоб был полнокровный и не важно если сливает. Можно выдвинуть предварительные требования. Например: трендовый, три окна, без SL и ТР, ММ, отработка ошибок состояний... 

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

 
Alexey Burnakov:

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

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

Было интересно прочитать, спасибо за труд. Я не понял про эксперимент 6 - почему в итоге были отобраны предикторы Y и Z? Z это ведь целевая переменная, её не должно было быть в списке предикторов.

Понравилась идея взять 3D график кролика и обучить модель на этом. Если честно, сначала я считал что "кролик" - это некий набор псевдослучайных данных, которые красиво выглядят на графике и имеют смысл только для человека с его способностью увидеть кролика в массиве чисел. Но нету такой функции которая бы описала кролика, для любой модели это будет просто набор точек, которые образуют скопления особой формы в 3-d пространтсве. С моей точки зрения все три координаты каждой точки не имеют между собой никаких связей и зависимостей, я ожидал что ни один алгоритм не справится. В конце статьи был удивлён.

Попробовал провести тот-же эксперимент с PCA, результаты такие:
Необходима одна компонента для точности 95%, в ней используются X и Y. Но алгоритм предсказания не работает с одной компонентой, нужно взять хотябы две. В общем-то они обе используют X и Y (в коде это не выводится, но это видно из графика), так что всё ок.
Обучить модель на sampleA, потом предсказать Z для sampleA : R^2 = 0.04759303
Обучить модель на sampleA, предсказать Z для sampleB:   R^2 = 0.05325888

Нарисовал 3d график предсказанных Z для sampleB, вышло плохо. Модель реально не нашла каких-то зависимостей, а просто усреднила всё Z в одну плоскость. Кролик вышел плоский. Вы пробовали обучать какие-то модели, и рисовать предсказанного кролика? Интересно как это получается у разных моделей.

Приложил код для кролика и y-aware pca. Есть небольшой косяк, график лоадингов предикторов почему-то сортирует компоненты. Тоесть они идут 1,10,11,12,2,3,4,5,... а в порядке важности нужно смотреть в такой последовательности: PC1, PC2, PC3,...

 

Файлы:
bunny_pca.txt  5 kb
 
mytarmailS:
уже делал так, нейросеть не учиться на большем горизонте с той целевой что я ей задал

Я ещё не пробовал обучать нейронку дальше одного бара, но полагаю что принцип будет тот-же. Я с ней работаю так:

1) собрать как можно больше исходных данных из mt5 - ohlc, время, индикаторы. Поскольку я не знаю что именно полезно, а что нет, я беру всё и пытаюсь отсеять мусор. Передавать всё в нейронку нельзя, потому что нейронка переобучается на мусоре и в таком случае ошибается во фронттесте. Отсеять мусор непросто, в общем-то все 28 страниц этой темы и посвящены тому как это сделать, и до сих пор всё неоднозначно. Добавляю к данным целевую переменную - 0 или 1 в зависимости от падения/роста цены за следующий бар.

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

3) Допустим, мусор отсеян. Теперь пора обучить нейронку. Я использую пакет nnet из R, там есть плюсы в виде отсутствия всяких гиперпараметров вроде скорости обучения, ускорений, торможений, типов обучающих функий. Меньше гиперпараметров - меньше проблем. Обучать нужно с кросс-валидацией. Я беру исходную таблицу, и делю её по строкам на три в отношении 70%/15%/15% (новые таблицы называются train/test/validate) (код можно взять из лога rattle, я с этого и начинал). Далее делаю например 10 итераций обучения нейронки на таблице  train. Считаю ошибку прогноза R^2. Прогнозирую результаты для таблиц test и validate, считаю R^2 для них тоже. Делаю ещё 10 итераций обучения, повторяю прогноз для 3 таблиц, смотрю на новые R^2. Остановить обучение нужно в тот момент, когда R^2 на какой-то из таблиц начнёт падать (он всегда будет расти только на таблице train). Готово. Теперь всё это можно повторить сначала, используя другое количество скрытых нейронов, и другое количество итераций обучения между кросс-валидациями, в надежде что минимальный R^2 трёх аблиц в конце будет больше, чем в прошлый раз.

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

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

Это хорошо, что не обучилась, потому как учите на шуме. А вот если бы обучилась, да грааль, да на реал....

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

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

 1) В лучшем случае что делается вами это отбор лучших 10 индикаторов из 100 возможных по каким то критериям, а у индикатора есть диапазон значений скажем 100 из этих 100 значений только 3 работают да и то не всегда а  в определенных ситуациях  вот только эти 3 значения и есть не шум и только их и надо оставлять а не весь индикатор потому что остальные значения тот же шум, так что все эти ваши отсевы качественно не глубоки а значит и мало эффективны 

 2)Далее,  есть такое понятие как противоречивость признаков, например берем цену она объективна и не противоречива то есть  если цена растет то она растет и второго тут не дано (если отбросить нюансы с силой тренда итп), берем тот же стохастик он может принять значение 90 и когда флет и когда тренд вверх и когда тренд вниз , то есть  этот индикатор не только ничем не помогает  сети он наоборот постоянно путает ее потому что его показания противоречивы так что обычные индикаторы для рынка не применимы, а вы об этом даже не думаете  просто забрасываете все что попало да побольше, а потом еще мне про шумы говорите

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

 
Dr.Trader:

Было интересно прочитать, спасибо за труд. Я не понял про эксперимент 6 - почему в итоге были отобраны предикторы Y и Z? Z это ведь целевая переменная, её не должно было быть в списке предикторов.

Понравилась идея взять 3D график кролика и обучить модель на этом. Если честно, сначала я считал что "кролик" - это некий набор псевдослучайных данных, которые красиво выглядят на графике и имеют смысл только для человека с его способностью увидеть кролика в массиве чисел. Но нету такой функции которая бы описала кролика, для любой модели это будет просто набор точек, которые образуют скопления особой формы в 3-d пространтсве. С моей точки зрения все три координаты каждой точки не имеют между собой никаких связей и зависимостей, я ожидал что ни один алгоритм не справится. В конце статьи был удивлён.

Попробовал провести тот-же эксперимент с PCA, результаты такие:
Необходима одна компонента для точности 95%, в ней используются X и Y. Но алгоритм предсказания не работает с одной компонентой, нужно взять хотябы две. В общем-то они обе используют X и Y (в коде это не выводится, но это видно из графика), так что всё ок.
Обучить модель на sampleA, потом предсказать Z для sampleA : R^2 = 0.04759303
Обучить модель на sampleA, предсказать Z для sampleB:   R^2 = 0.05325888

Нарисовал 3d график предсказанных Z для sampleB, вышло плохо. Модель реально не нашла каких-то зависимостей, а просто усреднила всё Z в одну плоскость. Кролик вышел плоский. Вы пробовали обучать какие-то модели, и рисовать предсказанного кролика? Интересно как это получается у разных моделей.

Приложил код для кролика и y-aware pca. Есть небольшой косяк, график лоадингов предикторов почему-то сортирует компоненты. Тоесть они идут 1,10,11,12,2,3,4,5,... а в порядке важности нужно смотреть в такой последовательности: PC1, PC2, PC3,...

 

Так, у вас в главные компоненты попали X и Y? Это было бы важно понять.

 

Второе, про аппроксимацию кролика. Конечно, так и должно быть! Это же линейная модель. Она просто проведет плоскость (если X и Y) немного с наклоном, либо линию (если один предиктор). Вот и вся линейная модель кролика ) Вот именно поэтому я стараюсь использовать нелинейные модели.

 

Вот так получается восстановить кролика другим методом (на основе дискретных величин). 

 
Alexey Burnakov:

Так, у вас в главные компоненты попали X и Y? Это было бы важно понять.

Да, только X и Y. Как это сделать через код я ещё не нашёл, все статьи про это оперируют графиками. Количество компонент которые нужно брать - можно посмотреть в переменной componentsToUse. В данном случае componentsToUse = 2, тоесть нужно взять только те предикторы, у которых на графике для PC1 и PC2 широкие горизонтальные линии.

В том графике выше нужно посмотреть на колонки PC1 и PC2 (первая и вторая главные компоненты), и далее на зелёные горизонтальные линии. Если линия уходит в сторону от 0 (неважно в плюс или в минус) - значит этот предиктор используется в соответсвующей главной компоненте. В PC1 используется y_clean ("_clean" автоматически добавлено при шкалированнии данных, чтобы не путать с оригнальным предиктором), в PC2 используется x_clean. Это и есть результат анализа PCA компонент - нужно взять x_clean и y_clean.

Если двигаться дальше, то в PC3 использовался бы input_noise_3_clean. Это просто для примера, PC3 в данном случае брать не нужно.

Тут всё очень хорошо получилось на самом деле. X и Y чётко выделяются на графике. Я ранее выкладывал такой-же график для форекса, там например всё плохо. 

 
Dr.Trader:

Да, только X и Y. Как это сделать через код я ещё не нашёл, все статьи про это оперируют графиками. Количество компонент которые нужно брать - можно посмотреть в переменной componentsToUse. В данном случае componentsToUse = 2, тоесть нужно взять только те предикторы, у которых на графике для PC1 и PC2 широкие горизонтальные линии.

В том графике выше нужно посмотреть на колонки PC1 и PC2 (первая и вторая главные компоненты), и далее на зелёные горизонтальные линии. Если линия уходит далеко от 0 (неважно в плюс или в минус) - значит этот предиктор используется в соответсвующей главной компоненте. В PC1 используется y_clean ("_clean" автоматически добавлено при шкалированнии данных, чтобы не путать с оригнальным предиктором), в PC2 используется x_clean.

Если двигаться дальше, то в PC3 использовался бы input_noise_3_clean. Это просто для примера, PC3 в данном случае брать не нужно.

Тут всё очень хорошо получилось на самом деле. X и Y чётко выделяются на графике. Я ранее выкладывал такой-же график для форекса, там например всё плохо. 

Отбор предикторов здесь получился через линейный метод. Ну, я рад, что вы удивились. Значит, что-то новое увидели )
 
Dr.Trader:

Я ещё не пробовал обучать нейронку дальше одного бара, но полагаю что принцип будет тот-же. Я с ней работаю так:

1) собрать как можно больше исходных данных из mt5 - ohlc, время, индикаторы. Поскольку я не знаю что именно полезно, а что нет, я беру всё и пытаюсь отсеять мусор. Передавать всё в нейронку нельзя, потому что нейронка переобучается на мусоре и в таком случае ошибается во фронттесте. Отсеять мусор непросто, в общем-то все 28 страниц этой темы и посвящены тому как это сделать, и до сих пор всё неоднозначно. Добавляю к данным целевую переменную - 0 или 1 в зависимости от падения/роста цены за следующий бар.

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

3) Допустим, мусор отсеян. Теперь пора обучить нейронку. Я использую пакет nnet из R, там есть плюсы в виде отсутствия всяких гиперпараметров вроде скорости обучения, ускорений, торможений, типов обучающих функий. Меньше гиперпараметров - меньше проблем. Обучать нужно с кросс-валидацией. Я беру исходную таблицу, и делю её по строкам на три в отношении 70%/15%/15% (новые таблицы называются train/test/validate) (код можно взять из лога rattle, я с этого и начинал). Далее делаю например 10 итераций обучения нейронки на таблице  train. Считаю ошибку прогноза R^2. Прогнозирую результаты для таблиц test и validate, считаю R^2 для них тоже. Делаю ещё 10 итераций обучения, повторяю прогноз для 3 таблиц, смотрю на новые R^2. Остановить обучение нужно в тот момент, когда R^2 на какой-то из таблиц начнёт падать (он всегда будет расти только на таблице train). Готово. Теперь всё это можно повторить сначала, используя другое количество скрытых нейронов, и другое количество итераций обучения между кросс-валидациями, в надежде что минимальный R^2 трёх аблиц в конце будет больше, чем в прошлый раз.

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

У меня другая точка зрения и Вы ее не понимаете
 

СанСаныч Фоменко:
 А если взять первые 10 (вроде) до ступени, а остальные отбросить? 

 Нарисовал график зависимости R^2 и процента выигрышных случаев от числа используемых компонент. Самый лучший результат на фронттесте был при 41 компоненте (выигрыш где-то 70%, очень хорошо). Но из бэктест графиков это не узнать, они просто всё время растут. Если опираться на важность компонент, то надо было бы брать 73, что не самый лучший результат во фронттесте.

R^2 фронттеста может быть отрицательным даже при выигрыше в >50% случаев, из-за несбалансированных требуемых результатов, количество классов "0" отличается от "1", поэтому их среднее не 0.5, и R^2 от этого немного хуже. 

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