Марат
Марат личный блог
12 ноября 2019, 17:34

Практическое использование RF на российском фондовом рынке.

Так как  насчет практического применения 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 на российском фондовом рынке.

Чем коричневей тем больше вероятность падения, чем синей — роста. Ну это так, если вы не хотите использовать 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-ы», а я по сути даже не начинал. 

34 Комментария
  • matroskin
    12 ноября 2019, 17:36
    ядрена кочерыжка… и как тут с вами по машкам и фибо торговать то...
  • kolinkor
    12 ноября 2019, 18:09

    хорош! продолжай писать. Вот на позапрошлой конфе смарт лаба один господин тоже утверждал, что xgboost — вещь. Михаил Шумихин фамилия его — confa.smart-lab.ru/20190427

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

    • matroskin
      12 ноября 2019, 18:19
      kolinkor, пишет хорошо))))только не для моего среднего ума)блин бывают же люди гениальные))
  • Тимофей Мартынов
    12 ноября 2019, 18:47
    блин, что такое RF и ML?
    • bstone
      12 ноября 2019, 19:12
      Тимофей Мартынов, это компетенции :)
  • CloseToAlgoTrading
    12 ноября 2019, 19:07
    Одно правда, фичи это в общем главное. 
    но что то фичи так себе получились судя таблички важности.
  • day0markets.ru
    12 ноября 2019, 19:30
    судя по названиям у тебя много коррелирующих фич. На обучение RF это особо не влияет, но немного замедляет само обучение и снижает стабильность дерева.
  • ivanov petya
    12 ноября 2019, 20:32
    дерево решений помогает?))я как-то пытался анализировать ленту, присваивая 1 и 0, не дошёл до завершения своей мысли… а чтобы объеденить несколько методов-это очень сложно?? например компьютерное зрение с глубоким обучением или что-то в этом духе?? вообще интересует глубокое обучение с подкреплением… но подозреваю там уж очень много математики и строк кода)
  • dt0wer
    12 ноября 2019, 20:37
    какая каппа? На реальных трейдах работает?
  • Vladimir Diaditchev
    12 ноября 2019, 20:42
    Вопрос, что такое tHigh%, wdif, s_Min10. Согласен, что многое зависит от входных данных. Пробовал деревья решений в R, с другими входными данными: значениями нескольких индикаторов ТА. Не впечатлило, тк данных было мало и они коррелирую сильно.
  • Oerlikonium
    12 ноября 2019, 20:43
    Деревья — это хорошо! Фиче инжиниринг — тоже!
    Но наше всё — правильный _таргет_ )
    • Replikant_mih
      13 ноября 2019, 08:08
      oerlikon, А что в ML в трейдинге входит в список правильный target?)
      • Oerlikonium
        13 ноября 2019, 11:40
        Replikant_mih, такой таргет, который поможет тебе для открытия и закрытия сделок. ML даёт только эдж в моменте, а как ты им будешь пользоваться для выставления конкретных ордеров в стакан — ну вот от этого и пляши )
        • Replikant_mih
          13 ноября 2019, 11:47

          oerlikon, >>«такой таргет, который поможет тебе для открытия и закрытия сделок»

           

          Ну, теоретическую часть вопроса я и так понимаю)).

          У меня есть некоторые идеи по поводу таргета, но было бы интересны и со стороны идеи послушать.

          • Oerlikonium
            13 ноября 2019, 12:00
            Replikant_mih, просто нет универсального ответа так правильно а так неправильно. Обученная моделька — возможно и не одна — это только часть торговой системы, и что у неё должно быть на входе и что на выходе, зависит от того что нужно остальным частям для выставления конкретных заявок. Чудес тут не бывает типа «предсказываем цвет следующей свечи» ))
            • Replikant_mih
              13 ноября 2019, 12:01
              oerlikon, Да, полностью согласен!)
    • akuloff
      13 ноября 2019, 09:14
      oerlikon, нет деревья это не очень, список фич в одной записи для дерева — это весь мир, деревья экстраполировать не умеют, и памяти нет. Тут лучше нейронки типа LSTM, потому как одна и та же формация фич должна рассматриваться в контексте окружения (в данном случае память в LSTM как-то может этот контекст сохранить).
      • Oerlikonium
        13 ноября 2019, 11:04
        akuloff, может нейронки и лучше, вариантов много. Что мешает засунуть «контекст окружения» в список фич?
        • akuloff
          13 ноября 2019, 11:17
          oerlikon, мешает то что заранее неизвестно какой глубины и каким фичам из «прошлого» какой вес придавать в качестве контекста, LSTM теоретически могут этому обучиться по ходу
          • Oerlikonium
            13 ноября 2019, 11:38
            akuloff, ну, тут придётся немного подумать, да. С нейронками такая проблема, что им чтобы самим до чего-то дотумкать, нужно много-много данных, которых на рынке просто нет. Это котиков можно нафоткать миллион, а рыночные данные они только те что есть. Так что теоретически то может и можно, а на практике — как минимум тяжело.
            • Replikant_mih
              13 ноября 2019, 12:00

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

               

              Не понимаю в общем).

              • Oerlikonium
                13 ноября 2019, 12:14
                Replikant_mih, просто тебе нужно больше знаний и практики )
                • Replikant_mih
                  13 ноября 2019, 12:15
                  oerlikon, а если чуть предметней?)
                  • Oerlikonium
                    13 ноября 2019, 13:03
                    Replikant_mih, ну самое главное — понять для себя где у тебя границы твоего понимания ) Вот у тебя есть материальное выражение твоего понимания — торговая система, ну или прототип или заготовка. Надо хорошо понимать, почему она написана именно так, а не иначе, буквально каждый конкретный кусочек и этап — почему он должен быть именно здесь и именно такой. Если ты пользуешь сторонние библиотеки для ML — надо тоже знать досконально как работает тот или иной алгоритм который ты используешь оттуда, и желательно не в теории (что обязательно) а и посмотреть на конкретный код как что реализовано (и тоже понять подходит тебе так или нет и может быть надо подправить). Ну и т д )
                    • Replikant_mih
                      13 ноября 2019, 13:34
                      oerlikon, Слегка абстрактная и размытая, но мудрость)).
  • Ынвестор
    12 ноября 2019, 21:48
    То что он на train показал вообще не важно. Деревья умеют подгонять что угодно. А нам не подгонка нужна а работающие закономерности. В sklearn есть GradientBoosting. Это тот же xgboost только попроще. Но по-любому будет лучше random forest. Ну и с вашими параметрами вряд ли он вообще чего-то рабочее найдет.
    • SergeyJu
      13 ноября 2019, 11:59
      Ынвестор, ну так и бустинг умеет подгонять все что угодно. И глубокое обучение. 
      Почему пишут, что все решают фичи и я с этими авторами согласен? Потому, что мы вынуждены, из-за переподгонки, ограничивать число степеней свободы любого метода. Например, если брать RF с глубиной деревьев не более трех, то на плохих фичах ничего путного не будет. Но на этих же плохих фичах с глубиной в сотню — переподгоним все! 
      • Ынвестор
        13 ноября 2019, 13:33
        SergeyJu, умеют. Поэтому и не понял зачем автор вообще смотрит на то что они там наподгоняли.
  • Replikant_mih
    13 ноября 2019, 08:12

     Да, если правильно подойти, думаю, можно что-то нарыть).

     

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

  • ch5oh
    13 ноября 2019, 12:44

    Стесняюсь спросить, что Вы используете для этого?

    Питон 3.6 + Керас + Тензорфло?

    • Ынвестор
      13 ноября 2019, 13:32
      ch5oh, Тензорфло это ваще-то нейросети. А Керас по сути надстройка над Тензорфло. А автор про случайные деревья пишет. Библиотека sklearn.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн