Блог им. afecn19
Так как насчет практического применения ML? Как вообще это выглядит?!
А выглядит это так, что 80% времени data scientist тратит на работу с данными, чтобы потом загнав их в модельку мобильно получить прогноз. Вообще, предполагалось что такой мощный инструмент как нейросети сможет работать с сырыми данными, то есть загонишь в нейросеть обычную котировку, а дальше могучие нейроны похимичат, сгенерируют кучу фичей и найдут нужную их комбинацию (на самом деле никаких фичей нейросети на создают, но можно представить). Ну вот например такое явление как большой ГЭП, важный показатель? Еще какой! В сырых данных он содержится, то есть можно помечтать что если мы создадим очень сложную нейросеть, то она сможет вытащить это значение самостоятельно. Что такое ГЭП нейросеть конечно не знает, но путем манипуляций с весами она найдет, что когда меняется циферка в дате то образовавшийся большой разрыв в цене имеет большое влияние для хорошей аппроксимации.
Мечты, мечты. Пока все что я видел в результате скармливания нейросети сырах данных-это слезы, боль и убожество. В общем мы пойдет другим путем. Мы не будет скармливать модели сырятину и мусор, мы постараемся кормить его качественно чтобы удои увеличивались и все такое.
Есть такое понятие как в ML как feature engenering. Наверно единственное более менее креативное что остается человеку в этом бездушном мире машинного обучения. А уж коли мы ведем речь о RF, то сам бог велел заняться этим, RF знаете ли не нейросети, там даже теоретически сырятина в данных не приветствуется. Вот этим мы и займемся.
Откуда же нам взять эти фичи и главное как? Тут каждому воля вольная. Например можно сдув пыль с WealthLab использовать старичка как генератора фичей. Кто не знает в него вшито около полусотни известных индексов и еще столько же, но с неизвестным кодом. А еще можно запрограммировать свои фичи. По своему «знанию и разумению», своих «знаний и разумений» я накопил много, но почти все они из разряда «все эти технические индикаторы не стоят ничего». Зато кое что из своего показали свою небезнадежность. В общем на первый случай я сгенерировал около 17 своих фичей, затем ранжировал их для каждой стоки, итого 34 фичи. Стоки брал из числа 20 самых ликвидных отечественных фишек с 2010 года по март 2018, что дало 50 тысяч дневных наблюдений. Прямо сказать не густо, но что есть. Тем более речь идет о демонстрации силушки RF.
Вот набор моих фичей:
Week 49303 non-null int64 GEP 49303 non-null float64 Min10 49303 non-null float64 Cl/High 49303 non-null float64 Cl/Low 49303 non-null float64 Cl/w_High 49303 non-null float64 Cl/w_Low 49303 non-null float64 wdif 49303 non-null float64 dif 49303 non-null float64 Vol20/Vol200 49303 non-null float64 tHigh% 49303 non-null float64 tLow% 49303 non-null float64 tHigh%-tLow% 49303 non-null float64 Cl/SMA21 49303 non-null float64 Cl/SMA5 49303 non-null float64 SMA5-SMA21 49303 non-null float64 Cl/(minSMA) 49303 non-null float64 Cl/(maxSMA) 49303 non-null float64 l_Min10 49303 non-null int64 s_Min10 49303 non-null int64 l_gep 49303 non-null int64 s_gep 49303 non-null int64 l_cl/high 49303 non-null int64 s_cl/high 49303 non-null int64 l_cl/low 49303 non-null int64 s_cl/low 49303 non-null int64 l_wdif 49303 non-null int64 s_wdif 49303 non-null int64 l_SMA5-SMA21 49303 non-null int64 S_SMA5-SMA21 49303 non-null int64 L_Cl/(maxSMA) 49303 non-null int64 S_Cl/(maxSMA) 49303 non-null int64 L-tHigh%-tLow% 49303 non-null int64 S_tHigh%-tLow% 49303 non-null int64
Вот настройки моего RF:
model = RandomForestClassifier(n_estimators=10, max_features = 3, random_state=1, min_samples_leaf=100, criterion='gini', min_weight_fraction_leaf=0.0, max_depth = 3)
Если попробовать перевести это на человеческий язык, то я как бы предложил RF сформировать 10 стратегий, в каждой из которой разбиение осуществляется по 3 фичам. А затем на основе голосования этих 10 стратегий и будет выбран ответ. В качестве ответа движение рынка вверх или вниз. Порог для принятия решения я задал в 55%. То есть когда вероятность события моделью оценивается ниже 55% то мы типа вне рынка, сидим на заборе-курим.
Train период задал нарастающим итогом с 2010 года. То есть для прогноза 2014 год использовал данные за 2010 — 2013 годы, для прогноза 2015 года 2010-2014… для прогноза 2018: 2010-2017. Можно по другому, например если исходить что рынок постоянно меняется то наверное лучше брать не нарастающим итого, а последние несколько лет. Я перепробовал и так и так, определенные выводы сделал, сейчас покажу только нарастающим.
Вот для 2014:
Profit %_ Long Profit_+- count mean Year 2010 324 0.988951 0.638889 2011 397 0.482695 0.634761 2012 229 0.825066 0.668122 2013 225 0.417867 0.577778<strong><br /></strong>2014 446 0.700673 0.515695 2015 431 0.665638 0.582367 2016 327 0.465596 0.581040 2017 293 0.216621 0.569966 2018 53 0.042642 0.490566 <br />Profit %_ Short Profit _+- count mean Year 2010 5 2.820000 0.800000 2013 4 -0.705000 0.000000 2014 2 -3.935000 0.000000 2015 12 0.249167 0.583333 2016 6 0.825000 0.666667 2017 1 -2.190000 0.000000
2010-2013 период на котором тренировал, с 2014 прогнозы. Profit_+-" это то что я аппроксимировал и видно как в Train период он принимает значения за 60% (то есть в 60% случаях он достиг правильной подгонки), а когда уже использовали данные для прогноза то показатель резко падал. Profit_% — средний профит на сделку. Count-число сделок. Видим что для шорта, с порогом в 55%, RF нашел гораздо меньше сделок, чем для лонга.
А вот для периода с 2014-2018 для лонга:
2014<br />count 446.000000 mean 0.700673 2015<br />count 394.000000 mean 0.835178 2016<br />count 213.000000 mean 0.760469 2017<br />count 208.000000 mean 0.468654 2018<br />count 48.000000 mean 0.074375 <br /><br />
А вот пример визуализации почему FR принимает то или иное решение:
Чем коричневей тем больше вероятность падения, чем синей — роста. Ну это так, если вы не хотите использовать RF вслепую, а хотите понимать логику приятия решения.
Кроме того можно получить оценку важности фичей, по влиянию фичи на точность прогноза. Я получил 5 таких оценок, для какого то года оказалась важней один набор фичей, для других — другой. Это к кстати тоже дает поле для анализа.
Например в большинстве случаев наверху оказывались примерно такой набор фичей, циферка справа означает важность:
Min10 0.209 GEP 0.157 Cl/Low 0.078 tLow% 0.072 Cl/High 0.060 tHigh% 0.044 S_tHigh%-tLow% 0.043 Cl/SMA21 0.042 dif 0.037 wdif 0.036 Cl/w_High 0.033 Cl/w_Low 0.028 Vol20/Vol200 0.028 SMA5-SMA21 0.024
Можно к примеру таким образом осуществить перебор важных фичей, отбросив шумовые, получив еще лучшие оценки.
Если взять более сложную модель RF, можно получить что то вроде этого:
2014<br />count 362.000000 mean 1.018564 2015<br />count 225.000000 mean 0.945689 2016<br />count 180.000000 mean 0.742389 2017<br />count 152.00 mean 0.64 2018<br />count 23.000000 mean 0.755217
Извращенцы с каггл «стакают xgboost-ы», а я по сути даже не начинал.
хорош! продолжай писать. Вот на позапрошлой конфе смарт лаба один господин тоже утверждал, что xgboost — вещь. Михаил Шумихин фамилия его — confa.smart-lab.ru/20190427
А мне все лень до этого добраться, уже лет 5 назад как про RF читал. Может статьи твои и замотивируют, спасибо.
но что то фичи так себе получились судя таблички важности.
Но наше всё — правильный _таргет_ )
oerlikon, >>«такой таргет, который поможет тебе для открытия и закрытия сделок»
Ну, теоретическую часть вопроса я и так понимаю)).
У меня есть некоторые идеи по поводу таргета, но было бы интересны и со стороны идеи послушать.
oerlikon, Не первый раз встречаю утверждение о том, что на рынке нет много данных, но каждый раз не понимаю, о чем речь. Десятки бирж, десятки тысяч инструментов, годы и десятилетия исторических данных, сотни тысяч свечей по одному инструменту, кол-во сделок и стаканов — даже не рискну прикидывать порядки цифр), можно придумать миллион фичей, в т.ч. не связанных с ценовой информацией.
Не понимаю в общем).
Почему пишут, что все решают фичи и я с этими авторами согласен? Потому, что мы вынуждены, из-за переподгонки, ограничивать число степеней свободы любого метода. Например, если брать RF с глубиной деревьев не более трех, то на плохих фичах ничего путного не будет. Но на этих же плохих фичах с глубиной в сотню — переподгоним все!
Да, если правильно подойти, думаю, можно что-то нарыть).
Пробовал и сырые загонять (когда только пробовал ML к трейдингу прикручивать) — конечно, ничего не вышло. Сейчас идея нагенерить фич (возможно, основной грааль в том каких и как) и обучить. По идеи отдельные пути — это отдельные паттерны получатся. Ну а дальше оценивать робастность, как-то (пока не знаю как), оценивать переобученность и т.д. Есть в чем покопаться, в общем.
Стесняюсь спросить, что Вы используете для этого?
Питон 3.6 + Керас + Тензорфло?
ch5oh, Керас и Танзерфлоу это для нейросетки. Я использовал Питон + библиотеки xgboost и RandomForestClassifier