О тестировании торговых систем, оптимизации и "безопасной" торговле

  • Автор темы Автор темы FXWizard
  • Дата начала Дата начала

FXWizard

Гуру форума
О тестировании торговых систем, оптимизации и "безопасной" торговле

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

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

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

Вложения

  • 1.png
    1.png
    11,7 КБ · Просмотры: 71
  • 2.png
    2.png
    14,9 КБ · Просмотры: 74
  • 3.png
    3.png
    26,1 КБ · Просмотры: 73
  • 4.png
    4.png
    18 КБ · Просмотры: 73
  • 5.png
    5.png
    17,9 КБ · Просмотры: 69
  • 6.png
    6.png
    3,4 КБ · Просмотры: 70
  • 7.png
    7.png
    2,9 КБ · Просмотры: 70
  • 8.png
    8.png
    39,6 КБ · Просмотры: 70
  • 9.png
    9.png
    72,7 КБ · Просмотры: 74
  • 10.png
    10.png
    10 КБ · Просмотры: 74

FXWizard

Гуру форума
О ТЕСТИРОВАНИИ.

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

attachment.php

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

Для этого давайте разберемся, что из себя представляет показатель средней прибыли на сделку. Как не сложно догадаться, это суммарная прибыль, поделенная на количество сделок. Отличный показатель для сравнения различных торговых систем на ОДНОМ И ТОМ ЖЕ отрезке котировок. Но ведь по правилам вневыборочные тесты должны проводится на новой истории. Поэтому для корректного сравнения обе эти "истории" необходимо привести к одному знаменателю. Допустим, сделка принесла прибыль в 1000 пунктов - много это или мало? Если цена актива равна 10000, то эта прибыль составляет почти 10%. А если цена равна 100000 - то это всего 1%. Хорошо, тогда перейдем к относительному значению: прибыль в 2% - это много или мало? Одно дело заработать 2% во время кризиса, когда цены летали по 5% в час, другое дело - во время застоя, когда цены колеблются в очень узком полупроцентном диапазоне. Хорошо, тогда нормируем прибыль по среднему диапазону, разделив ее на АТР. Следующий вопрос: прибыль в 1/2 АТР - это объективная оценка? Опять же не совсем. В периоды роста волатильности цена может легко сделать полтора или даже два АТР. Поэтому нужно посмотреть, сколько средних диапазонов содержится в одном стандартном отклонении. Амплитуда движения в одно стандартное отклонение подразумевает вполне конкретную вероятность, поэтому в разные периоды волатильности и движение в один АТР будет иметь различную вероятность. В итоге, чтобы получить справедливую оценку прибыли, необходимо нормировать ее по АТР и вероятностной функции:

нормированная прибыль = (прибыль / АТР) / (СКО / АТР) = прибыль / СКО

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

attachment.php

На графиках представлены гистограммы распределений рассматриваемых величин. В верхней части графика - движение, нормированное по АТР, в середине - амплитуда стандартного отклонения, выраженное в единицах АТР. В нижней части графика - движение, нормированное по СКО. Хорошо видно, что оно также имеет распределение, близкое к классическому рыночному. По этим графикам можно оценить вероятность ценового движения в различных фазах рынка, от вялых диапазонов до сильно волатильных "выбросов".

Теперь давайте посмотрим, как эти ситуации выглядят на графике:

attachment.php

В верхней части графика расположен индикатор СКО (красный), далее индикатор АТР (зеленый), далее индикатор абсолютных приращений, нормированных по АТР (сиреневый), далее - СКО в единицах АТР (салатовый), далее - приращения, нормированные по волатильности (синий). Хорошо видно, что наибольшая амплитуда колебаний наблюдалась в конце 2008 года в разгар панических настроений. Не мудрено, что именно в эти моменты даже посредственные системы показывали высокие результаты.

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

Поэтому, чтобы сравнить результаты выборочного и вневыборочного тестирования, нормируем значение полученной прибыли по волатильности. Для этого последовательно разделим абсолютное значение прибыли на абсолютное значение волатильности и рассчитаем средние показатели. В Вэлслабе есть возможность построения пользовательской функции для тестирования, а с четвертой версии она добавлена в "перфскрипт" для вывода нужного параметра в сводную таблицу результатов торговли. Но это значение легко рассчитать и в Экселе. Достаточно получить значения волатильности на каждом баре и синхронизировать их во времени со сделками. Смотрим полученную таблицу для периода оптимизации:

