Андрей Горшков: бэктестинг биржевых данных при создании и тестировании торговых алгоритмов

25 февраля 2016 на Четверге в AllDerivatives Cafe квант и разработчик торговых систем Андрей Горшков поделился опытом обработки исторических биржевых данных при создании и тестировании торговых алгоритмов. По просьбе участников дополнительно выкладываю тезисы к презентации Андрея на русском языке.

Скачать презентацию Андрея Горшкова

1. Основные проблемы бэктестинга

1.1. Есть результат в исследовании, нет результата в продакшн:

  • не учтены frictions: спред, комиссии, проскальзывание
  • неверные данные на входе
  • не учтены метаданные (расписания сессий, праздники)
  • ошибки в алгоритме: заглядывание в будущее, невоспроизводимые статистики (high, low, close)

1.2. Сложность переноса в продакшн:

  • код в другом стиле (Matlab, многопроходность vs событийность)
  • архитектура в другом стиле (отдельный execution, отдельные сервисы-калькуляторы)
  • данные в другом формате (SQL vs nonSQL, текст vs бинарный, равномерная сетка, разбиение на дни)
  • использование сторонних библиотек (а нужно ли вообще?)
  • другая платформа (Windows vs Linux)

1.3. Интеграция с системой поиска и production pipeline:

  • возможность запускать бэктест в цикле с параметрами
  • возможность экспортировать результаты в production (confgen)
  • прозрачность и воспроизводимость: увидеть на тестах то, что наблюдалось в production и в исследовании

2. Стадии тестирования

2.1. Standalone исследование

  • аналитические методы (Матлаб)
  • визуализация: графики, гистограммы
  • нужно откуда-то взять правильные данные

2.2. Standalone бэктест (execution не требуется)

  • приблизительный тест на сэмплированных данных
  • точный тест на bid/ask данных
  • тут можно выгрузить данные

2.3. Production бэктест (execution нужен):

  • paper trading на исторических данных
  • paper trading на онлайн данных
  • запуск на тестовых объёмах
  • deployment, config, logs

3. Структура данных для бэктеста

3.1. Метаданные:

  • список инструментов, связи
  • календарь и расписание сессий
  • экспирация фьючерсов, склейка
  • сплиты, слияния, появления и исчезновения

3.2. Ценовые ряды

  • форматы: L1, L2, L3, OHLC
  • TWAP bid/ask — до сих пор непопулярен у брокеров!
  • сетка равномерная vs неравномерная: избыточность или удобство
  • события vs состояния: потеря информации

3.3. Способы чтения

  • синхронный (равномерная сетка)
  • слияние (симметричное и асимметричное, условия пропуска)
  • иерархическое хранение и чтение (по дням, месяцам)
  • смешанные способы, граф потоков данных

4. Проблемы построения бэктеста

4.1. Логические проблемы

  • проблема областей определения (события vs состояния)
  • проблема next_tm: необходимость многопроходности (1h + 1m example)
  • заглядывание в будущее vs простота кода (многопроходность делает дерево вычислений непрозрачным)

4.2. Способы реализовать многопроходность

  • врЕменные данные (массивы, файлы, пайпы)
  • несколько итераторов (курсоры)
  • продюсеры-консьюмеры

4.3. Способы реализации producer-consumer

  • внутри одной программы через шедулер (scheduler)
  • через корутины
  • через трэды
  • встроенные каналы в Go
  • несколько программ + пайпы или файлы
  • внешние онлайн сервисы

4.4. Переиспользование кода

  • возможность запуска в цикле для оптимизации параметров
  • возможность использования в production (как генератор конфига, как часть pipeline)

4.5. Переиспользование данных

  • консистентность: все исследователи видят одни и те же данные
  • кэширование: не считаем одно и то же много раз

5. Поиск торговых алгоритмов

  • Цель – не тестирование одного-двух граалей, а поиск в ширину
  • Низкие трудозатраты на проверку идеи: исключить implementational bias
  • Скорость: отрицательный ответ получаем максимально быстро, с положительным можно дольше
  • Точность: по возможности сразу получаем все метрики (draw down, sharpe), в том числе стресс-тест и чувствительность к данным
  • Полнота: либо находим алгоритм, либо заключаем, что его нет ни для каких разумных параметров, и спокойно двигаемся дальше
  • Воспроизводимость и отладка: возможность быстро пройти всю цепочку тестов для заданного алгоритма
  • Кэширование найденных результатов: проблема удобного кодирования комбинаций, общий доступ
  • Неважно, по какому пространству ищем и как ищем (генетика, простой перебор), а важно, как оцениваем — МЕТРИКИ
  • Continuous and incremental search: нам не нужно знать все сразу и абсолютно точно, двигаемся постепенно, улучшая результат и уровень достоверности
  • «Воронка» поиска: грубый отсев быстро и по большому фронту, более глубокая проверка для оставшихся

6. Составление портфеля стратегий

А это уже отдельная тема…

 

 

Share this Post!

About the Author : aliana


Отправить

Ваш электронный адрес не будет опубликован.