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

 
Mihail Marchukajtes:
Не, не ребята, система слилась, показывать даже нет смысла.

Может быть из-за того что я забыл предупредить, что у тернарного классификатора сменилась логика?

У бинарных логика осталась прежняя: если значение на выходе меньше нулевого, то это как 0 в выборке. Если больше, то это как 1 в выборке.

А у тернарного если на выходе: 1 как 1 в выборке, 0 как 0 в выборке, -1 как "-" в jPrediction.

 


сделал для интереса комитет из 8 моделей и смоделировал на валидации последовательности из 4000 сделок (5.5 лет торговли). Это Монте-Карло симуляция для того, чтобы получить представление о возможном размахе роста депозита, без подгонки под начальные точки совершения сделок (что дает прогон в тестере стратегий). Здесь МО на валидации 0.00026 пунктов. Нижний квантиль очевидно выше нуля, что я и хотел получить.

Дальше будет анализ распределения фактора восстановления для этих рядов. 

 

так распределен фактор восстановления. Медиана 3.7 - это типа целевое значение (план). Нижний квантиль тоже неплох..

 

Осталось дождаться прогона обучения еще на 80 тренировочных выборках и сделать комитет побольше. 

 
Yury Reshetov:

Может быть из-за того что я забыл предупредить, что у тернарного классификатора сменилась логика?

У бинарных логика осталась прежняя: если значение на выходе меньше нулевого, то это как 0 в выборке. Если больше, то это как 1 в выборке.

А у тернарного если на выходе: 1 как 1 в выборке, 0 как 0 в выборке, -1 как "-" в jPrediction.

YНе это я понял, с этим всё в порядке.... Тут дело в другом. Дело в том что Оптимизатор очень хорош для поиска данных содержащих информацию о выходе. После того как данные найдены с обобщением выше 80%. То их, эти данные, можно с успехом испоьзовать в любых других топологиях сетей и результат обучения будет на высоте, без переобучения и т.д.  Это для тех кто не хочет использовать оптимизатор непосредственно в торговле. В моем же случае получилось что данные которые использовались для классификации выхода оказались не совсем удачные, поэтому и результат торговли за пятницу получился немного не тот что хотелось бы. Однако, я не стал угрюмить и нашёл другой набор предиктов, который, при неоднократном построении модели не приводил к состоянию мусора на входе и на выходе....... так или иначе вот несколько рекомендаций, для использования классификатора, как умного фильтра сигналов вашей ТС (не прогноз).

1.  Разделить отдельно сигналы бай и селл. Если используете данные предыдущих значение и такое разделение сбивает порядок данных, то обязательно одним из предиктов должен быть признак сигнала. Бай=1, Селл=-1 То есть один из предиктов будет направление сигнала.

2.  Предикты должны быть коим образом связанны с системой прогнозирования. У меня это Zscore сигнала, Kelli сигнала, Порядок сигнала (система не переворотная, поэтому могут быть подряд несколько сигналов в одну сторону). Вообщем та информация, которая коим образом относится к системе. Можно даже взять моментум, отдельно в оптимизаторе МТ4 подобрал параметра который на тестовом периоде выдает прибыль, торгуя по сигналам системы. То есть моментум оптимизирован под сигналы системы на участке тренировки и т.д.

3. Выход. Это самая главная часть, потмоу как у меня выход 100 пипсов прибыли давал 50% обобщения, а изменил на 10 пипсов и обобщение выросло до 65%. это говорит о том что выход должен быть адекватный. В ТС Демарка это достаточно сложно сделать. нередко приходится просматривать в ручную потому как формализация подхода в данном случае не проходит.......И в тренировочном участке лучше допустить ошибки в сигналах, но при этом получить модель с высоким уровнем обобщения. Скажем в тренировке сигнал заработал 100 пипсов, а мы всё равно пометили его как 0, потому как рынок был предрасположен к обратной стороне сигнала. Тоесть мы заведомо даём ТС проиграть, для того чтобы повысить уровень обобщения и тем самым заставить ТС в будущем работать лучше. Ведь наш выход является идиальным, ну пусть он будет чуток не идиальным, но зато корректным....

4. Используйте в предиктах объёмы торгов с СМЕ. Это реально работает и повышает уровень обобщения модели ЗНАЧИТЕЛЬНО...... Я беру с кластер дельты, так что как то так..... 

 
Alexey Burnakov:

Это Монте-Карло симуляция для того, чтобы получить представление о возможном размахе роста депозита, без подгонки под начальные точки совершения сделок (что дает прогон в тестере стратегий).

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

 