attachment.php

Коричневым цветом выделены сделки, полученные из тестера Вэлслаба. Голубым цветом выделены значения АТР и СКО, полученные в момент открытия позиции. Салатовым цветом выделены значения прибыли, нормированные по СКО и, для сравнения, по АТР. В нижней части таблицы посчитаны средние показатели для обоих значений. Значит, на тестовом отрезке средняя прибыль составляла примерно 37-39% от волатильности. Теперь рассчитаем эти же значения для вневыборочного интервала:

attachment.php

Та же самая методика расчета. Получается, что на этом отрезке времени система зарабатывала в среднем по 33% от АТР и по 41% от СКО на каждую сделку. Получается, что за этот период система даже чуть более эффективно отрабатывала рыночную волатильность.

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

ОБ ОПТИМИЗАЦИИ.

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

Возьмем самый простой пример с торговой системой, основанной на пересечении ценой своей скользящей линии. Единственным параметром в этом случае станет длина этой самой линии. Протестируем лонги с закрытием через три бара с длиной окна от 1 до 300. Смотрим график:

attachment.php

Хорошо видна резкая вершина в начале диапазона и несколько умеренных холмов в середине. Одной из задач в оптимизации является выбор такого параметра, что его незначительное изменение не приведет к заметному ухудшению результатов. И было бы логично взять значение 110, диапазон которого (100-120) также достаточно устойчив. Вот тут и проявляется ошибка пересчета. Если мы берем окрестность в 10 пунктов, как доверительные границы, то попадаем в ловушку. Ведь при значении параметра в 50 эта окрестность дает 20%-ный разброс в каждую сторону. А при значении в 200 - лишь 5%-ный разброс. Получается, что визуально мы всегда выберем "холм" с бОльшими значениями, ведь абсолютный разброс его устойчивости будет казаться шире.

Поэтому для корректного сравнения, необходимо преобразовать шкалу значений. Таким образом, чтобы визуальное геометрическое восприятие делало ширину "холмов" равноценными. То есть необходимо уравнять процентный прирост от значения к значению. Это легко сделать, логарифмировав шкалу значений. Смотрим преобразованный график:

attachment.php

Хорошо видно, как изменилась шкала. После такого преобразования зрительная ширина "холмов" соответствует реальной мощности их подмножеств. И "холм" в районе 110 уже выглядит совсем по-другому.

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

attachment.php

В левой части равномерное покрытие всех возможных значений (0;100) с фиксированным шагом и поверхность, построенная по этим значениям. Хорошо видно, что наибольшая эффективность достигается примерно в районе (30;60). Но если рассмотреть правый график с логарифмированными шкалами, то карта поверхности немного преобразуется. Хорошо видно, насколько тщательнее мы протестировали диапазон значений в правом верхнем углу карты. Ведь чем больше абсолютное значение параметра, тем меньшую долю от него составляет наш фиксированный шаг. А визуально можно определить наличие еще одной потенциальной вершины, которая как раз проверена гораздо менее тщательно.
 

FXWizard

Гуру форума
Теперь встает вопрос, как можно избежать подобной ловушки, и справедливо и равномерно протестировать доступное множество значений. Ответ прост: для тестирования широкого временнОго окна необходимо работать на прямую с логарифмированным рядом. Допустим, необходимо проверить диапазон значений от 5 до 200 периодов. Тогда преобразуем реальную шкалу значений в логарифмическую:

real(5 ; 200) = log(1.6 ; 5.29)

А в самом коде системы вместо логарифмированного значения вставим его натуральную величину:

