_sk_
_sk_ личный блог
26 ноября 2019, 09:29

Про тестирование стратегий на фьючерсах

Просто несколько строк про свой опыт.

Тестер стратегий у меня самописный (java), что даёт неплохую производительность и возможность запрограммировать именно то, что нужно мне.

Обычная склейка фьючерсов не используется из-за нестыковок цены соседних контрактов, которые портят как расчёт прибылей/убытков, так и значения индикаторов.

Свечные данные сохраняются из терминала QUIK скриптом на QLua в ежедневном режиме отдельно по каждому инструменту. Получается, что для каждого фьючерса есть вся его история в виде csv-файлов «финамовского» OHLCV-формата. Тестер умеет загружать временные ряды из этих файлов за любой период времени.

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

SiH9("Si-3.19", "SiH9", "Si", 20190321, 20190320, 20181220),
SiM9("Si-6.19", "SiM9", "Si", 20190620, 20190619, 20190321),
SiU9("Si-9.19", "SiU9", "Si", 20190919, 20190918, 20190620),
SiZ9("Si-12.19", "SiZ9", "Si", 20191219, 20191218, 20190919),

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

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

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

long position = 0;
final int len = timeCode.length();
for (int i = 0; i < len; i++) {
    final long t = timeCode.get(i);
    if (t <= tLast) {
        continue;
    } else {
        tLast = t;
    }
    // Тут уже доступны значения индикаторов
    final double c = close.get(i);
    ...

Думаю, что самописный или open-source тестер — это однозначный выбор для тех, кто умеет программировать.
27 Комментариев
  • _sg_
    26 ноября 2019, 11:27
    Почему значение «день, предшествующий экспирации» не вычисляете из значения «дата экспирации»? Зачем лишний столбец в данных?
  • Replikant_mih
    26 ноября 2019, 11:50

    >>«Думаю, что самописный или open-source тестер — это однозначный выбор для тех, кто умеет программировать.»

     

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

  • Пафос Респектыч
    26 ноября 2019, 11:54
    Если вы так сильно паритесь по поводу разрывов цены, которые бывают раз в месяц на нефти и раз в три для других фьючей, ваша ТС не особо робастна.
    То есть понятно, что со фьюча на фьюч перед экспирацией надо переходить, но саму ТС такие вещи как случайные гэпы не должны приводить в замешательство ))
  • _sg_
    26 ноября 2019, 12:11
    Вы java под Linux используете?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн