Блог им. grepan

Трезво оцениваем полезность системы Backtest’а

    • 23 ноября 2021, 13:43
    • |
    • grepan
  • Еще

Я нахожусь в процессе тестирования на промышленных данных тех моделей, которые я разработал с помощью системы Backtest’а.


В основе системы лежит open-source библиотека Zipline, разработанная стартапом Quantopian, но не поддерживаемая где-то с апреля этого года, когда этот стартап приказал долго жить.


В библиотеке допилена возможность онлайн-закачки данных с источников (финам, mfd, YF), достаточно просто  в алгоритме указать, какие тикеры нужны за какой период, и данные будут в нужном виде скачаны и преобразованы. А также допилена возможность работать с минутным таймфреймом.


Поскольку библиотека реализована на Python, то в пайплайн алгоритма можно вставить любые методы обработки и анализа данных, включая библиотеки машинного и глубокого обучения, сразу в одном ноутбуке и скачав данные, и обучив модели, и проведя бэктест алгоритма, что дико удобно.


В принципе, проверена даже техническая возможность повторить портал Quantopian, добавив на какой-либо сайт возможность работы с ноутбуком Zipline, расшаривая (при желании) для других пользователей на форуме либо полный скрипт пользовательского алгоритма, либо его результаты (таблицы и графики).


Бэктест для меня незаменим не только при разработке торгового алгоритма (поиск точек входа и выхода), но и что не менее важно, для поиска методов сопровождения сделок и методов управления капиталом и риском. Здесь уже кто-то писал про важность этих моментов, я присоединяюсь двумя руками.


Результат алгоритмов сильно меняется при изменении подходов: работаем в обе стороны, или только лонг/шорт, есть ли нет стоп-лосса (фиксированного или трейлинг-стопа), фиксированный ли профит или нет, есть ли докупки или частичное закрытие позы и так далее.


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


Мои алгоритмы сейчас базируются на минутках. И при повторе их на реальных данных, есть различия между позициями бэктеста и позициями на реальных данных. Например, за вчерашний день:


Бэктест дал 24 сделки, с общим результатом 1613 единиц.


OPEN 198 2021-11-22 07:42:00+00:00
CLOSE  2021-11-22 08:18:00+00:00 profit= 46.0
OPEN 199 2021-11-22 09:00:00+00:00
CLOSE  2021-11-22 09:15:00+00:00 profit= 90.0
OPEN 200 2021-11-22 10:15:00+00:00
CLOSE  2021-11-22 10:18:00+00:00 profit= 71.0
OPEN 201 2021-11-22 11:37:00+00:00
CLOSE  2021-11-22 11:38:00+00:00 profit= 60.0
OPEN 202 2021-11-22 11:41:00+00:00
CLOSE  2021-11-22 11:42:00+00:00 profit= 112.0
OPEN 203 2021-11-22 12:15:00+00:00
CLOSE  2021-11-22 12:27:00+00:00 profit= 45.0
OPEN 204 2021-11-22 12:29:00+00:00
CLOSE  2021-11-22 13:01:00+00:00 profit= 31.0
OPEN 205 2021-11-22 13:06:00+00:00
CLOSE  2021-11-22 13:09:00+00:00 profit= 39.0
OPEN 206 2021-11-22 13:20:00+00:00
CLOSE  2021-11-22 13:38:00+00:00 profit= 44.0
OPEN 207 2021-11-22 13:45:00+00:00
CLOSE  2021-11-22 13:56:00+00:00 profit= 103.0
OPEN 208 2021-11-22 14:11:00+00:00
CLOSE  2021-11-22 14:13:00+00:00 profit= 98.0
OPEN 209 2021-11-22 14:35:00+00:00
CLOSE     2021-11-22 14:39:00+00:00 profit= 67.0
OPEN 210  2021-11-22 16:09:00+00:00
CLOSE     2021-11-22 16:13:00+00:00 profit= 96.0
OPEN 211  2021-11-22 16:21:00+00:00
CLOSE     2021-11-22 16:22:00+00:00 profit= 54.0
OPEN 212  2021-11-22 16:29:00+00:00
CLOSE     2021-11-22 16:30:00+00:00 profit= 64.0
OPEN 213  2021-11-22 16:32:00+00:00
CLOSE     2021-11-22 16:33:00+00:00 profit= 129.0
OPEN 214  2021-11-22 16:45:00+00:00
CLOSE     2021-11-22 16:48:00+00:00 profit= 36.0
OPEN 215  2021-11-22 17:13:00+00:00
CLOSE     2021-11-22 17:21:00+00:00 profit= 189.0
OPEN 216  2021-11-22 18:18:00+00:00
CLOSE     2021-11-22 18:21:00+00:00 profit= 31.0
OPEN 217  2021-11-22 18:21:00+00:00
CLOSE     2021-11-22 18:22:00+00:00 profit= 45.0
OPEN 218  2021-11-22 18:25:00+00:00
CLOSE     2021-11-22 18:30:00+00:00 profit= 63.0
OPEN 219  2021-11-22 19:10:00+00:00
CLOSE     2021-11-22 19:47:00+00:00 profit= 32.0
OPEN 220  2021-11-22 19:50:00+00:00
CLOSE     2021-11-22 19:56:00+00:00 profit= 38.0
OPEN 221  2021-11-22 21:30:00+00:00
CLOSE     2021-11-22 21:40:00+00:00 profit= 30.0

На продуктиве (торговля одним лотом) же сделок было всего 5, с результатом 213 единиц:


2021.11.22 12:17:54 OPEN
2021.11.22 12:38:21 OPEN
2021.11.22 12:58:39 CLOSE profit=41
2021.11.22 14:54:17 CLOSE profit=32
2021.11.22 18:25:35 OPEN
2021.11.22 19:11:22 OPEN
2021.11.22 19:17:47 OPEN
2021.11.22 20:16:35 CLOSE profit=49
2021.11.22 20:24:34 CLOSE profit=45
2021.11.22 21:12:16 CLOSE profit=46


В процессе анализа разницы, я понял для себя некоторые моменты, которыми хочу поделиться, и прошу поправить, если я ошибаюсь:
1. На бэктесте цена закрытия минутки может являться ценой ASK или BID, в зависимости от направления последней сделки в минутной свече. На продуктиве, ожидая профита, мониторится своя часть стакана, в зависимости от направления открытой позиции. Таким образом, какая-то часть котировок из минутных свечей нам будет вообще недоступна для работы. Возможно, эту ситуацию можно сгладить, если выставлять лимитные ордера, но это пока не для моего текущего алгоритма.
2. Разница дискретности анализа данных: на бэктесте анализируется каждая минутная свеча, на проде анализируется стакан на возможность как открыть позицию, так и закрыть ее с необходимым профитом. Даже если перейти на анализ продуктивных данных каждую минуту, вряд ли получишь данные, эквивалентные бэктесту из-за пункта 1. Соответственно, профит и убытки на проде меньше (быстрее реагируем).
3. Близкий к идеальному бэктест – это система, анализирующая стакан (даже не тики), а возможно еще одновременно и ленту сделок.
4. Но даже наличие простого бэктеста на минутках, позволяет оценить профит-фактор алгоритма, заложив негативное проскальзывание на среднюю ширину между лучшими BID и ASK стакана.


Можете что дополнить или скорректировать?
★2
37 комментариев
Поосторожней с иностранными словами! Backtest можно перевести и как тест жопы ;)

Пользуйтесь русскими аналогами: тест (на) истории или открытая библиотека )))
avatar
bohemian rhapsody, Чёрт! «А мужики-то не знают»!
avatar
grepan, 
avatar
Что-что, а нумерация у вас крутая).

Согласен, на питоне удобно ещё и тем, что ты расстоянии вытянутой руки от всех дата-саенс библиотек и от всего машинного обучения. Иногда скучаю по такой доступности.


avatar
Replikant_mih, а на чем сейчас тестируете?
avatar
grepan, Wealth-Lab 7, но и Python использую — для постпроцессинга транзакций или для ML. Просто теперь это менее органично).
avatar
Replikant_mih, просто каждый пункт важен как первый ))
avatar
grepan, Я знал, я знал, что это не ошибка!)
avatar
1 тебе нужна средняя сделка> 3...5*(спред + комисс) тогда можно не выносить мозг ерундой
2 надо 10000 сделок чтоб собрать достоверную статистику
avatar
ves2010, не понял. Средний профит больше чем 3-5 (спрэд + комиссия)? Спрэд между бид\аск?
avatar
А если серьезно, то «история не повторяется, а если и повторяется, то не в пользу трейдера».

