Заметка

Проверка торговой системы на прочность

  2  

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

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

1. Сдвиг на полпериода

Самый простой метод, который подходит как для обычного бэктеста, так и для форвардного теста. Его можно применить, если у нас данные представлены в виде свечей или баров. Берем и сдвигаем начало формирование свечи на пол-периода назад/вперед. Применительно к Amibroker’у это можно сделать, зайдя в File – Database Settings -> Intraday Settings, и там изменить начало и конец  торгов Day Session и Night Session. После чего провести повторный бектест.

Вот пример для одной из систем (2 форвардных теста):

Главное на что стоит обратить внимание – показатели прибыльности, процент выигрышных сделок, Avr Profit/Loss и Profit Factor. Для сдвинутого бектеста результаты не должны сильно отличаться. Иначе система считается подогнанной под исторические данные.

2. Вневыборочное тестирование

Тоже простой метод – суть в том, что параметры системы подбираются на одном отрезке, а их оценка проводится на другом отрезке. Показатель, за которым стоит следить – это Avr Profit/Loss, он не должен сильно деградировать на вневыборочном отрезке при правильном выборе обоих интервалов теста. Под правильностью выбора интервалов я понимаю их достаточную длину, где поместится от 50 сделок. Также стоит обратить внимание на среднюю волатильность инструмента на обоих интервалах – если она будет сильно отличаться, то потребуется нормировка результатов относительно разнице в волатильности.

Автоматический вариант этого теста – форвардное тестирование. Не буду на этом останавливаться, подробно про этот метод можно почитать в предыдущей заметке. В этом случае лично я предпочитаю всю оценку проводить по результатом торгов на вневыборочных отрезках. В этом случае отпадает необходимость нормировки по волатильности и вообще каком-либо сравнении поведения системы на In-Sample и Out-of-sample отрезках.

3. Оценка методом Монте-Карло

Этот метод позволяет промоделировать различные состояния рынка, проверяя систему на прочность и устойчивость результатов. Главная цель данной оценки – определить допустимые рамки изменения параметров, которые считаются для нее рабочими (такие как Max System Drawdown %, Max Consecutive Loosers, Loosers %, Profit Factor). При реальных торгах выход параметров за рамки рабочего интервала считается сигналом поломки системы – торги в этом случае необходимо остановить.

Есть 3 варианта этого метода:

- Статистическое моделирование последовательности сделок исходя из полученных обычным бектестом параметров Avr Profit%, Winners%, Avr Loss%, Loosers%. Самый примитивный метод, позволяющий примерно оценить величину прибыли и макс серию убытков на основе общего числа сделок. Большую роль играет число экспериментов – должно быть не меньше 10000.

- Моделирование истории котировок с последующим бектестом системы. Интересный метод для оценки поведения системы в экстремальных условиях, но ИМХО не подходит для тестов систем, эксплуатирующих какую-то определенную неэффективность рынка (скажем, свечные паттерны). Психология толпы вряд-ли будет совпадать с психологией генератора случайных чисел.

- Моделирование сделок и эквити на основе реального ряда сделок. Самый на мой взгляд трезвый метод, его и рассмотрим.

В качестве ряда сделок рекомендуется использовать результаты бектеста на вневыборочных отрезках, но пойдет и обычный, если параметры системы не оптимизировались. В последней версии Amiborker’а появилась возможность «заглянуть» в сделки отдельных OOS-интервалов (раньше была доступна только сводная таблица IS/OOS) – ряд из таких сделок как нельзя лучше подойдет для этого метода.

Есть 2 разновидности генерации нового ряда сделок:

- Простая перестановка сделок. Число сделок все время остается тем же, и конечный результат не будет сильно отличаться. У этого варианта есть еще вариация, когда мы весь ряд делим на множество подрядов по 20-30 сделок в каждом, и уже внутри каждого подряда проводим перестановки. Логично использовать эту вариацию в случае использования ряда из множества OOS-периодов.

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