trunc(exp(#OptVar1/10)+5/10)

Такой подход позволит протестировать логарифмированный ряд от 16 до 53 с фиксированным шагом, а тестировать систему на реальных значениях длины окна. Посмотрим, что получается в результате при подобном подходе:

attachment.php

В верхней части графика тесты проводились с фиксированным шагом, в нижней тестировались на случайных числах по методу Монте-Карло. В левой части - логарифмированная шкала, в правой - нормальная. Хорошо видно, что на нормальной шкале шаг тестирования увеличивается по мере роста абсолютных значений параметра. Это позволяет более справедливо проверить диапазон и построить более верную карту поверхности.

Визуально верхняя и нижняя части практически не отличаются. Поэтому справедливо возникает вопрос, зачем нужно случайное Монте-Карло тестирование, если можно покрыть равномерной сеткой всю логарифмическую шкалу. Для ответа на этот вопрос нужно разобраться, что же такое "оптимизация".

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

Кто-то скажет, что более трех переменных в одной системе - это перебор, и устойчивость показателей будет слишком слабой. Отчасти так и есть, если эти параметры не обеспечены достаточным количеством сделок, тестовой историей с различными фазами или достоверностью тестов. Но, например, торговая система, рассмотренная в первом разделе статьи, имеет пять параметров. Система тестировалась на трехлетнем отрезке истории и дала около 1300 сделок. В результате, вневыборочные тесты полностью подтвердили робастность выбранных параметров. Поэтому при высокочастотной торговле вполне возможно и большее количество параметров.

Но вернемся к "оптимизации". Логически, оптимизация - это поиск экстремума функции при заданных ограничениях. В качестве целевой функции можно использовать общую прибыль торговой системы, среднюю прибыль на сделку, вероятность выигрыша, глубину просадки, фактор восстановления, профит-фактор и т.д. В качестве ограничений - минимальное количество сделок, минимальную прибыль на сделку или максимальную продолжительность просадки. Эти значения имеют различную устойчивость во времени и, соответственно, различные целевые экстремумы: минимумы и максимумы. Но мало просто выбрать цель многомерной оптимизации, нужно еще найти алгоритм расчета. Обычно применяется метод прямого перебора с последующей визуальной оценкой. Но этот метод достаточно субъективен, а иногда и просто не возможен во временных рамках. Большую работу по разработке и анализу алгоритмов для оптимизации торговых систем проделал в своей диссертации Армен Шахназарян.

Можно выделить несколько классических алгоритмов оптимизации:

- линейное программирование и симплекс-метод;

- метод градиентного спуска (используется в "поиске решений" Экселя);

- метод генетической оптимизации (используется в Palisade Evolver);

- метод Монте-Карло.

Именно Монте-Карло реализован в Вэлслабе и позволяет достаточно быстро находить устойчивые решения. Рассмотрим следующий рисунок:

attachment.php

В нижней части окна оптимизатор позволяет выбрать целевую функцию и определить параметры оптимизации. Суть Монте-Карло метода в следующем:

- количество оптимизируемых параметров определяет х-мерное пространство всех допустимых комбинаций значений.

- Монте-Карло "рассыпает" по этому пространству случайные точки, координаты которых представляют собой случайные значения параметров. Для каждой случайной точки определяется значение целевой функции

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

- после "сжатия" диапазоны возможных значений для всех параметров немного сужаются, образуя большую устойчивость;

- после этого оптимизатор вновь "рассыпает" случайные точки по новому сжатому пространству и вновь определяет наиболее оптимальный кластер уже внутри него.

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

FXWizard

Гуру форума
О "БЕЗОПАСНОЙ" ТОРГОВЛЕ.

В этой части не будет низкорисковых стратегий и структурных продуктов)) Сейчас я хочу рассказать еще об одной важной составляющей процесса разработки торговых систем. Мало разработать условия для входов и выходов и грамотно подобрать оптимальные параметры. Нужно еще определить критерии, по которым можно будет констатировать факт "смерти" торговой системы. Как правило, торговая система эксплуатирует временную неэффективность рынка. Рано или поздно рынок ее устранит, и нужно быстро определить этот факт, приостановив торговлю по этому алгоритму.

В своей прошлой статье ( _www.russian-trader.ru/forums/showthread.php?t=3399 ) я рассказал о некоторых методах вероятностной оценки торговых систем. В результате, больше всего вопросов мне пришло по оценке линии капитала и ряда сделок. Поэтому сейчас я хочу более подробно остановиться на комбинаторном тестировании последовательности сделок. Рассмотрим результаты краткосрочной трендследящей системы:

attachment.php

В первом столбце представлены последовательные значения результатов сделок по этой системе. Во втором столбце - значения накопленной прибыли. На графике она представлена линией темно-синего цвета. Теперь, переставляя случайным образом сделки из определенной окрестности, мы будем получать новые линии капитала, которые могли бы быть в реальности (розовая линия). Более подробно суть этого метода рассмотрена в прошлой статье, а сейчас остановимся на технических нюансах:

- торговая система должна быть протестирована на репрезентативном временнОм отрезке. Этот интервал должен содержать различные фазы рынка и обязательно неблагоприятный для стратегии период.

- торговая система должна дать репрезентативное число сделок. Диапазон "комбинаторности" определяем как стандартную статистическую ошибку, то есть - квадратный корень из числа сделок. В моем случае - всего было 569 сделок, значит диапазон - 23 сделки.

То есть на месте каждой конкретной сделки может оказаться любая из 23, ей предшествующих. Экселевский алгоритм перестановки сделок можно посмотреть в приложенном файле. Теперь, когда новый ряд капитала генерируется, можно рассчитать для него основные статистики результативности:

attachment.php

В моем файле они рассчитаны по вэлслабовским формулам. При нажатии на клавиатуре функциональной клавиши F9 Эксель создаст новый ряд и пересчитает для него соответствующие ячейки. Далее переходим к непосредственно моделированию в @RISK. Ведь нам нужно получить вероятностные оценки возможных показателей системы. И приблизительно указать, какова вероятность получить 10 убытков подряд или просадку в 60000 рублей. Для этого сначала проведем предварительный тест, чтобы определить количество сделок, скользящую эффективность которых мы будем моделировать в дальнейшем.

Чтобы узнать это число, можно вычислить среднюю длину просадки в сделках. Поэтому делаем первичный анализ системы и определяем 50%-ный доверительный интервал:

attachment.php

На представленном графике рассчитаны 50%-ные вероятности длины просадки, максимальные серии убытков подряд и максимальной глубины просадки. Получается, что с 50%-ной вероятностью мы не получим просадку более 40000 рублей, она не будет длиться дольше 88 сделок и подряд мы не получим более 19 убытков.

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

attachment.php

После чего возьмем минимальное значение ряда, чтобы определить наименее благоприятный отрезок истории. Затем смоделируем эти значения на большом количестве испытаний. В результате мы получим диаграмму распределения вероятности для каждого интересующего нас параметра. Но нужно помнить, что в этом тесте используется чистые, ненормированные значения прибыли, поэтому лучше ориентироваться на безразмерные показатели. Например, вероятности прибыльного исхода или значения профит-фактора за последние 88 сделок:

attachment.php

По диаграмме видно, что с 50%-ной вероятностью профит-фактор 88 сделок подряд не упадет ниже значения в 0,774. И с 95%-ной вероятностью - не упадет ниже 0,446.

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

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

Во-вторых, правильно оцененная вероятность "провала" торговой системы дает некоторые гарантии ее работоспособности. На сегодняшний день рынок торговых систем практически не развит во многом из-за того, что не существует четких правил игры. Продавая торговую систему, разработчик перекладывает все риски на покупателя, не неся никакой ответственности за свою работу. Которая, к сожалению, часто является откровенной халтурой. А, имея вероятностные границы работоспособности, покупатель вправе требовать возврата денег, если за конкретный период времени система так и не оправдала возложенных на нее надежд.

В качестве такого доверительного периода можно, например, взять 90%-ную вероятность продолжительности просадки (в статье взята 50%-ная) и рассчитать на этом интервале предельную эффективность серии сделок. Тогда покупатель точно будет знать, в каком случае разработчик торговой системы признает "брак в работе" и вернет деньги.

ВЫВОД.

В этой статье я рассказал о некоторых, на мой взгляд существенных, моментах в системостроительстве. Во-первых, для сравнения тестовых и вневыборочных показателей эффективности торговой системы, необходимо приводить оба временнЫх отрезка к одному знаменателю. Это можно сделать, разделив абсолютное значение прибыли в каждой сделке на соответствующее этому моменту времени численное значение волатильности. Во-вторых, оптимизация - это не просто перебор значений, а максимизация целевой функции при заданных ограничениях. И если при проверке диапазона значений необходимо придать каждому значению свой "справедливый" вес, то шкалу необходимо логарифмировать. Особенно большое значение это имеет при определении длины рабочего окна из широкого диапазона значений. И, в-третьих, создав работоспособную систему, можно определить границы ее работоспособности. Для этого нужно смоделировать комбинаторный алгоритм и оценить вероятность различных фиксированных и скользящих показателей эффективности торговой системы.

Автор статьи: Тарас Правдюк
 

Вложения

  • 11.png
    11.png
    13,7 КБ · Просмотры: 66
  • 12.png
    12.png
    9,2 КБ · Просмотры: 65
  • 13.png
    13.png
    14,9 КБ · Просмотры: 65
  • 14.png
    14.png
    5,2 КБ · Просмотры: 65
  • 15.png
    15.png
    22,2 КБ · Просмотры: 65
Верх