На анализе исторических данных можно увидеть лишь статистические закономерности, типа " Рынок чаще находится в боковике" или «Ри падает быстрее и сильнее, чем растет» и оценить их количественно.
avatar
bohemian rhapsody, так это фактически новый индикатор для инструмента. Уже результат)
avatar
grepan, это результаты теста или реальные сделки?
avatar
bohemian rhapsody, Сверху тест, снизу реальные за один день. То есть сначала получены реальные, а сегодня с утра по вчерашним котировкам прогнан тест.
avatar
grepan, что, по историческим данным всего за 1 день построен индикатор?
avatar
bohemian rhapsody, нет) сначала модель строилась и тестировалась на минутках (квартал), проверялась на других кварталах, а сегодня была задача сравнить тестовые и реальные сделки.
avatar
grepan, а инструмент какой?, учитываются ли сборы биржи и комисы брокера?
avatar
«Можете что дополнить или скорректировать?»
Могу дополнить: ваши лимитные ордера выставленные по стакану в бэктесте (я уже не говорю по свечам), в реалтайме могут повлиять на волатильность стакана. Например если в бэктесте стоит на асках 10 уровней по 10 лот, а вам надо 100 лот, то в бэктесте вы получите позицию по 10-и бестаскам, а в реале могут а) лимитом не дать и уйти б) маркетом протащить на худшие цены в) при большом вашем объеме вас запомнить и наказать позже. Т.е. фактически используя «систему», и одновременно находясь внутри нее вы на самом деле на нее влияете, что разумеется не отражается ни в каких линейных тестах. Это просто надо понимать и пытаться учитывать.
avatar
Sprite, в бэктесте нет стакана, к сожалению. только свечи. Поэтому это сферический конь в вакууме. И конечно понятно, что реальные ордера влияют на реальный стакан. И это будет отличием между тестовой и реальной статистикой. Но пока отличий по другим причинам больше)
avatar
grepan, «в бэктесте нет стакана» ну у кого как )
avatar
Sprite, я про свою систему. Если у Вас есть, завидую белой завистью! Если не секрет, что за система?
avatar
grepan, не секрет — StockSharp. Разработчики библиотеки даже попытались сделать сведение ордеров в бэктесте и учитывать влияние своего объема на тесты, аля виртуальная биржа в реалтайм. Но я эту их часть не осилил и запилил свою.
avatar
grepan, в принципе, при наличии данных по стаканам всё не так уж сложно и можно самому собрать велосипед. Сортируете тики и изменения стаканов по дате и обрабатываете в порядке очереди.
avatar
Sprite, все верно, но это практически с нуля собрать новый бэктест(
avatar
grepan, всему своё время )
avatar
Sprite, интересная идея
avatar
papers.ssrn.com/sol3/cf_dev/AbsByAuth.cfm?per_id=1121907 где-то тут, по моему в первой пдфке, про модели micro mid-priced для стакана при бэктестах
avatar
Andrew Morozov, супер, спасибо, все материалы очень интересные.
avatar
Andrew Morozov, материалы бомба! смотрю его видео про микроструктуру рынка запоем. Сам делал взвешенную цену по стакану, но до работающей стратегии не дошло. Спасибо!
avatar
grepan, а можно ссылочку на видео?
avatar
grepan, нашел еще видос от этого чувака, вам может быть интересно:
www.youtube.com/watch?v=0ZHypIAxYNo
Презентация, по которой сделано видео:
github.com/sstoikov/microprice/blob/master/Microprice%20-%20Big%20Data%20Conference.ipynb
avatar
Sprite, Спасибо, гляну
avatar
Но, на моэх стаканчики намного более дерганые, чем к примеру, на сме.
avatar
   Интересные темы поднимаете, спасибо.
   Вот таких конкретных обсуждений здесь на сайте и ждешь, а их практически не осталось — все «объемы» общения ушли в юмор, ЗОЖ, разные бытовые вопросы и пр. и т.п.
   По сути статьи: на мой взгляд, никакой тест на истории не даст вам полноценного соответствия реальной торговле. В силу неопределенности в отношении стакана, поведения ММ, поведения других участников торговли, и, наконец, вашей очереди в стакане по выставленной в заявке цене. А если алгоритм работает по границам цен (H и L), то важна еще скорость соединения вашего интернета, поскольку искомую цену вы в истории видите, а по факту взять ее не можете. 
   Что следует из этого предположения? Бессмысленность ИЗЛИШНЕ ЗАМОРАЧИВАТЬСЯ с детальной правдоподобностью теста. Я не говорю, что тест не нужен, а считаю контр-продуктивным тратить время и силы на попытку приблизить условия теста к реальным условиям, когда понимаешь, что полностью все важные факторы учесть или имитировать невозможно. Достаточно «золотой середины». Например, маленьких интервалов. И надо четко понимать, что в реале доходность метода будет в разы меньше такой «теоретической доходности». 
   Я, во всяком случае, столкнулся с проблемами, о которых написал выше. В итоге приходится: входить в позицию и выходить из нее по менее оптимальным ценам. А это, в свою очередь, приводит к необходимости менять систему риск-менеджмента, и вот тут появляются абсолютно нетривиальные подводные камни...   
   Удачи вам в разработках. С интересом прочту продолжение статьи
Владимиров Владимир, благодарю за отзыв! Вы правы, тест на истории не будет соответствовать реальности. Но мне сейчас важно, насколько и по каким причинам будет расхождение. Важно чтобы понять границы достоверности моих тестов. Потому что в реальном алго все-таки другие механизмы. Я не смотрю H и L, я предпочитаю синтетический арбитраж, а значит наблюдаю сразу несколько стаканов, формирую из них некоторую  «справедливую» цену, и далее отслеживаю динамически порог открытия позы. Вычисление идет по мере обновления котировок стаканов, не по задержкам времени или по мере формирования свечей. Таргет позы совокупный (по всем инструментам позы) также мониторится по всем стаканам одновременно. Риск проскальзывания я убираю некоторыми трюками работы по стаканам, естественно стараясь минимизировать в коде всякие циклы по возможности. Так что алго с минимально возможным проскальзыванием берет свой таргет. Скорость соединения («сервер» стоит дома, отчет по каждой сделке валится в телеграмм-канал) позволила сегодня в течение одной минуты закрыть 11 позиций (в каждой несколько инструментов). 
avatar

теги блога grepan

....все тэги



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