Александр Томтосов
Александр Томтосов личный блог
13 мая 2021, 17:42

Системно тестируем аномалии на Python. Релиз библиотеки Portfolio Quantitive Research (PQR)

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

  • Моделирование портфелей по кросс-секции и временным рядам;
  • Квантильная методика формирования портфелей в % от выборки или фиксированное число инструментов;
  • Возможность гибко задавать веса в портфеле по дополнительному фактору (почти smart beta);
  • Можно вырывать данные для аналитики на каждом промежуточном этапе: сделки, размер позиций, комиссии, доходность портфелей;
  • Возможность относительно точно учесть комиссионные расходы;
  • Пока самая простая визуализация и метрики.

Как выглядит итоговая отрисовка:
Системно тестируем аномалии на Python. Релиз библиотеки Portfolio Quantitive Research (PQR)

Небольшая предыстория или зачем писать свой тестер

 

Не являясь базовым программистом, я пользовался готовыми решениями для бэктестов и особенно долго засиживался на платформе Quantopian. В прошлом году компания не получила нового транша от инвесторов и объявила о закрытии. Вместе с ней сгинул и весь написанный код, а знания синтаксиса несуществующей платформы близки по полезности к 1С-программированию при переезде в долину.
Поработав с другими сервисами, понял, что их существенные недостатки можно разделить на 3 группы:

 

  1. Отсутствие гибкости в плане выбора параметров и получения промежуточных результатов;
  2. Работа в закрытой экосистеме из данных и тестов. Проблемно загрузить много своих альтернативных данных или существенно поменять логику тестов;
  3. Отсутствие системного тестирования рынка и работа по отдельным инструментам.

 

Последний пункт наиболее критичный. Мне хотелось тестировать технические индикаторы или отбор акций по EV/EBITDA не на выборке из 1/2/25 бумаг, а на всех 500+ акциях, которые обращались на Мосбирже или 10к+ на NYSE. Данных и идей будет много, поэтому программа должна быть умеренно быстрой. Остановился на векторных вычислениях в numpy.
Логика расчетов не убойная и ее не сложно переписать на ваш любимый язык. Пример c расчетом весов портфеля по заданному фактору. Например, это может быть рыночная капитализация:

Системно тестируем аномалии на Python. Релиз библиотеки Portfolio Quantitive Research (PQR)

Как можно тестировать свои идеи в PQR

  1. Загружаем библиотеку и смотрим примеры использования в main.py и в папке с примерами. Там ноутбуки с простыми идеями. Будут пополняться;
  2. Находим данные по ценам и факторам для множества компаний. Цена тоже может быть фактором, если ее преобразовать в изменение или другой показатель. Допустим, выбраны мультипликаторы P/E и месячные цены закрытия для 200 российских акций;
  3. Составляем одинаковые по размеру таблицы (матрицы) в экселе/csv/txt или в чем угодно, что сможете загрузить в программу. По вертикальной оси будут названия компаний, а по вертикальной временной ряд. Матрицы обязательно должны быть одинаковы по размеру;
  4. Выбираем параметры тестирования: сколько периодов мы наблюдаем за фактором перед покупкой и сколько будем держать позиции. Устанавливаем лаг, комиссии и требуемый % акций из выборки в каждом портфеле;
  5. Подаем данные по P/E в функцию get_factor и получаем готовые ряды для дальнейших тестов. Все расчеты по укрощению lookahead bias выполняются здесь. Дополнительно сдвигать ряды не нужно;
  6. Задаем фильтры (опционально). Например, выкидываем из выборки компании со среднедневным объемом торгов за прошлый месяц менее 100 млн рублей;
  7. Считаем позиции по отдельным бумагам в каждом портфеле. Эти бинарные матрицы уже почти портфели, но не хватает весов;
  8. Задаем способ расчета весов в портфеле. Если выбираете взвешенный по фактору, то этот фактор нужно загрузить, не забывая про размер матрицы;
  9. Опционально считаем комиссии;
  10. Подаем все полученные данные в последний скрипт для расчета доходности портфеля, метрик и сравнения с бенчмарком. Если есть интересная альфа – можно углубиться в отдельные портфели и подумать над усложнением стратегии. Если нет – копаем дальше.

В папке examples на Гитхабе есть ноутбук с примером расчета небольших портфелей из FAANG и анти-FAANG акций. Пример ознакомительный и по понятным причинам выкладывать большие массивы вендоров в открытый доступ не могу.

Почему квантильная методика так важна

Количество акций в отдельные периоды на ЕМ сильно отличается, особенно если используете фильтры по ликвидности. Количество бумаг на нашей бирже в 1997 и 2021 не подлежит сравнению. 10 портфелей по 5 ликвидных (относительно) акций это очень много для того периода и мало для текущего. Квантильный способ удобен тем, что мы всегда берем одинаковый относительный охват рынка и получаем полную картину на каждый период.

Интересно наблюдать, как меняется результативность портфеля от первых 10% с наименьшим P/E, затем следующим 10% и т.д. Если альфа ломается при малейших изменениях параметров – тревожный признак. U-образная доходность портфелей – уже интереснее.

Что будет и чего не будет в будущих версиях

  1. Расширю количество метрик и графиков, добавлю мультифакторные стратегии и способы расчета бенчмарка
  2. Возможно будет коллаборация с подгрузкой данных из бесплатных источников;
  3. Больше статистики и аналитики по карте портфелей;
  4. Точно не будет всего что касается исполнения ордеров, производных инструментов и микроструктуры рынка. Это инструмент для первых прогонок стратегий. Копать дальше и торговать лучше более подходящим инструментом.

Ссылку на гитхаб с программой выложил в телеге :) https://t.me/sentimetrica

В следующий раз разберу принцип работы на конкретных примерах по нашему рынку. Идеи и пожелания по инструменту @atomtosov

19 Комментариев
  • Ынвестор
    13 мая 2021, 17:53
    По России интересно. По Штатам все уже придумано в лучшем виде.
  • Михаил Дунаев
    13 мая 2021, 17:58
    Для анализа можно использовать готовую довольно мощную либу pyfolio от quantopian, может работать изолированно без экосистемы quantopian
    Так же можно использовать zipline локально
    Есть еще альтернатива с quantconnect, тоже доступна для локальной работы

    Понимаю, что свой велосипед приятнее и роднее )
    Но все же рекомендую глянуть на готовые решения, если вдруг пока не довелось, возможно, они закроют большую часть потребностей
  • Артур
    13 мая 2021, 19:31
    а panda не изучвли?
  • Артур
    13 мая 2021, 19:32
     как вообще начали питон осваивать. мне 31 год и я вообще не шарю в программировании. хочу на досуге питон начать учить, но так лень.

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

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