Блог им. XXM

Тестирование стратегий. На примере индекса Московской биржи.

    • 12 декабря 2017, 17:16
    • |
    • XXM
  • Еще

цены на мед

Программ для тестирования много. Как-то начал считать, дошел до цифры 33 (https://smart-lab.ru/blog/236254.php).
Но, сколько бы их ни было, все равно чего-то не хватает: то танцы с бубном со входными данными, то отсутствие какого-нибудь функционала, то проблемы с установкой самой программы ТА, «то полы кривые» и т.д.

Поэтому создал свой тестер, на c#, назвал Xtest.

Вкратце напишу про то, как он работает на примере индекса Московской биржи (ранее — индекс ММВБ).

Стратегия простая:
Покупаем, когда начался рост. Продаем либо по стопу, либо по тэйк-профиту.
Для шорта — зеркально.
Для входа в позицию выбрал простой индикатор, рассказывать про него не буду, поверьте, он банальный. Одна переменная, назвал Param1.
Выходы: будем подбирать stopLoss, takeProfit и SLforTP (stopLoss для takeProfit), они в блоке «Strategy Parameters» на вкладке Parameters.

запуск программы

Загрузка данных с сайта Финам: идем на вкладку «DownLoad», выбираем даты «с» и «по», нажимаем «загрузить». Для 15-минуток диапазон — 01.01.2010-31.12.2013 (больше может не пройти).
Недостающие данные добавляем до сегодняшней даты на втором этапе.
Спасибо, Финам!

Тестирование проведем в два шага:
1. Тестирование на периоде 01.01.2010 — 31.12.2016, с фильтром Profit > 2000 и Recovery Factor > 3.
На выходе: 4311 вариантов.
Количество прогонов в данном случае 63840, комиссию принимаем за 0.2 (включены биржевые и брокерские, плюс проскальзывание)

Тестирование. Обычное + форвардное.

Форвардный анализ добавляет к традиционной процедуре оптимизации очень важный шаг. Он тестирует
эффективность переменных модели на данных, которые не были включены в оптимизационные данные. Это
также называется тестированием на данных, не вошедших в выборку или форвардным тестированием.
Р. Пардо «Разработка, тестирование и оптимизация торговых систем»

 

 

2. К полученному набору параметров применяем форвардное тестирование на периоде 01.01.2017 — 10.12.2017, с фильтром Profit > 500 и Recovery Factor > 1.0.
Получаем 746 вариантов.

Количество стратегий- 746. И все в плюс!!!   8-O

Эти наборы параметров протестируем на всех имеющихся сейчас барах с 01.01.2010 — 10.12.2017 и из них отберем вручную 5 самых лучших вариантов, следя за тем, чтобы не было корреляции между ними. Процесс творческий, поддающийся автоматизации, но это сейчас несущественно.
Главное — есть у нас 5 вариантов стратегий:

Выберем количество стратегий, равное количеству пальцев на правой руке ;)

которые можно исследовать как поврозь, так и все вместе.
Посмотрим на характеристики одного теста:
Performance, почти по WLD.


Количество сделок Long и Short примерно одинаковы, но Profit по лонгам выше, ведь стратегия «Buy and Hold» = 737.23, значит показатели скорее верны, чем не верны.
Значение комиссии 933.2 — в пунктах, поэтому, теоретически, при количестве сделок 2333*2 = 4666 в рублях комиссия составляет более 9 тысяч.

сделки:
Вкладка Сделки

equity:
Красиво, конечно.

Для построения графика Equity портфеля стратегий сначала выделяем их, затем нажимаем кнопку «Testsel»
Портфель стратегий


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

До полного расчета результатов вкладки «Performanse» для выбранных стратегий запала не хватило.

На примере тестирования на индексе Московской биржи показал свой подход к поиску стратегий для алготорговли.
Примечательно, что стратегий, которые прошли через сито форвардного тестирования, очень и очень много (746 в данном случае).
Выделить из них десяток-другой некоррелируемых стратегий будет несложно, но зато на выходе — слаженный ансамбль, который в общем (теоретически, на индексе Мосбиржи!) может выдавать плюсовой результат с плавным графиком equity.

★7
26 комментариев

сделка 207,215, 217 и тд и тп… время 10.30 — торгует на открытии рынка… что унреал

т.е у тя идет торговля внутри гэпов
avatar

ves2010, по 215:

решение о сделке (вход в позицию short) принято на свече «20100617,183000», но, во избежание ошибки заглядывания вперед (Look-Ahead Bias), в позицию «вхожу» на открытии следующей свечи.
account_entryPrice = source.BarPrices[i + 1].open;
Ее цену, как и дату и время, на свече «20100617,183000» программа как бы пока не знает. И сделка свершается по цене открытия свечи «20100618,103000» Open=1360.28.
----
Со стопами так:

_stopLoss = Math.Round((entryPrice * (1 + stopLoss / 100)) / priceStep + 0.5) * priceStep;
if (Open > _stopLoss)
     closePrice = Open;<br />else<br />     closePrice = _stopLoss;
тут проверка для шорта только на цену Open свечи: если открылись выше, то срабатывает по Open (как бы высокой она не была), если нет — по рассчитанному стопу.
Как написано ниже, проскальзывание 1.11. 
Для фьючерса на индекс Мосбиржи от 0.3 до 0.6, судя по стакану.
Но торговли внутри гэпов тут нет:
Стоп по цене 1341.94
стоп по цене 1341.94, она внутри свечи.
avatar
XXM, далек ты от практики… ох далек… выкидывай первую свечу из расчетов… не спорь
avatar
ves2010, так вроде бы речь идёт о самом индексе, а не о фьючерсе. На индексе ведь гэпы отрисовываются именно как гэпы, а не как полная свеча. То есть открытие позы на тесте происходит по худшей цене, а не внутри гэпа. 
avatar
Ну как бы, на самом деле индекс тут — обычный актив со своим OHLC. Программе хоть что подсунь, он обязан ее обработать, если входные данные соответствуют. Другое дело, что на практике пользователи-трейдеры сталкиваются с кучей допущений в программах ТА, что всякие «допуски, посадки» неизбежны и в самописных программах. Тут важна степень влияния, и каждый тестер ее решает ее в одиночку, как правило (или советуясь с коллегами).
avatar
XXM, выкинь первую свечку из расчетов — сам все увидишь насколько все станет плохо
avatar
ves2010, по №207.
Short 1336.59, StopShort 1341.94, Profit = 1336.59 — 1341.94 = -5.35, но в расчет пошел -5.75, это дань погрешностям исполнения. Посчитал, что достаточно. Хотя именно на этих цифрах упорствовать не намерен, поиграюсь. Про первую свечу дня интересно, продумаю для тестера. Но в реальных роботах включаю опцию:
startTime = 10:05:00
это уже из практики.
Насчет четырех косяков, о которых написали ниже: намекните в личку, плиз, я заинтригован ;)
avatar
XXM, 
1 у тя стоимость актива меняется на интервале тестирования вдвое-втрое… и как ты тестишь?
2 форвардное тестирование — зло… т.к. самую ценность представляют как раз последние данные...
3 ты просто тыкаешь пальцем в небо отбирая случайые варианты… может это выпадающие экстремумы… т.е. надо проверять область около этих вариантов
4 как только уберешь первую и последнюю свечу из расчетов у тя все ухудшится вдвое-втрое
5 делаешь комиссы=0, проскальзывание = 0… затем делаешь оптимизацию на максимальный убыток… наверняка будет торговать так же хорошо 
avatar
ves2010, 
1. параметры оптимизации выражены в процентах, а не в абсолютных цифрах. И, важно: тут комиссия считается в абсолютных цифрах. При переводе на проценты (как сейчас на фьючерсе на индекс в соответствии с www.moex.com/a90) ситуация сильно улучшается. Подумал, так хорошо в реале не бывает. Картинку приведу, чуть позже.
2. Не зациклен на форвардном тестировании, но со «злом» не соглашусь, как-то категорично. Хотя актуальность последних данных очевидна: поведение рынка меняется, и применять параметры, которые «хорошо работали в 2011 году» в 2016, не совсем верно.
Но, тем не менее, никто не гарантирует, что в 2017 поведение рынка поменяется так, что параметры для 2011 подойдут лучше, чем параметры 2016 года.  
Выходом будет применение портфеля стратегий, ниже поясню.
3. С экстремумами гляну. На первый взгляд, их влияние несущественное (рис).
4. Насчет первой свечи — внесу поправки, на нее в тестах как-то не акцентировал внимание.
Но последнюю трогать не буду. Она хорошая ;)
Максимумы и минимумы

Особенность торговой системы в том, что она трендовая: на движении вверх входит в лонг и сопровождает. 
Одни стратегии активируют скольжение на 4.2%, другие 0.8%.
Стопы тоже отличаются, но они не более 1.4%.
Составление портфеля стратегий — единственно верный путь для прибыльной торговли (если вы не инсайдер ;))
avatar
Ну как бы, 
там помимо этого… еще четыре косяка… мне просто лень писать про очевидные вещи... 

