Блог им. robostock
Статья будет полезна тем, кто уже тестирует или планирует тестировать торговые стратегии на фьючерсах.
В моей практике постоянно приходится сталкиваться с торговыми стратегиями на срочном рынке.
В каждом таком случае необходимо понимать, на каких данных тестировалась стратегия, как склеивались фьючерсы, если они склеивались.
Цена фьючерса зависит от следующих параметров: цены базового актива, процентной ставки и дней до экспирации.
F=N*S*(1+r1) — N*div*(1+r2),
где
N – объем фьючерсного контракта (количество акций),
F – цена фьючерса;
S – спот-цена акции;
r1 – процентная ставка на срок со дня заключения сделки по фьючерсному контракту до его исполнения;
div – размер дивидендов по базовой акции;
r2 – процентная ставка на срок со дня закрытия реестра акционеров («отсечки») до исполнения фьючерсного контракта.
Поэтому фьючерсы с разными датами экспирации торгуются c разными ценами, с премией или дисконтом к базовому активу.
Чем меньше дней до экспирации, тем меньше разница между базовым активом и фьючерсом.
Поэтому фьючерсы с разными датами экспирации торгуются с разным базисом к базовому активу.
У большинства фьючерсов на российском рынке всего 4 экспирации, и если вы торгуете без плечей, можно проигнорировать данный факт.
Кто же торгует на срочном рынке без плечей!? :)))))
А если рассмотреть фьючерс на нефть, то он экспирируется ежемесячно. В этом случае ошибка в тестировании фьючерсной стратегии будет давать знать о себе 12 раз в году. В чью пользу зависит от стратегии.
Но будьте уверены, в большинстве случаев не в вашу пользу.
Я выбрал 2 удобных способа хранения и использования исторических котировок фьючерсов.
Первый способ: раздельное хранение котировок отдельных фьючерсов
Долгое время я использовал простой подход, скачивал исторические данные за период с даты экспирации предыдущего фьючерса, до даты экспирации текущего фьючерса.
Таким образом, у меня в каждом файле находится история только по одному фьючерсу.
Исторические данные в каждом отдельном файле не пересекаются по датам с историческими котировками фьючерсов других серий.
Чем удобен такой способ:
— легко тестировать стратегии на отдельных сериях фьючерсов
— не надо думать о том, как склеивались фьючерсы
— тесты максимально близки к реальным торгам
Чем неудобно:
— накапливается огромное количество файлов
— сложный код для стратегий, которые торгуют несколькими фьючерсами
— в wealth-lab`е не будет работать функция синхронизации позиций
— мало исторических данных, для стратегий использующих индикаторы с длинными периодами усреднения
Рекомендации:
Для удобной сортировки файлов рекомендую использовать формат имени файла в виде:
{сокращенное наименование фьючерса}{год}{код месяца} — Si17U, GZ17Z и т.д.
Второй способ: склейка с добавлением дополнительного поля
Этот способ пришлось «изобрести», когда понадобилось тестировать стратегию, торгующую корреляцию акций российских компаний с сырьевыми активами.
Во всех тестерах стало неудобно и лениво писать код, который бы в огромном количестве файлов находил правильный фьючерс, синхронизировал данные и корректно совершал сделки по двум инструментам.
Удобным решением оказалось склеить все исторические данные в один файл. Но вместо использования классических методик склейки фьючерсов, я добавил дополнительное поле «Expiration». Данное поле может принимать на ваше усмотрение любые значения.
Я записываю 0, либо 1.
«1» означает, что данный бар последний перед экспирацией.
В случае работы с Wealth-Lab`ом для работы с дополнительным полем есть специальная функция — FindNamedSeries.
Загружаем дополнительное поле в отдельную переменную:
MySeries = Bars.FindNamedSeries( «Expiration» );
Далее на каждом новом шаге цикла проверяем значение этого поля.
Если MySeries[bar] = 1, то закрываем позиции по стратегии, т.к. это последний торговый бар перед экспирацией.
Если ваша стратегия торгует 2мя инструментами, тогда загружаете значения в две переменные и на каждом шаге цикла значение поля в двух массивах.
Чем удобен такой способ:
— вам становится доступна функция wealth-lab`а для синхронизации котировок разных инструментов
— упрощается код стратегии
— увеличивается массив данных для индикаторов с большим периодом усреднения (хотя я считаю это плохим тоном в написании стратегий)
— упрощается работа с несколькими инструментами
Чем неудобно:
С неудобствами не столкнулся