Блог им. vlad1024

Отдаю грааль в добрые руки

Картинка для затравки, Out of Sample perfomance (то есть результаты получены на выборке на которой не производилось построение модели):
Отдаю грааль в добрые руки

Сбербанк MOEX 15106 трейдов прибыль 140 руб на одну акцию, периодичность трейдов где-то 15 минут, equity где-то за год.
То же самое для Ri, 22237 трейдов прибыль 100000 пунктов на один контракт, или 5 пунктов на трейд, периодичность такая же 15 минут.
Отдаю грааль в добрые руки
Кому не терпится, выложил исходный код с остальными кратинками (каталог ./img) на github.
github.com/xmvlad/stock_trade_datamine

В чем собственно суть подхода. Начну немного из далека, по большому счету, когда вы пишите стратегия в каком ни буть Wealth-Lab или TS-Lab, она по сути состоит из двух частей Факторов (то есть к примеру индикаторов RSI, ADX или еще чего-то более своеобразного) и некоторой Логики которая на основе факторов принимает решения о том какую позицию занимать.

VC-dimensions и проклятие размерности

Основная проблема построения систем в ручную, то что при увиличении факторов написать для них логику принятия решения становится практически нереально. С другой стороны при построении систем часто используют оптимизацию, но как многим хорошо известно при увиличении количества параметров оптимизации In-Sample и Out-Of-Sample перфоманс системы начинает сильно расходится. Но мало кто понимает что на самом деле проблема не в количестве свободных параметров, а в способе которым они находятся. В статистике есть область, которая изучает способы извлечения зависимостей по данным, это область машинного обучения. Так вот, в ней есть интересные результаты, показывающие почему на самом дели для модели построенной на обучающей выборке(In-sample) ее результаты могут сильно отличаться тестовой(Out-of-sample), при условии что обучаем мы ее некоторой стационарной плотности вероятности. И связано оно со способностью модели разделять точки во входном пространстве параметров, и называется эта метрика VC dimensions(Vapnik–Chervonenkis dimension). В чем ее суть, если мы возьме простейшую линейную модель, например логистическую регрессию, то она будет представлять из себя разделяющую плоскость в N-мерном пространстве входных параметров, для конкретности возьмем что N=10. Что это означает, если в обучающей выборке, меньше 10 точек, то мы всегда можем построить плоскость через эти 10 точек и получить великолепную предсказательную способность на обучающей выборке, которая не будет распросраняться на тестовую. Так же очевидно, что если мы взяли 500 точек, и получили для них хорошую предсказательную способность модели, то есть они все лежат в одной плоскости, то чем больше соотношение количество входных точек к размерности модели, тем больше вероятность, что результат обучающей и тестовой выборки будут сближаться (при условии что мы их считаем на одной и той же плотности). Так вот если для линейной модели, хорошо понятно что при размерности N=10 она задает плоскость в 10-мерном пространстве, и чем ближе к этой плоскости лежат точки тем лучше, то для более сложных моделей этот момент неочевиден, VC-размерность по сути являются расширением понятия «размерности модели» на произвольный случай. Так вот возвращаясь к исходному вопросу, в чем проблема оптимизации алгоритмических стратегий путем перебора параметров, в том что при низком фактическом количестве параметров они имеют очень высокую «размерность модели» (VC-размерность), то есть перебирая некоторые параметры(например индикаторов), мы всегда можем разделить «хорошие» точки от «плохих». Это нас приводит к мысли, что проблема ни в самих свободных параметрах, а в способе построения модели, и хорошо бы найти какой-то «средний» вариант, между простотой линеных статистических моделей и стратегиями имеющими высокую VC-размерность. И такой вариант давно найден и используется в области машинного обучения

Decision trees(Дерева принятия решений)

en.wikipedia.org/wiki/Decision_tree

Не буду расписывать подробно, так как можно прочитать в википедии. Но суть в том, что дерева приняти решения примерно эквивалентны той логики которую можно написать на языке программирования с использованием вложенных if условий использующих различные Факторы. Есть различные способы их построения, но все сводятся примерно к следующему, они пытаются апроксимировать входную плотность вероятности. На основе деревьев принятия решений, строятся некоторые более сложные модели например Random Forest(которые и использовались в данной модели), но суть их остаеться той же. Хотя деревья принятия решений и имеют VC-размерность большую, чем у линейных моделей, которая пропорциональна O(n*d), где — n количестов факторов, d — глубина дерева (для линейных моделей O(n)), но все равно она остается достаточно ограниченной, чтобы при наличии достаточного количества данных модель не переобучалась. В общем, можно применять различные модели, главное сохранять баланс между ее «размерностью», описывающей способностью, и количеством входных данных.