Моя вторая попытка (регрессия, округлённая к [0;0.5;1]) на ваших данных у меня закончилась неудовлетворительно. Модель и генетика опять выбрали вариант с константным классом "не торговать".
Видимо, для предсказания трёх классов нейронке нужно обязательно иметь 3 выхода, иначе она не в состоянии уместить три класса в один выход с уровнями. Или мне нужно было сразу убрать класс "не торговать", оставить два, и работать с ними.

Что бы хоть как-то хоть что-то проверить на фронттесте я взял список предикторов выбранных генетикой, обучил на них нейронку (всё как надо, с тремя выходами, и с factor на входе) через caret c кроссвалидациями (method = "repeatedcv"). Получилось так себе, точность даже на тренировочных данных всего 40%.
Я только сейчас заметил что валидационный файл имеет на выходах не классы а действительные числа. Я их просто заменил на +1 для всех положительных, и -1 для всех отрицательных.
Далее, получил две точности для фронттеста:
1) учитывая что при предсказании=0 модель торговать не должна, то правильный результат не имеет значения, ведь сделка открыта не будет и не повлияет на итоговую статистику. В таком случае предсказания -1 и 1 верны в 51% случаев (игнорируя все примеры где предсказание=0).
2) взять все предсказания, сравнить со всеми правильными результатами. В таком случае точность = 14%, даже хуже рандома.

Мне интересно какой будет результат торговли модели в вашем эмуляторе торговли, вы могли бы пожалуйста сделать график как выше, но торгуя с моделью которую я приатачил?
RData файл получился слишком большой, форум его не принял сразу. Я сделал два винрар архива, и их по отдельности положил в zip архивы. Нужно извлечь оба зип архива, потом открыть первый рар архив, извлечь данные, второй рар архив подцепится самостоятельно главное чтобы они были в одной папке.
Или можно запусить приатаченный r скрипт, он содержит список отобранных предикторов, и сгенерирует модель с ними. Нужно иметь тот оригинальный csv файл что вы выкладывали, он используется.
Этот же скрипт можно запустить после открытия RData из атачмента, скрипт возьмёт уже готовую модель вместо создания новой, в коде пример предсказания и оценки точности. Для фронттеста нужен выложенный вами ранее RData файл.

 

Учитывая прошлые ошибки, начинаю третью попытку. 

 
Dr.Trader:

1) учитывая что при предсказании=0 модель торговать не должна, то правильный результат не имеет значения, ведь сделка открыта не будет и не повлияет на итоговую статистику. В таком случае предсказания -1 и 1 верны в 51% случаев (игнорируя все примеры где предсказание=0).

За неверный ответ я начислял -2 балла, за отсутствие ответа -1, за верный ответ 1. Пропорцию полученных баллов за ответы можно менять в ту или иную сторону, но важно что бы сеть не филонила по понапрасну, поэтому нужно наказывать за "воздержался".

Комитет из двух сетей, каждая из которых давала 1 сигнал, -1 (или 0) отсутствие сигнала, если сигналы противоречили, то итоговый сигнал 0. Таким образов сигналы от сетей сводил в общий сигнал [-1, 0, 1].  

 

Dr.Trader:

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

 


Да, конечно, можете быть железно уверенны. Это именно валидация. Просто последовательности сделок составлены по принципу случайной выборки из большого объема наблюдений. Монте-Карло нужно для того, чтобы понять где может оказаться кривая торговли. Любое смещение сделок на неск.минут в ту или иную сторону генерирует свои кривые. В тестере МТ я вижу одну кривую - одну реализацию. Если я встрою условие с генератором случайных чисел на каждом обсчете и буду открываться с учетом случайного числа, то я могу запустить 500 раз тестер стратегий и получить такие же кривые. Но в МТ это будет долго. А мне нужно за 30 секунд.

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

 
Dr.Trader:


Мне интересно какой будет результат торговли модели в вашем эмуляторе торговли, вы могли бы пожалуйста сделать график как выше, но торгуя с моделью которую я приатачил?
RData файл получился слишком большой, форум его не принял сразу. Я сделал два винрар архива, и их по отдельности положил в zip архивы. Нужно извлечь оба зип архива, потом открыть первый рар архив, извлечь данные, второй рар архив подцепится самостоятельно главное чтобы они были в одной папке.
Или можно запусить приатаченный r скрипт, он содержит список отобранных предикторов, и сгенерирует модель с ними. Нужно иметь тот оригинальный csv файл что вы выкладывали, он используется.
Этот же скрипт можно запустить после открытия RData из атачмента, скрипт возьмёт уже готовую модель вместо создания новой, в коде пример предсказания и оценки точности. Для фронттеста нужен выложенный вами ранее RData файл.

 

Учитывая прошлые ошибки, начинаю третью попытку. 

А вы какую модель учите, Нейронную сеть?

Давайте я попозже попробую это сделать. У меня круглосуточно модель учится на всех ядрах.

А вообще, я думал вы сами оцените. Просто подставьте в валидационный файл, который я давал по ссылке,  предсказания модели. Это должны быть направления вида +1 / -1 / 0. Будет новая колонка prediction. Перемножьте столбец с предсказаниями на целевую колонку. Вычесть 0.0001 спред. Удалите записи, где выход модели 0. Возьмите функцию cumsum:

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

 Грубо это будет график торговли по всем наблюдениям и подсчет МО. Это просто.

 
Alexey Burnakov:

А вы какую модель учите, Нейронную сеть?

... 

Перемножьте столбец с предсказаниями на целевую колонку

Да, я нейронную сеть учу, пакет nnet. В данном случае обучаю модель с помощью caret, который подбирает пару параметров модели.

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

Всё понял, спасибо за пояснение, посчитал профит, учёл спред, нарисовал график. Плохо, МО = -2.052423e-05, медленный но верный слив.

Насчёт спреда, его нужно учитывать только в 4 случаях:
1, 2) Прогноз на прошлый бар = 0; прогноз на новый бар = -1 или 1. Открытие новой позиции.
3)  Прогноз на прошлый бар = -1; прогноз на новый бар = 1. Переворот, старая позиция закрывается, новая открывается.
4)  Прогноз на прошлый бар = 1; прогноз на новый бар = -1. Переворот, старая позиция закрывается, новая открывается.
Во всех остальных случаях либо остаётся прошлая позиция с прошлого бара, либо просто закрывается старая позиция, либо вообще никаких позиций. Это всё не требует спреда.

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

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

 
Dr.Trader:

Да, я нейронную сеть учу, пакет nnet. В данном случае обучаю модель с помощью caret, который подбирает пару параметров модели.

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

Всё понял, спасибо за пояснение, посчитал профит, учёл спред, нарисовал график. Плохо, МО = -2.052423e-05, медленный но верный слив.

Насчёт спреда, его нужно учитывать только в 4 случаях:
1, 2) Прогноз на прошлый бар = 0; прогноз на новый бар = -1 или 1. Открытие новой позиции.
3)  Прогноз на прошлый бар = -1; прогноз на новый бар = 1. Переворот, старая позиция закрывается, новая открывается.
4)  Прогноз на прошлый бар = 1; прогноз на новый бар = -1. Переворот, старая позиция закрывается, новая открывается.
Во всех остальных случаях либо остаётся прошлая позиция с прошлого бара, либо просто закрывается старая позиция, либо вообще никаких позиций. Это всё не требует спреда.

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

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

по порядку.

МО - 0,00002. Это уже больше, чем -спред. То есть модель кое-что выучила из шумов, но силы предсказания недостаточно.

Второе. caret с кроссвалидациями. Вы как-то указывали какую часть данных подсовывать в определенный fold? Если просто по умолчанию выбрать CV (repeated CV) модель будет брать случайным образом выбранные наблюдения для теста. Не лучший вариант в случае временных рядов.

Дальше, моделирование торговли. У меня просто сигнал на открытие и закрытие через нное количество минут. А потом уже можно и посложнее сделать. ПОэтому, у меня положительное МО при учете спреда на каждую сделку. И это реально получить.

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

И еще, кроме нейронки, есть масса других методов. Один из лучших на сегодня это либо GBM или XGBOOST. пакеты так и называются. Я выбрал пока первый. Мне нравится. 

 

Я использовал метод "repeatedcv" в trainControl, с разбиением по умолчанию. Недавно я писал код для кроссвалидации сам, пробовал кроссвалидацию и с просто рандомно взятыми барами, и с последовательно взятыми кусками без пропусков. Разницы на фронттесте не видел, в обоих случаях дало примерно одинаковый результат. Я данные для тренировки/кроссвалидации делил 50%/50%, возможно на таком отношении это уже не имеет значение.
Поэкспериментирую с этим в caret...

Я помню в той статье что вы недавно выкладывали, в сравнении лидировал boosted trees с методом Платта (как-то так). Всё что я нашёл в гугле про этот метод - нужно выход модели передать в сигмоиду, и взять её результат. gbm или xgboost такое могут? Такой подход вроде как лучше чем лес, нейронка, и некий "bagged trees", которые идут на втором месте.

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