avatar

Спасибо, гляну.
Хотя на каждую «сделку» проскальзывание предусмотрено 1.11, но замечание справедливое.
avatar
WLD переизобретаете…
avatar
Redline, 
ну как бы иногда приходится делать узко заточенные вещи...
с которыми стандартные проги не справляюся либо считают крайне долго...

ну к примеру, минутки за 12 лет и хотябы тысяча сделок в день сделок в день… и все… комп висит… а если тики...

avatar
ves2010, А как это сделать быстро?)
avatar
Replikant_mih, нужен си… с++, с# питоны и прочая тормознутая хрень для недопрограмистов идут лесом... 
некоторые считают на видяхах…

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

вообще… если есть 4-5 параметров оптимизации, то комп начинает считать месяцами… сам попробуй… я как то не верил… а потом запустил оптимизацию на 5ти скользящих средних… мне выдал срок окончания расчетов — 1 месяц
avatar
ves2010, Блин, я надеялся, что «секреты» лежат за пределами выбора быстрого языка)). Ожидал что-то типа: в стандартных прогах много лишнего, поэтому они медленные, а если делать без лишнего — будет быстро))
avatar
Replikant_mih, тестировал на MetaStock, Excel. Для простых вещей нормально.
Резвился на WLD 4. Но, пару раз наткнулся на то, что результаты 2-х суточных тестов пропадали из-за «недостаточности памяти», и эту тему закрыл навсегда. Перешел на WLD 6. С памятью траблов уже нет, но там много всего такого, что не всегда нужно, и, самое главное, в тестировании идентичных стратегий я на своей программе получил выигрыш на целый порядок!
Там, где WLD6 будет считать 10 часов, Xtest выдаст его за 1 час. 
Такая экономия стоит трудов.
----
Хотя, как пишет ves2010, есть «процессорный кэш без обращения к памяти компа». Это уже ускорение на 3 порядка, наверное, не меньше ;)
----
avatar
XXM, 
>>«Там, где WLD6 будет считать 10 часов, Xtest выдаст его за 1 час. » — за счет чего такая разница достигается?
avatar
Replikant_mih, дело, скорее всего в том, что все данные для тестов я размещаю в оперативной памяти, которая имеет ограничения. Например, 1-минутки Сбербанка с июля 2007 года (более 1 309 000 свечей) «отказались» загружаться, а минутки с 2010 года (1 031 670 свечей) хорошо обработались.
Как именно WLD6 выходит из ситуаций с огромной базой входных данных я не в курсе, но работать с ними он не отказывается.
avatar
XXM, в влд генетический оптимизатор есть, за пол часа со всем справляется, если глубину поставить побольше, то час. Про полный перебор уже почти год как забыл:) 
avatar
Сергей Фролов, про эти опции знаю, но ни разу, к стыду своему, не применял.
Было бы любопытно, какие цифры для стопа и тэйк-профита на индексе МБ выявит ваш тестер. Вход можно установить по пересечению SMA3 и SMA5 на 15 мин.
avatar
ves2010, генетика решает.
avatar
ch5oh, генетика для нубов… только полный перебор на 2ух параметрах, чтоб видеть все резалты в виде плоскости… и тогда все ясно...

avatar
ves2010, 
у меня на это есть два решения:
 1. Если нужно быстро сделать оптимизацию на минутках на большом количиестве баров, то я сделал многопоточный оптимизатор, который херачит с огромной скоростью в отличии от стандарного WLD6(включая тот многопоточник, который гуляет по сети). Плюс там сразу отфильтровываются варианты статистики, которые меня заведомо уже не удовлетворяют: количество сделок слишком большое или там количество последовательных убытков. Что угодно короче.
2. Для более тяжелых тестов у меня есть в распоряжении кластер на базе hadoop на over 300 ядер(не мой). Сделал себе фреймворк на Apache Spark. Стратегию можно написать за пару часов. Ставлю на выходные и вперед. 
avatar
Redline, круто... 
avatar
Странный пост. Начали с программ для тестирования, а закончили результатами бэктеста одной стратегии.
Какой информацией Вы хотели поделиться с читателями?
Чтобы Вы не подумали, что я просто придраться решил, объясняю:
Для тестирования своих стратегий, мне тоже пришлось написать свой тестер, но это отдельная программа, которая может тестировать разные стратегии, подключаемые в виде DLL-ок. Писать отдельный тестер под каждую стратегию — не самый оптимальный вариант на мой взгляд.
avatar

теги блога XXM

....все тэги



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