
В серии следующих постов я расскажу о том, как проводить бэктестинг с помощью Python. Для тестирования торговых стратегий я использую сайт Quantopian. Почему именно его? Потому что он: а) простой и наглядный; б) дает доступ к бесплатным историческим данным; в) имеет богатый функционал.
Для самых подозрительных: придумай идею, научись работать с данными, скачивай библиотеку, подключай к брокеру и торгуй приватным алгоритмом.
Если вы не знакомы с языком Python, то для его изучения вам будут полезны следующие ссылки:
Если кратко, то идем на сайт Quantopian, регистрируемся и начинаем писать код. А подробнее надо знать о следующих пунктах меню:

Идем сюда My Code > Algorithms и выбираем из списка Getting Started: Lesson 1 1. Или можно создать новый алгоритм и скопировать туда следующий код:
# функция, выполняемая перед началом тестирования
def initialize(context):
# context - объект, который будет доступен на всем пути
# привязываемся к тикеру AAPL
# sid(24) и symbol("AAPL") взаимозаменяемы
context.aapl = sid(24)
# добавим переменную для вывода в Logs
context.message = "hello"
# функция, которая будет вызвана каждую минуту
def handle_data(context, data):
# будет куплен AAPL на 100% портфеля
order_target_percent(context.aapl, 1.00)
# выведем переменную из контекста (попадет в Logs)
print(context.message)
Этот код каждую минуту будет проверять наличие свободных средств и покупать акции AAPL, поддерживая их долю на уровне 100% портфеля. Покупка будет осуществляться постановкой ордера, который будет заполняться по мере появления необходимого объема в исторических минутных тиках.
Quantopian не даст купить акций больше, чем торговалось исторически. Результаты такого теста наиболее приближены к реальной торговле.
Также, каждую минуту в лог будет писаться сообщение «hello». Богатыми это нас не делает, но картина проясняется.
Перед запуском установите период и размер капитала.

В русскоязычном интернете есть несколько обзоров Quantopian, где описывается первая версия платформы. В те времена по умолчанию тестирование велось на дневной истории, что давало большую погрешность в сравнении с реальностью.
Теперь о нас позаботились и платформа всегда работает в режиме минутных тиков. Мы ставим ордер, и он исполняется, учитывая исторический объем. Для стратегии «купи и держи» нам достаточно ставить ордер один раз в день и сделать это можно так:
# функция, выполняемая перед началом тестирования
def initialize(context):
# сохраняем актив, с которым будем работать
context.asset = symbol('SPY')
# ставим событие для ребалансировки на открытии рынка
schedule_function(rebalance, date_rules.every_day(), time_rules.market_open())
# ежедневная ребалансировка
def rebalance(context, data):
# проверяем возможность торговли активом
if data.can_trade(context.asset):
# покупаем актив на 100% портфеля
order_target_percent(context.asset, 1.00)
# пишем в Logs сообщение
print("rebalanced")
В данном алгоритме каждый торговый день будет вызвана функция rebalance(), которая поставит ордер на покупка SPY на все свободные средства. В лог каждый день будет выведено сообщение «rebalanced».
Результаты будут максимально приближены к бенчмарку Quantopian, в котором использован принцип «купи и держи» для SPY. Все полученные дивиденды будут реинвестироваться.
Run Full Backtest проведет более детальный анализ и предоставит новую информацию для анализа алгоритма. В будущих статьх я обязательно к этому вернусь.
Этого материала достаточно, чтобы пойти и попробовать самостоятельно что к чему. Стратегия простая как валенок и подробности здесь ни к чему. В следующий раз я опишу улучшенную стратегию «Купи и держи» вокруг SMA(200), которая недавно была описана на сайте Mindspace.ru. В комментариях задавайте вопросы и оставляйте свои предложения.
Александр Румянцев,
Трейдер и автор блога Quantrum.me.
Только вот пайтон странный язык.