Финансовая лаборатория

Биржевая торговля и торговые роботы

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

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

Ловушка заглядывания

Являясь всего лишь средством программирования, Wealth-Lab не может искусственно ставить для Вас барьеры, указывая - как Вы должны строить программный код. При построении программного кода торговой стратегии возможны всевозможные подводные камни, такие, как заглядывание в будущее - специальное или нечаянное. В своей книге "Трейдинг - Ваш путь к финансовой свободе" Ван Тарп назвал такое заглядывание в будущее постдиктивными ошибками.

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

При тестировании не получайте доступа к данным из будущего

Убедитесь в том, что Ваша стратегия не извлекает преимущество из той информации, которую Вы никогда не сможете получить в реальном мире. Такого типа ошибки можно легко избежать если всегда получать доступ к значению ряда данных либо индикатора в главном цикле только на текущем (либо предыдущем) баре, не пытаясь получить доступ к данным на баре с номером (bar + 1) либо с любых других баров, которые находятся в будущем.

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

Пример (как выполнить пример приведенного кода)...

//Иллюстрация того, ЧТО ДЕЛАТЬ НЕЛЬЗЯ!!!

protected override void Execute()
{
   double sd = StdDev.Value(Bars.Count - 1, Close, Bars.Count, StdDevCalculation.Sample);

   for(int bar = 20; bar < Bars.Count; bar++)
   {

      // Логика торговой стратегии, которая располагается здесь НЕ ДОЛЖНА ИСПОЛЬЗОВАТЬ sd (стандартное отклонение)
   }
}

Выполняйте торговые сигналы только на баре с номером (bar + 1)

Если Вы не хотите получать доступ к данным бара, который находится в будущем, Ваша стратегия должна обрабатывать текущий бар и создавать торговый сигнал для следующего бара, т.е. для бара с номером (bar + 1). Все стратегии, которые поставляются вместе с программой Wealth-Lab Developer являются хорошими примерами для внимательного изучения. Обязательно посмотрите также технику выходов, основанных на времени удержания позиции.

Исключением из этого правила являются только торговые сигналы, которые используют цену закрытия (AtClose).

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

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

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

1. Приказы AtClose выполняются на текущем баре bar.

Затем следуют приказы, выполняющиеся на баре bar+1 в следующем порядке:

2. Приказы AtMarket, затем

3. Приказы AtStop (ограничивающие убытки), и наконец, самыми последними выполняются

4. Приказы AtLimit (берущие целевую прибыль)

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

Пример (как выполнить пример приведенного кода)...

protected override void Execute()
{
   for(int bar = 50; bar < Bars.Count; bar++)    {       if (IsLastPositionActive)       {          Position p = LastPosition;          if( CumUp.Series(Close, 5)[bar] >= 1 )

            ExitAtClose(bar, p);

         else if( p.MAEAsOfBarPercent(bar) < -8)

            ExitAtMarket(bar + 1, p);

         else if( !ExitAtTrailingStop(bar + 1, p, SMA.Series(Close, 50)[bar]) )

            ExitAtLimit(bar + 1, p, p.EntryPrice * 1.25);
      }

      else

      {

         //здесь кодируются правила входа в позицию.

      }
   }
}

Трейдинг, базирующийся на статусе активности позиции

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

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

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

Пример (как выполнить пример приведенного кода)...

//Пример иллюстрирует то, ЧТО ДЕЛАТЬ НЕЛЬЗЯ!!!
protected override void Execute()
{
   for(int bar = 5; bar < Bars.Count; bar++)
   {
      if( !IsLastPositionActive )

        BuyAtLimit(bar + 1, Close[bar] * 0.98);

        /* НИКОГДА НЕ ПРОВЕРЯЙТЕ СТАТУС АКТИВНОСТИ ПОЗИЦИИ ПОСЛЕ ТОРГОВОГО СИГНАЛА */

      if (IsLastPositionActive)

         ExitAtMarket(bar+1, LastPosition);
   }
}

Смотрите, какой прекрасный график роста капитала рисует нам проведенный бектестинг такой стратегии. Ну чем не "святой грааль"?

Заглядывание в будущее

Пример использование некорректного кода с заглядываием

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

Искажения результатов из-за выбытия компаний

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

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

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

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

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

Сегодня мы рассмотрели опасные моменты, которые могут возникнуть при построении торговых стратегий. Не зря русская пословица говорит - "Знал бы где упасть - соломки бы подстелил". Те, кто прочитал сегодняшний пост могут заранее "подстелить соломки" и не делать ошибок при построении торговых систем, связанных с заглядыванием в будущее.

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

Комментариев: 3

  1. [...] Ловушки при построении торговых систем, связанные с пр…  Главная  Торговая система HighLowLong – шаблон [...]

  2. Юрий Шевелёв пишет:

    Дмитрий, здравствуйте!
    Спасибо Вам за огромную работу, которую Вы проделали, сделав этот (так необходимый многим) перевод. Хотелось бы знать, будет ли продолжен перевод оставшейся части инструкции. Мне кажется, что перевод порядка следования приказов точнее сделать примерно так:

    1. Приказы AtClose выполняются на текущем баре bar.
    Затем следуют приказы, выполняющиеся на баре bar+1 в следующем порядке:
    2. Приказы AtMarket, затем
    3. Приказы AtStop (ограничивающие убытки), и наконец, самыми последними выполняются
    4. Приказы AtLimit (берущие целевую прибыль)

    С уважением, Юрий Шевелёв

Оставить комментарий