Картинка для затравки, 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 подхода.
"… большое количество факторов, инидикаторы (RSi, ADX), свечные паттерны, полиномиальная апроксимация скользящим окном"
в итоге, какие факторы оказались самыми полезными/значимыми?
vlad1024, кубический полином по ценам закрытия??? Интересно!
А сколько точек брали в «окно» для вычисления коэффициентов?
Предлагаю Вам учесть комиссии и повторить. Тогда Вы сразу получите рабочий вариант.
Без комиссий зарабатывает очень много стратегий с большим числом сделок.
полистал проект, в img вроде бы нашёл.
вопрос, japanese pattern на минутных свечах анализировались? всегда к паттернам прохладно относился, тем более на мелком ТФ, а там смотрю doji вылез как значимый фактор.
— из написанного ничего понял (((
Такое сильное различие картинок на обучающей и тестовой выборке говорит в пользу того, что обучение свелось к запоминанию, нежели обобщению.
Из этого также следует вывод, что реальной информативности в выбранных факторах мало. Также надо учитывать, что приведенные факторы на 80% это одно да потому. Можно было случайно выбрать любые иные факторы и получить за счет данного обучения подобные картинки.
Интересно другое. Как всё это меняется, если уменьшить кол-во сделок на порядок?
А как их уменьшить? сигнал выдается каждые 15 минут, можно конечно таймфрейм торговли увеличить но тогда данных совсем мало будет -> сильное переобучение
Из очевидного можно попробовать сразу на часовики подняться. И сделок станет меньше за год и процедуры обучения будут длиться ощутимо быстрее. Более сложный способ — добавить грубые параметры в обучение — некие пороговые значения, которые будут заставлять систему пропускать часть сигналов.
Переобучение зависит объема данных лишь частично. На самом деле можно легко добиться переобучения и в случае, когда кол-во обучаемых примеров превосходит кол-во выбранных факторов скажем в 10 тысяч раз. Всё дело в том, насколько обучение осмысленно. Нельзя обучиться всему из ничего… Когда мы обучаем ребетенка чему-то мы ведь ему не всякий мусор подсовываем в качестве учебного материала. Тут такая же история… Подавая на вход обучающейся системе всякие RSI и MA, на самом деле мы подаем ту же самую исходную ценовую информацию. В этом два «жирных» минуса:
1. Мы дублируем исходную информацию, ибо все эти машки, емашки и пр и пр — суть простые линейные преобразование исходного ряда по типу первой производной.
2. (следствие из первого) Мы подаем на вход практически случайный набор данных… ибо ценовые последовательности весьма близки к случайным, хотя таковым не являются.
Поэтому неудивительно, что обучающаяся система либо тупо запоминает то, что от неё требуется на обучающей выборке, а потом уже как получится что-то выдает на тестовой. Либо же результатом обучения становятся некие средние прогнозы — средняя температура по больнице. И то и другое не очень полезно практически, хотя для понимания многих нюансов ваши исследования весьма полезны!
Автор, ну ты даешь, это 100 уровень цинизма.
P.S. вы таки правда считаете что по 500 точкам можно обучить модель с 10 параметрами? ;) если да, то жизнь готовит вам много сюрпризов. неприятных.
пусть у каждого параметра всего 10 возможных значений (очень грубая оптимизация); вы получаете 10^10 = 10 миллиардов как провести гиперплоскость и попилить свои несчастные 500 точек. среди этих 10 миллиардов найдется, навскидку, с миллион неплохих вариантов и из них 1000 очень хороших. только это все фигня, ибо никакой предсказательной силы не имеет.
попробуйте форвардное тестирование, желательно на деньги и желательно большие (так уроки лучше усваиваются) — и все сразу станет понятно.
а можно вообще без точек — по старинке, на кофейной гуще, результат тот же + напиток вкусный.
вот, видимо, поэтому у математиков торговля получается поначалу хуже чем по идее должно было быть. Ваша цель — не гиперплоскости проводить, а построить модель, имеющую ПРЕДСКАЗАТЕЛЬНУЮ силу. и по 500ам точкам вы ее не построите.
по меньшему числу точек не строят, а уточняют имеющуюся (например из теоретических соображений) модель.
короче, начинайте торговать на деньги, рынок всему научит.
С 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'
Похоже, не правда ли? Деревья решений также аппроксимируют пространство исходов прямоугольниками. Так чем они лучше?
Просто подискутировать…
Вы можете привести пример оптимизации (скажем, подбор оптимального порога чего-либо), когда VC-размерность не растет?
Я, честно, не совсем понимаю вас, когда вы говорите, что изменяя окно, например, МАшки, имеем мультипликативный рост. Поясню: у нас есть 10 параметров, часть из них связано с погружением в лаговое пространство (например, ширина окон), часть с порогами отсечения. Почему ряд значений параметра окна будет равнозначен ряду факторов?
Пример, подаем на обучаемую машину разницу последней известной цены и МА. МА берем с разным окном, всего получаем, например, 20 таких разниц (входов). Машина попробует их по очереди и отберет наиболее информативный с точки зрения разделения выходной переменной. В чем здесь подвох видите? Неужели, этот единственный отобранный вход будет равноначен больше чем одному добавленному фактору?