• strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Declaration of views_handler_field::query() should be compatible with views_handler::query($group_by = false) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_field.inc on line 1148.
  • strict warning: Declaration of content_handler_field::element_type() should be compatible with views_handler_field::element_type($none_supported = false, $default_empty = false, $inline = false) in /home/forex/sites/0-forex.ru/sites/all/modules/cck/includes/views/handlers/content_handler_field.inc on line 229.
  • strict warning: Declaration of views_handler_argument::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_argument.inc on line 917.
  • strict warning: Declaration of views_handler_argument::query() should be compatible with views_handler::query($group_by = false) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_argument.inc on line 917.
  • strict warning: Declaration of views_handler_sort::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_sort.inc on line 165.
  • strict warning: Declaration of views_handler_sort::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_sort.inc on line 165.
  • strict warning: Declaration of views_handler_sort::query() should be compatible with views_handler::query($group_by = false) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_sort.inc on line 165.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_filter.inc on line 599.
  • strict warning: Declaration of views_handler_filter::query() should be compatible with views_handler::query($group_by = false) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_filter.inc on line 599.
  • strict warning: Declaration of views_handler_relationship::query() should be compatible with views_handler::query($group_by = false) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_relationship.inc on line 149.
  • strict warning: Declaration of views_handler_area::query() should be compatible with views_handler::query($group_by = false) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_area.inc on line 81.
  • strict warning: Declaration of views_handler_area_text::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/handlers/views_handler_area_text.inc on line 121.
  • strict warning: Declaration of views_plugin_argument_validate::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/plugins/views_plugin_argument_validate.inc on line 87.
  • strict warning: Declaration of views_plugin_argument_validate_taxonomy_term::options_submit() should be compatible with views_plugin_argument_validate::options_submit(&$form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc on line 165.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Declaration of date_handler_field_multiple::pre_render() should be compatible with content_handler_field_multiple::pre_render($values) in /home/forex/sites/0-forex.ru/sites/all/modules/date/date/date_handler_field_multiple.inc on line 185.
  • strict warning: Declaration of views_plugin_query::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/plugins/views_plugin_query.inc on line 181.
  • strict warning: Declaration of views_plugin_style_default::options() should be compatible with views_object::options() in /home/forex/sites/0-forex.ru/sites/all/modules/views/plugins/views_plugin_style_default.inc on line 24.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/plugins/views_plugin_row.inc on line 136.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Declaration of views_handler_field_user::init() should be compatible with views_handler_field::init(&$view, $options) in /home/forex/sites/0-forex.ru/sites/all/modules/views/modules/user/views_handler_field_user.inc on line 50.
  • strict warning: Non-static method view::load() should not be called statically in /home/forex/sites/0-forex.ru/sites/all/modules/views/views.module on line 1118.
  • strict warning: Declaration of views_handler_filter_node_status::operator_form() should be compatible with views_handler_filter::operator_form(&$form, &$form_state) in /home/forex/sites/0-forex.ru/sites/all/modules/views/modules/node/views_handler_filter_node_status.inc on line 15.

Об одном методе фильтрации краткосрочных систем. Трейдер Александр Горчаков.

 Об одном методе фильтрации краткосрочных систем. Трейдер Александр Горчаков.

Вместо предисловия

Чем дальше я ухожу от занятий «чистой» наукой, тем иначе мне видится творческий процесс и его описание. В науке все было просто и четко:

- постановка задачи,

- перечисление близких задач и их методов решения, предложенных предшественниками,

- собственные методы или модификация существующих,

- их приложение для решения задачи.

Сухо, понятно и по возможности кратко. Собственно сам процесс заключался в последних двух пунктах и отражался в куче листов, исписанных формулами, постоянно перечеркиваемыми и исправляемыми. Сейчас мне и проще и сложнее. Нет четких задач, нет и общепризнанной аксиоматики, переводящей проверку найденного решения в плоскость математической логики «истина-ложь». И поиск решения уже сводится не к выводу формулы, а к цепочке нестрогих рассуждений, приводящих к выбору (!) нужной формулы для последующей экспериментальной проверки. Да и само решение в процессе исследования ни раз и ни два подвергается ревизии из-за смены расстановки приоритетов в тех самых нестрогих рассуждениях.

И уже в конце работы я и сам не могу понять, что внесло больший вклад в решение задачи: нестрогие рассуждения или собственно формула(-ы)? И невольно ловлю себя на мысли, что в трудах других авторов все чаще и чаще ищу только ответ на вопрос: почему так, а не иначе? Потому что, только ответив на этот вопрос, можно найти путь к совершенствованию и модификациям, а не к простому копированию. Ведь в нашем деле копирование – это путь в никуда. Поэтому я заранее прошу прощения у тех, кто ждет от моего доклада новых математических открытий, кучи формул и выкладок, у тех, кто хочет иметь готовый алгоритм моей торговой модели. Увы, этого в докладе нет (хотя бы потому, что об идеях своей торговой модели я много раз писал на сайте). Также я прошу прощения у тех, кому не интересны дискуссионные рассуждения о взаимоотношениях «трейдер-инвестор». Но без них я не смогу ответить на вопрос: зачем нужен фильтр? А собственно доклад и посвящен моему ответу этот вопрос и описанию как я строил фильтр. Кому не интересно первое, может не читать первые два раздела, а кому не интересно второе – последующие.

Все течет, все изменяется

Уже готовя этот доклад и в очередной раз просматривая сайт «Как стать трейдером?», я натолкнулся на дискуссию по тематике данного доклада Трендовый фильтр: длина vs глубина просадки и увидел в ней свое сообщение:

Цитата:

Мы обычно делаем так:

1. На основе полученного фильтра строим новую торговую систему без привязки к существующим.

2. С помощью портфельных методов находим в некотором смысле оптимальный портфель систем.

3. Торгуем этот портфель.

Когда я писал этот ответ, это было правдой, но «Его Величество» рынок тем и интересен, что зачастую преподносит нам сюрпризы, заставляющие отказываться от любых догм. И причиной тому стали неудачные результаты коротких системных позиций с 14 июля по 12 октября 2006-го года. Не секрет, что шортовые системы на нашем растущем рынке на порядок хуже лонговых по любому соотношению «доходность-риск», а потому их постоянное использование существенно ухудшает соотношение «доходность-риск» кривой доходности. Конечно, если на участках тестирования попадаются периоды а-ля октябрь 1997-октябрь 1998-го в России или март 2000-март 2003 в США, то результат будет иным, но ожидание таких периодов может привести к очень негативным последствиям для счета.

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

И еще надо учитывать при ответе на вопрос: играть или не играть шорты постоянно, метод оценки средним инвестором своей доходности. Этот метод прост: средний инвестор выбирает максимум доходности из альтернативных вложений по принципу: «вложил и забыл» (шорты в данном случае к счастью для управляющего исключаются). Поэтому, вытерпев некоторое время Ваш «проигрыш» его «доходности» и забыв о предшествовавших «победах», средний инвестор в случае затяжной полосы «поражений», проголосует ногами.

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

Вывод напрашивается сам собой: если Вы рассчитываете на массового инвестора, то постоянное использование шортов и «плечей» в одном эмитенте – это не для Вас.

Какой же выход из создавшегося положения? Их два:

1. Диверсификация по:

- торговым системам «только лонг», зарабатывающим и(или) не сильно проигрывающим при разных состояниях рынка (например, диверсификация по трендовым системам, зарабатывающим на трендах разной длины, между трендовыми системами и стратегиями типа «торговли волатильностью» и т. п.);

- видам финансовых инструментов (долговые инструменты, акции, покупка (не продажа!) опционов);

- финансовым рынкам разных стран.

2. Создание фильтра(-ов) шортов и плечей.

Отметим, что из перечисленного в п. 1 полностью избавит Вас от головной боли только качественное решение первой задачи. Две другие лишь уменьшают вероятность наступления «неблагоприятного события»: длительного «проигрыша» «доходности» среднего инвестора. Собственно это я и написал в сообщении, приведенном выше. Но жизнь не стоит на месте и на мою «повестку дня» встала вторая задача. Почему? Об этом в следующем разделе.

Почему краткосрочные системы?

Чем дольше я исследую трендовые (и только трендовые) торговые системы для акций России, США и Германии со средним временем в позиции от 2-х дней и больше (эта нижняя граница определяется соображениями трудоемкости исполнения), тем больше убеждаюсь в том, что набор лучших соотношений «доходность-риск» среди всех систем с заданным средним временем в позиции и одинаковым небольшим проскальзованием (~ среднеквадратичное отклонение дневных приращений, деленное на 10) имеет ярко выраженный локальный максимум в одной из точек от 2 до 5 дней для любого эмитента.

Также к достоинствам таких краткосрочных систем можно отнести четкие и комфортные ограничения на риск в одной сделке, что приводит к существенно более низким просадкам при их подневном расчете и сравнительно быстрый выход из этих просадок. Это очень немаловажно, если учесть то, что отчетность перед инвесторами производится не посделочно, а за период. И если, долгосрочная система, не дай Бог, просидит часть этого периода «против» сильного движения рынка, то никакие объяснения о прибыльности текущей сделки Вам не помогут.

Собственно два этих замечания и привели меня к выводу, что решение первой задачи из перечисленных в п. Диверсификация из предыдущего раздела очень сильно зависит от «краевых условий». Потому что задача оптимизации соотношения «доходность-риск» диверсифицированного портфеля и задача снижения вероятности длительной серии «проигрышей» диверсифицированного портфеля «доходности» инвестора, если и не «противоположны», то, как минимум, «перпендикулярны». В первом случае, как правило, получается портфель из лучших систем со средним временем в позиции 2-5 дней, во втором до 30% портфеля начинают занимать системы со средним временем в позиции от 7 и более дней, в результате чего соотношение «доходность-риск» такого портфеля становится в лучшем случае сравнимым с аналогичным соотношением для одной из систем первого портфеля (у портфеля краткосрочных систем это соотношение, как правило, гораздо выше).

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

Как же «скрестить ежа с ужом»? Постановка задачи в данном случае лежит на поверхности:

надо играть на оптимальном портфеле краткосрочных систем:

- шорт+лонг с уменьшенным объемом, на тех среднесрочных(!) состояниях рынка, когда шорты прибыльны (за период),

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

- лонг с уменьшенным объемом или аут в оставшихся случаях.

Дело «за малым», но самым трудным: построить прогноз будущего среднесрочного состояния рынка, т. е. ни что иное, как фильтр.

Как Вы видите, из предложенных в упомянутой дискуссии вариантов ответов:

Цитата:
Вопрос к тем, кто это прочитает - как поступаете Вы:

1. Используете фильтр с описанными недостатками (уменьшение доходности, еще сильнее уменьшение просадки, в обмен на увеличение ее длительности – прим. мое)

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

3. Не используете фильтр и наслаждаетесь более психологически комфортной системой

4. Другое

30 июня 2006-го я уверенно выбрал п. 4, подразумевая под этим решенную задачу диверсификации по системам (см. О построении оптимальной торговой системы из набора систем ). Но сейчас выбираю п. 2. П. 1, как я объяснил выше, тоже мне не подходит, потому что важна не только глубина, но и время просадки.

Как строить фильтр?

Правильнее было бы озаглавить этот раздел «Как я строил фильтр», но так как упоминание «я» в заголовках не принято, то, поразмыслив, остановимся на заголовке-вопросе, потому что, строгого доказательства, что какой-либо алгоритм построения фильтра оптимален, вероятней всего, не существует в природе.

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

Однако в моем случае на основе анализа сделок одной из краткосрочных систем удалось найти другую характеристику. Простейший анализ сделок показал, что если вход в лонг происходил накануне (система у меня работает по внутридневным стоп-приказам), а на следующий день была белая свеча и рост цены High+Low (как я отмечал здесь приращения именно этих цен наиболее сильно коррелируют с приращениями средневзвешенных цен), то с вероятностью больше 0,8 этот лонг закрывается с прибылью. И наоборот, если выход из лонга происходил накануне, а на следующий день была черная свеча и падение цены High+Low , то с вероятностью больше 0,8 вход в следующий лонг происходил дешевле. Так как в 90% случаев входы в лонг происходили в дни, когда наблюдалась белая свеча (это просто правило системы) и рост цены High+Low (это, скорее всего, следствие того, что система трендовая), а такая же доля выходов из лонга в дни, когда наблюдалась черная свеча (это тоже правило системы) и падение цены High+Low, то естественной характеристикой среднегосрочного состояния рынка для лонгов становится число дней за период (о длине этого периода чуть ниже), когда в этот день и накануне наблюдались белые свечи (это просто правило системы) и рост цен High+Low , а для шортов, соответственно, число дней за период, когда в этот день и накануне наблюдались черные свечи (это тоже правило системы) и падения цен High+Low .

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

Да и само сравнение классификаторов постфактум не дает внятного ответа на вопрос «что лучше?», потому что не учитывается объективная временная задержка при переходе от классификатора к прогнозу будушего среднесрочного состояния рынка. Поэтому я ограничился экспериментальным сравнением уже готовых фильтров, взяв в качестве классификатора направления среднесрочного тренда позицию лучшей из известных мне торговых систем со средним временем в позиции больше 10 дней. Но о результатах эксперимента чуть позже.

Итак, формула предлагаемого классификатора выглядит для лонгов следующим образом



I(M) – индикатор события M,

а для псевдошортов (т. е. когда новый лонг открывается дешевле цены продажи предыдущего)

Если предположить, что последовательность B(t)=I((Closet-Opent )<0) представляет собой последовательность Бернулли (т. е. последовательность независимых испытаний) с вероятностью успеха равной (случай «эффективного рынка») и вероятность равна , то L(m,N) и S(m,N) представляют собой ни что иное, как число биграмм (1,1) в последовательностях Бернулли с вероятностью успеха равной и для среднего и дисперсии этих величии справедливы формулы:


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

Чтобы можно было пользоваться нормальным приближением, я положил N=50 и от значений L(m,N) и S(m,N) перешел к значениям
и ,
где - функция распределения стандартного нормального закона.

А для того, чтобы придать больший вес последним значениям цен от этих величин перешел к их взвешенным средним:



И, наконец, в качестве прогноза значений EP(L,m) и EP(S,m) на следующий день m после окончания торгов в (m-1)-й день я использовал величины EP*(L,m) и EP*(S,m), получающиеся заменой в приводившихся формулах цен Openm, Highm, Lowm, Closem, на цену Closem-1.

Собственно фильтр на объем лонга (!) я строил в два этапа. Прежде всего, обозначим состояния рынка:

1 – лонги играются с увеличенным объемом;

0.5 - лонги играются с уменьшенным объемом;

0 – лонги не играются.

На первом этапе была построена функция f(m) по следующему правилу:

Однако эта функция в качестве фильтра оказалась не слишком пригодна из-за сравнительного большого числа «ошибочных входов и выходов», т. е. краткосрочных (на 2-3 дня) смен состояний с возвратом в старое состояние. Поэтому был использован фильтр на смену состояния функции f(m) опять с использованием уже введенных величин. А именно, в качестве фильтра была взята функция F(m)

Ну и наконец последней особенностью применения построенного фильтра является то, что собственно его применение начинается со следующей сделки по краткосрочной системе.

Результаты экспериментов

Итак мы получили фильтр для объема лонга краткосрочной системы. В принципе сам фильтр легко преобразуется в среднесрочную торговую систему по правилу: если F(m)=1 и F(m-1)<1, то по закрытию m-1 дня открывается лонг и если F(m)<1 и F(m-1)=1, то по закрытию m-1 дня лонг закрывается.

Как мы обещали выше, наряду с построенным фильтром, рассмотрим в качестве альтернативного фильтра лучшую из известных мне торговых систем со средним временем в позиции больше 10 дней. Этот фильтр мы будем строить по обратному правилу: если позиция системы на конец дня лонг, то значение альтернативного фильтра на следующий день равно 1, в противном случае значение фильтра положим равным 0.5. Этот фильтр обозначим F1(m).

Сравнение системы с псевдосистемой, построенной при помощи фильтра, показало, что с 03.06.2002 по 30.03.2007 последняя в РАО ЕЭС и Газпроме при близкой максимальной просадке (~20%) имеет в два раза хуже доходность. Т. е. использование фильтра как торговую систему в моем случае бессмысленно.

Оба фильтра мы будем использовать так:

- если значение фильтра 0.5, то в этот лонг (-и) открывается с объемом ,

- если значение фильтра 1, то в этот день лонг(-и) открываем с объемом k,

- если значение фильтра 0, то в этот день лонг(-и) не открываются.

Значение 1<2 мы подберем таким образом, чтобы среднедневная доходность исходной торговой системы и фильтрованной совпали.

В качестве меры сравнения возьмем коэффициент Кальмара: среднедневная доходность, умноженная на 255, деленная на максимальную просадку. В качестве проскальзования системы возьмем 0,1% на одну транзакцию (0,2% на сделку), что является реальным проскальзованием для портфеля из 5-6 краткосрочных систем и общим объемом на портфель в РАО ЕЭС или Газпроме ~1 млрд. руб.

Как видно из результатов таблицы, применение обоих фильтров улучшило коэффициент Кальмара исходной системы. При этом фильтр F(m) оказался лучше фильтра F1(m) в 2 случаях из 4 и хуже в одном. Также коэффициент k указывает на то, что фильтр F(m) лучше выявляет периоды сильных просадок систем, а фильтр F1(m) - периоды повышенной доходности систем, что говорит о том, что и тот и другой фильтр могут быть улучшены, путем создания комбинированного фильтра.