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

 
Aleksey Vyazmikin #:

А для кого это новое - я использую подобные предикторы уже не первый год.

Тут сразу возникает вопрос правильной настройки ZZ.

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

 
vladavd #:

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

В замыленном старом можно увидеть новое, но все на это способны.)

 
vladavd #:

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

Это далеко не всё, что Вы видите.

Это только 5% дозволенного.))

lynxntech #:

это как последнее слово и гамбургер)

всегда надо давать возможность оправдать себя

 

Всем привет!

Может кто-то сможет подсказать. Я пытаюсь прогнозировать направление движение валютной пары на день (вверх или вниз), применяя модель "DecisionTreeClassifier".

Для прогноза беру всего 5 предикторов, результат прогноза тренд восходящий (1) или нисходящий (-1). Размер датасета: 999 строк и 6 столбцов (датасет прилагаю).

Но столкнулся с проблемой, когда увеличивая "max_depth"  растет все время точность на обучающей и тестовых выборках одновременно. Точность на тестовой выборке перестает расти и становится константой при max_depth=22, равной 0.780000. Результаты  при различных значениях max_depth:


1) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=3)

Accuaracy on training set: 0.539424 Accuaracy on test set: 0.565000

2) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=5)

Accuaracy on training set: 0.579474 Accuaracy on test set: 0.585000

3) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=7)

Accuaracy on training set: 0.637046 Accuaracy on test set: 0.640000

4) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=9)

Accuaracy on training set: 0.667084 Accuaracy on test set: 0.700000

5) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=11)

Accuaracy on training set: 0.700876 Accuaracy on test set: 0.710000

6) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=13)

Accuaracy on training set: 0.720901 Accuaracy on test set: 0.720000

7) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=15)

Accuaracy on training set: 0.734668 Accuaracy on test set: 0.740000

8) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=17)

Accuaracy on training set: 0.747184 Accuaracy on test set: 0.760000

9) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=19)

Accuaracy on training set: 0.755945 Accuaracy on test set: 0.765000

10) clf_20=DecisionTreeClassifier(criterion='entropy', max_depth=22)

Accuaracy on training set: 0.760951 Accuaracy on test set: 0.780000


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

Я не понимаю в такой ситуации, какую глубину дерева решений выбрать или какую модель даже и вообще стоит ли дальше работать в этом направлении, может чего-то не хватает (но, вроде, датасет не 100 строк же), можно ли еще добавить предикторов и сколько еще можно при таком размере датасета (я бы еще штуки 2-5 добавил).

Код простой, также прилагаю его совместно с датасетом:



 
Elvin Nasirov #:

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

Я не понимаю в такой ситуации, какую глубину дерева решений выбрать или какую модель даже и вообще стоит ли дальше работать в этом направлении, может чего-то не хватает (но, вроде, датасет не 100 строк же), можно ли еще добавить предикторов и сколько еще можно при таком размере датасета (я бы еще штуки 2-5 добавил).

Код простой, также прилагаю его совместно с датасетом:

Здравствуйте.

Больше число сплитов - больший объем памяти = риск выучить выборку.

Я в питоне не разбираюсь, но:

1. Попробуйте разделить выборку без перемешивания.

2. Всё же мне кажется, что Вы обучаетесь на всей выборке, а не на уменьшенной.

 
Aleksey Vyazmikin #:

Здравствуйте.

Больше число сплитов - больший объем памяти = риск выучить выборку.

Я в питоне не разбираюсь, но:

1. Попробуйте разделить выборку без перемешивания.

2. Всё же мне кажется, что Вы обучаетесь на всей выборке, а не на уменьшенной.

Спасибо! Кажется, Вы правы.

Я заменил в представленном выше коде "clf_20.fit(X, y)" на "clf_20.fit(X_train, y_train)" и картина изменилась почти на 50/50.

 
Elvin Nasirov #:

Спасибо! Кажется, Вы правы.

Я заменил в представленном выше коде "clf_20.fit(X, y)" на "clf_20.fit(X_train, y_train)" и картина изменилась почти на 50/50.

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

 
Aleksey Vyazmikin #:

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

Появился еще вопрос, если можно.

Получилось, что лучший результат достигается при max_depth=1 и выглядит так:

Accuaracy on training set: 0.515021 Accuaracy on test set: 0.503333

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

То есть ситуация такова, что для каждой комбинации предикторов есть два равносильных варианта движения рынка: вверх или вниз, а значит требуется дополнить датасет чем-нибудь, что могло уточнить при текущей комбинации все же вверх или вниз.

 
Elvin Nasirov #:

Появился еще вопрос, если можно.

Получилось, что лучший результат достигается при max_depth=1 и выглядит так:

Accuaracy on training set: 0.515021 Accuaracy on test set: 0.503333

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

То есть ситуация такова, что для каждой комбинации предикторов есть два равносильных варианта движения рынка: вверх или вниз, а значит требуется дополнить датасет чем-нибудь, что могло уточнить при текущей комбинации все же вверх или вниз.

Первым делом почитайте про другие метрики оценки результатов обучения - Recall (полнота) и Precision (точность), особенно они актуальны при несбалансированной выборки. Стратегия может быть такова, что при одинаковом шансе на правильный и ошибочный результат классификации будет приносить положительный финансовый результат.

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

По мне - выборка слишком мала.

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

Рекомендую попробовать CatBoost для обучения - быстро строит модели и решен вопрос переноса моделей в код для работы в MT5 без костылей.

 
Elvin Nasirov #:

Получилось, что лучший результат достигается при max_depth=1 и выглядит так:

Accuaracy on training set: 0.515021 Accuaracy on test set: 0.503333

Тоже часто вижу, что лучший результат при глубине=1, что означает, что сделан всего 1 сплит по одной из фич. Дальнейшее деление дерева приводит к переобучению на трейне и ухудшению результатов на тесте.