Для иллюстрации тестирования Монте-Карло я воспользуюсь программой @RISK (http://www.palisade.com/risk/). Это настройка для Excel, позволяющая автоматизировать обработку множества проходов со случайными числами, и много чего еще. Входит в продукт Palisade DecisionTools Suite.

В качестве исходного ряда был взят ряд сделок трендоследящей система с такой эквити (тест на фьючерсе РТС с 2009 года по данный момент):

Как и большинство трендоследящих систем, она отличается множеством мелких убытков и отдельными крупными выигрышами. Для бектеста были выбраны средние параметры форвардных тестов на этом же временнОм отрезке. Результаты вкратце следующие:

Net Profit %

5105.90 %

All trades

837

Max. Consecutive Loosers

21

Max. system % drawdown

-39.16 %

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

После 10000 проходов получим такие картинки:

Средняя доходность 5187%, с 95% вероятностью будет лежать на отрезке [4250; 5835]. Понятное дело, что доходность не будет сильно отличается для всех вариантов, так как множество сделок одно и то же. Вся разница получается из-за сложного процента, так как доход считается с учетом реинвестирования прибыли. Тут особо анализировать нечего.

С просадкой дела получились много хуже:

Средняя просадка составила -51%, с доверительным интервалом 95% она может меняться от -36% до -70%. Можно сказать, что бектесту сильно повезло. Эксперимент подтвердил старое-доброе правило: протестируй систему, получи оценку максимальной просадки, помножь ее на 2 и получишь то, что можно ожидать в реальной торговле.

Касаемо убыточных сделок подряд дела не лучше:

В среднем число убыточных сделок подряд будет около 24, с 90% вероятностью будет лежать в пределах от 18 до 34. Вообще, для простой оценки ожидаемой серии убытков можно пользоваться простой формулой:

Ln(1/N)/Ln(P), где N – число сделок, а Р – вероятность убыточной сделки. Подставив сюда значения N=837 и Р = 0.8, получим в районе 30 сделок подряд, что сходится с экспериментом.

Из полученных результатов можно с уверенностью сказать, что система для тех, у кого Balls of Steel :)

Аналогично можно построить графики распределения для любого интересующего нас параметра, были бы формулы рассчета для Экселя.

Полезные книжки/ссылки

- Evidence-Based Technical Analysis (David R. Aronson)

- Trading Systems. A new approach to system development and portfolio optimization (Urban Jaekle)

- Quantitative Trading Systems Practical Methods for Design Testing and Validation (Howard B Bandy)

- www.elitetrader.com

- http://forex.kbpauk.ru

Комментарии

Николай Камынин — 28 ноября 2012 г.

spitfire,
Правильно ли я понял,что Вы переставляете сделки?
Типа, История не меняется, а сделка, которая вчера переставляется, со сделкой сегодня.
Верно? А какие условия для сделки при этом реализуются?
Если так, то какая гипотеза проверяется данным тестом?
Спасибо

0 +

Николай Камынин — 28 ноября 2012 г.

и еще, если не сложно, изложите кратко, какую гипотезу проверяет каждый из приведенных Вами тестов
Спасибо

0 +

Николай Камынин — 28 ноября 2012 г.

поясню.
В заголовке статьи указана проверка на прочность.
Для торговых роботов понятие прочность не определено,
а фондовые рынке не очень похожи на сопромат.

0 +

Николай Камынин — 28 ноября 2012 г.

и еще
Если Вы переставили историю случайным образом, то рынок стал уже другим
Что же показывает тест вашего робота на этом новом рынке?
если результаты сильно не изменились - значит рынок не изменился или роботу все равно что обрабатывать?

0 +

spitfire — 28 ноября 2012 г.