Результат

Собственно, если в двух словах, то как получились картинки из начала поста, по 1 минутным данным строилось большое количество факторов, инидикаторы (RSi, ADX), свечные паттерны, полиномиальная апроксимация скользящим окном. Затем на основе факторов, строилась модель Random Forest с жестко ограниченной VC-размерностью, и регуляризацией. Исходный код доступен по ссылке. Торговать это конечно, из-за профитов съедаемых комиссией нельзя, но возможно кому-то будет интересно как пример работающего low-frequency подхода.
★38
43 комментария
для здешней публики нужно последнее предложение сделать первым, а то мозг с непривычки сломают)
Средний доход на сделку (при среднем курсе $ 60 рублей) 6 рублей. А комиссии средние 3,2-4.
avatar
Gospodin, На самом деле она больше, если оптимизировать исполнение, хотя бы держать позицию если она не изменилась и т.д. Но это все равно слишком мало.
avatar

"… большое количество факторов, инидикаторы (RSi, ADX), свечные паттерны, полиномиальная апроксимация скользящим окном" 

в итоге, какие факторы оказались самыми полезными/значимыми? 

avatar
Иван Дворцов, в зависимсоти от инструмента получились разные факторы вот здесь можно посмотреть github.com/xmvlad/stock_trade_datamine/tree/master/img картинки feature_importance.png. Наиболее серьезный буст, дали коэфициенты от кубического полинома, который фитилс скользящим окном
avatar

vlad1024, кубический полином по ценам закрытия??? Интересно!

А сколько точек брали в «окно» для вычисления коэффициентов?

avatar
ch5oh, да, там много вариантво было 25, 50, 100,200, 400 и использовался en.wikipedia.org/wiki/Savitzky%E2%80%93Golay_filter чтобы можно было быстро скользящим окном пройтись
avatar
Иван Дворцов, генератор случайных чисел вестимо ;)
avatar

Предлагаю Вам учесть комиссии и повторить. Тогда Вы сразу получите рабочий вариант.

Без комиссий зарабатывает очень много стратегий с большим числом сделок.

avatar
ch5oh, предлагаю тогда их выложить, если это конечно не переобучение а настоящий out-of-sample с количеством сделок > 5000 в год.
avatar
В картинках для РТС видно, что Вы сделали переподгонку: инсемпл у Вас идеальный, а аутофсемпл — как обычно средней паршивости.
avatar
ch5oh, там обе картинки out-of-sample только первая на сбере, а вторая на РТС, на сбере лучше всего, есть еще по другим инструментам картинки на гитхабе.
avatar
vlad1024, на джитхабе и посмотрел.
avatar
ch5oh, ну да переподгонка есть, но она более менее разумная, при таком количестве параметров.
avatar
Я ничё не понял. «Random Forest model with 30 minute price delta as target for prediction» — таргет полчаса и всё коммиссы сжирают?

avatar
Spekyl, 15 минут, но торгует все периоды времени, то есть всегда в рынке, да все комиссы сжирают при такой частоте. )
avatar

полистал проект, в img вроде бы нашёл.

вопрос, japanese pattern на минутных свечах анализировались? всегда к паттернам прохладно относился, тем более на мелком ТФ, а там смотрю doji вылез как значимый фактор.

avatar
Иван Дворцов, да japanese pattern на минутках
avatar
А что за фича — timestamp?
avatar
Spekyl, время от начала сессии в минутах
avatar
 в общем, интересно, спасибо.  надо погонять на привычном с#)
avatar
Иван Дворцов,  а через че  запускать файлы?

avatar
тут одних добрых рук не достаточно, нужна еще и умная голова )))
— из написанного ничего понял (((
avatar
Машинное обучение — коварная штука...

Такое сильное различие картинок на обучающей и тестовой выборке говорит в пользу того, что обучение свелось к запоминанию, нежели обобщению.

Из этого также следует вывод, что реальной информативности в выбранных факторах мало. Также надо учитывать, что приведенные факторы на 80% это одно да потому. Можно было случайно выбрать любые иные факторы и получить за счет данного обучения подобные картинки.

Интересно другое. Как всё это меняется, если уменьшить кол-во сделок на порядок?
avatar
Sergey Pavlov, по поводу коварности согласен, но я практически уверен, что из этого набора факторов любыми другими методами большего не выжать.
А как их уменьшить? сигнал выдается каждые 15 минут, можно конечно таймфрейм торговли увеличить но тогда данных совсем мало будет -> сильное переобучение
avatar
vlad1024, 
из этого набора факторов любыми другими методами большего не выжать
а нужно ли?

Из очевидного можно попробовать сразу на часовики подняться. И сделок станет меньше за год и процедуры обучения будут длиться ощутимо быстрее. Более сложный способ — добавить грубые параметры в обучение — некие пороговые значения, которые будут заставлять систему пропускать часть сигналов.

Переобучение зависит объема данных лишь частично. На самом деле можно легко добиться переобучения и в случае, когда кол-во обучаемых примеров превосходит кол-во выбранных факторов скажем в 10 тысяч раз. Всё дело в том, насколько обучение осмысленно. Нельзя обучиться всему из ничего… Когда мы обучаем ребетенка чему-то мы ведь ему не всякий мусор подсовываем в качестве учебного материала. Тут такая же история… Подавая на вход обучающейся системе всякие RSI и MA, на самом деле мы подаем ту же самую исходную ценовую информацию. В этом два «жирных» минуса:
1. Мы дублируем исходную информацию, ибо все эти машки, емашки и пр и пр — суть простые линейные преобразование исходного ряда по типу первой производной.
2. (следствие из первого) Мы подаем на вход практически случайный набор данных… ибо ценовые последовательности весьма близки к случайным, хотя таковым не являются.
Поэтому неудивительно, что обучающаяся система либо тупо запоминает то, что от неё требуется на обучающей выборке, а потом уже как получится что-то выдает на тестовой. Либо же результатом обучения становятся некие средние прогнозы — средняя температура по больнице. И то и другое не очень полезно практически, хотя для понимания многих нюансов ваши исследования весьма полезны!
avatar
Sergey Pavlov, во много с вами согласен. По поводу мусора — методы машинного обучения сами его отбрасывают, вопрос в том что если нет лучших факторов то будет «запоминание» плохих, если же есть хорошие и они в прошлмо были скоррелированны с результатом, то будут использоваться они. С часовиками не получится, слишком мало данных -> переобучение, машинное обучение слабо применимо.
avatar
vlad1024, в порядке личного мнения: думаю, что вы переоцениваете машинное обучение в следующем
По поводу мусора — методы машинного обучения сами его отбрасывают
avatar
и как Пользоваться  этими Файлами?
avatar
"… Торговать это конечно, из-за профитов съедаемых комиссией нельзя" !!!
Автор, ну ты даешь, это 100 уровень цинизма.
avatar
И. В. Бородин, цинизм был бы, если бы я этой фразы не написал ))
avatar
Зачем так мозги себе парить? Жизнь и так не сахар:) начну с начала: люди! Не стройте иллюзий.пока не потратите 4-6 лет на обучение и практику( сливы в том числе) вы не увидите те закономерности которые позволяют стабильно работать в плюс.тут один чудак писал что правило10000 часов не работает.как раз наоборот: это самое главное.просто далеко не у всех хватает терпения или возможностейдойти до конца.отсюда и статистика о 95 процентов слившихся.
avatar
Это не грааль, это иллюзия. фирменные грабли для любителей математики. 

P.S. вы таки правда считаете что по 500 точкам можно обучить модель с 10 параметрами? ;)  если да, то жизнь готовит вам много сюрпризов. неприятных.
avatar
Vitty, речь шла о линейной логистической регрессии, да ее можно обучить с 10 параметрами по 500 точкам.
avatar
vlad1024, да не обучите вы ничего. 
пусть у каждого параметра всего 10 возможных значений (очень грубая оптимизация); вы получаете 10^10 = 10 миллиардов как провести гиперплоскость и попилить свои несчастные 500 точек. среди этих 10 миллиардов найдется, навскидку, с миллион неплохих вариантов и из них 1000 очень хороших. только это все фигня, ибо никакой предсказательной силы не имеет.

