Бэктестинг: с чего начать?

Quantopian — богатый инструментарий🔨 для бэктестинга различных стратегий с помощью Python🐍. На сайте имеются бесплатные данные: минутные тики⏳ с 2002 года, фундаментал, календарь отчетности📅, настроение по новостям и т.д.

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

В этот раз будет описана стратегия «Купи и держи».

Как это устроено и в чем фишка: Quantopian проводит конкурсы🏆 алгоритмов и авторам лучших предлагает деньги💰 в управление. При этом алгоритм автора будет залицензирован. Со всей прибыли алгоритма автор получает процент вознаграждения. Код алгоритмов закрыт🔒 от владельцев платформы, о чем неоднократно упоминается в соглашении пользователя и всплывающих окнах. Но Quantopian оставляет за собой право📃 изучать выходные данные алгоритма — доходность, волатильность и другие коэффициенты.

В основе Quantopian лежит библиотека Zipline, которая доступна на GitHub. Эта система основана на событиях и подходит, как для бэктестинга, так и для живой торговли. Дополнительным преимуществом является еще и то, что система готова к интеграции с платформой Interactive Brokers. Подробнее о брокере, читайте здесь.

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

Дополнительное преимущество: платформу можно подключить к своему аккаунту у брокера. То есть для построения робота вам необходимо создать алгоритм, создать аккаунт у Interactive Brokers (демо или обычный) и включить алгоритм. Затем останется только считать прибыль📈 или убытки📉, как кому повезет.

Если есть проблемы с Python, тогда вам будут полезны следующие ссылки:

С чего начать?

Если кратко, то идем на сайт, регистрируемся и начинаем писать код. А подробнее надо знать о следующих пунктах меню:

  • My Code > Notebooks: Ipython блокноты, заточенные под тестирование разных стратегий. Имеется несколько примеров кода.
  • My Code > Algorithms: управление своими алгоритмами. Здесь есть примеры, которые помогут начать. Что-то будет рассмотрено ниже.
  • Learn & Support > Learn: здесь есть вводный курс, FAQ, документация, примеры, статьи и лекции. Все на английском.

Вводный алгоритм

Идем сюда 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.

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

Александр Румянцев aka "iamraa"
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.