Предыдущий мой пост был призван помочь понять и осознать роль и место бэктестирования в практике трейдинга. Ну, и заодно — намекнуть на корректные правила использования тестирования исторических данных.
Нужно понять, что
бэк-тестирование — это численный эксперимент, который не только так красиво называется, но и требует к себе уважительного отношения. Ну, и некоторого количества ума и трудолюбия.
Однако, как и следовало бы ожидать, некоторые не особо восхваляемые в приличном обществе личные качества комментаторов не дали этим «коллегам» возможности разглядеть предложенные возможности.
Какие контраргументы предложили «коллеги» против бэк-тестирования?
Увы, самые замшелые и незамысловатые, как-то:
- бэк-тесты не учитывают уровни ликвидности;
- сигналы на бэктестах не могут реализоваться в «боевых» условиях, потому что «рынок живой» (что это такое — каждый понимает по-своему);
- бэк-тесты не учитывают разных аварий на линии коммуникаций или сбоев торгового ПО;
- в реальности торговый алгоритм выдает одновременно 2 (!) торговых сигнала, робот-скотина «не фильтрует», а на бэк-тестах такого почему-то не бывает;
- колл-бэки «в реале» не отвечают так, как хотелось бы;
- бэк-тестирование — это удел презренных теоретиков и необстрелянных «окопников», никогда не бывавших в настоящем бою.
Ну, и, естественно, еще многая многа чего невысказанного… Смысл только один: «все бэк-тесты — козлы, я один — Д'Артаньян».
В качестве романтического отступления, предлагаю вспомнить (тем, кто когда-то знал, но забыл) или изучить заново (тем, кто не знал да еще и забыл) басню И.И.Крылова «Лисица и виноград» (ретивым «знайкам» она известна как басня Эзопа или Лафонтена). Тем, кому некогда расширять свой кругозор, буквально в трех словах изложу смысл басни:
Не получив ожидаемой выгоды, человеку свойственно обвинять в этом обстоятельства, а не собственную несостоятельность.
Ну, а теперь предлагаю «пробежаться» по порядку по изложенным выше претензиям к бэктестам.
Первый и, как кажется на первый взгляд, неубийственный аргумент — это
тезис о ликвидности, а именно отсутствие нужного объема по нужной цене. Это — проблема, прежде всего, спекулянтов-опционщиков, ибо спреды в стаканах измеряются не долями и не единицами, а десятками процентов, которые очень хочется скорее положить в карман своего депо-счета! Какой сладкий «виноград»! И, главное, вот он, рядом, только руку протяни… Ан, нетушки, дудки! Смотрит такой «трейдер» на свой бэктест, где программа его «затарила» по сладкой цене и «разгрузила» по еще более вкусной, а «в реале» попандос за попандосом, и понимает, что всех волосёшек на всем его хилом тельце не хватит для выражения постигшей его, такого умного и отважного бойца, трагедии.
Жалко «бойца»! Хотя никто не заставлял его с голым задом на танк бросаться (наоборот, все ветераны советуют бросить это занятие и
«пойти заняться своим прямым делом» (проф.Преображенский)), но всё равно жалко человека. Да и надежда есть, что, хотя он еще молод и неопытен, но, тем не менее, имеет потенциал.
Так вот,
в качестве первого совета: прежде, чем «заряжать» бэктест на обработку данных, объясните ему, этому тупому бэктесту (не Вам же!), что (как вариант) нужный для реализации торговый объем можно собрать в стакане только в интервале(!) цен, а не по одной конкретной цене. Посмотрите, каков средний объем прошел по всем «свечам» (или, как меня тут ехидно «укололи», «по барам») за исторический анализируемый период, и каков был при этом средний ценовой интервал (от High до Low). Вполне возможно, что после этого вашу торговую систему нужно будет капитально пересмотреть.
Отступление: в квантовой физике есть такое правило — принцип Гейзенберга, гласящее, что «мы никогда не сможем одновременно определить энергию и координаты квантового объекта», а потому вынуждены использовать некие средние отклонения (интервалы) значений. Применительно к нашей материи это означает: никогда не стройте свою стратегию из расчета «хочу купить/продать конкретный объем по конкретной цене». Грамотный подход: «готов заплатить за нужный мне объем средним разбросом цен от Low до High».
Я знаю точно, что по торгуемым мной инструментам для «затаривания» нужного объема мне достаточно установить проскальзывание в размере 0,2% (изредка — 0,5%). При таком подходе результаты моих бэк-тестов очень мало разнятся с «боевыми» результатами. Что обеспечивает высокую надежность и предсказуемость моей торговой системы.
На этом пока остановлюсь, дабы не отрывать моих читателей от насущных задач биржевых спекуляций.
Если развитие данной темы представляет интерес, прошу уважаемой аудитории обозначить этот интерес. Обещаю продолжить.
С уважением и наилучшими пожеланиями...
зы: Лучше всего — пишите программы бэктестирования сами!
ззы: насчет моего опыта прошу не беспокоиться, ибо имел расчетные фирмы на МТБ, на «Гермесе», РТСБ еще в те времена, когда многие здешние «оппоненты» еще и в проекте не состояли. )))
Да, объективность, — это одно из важнейших требований к постановке эксперимента.
В этом случае реальные результаты должны быть лучше.
Я объясняю это так:
во-первых, не весь объем в реале пройдет по невыгодной цене, а кое-что будет очень удачно куплено/продано,
во-вторых, если я проектирую эффективную торговую систему, то расчитываю с её помощью использовать некоторое трендовое движение, которое в своей цели значительно превышает самую невыгодную на текущий момент открытия позиции цену. «Пила», конечно, подпортит результат, но тут — вопрос статистики, правильно интерпретировав которую, можно задавать торговый диапазон и порядок выдачи сигналов.
Ну, и, с точки зрения принципа консервативности, если моя ТС показывает положительное матожидание по прибыли при худших условиях, то я уверен почти на 99%, что эта ТС будет тем более эффективна при условиях, хотя бы на чуточку лучших.
Не разочаровывайтесь в случае неудачи. Я на своем веку этих систем натестировал сотни, если не тысячи: каждый рынок, каждый инструмент, каждый фрейм. Там есть еще сонм влияющих параметров, даже и не очевидных на первый взгляд. Но — «дорогу осилит идущий»…
Например, если Вы хорошо знаете, что «падающая звезда» должна иметь вполне конкретное соотношение тела и фитилей, а также — определенное положение относительно предыдущей и последующей «свечи», то всегда сможете формально представить все эти соотношения. А значит, сможете «научить» программу различению паттернов.
Со своей стороны, могу только отметить, что паттерны — это, по моему опыту, не очень надежный показатель рыночной ситуации. Вероятность «попадания» на убытки всё-таки выше, чем в статистических моделях.
И самое главное, это найти это окно оптимизации (его размер) и период торговли, когда система работает. Например месяц оптимизации, две недели торгов. После двух недель торгов, мы вновь оптимизируем систему в окне месяц, со сдвигом на две прошлые недели торгов, и вновь запускаем её в торги на две недели. Такой метод ещё называется Wolk Forward. И это очень большой труд, что бы найти такое соотношение оптимизация/форвард, что бы соотношение по прибыли из хотя бы 20 прогонов было 50/50
Мое мнение: да, работы тут — непочатый край. Однако, не стоит забывать, что затраты на поиск решения истины не должны превышать всех «вкусняшек» от её использования.
Eugene Logunov уже неоднократно абсолютно верно отмечал в своих постах о необходимости построения МАКСИМАЛЬНО ПРОСТЫХ торговых систем. Я полностью разделяю это его мнение. Мало того, полагаю, что Вам это известно, количество внутренних ошибок в системе растет экспоненциально при каждом её очередном усложнении.
С другой стороны, если такая задача текущей оптимизации всё же является насущной, то тем более нужно написать свою программу бэк-тестирования и запускать её с нужной периодичностью.
Что ж тут плохого?
Просто я запускаю такую задачу верификации моего робота и бэк-тестов один раз в квартал-полгода-год, когда робот роллирует позицию.