попробуйте форвардное тестирование, желательно на деньги и желательно большие (так уроки лучше усваиваются) — и все сразу станет понятно.
avatar
Vitty, чтобы провести гиперплоскость надо всего 10 точек, об этом и речь, остальные 490 должны лежать рядом к этим 10.
avatar
vlad1024, о хосподи… чтоб провести 10мерную гиперплоскость, да 10 точек достаточно. кста, остальные 490 ничего не должны и лежат почти случайно — пробовали хоть визуализировать?

а можно вообще без точек — по старинке, на кофейной гуще, результат тот же + напиток вкусный. 

вот, видимо, поэтому у математиков торговля получается поначалу хуже чем по идее должно было быть. Ваша цель — не гиперплоскости проводить, а построить модель, имеющую ПРЕДСКАЗАТЕЛЬНУЮ силу. и по 500ам точкам вы ее не построите.

avatar
Vitty, в статистике, особенно медицинском ресёче полно строят линейных моделей и по меньшему количеству точек.
avatar
vlad1024, ну отдельная песнь что такое медицинский ресеч, особенно если речь о россии ;)

по меньшему числу точек не строят, а уточняют имеющуюся (например из теоретических соображений) модель.

короче, начинайте торговать на деньги, рынок всему научит.
avatar
Stanislav Korolev, справедливости ради бывает.  редко, но бывает. пирамида Маслоу в действии. когда вопрос с деньгами закрывается, возникает потребность в признании.
avatar
Вопрос vlad1024.

С VC-размерностью немного знаком, свои стратегии искал и машинным обучением (предпочитаю boosted trees) и перебором параметров в тестере стратегий.

Что, вообще, значит в контексте обсуждения провести гиперплоскость через 10 или иное количество точек? Это значит, плосткость будет отделять точки, соответствующие приказам Buy от приказов Sell. Я не имею ничего против того, что перебрать координаты этой плоскости, при условии, что количество точек, будет «не маленьким».

Далее. А как, собственно, формируется логика приказов? У меня, при переборе параметров, она была такая: 

if (param1 > threshold 1
& param2 > threshold 2
& param3 < threshold 3
& ...
& param(n) between 2 and 24) then 'buy'

То есть, простыми словами, логика строит прямоугольник в n-мерном пространстве. Что в этом плохого или сомнительного? В прямоугольнике VC-размерность будет конечна, не?

Вернемся к деревьям решений, их логика:

if (param1 > best_threshold 1
& case count > min count) then
'create subsapce 1 and look for next param in given subspace else stop'

if (param1.1 > best_threshold 1.1
& case count > min count) then 
'create subsapce 1.1 and look for next param in given subspace else stop'

Похоже, не правда ли? Деревья решений также аппроксимируют пространство исходов прямоугольниками. Так чем они лучше?

Просто подискутировать…
avatar
ALEXEY BURNAKOV, плохо когда от перебираемых параметров начинают зависеть факторы, к примеру длина окна МАшки или еще что-то такое, тогда VC-размерность растет мультипликативно, как будто каждое значение параметра эквивалентно добавлению нового фактора, а так конечно можно строить и другие модели. Только перебором, когда факторов много, наверное слишком долго.
avatar
vlad1024, 
Вы можете привести пример оптимизации (скажем, подбор оптимального порога чего-либо), когда VC-размерность не растет?

Я, честно, не совсем понимаю вас, когда вы говорите, что изменяя окно, например, МАшки, имеем мультипликативный рост. Поясню: у нас есть 10 параметров, часть из них связано с погружением в лаговое пространство (например, ширина окон), часть с порогами отсечения. Почему ряд значений параметра окна будет равнозначен ряду факторов?

Пример, подаем на обучаемую машину разницу последней известной цены и МА. МА берем с разным окном, всего получаем, например, 20 таких разниц (входов). Машина попробует их по очереди и отберет наиболее информативный с точки зрения разделения выходной переменной. В чем здесь подвох видите? Неужели, этот единственный отобранный вход будет равноначен больше чем одному добавленному фактору?
avatar

теги блога vlad1024

....все тэги



UPDONW
Новый дизайн