Уфф, Николай, сколько вопросов сразу)) Попытаюсь ответить.
Про переставление сделок. Да, Вы правильно поняли, в тесте Монте-Карло рандомно переставляются сделки (под сделкой понимаю ее итоговый результат в %), получается новая кривая капитала, которую и оцениваем. Это как бы симуляция варианта что история повторяется, но немножко не в той последовательности :)
По тестам.
1. Сдвиг во времени проверяет подгонку системы под график цен
2. Вневыборочное тестирование - аналогично. + оценка поведения системы на реальных торгах
3. Монте-карло оценивает в каких пределах может изменяться тот или иной параметр.

Переставлением сделок я не меняю природу рынка, что очень важно (поэтому я не использую для теста генераторы истории свечей - тоже считаю это бредом). Я просто меняю последовательность событий, происходящих на рынке. Пятница стала средой, а вторник четвергом образно говоря. У всех систем есть времена когда они выигрывают и когда проигрывают. И перестановка сохраняет сами сделки, просто смешивая их между собой много-много раз. Таким образом мы сможем глянуть а что будет если вдруг рынок какое-то время будет "не наш", как это отразится на просадке, профит-факторе и прочем. То есть смотрим акая вообще просадка возможна для этой конкретной работающей системы на этом конкретно рынке, если бы последовательность событий на рынке была другой (опять же при сохранении характерных рыночных паттернов)

С удовольствием выслушаю варианты других коллег по проверке систем. :)

0 +

barabas — 30 ноября 2012 г.

>С удовольствием выслушаю варианты других коллег по проверке систем. :)

Все перечисленные методы абсолютно разумны. Однако после нескольких лет тестирования систем пришел к выводу, что все эти тесты отнимают слишком много времени. В итоге методику оценки сильно упростил, а эффективность ее повысил. Первое, и самое главное - ТС должна реализовывать не абстрактное "пересечение средних", а какую-то осмысленную идею, имеющую "физический смысл", основанную на понимании структуры рынка и сути процесса, на котором пытаемся заработать. Поэтому оптимизацией не пользуюсь вообще, а интервалом OOS при этом является весь (и любой) интервал тестирования. Для оценки просто смотрю на графике цены где находятся точки совершения сделок - они должны соответствовать заложенной в ТС идее, просмотреть несколько десятков сделок на разных участках занимает не более 5 минут. Сразу становится очевидно, что нужно дорабатывать. Если ТС работает как задумано, смотрю на кривую баланса - после накопления некоторого опыта достаточно одного взгляда, чтобы без всяких параметров оценить работу ТС, это занимает еще минуту. Ну и если кривая баланса выглядит как задумано, тогда можно потратить время чтобы посмотреть параметры ТС, оценить устойчивость, но это до этой стадии дело доходит уже очень редко, и как правило, ничего нового не узнаешь, только подтверждаются ранее сделанные выводы.

0 +

spitfire — 30 ноября 2012 г.

barabas, согласен, в случае если и оптимизировать нечего, то первые 2 метода не нужны. А по какому правилу Вы определяете что система сломалась и ее необходимо выводить из торгов?

0 +

barabas — 1 декабря 2012 г.

spitfire,
"вручную" - по тому же самому - если сделки системы перестали соответствовать заложенной идее. Но вообще, стараюсь торговать основополагающие принципы, которые если и исчезнут, то наверное вместе с самим рынком. У меня и систем по сути всего две - трендовая и контртрендовая, сейчас как раз пытаюсь их объединить в одну ))) А оперативный вывод из торгов в случае слома в большей степени необходим для торговли паттернов, которые склонны появляться и исчезать. Если же речь идет о полностью автоматизированном выводе из торгов, то умные люди пишут, что критерием должно быть отклонение параметров баланса от "нормы" на статистически значимом числе сделок, и я с ними полностью согласен :)

0 +

spitfire — 1 декабря 2012 г.

barabas, выражение "отклонение параметров баланса от "нормы" на статистически значимом числе сделок" довольно расплывчато)
Насчет объединения 2х систем в одну. Это скорее всего называется портфелем систем, где каждой системе присваивается свой вес в общем капитале. Периодически веса меняются в зависимости от поведения систем относительно друг друга. Это вкратце - могу написать заметку на эту тему если интересно.

0 +

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору