Методика

Backtest квартильной momentum-стратегии на российских акциях. Основано на методике t.me/kpd_investments.

Универс

Survivorship-free, пересчитывается каждый месяц.

Тикер попадает в универс месяца t, если выполнены все условия:

Делистинг обрабатывается естественно: данные тикера заканчиваются → он автоматически выпадает из универса в момент исчезновения котировок. Никакого ретроспективного составления списка «успешных» бумаг.

Сигнал

Дефолтные страницы сайта и квартильные списки построены по формуле curve_fit:

score = (0.9 · r(12-1) + 0.1 · r(6-1)) / σ(12)

В pipeline также реализована формула simple = r(12-1) / σ(12) (чистый 12-месячный импульс, без добавки 6-месячного). Дефолтные страницы и состав Q1-Q4 остаются на curve_fit; для сравнения на странице Experiments рядом показаны simple, curve_fit и веер промежуточных весов (a · r(12-1) + (1−a) · r(6-1)) / σ(12), a = 1.0…0.0. Веер демонстрирует, что выбор весов не критичен — на верхнем квартиле любые коэффициенты дают близкие кривые, обгоняющие рынок. Количественное сравнение simple vs curve_fit — внутренний research-документ, на сайт не выносится.

Почему такая формула

Сигнал стоит на классической литературе по momentum.

Мы воспроизводим сигнал на собственных данных MOEX; вселенную задаём своим правилом (top-100 по ликвидности).

Квартили и ребаланс

Ожидающие включения (новые акции)

Свежие IPO с историей <12 месяцев не попадают в Q1-Q4 — для score нужно 13 закрытий. Чтобы они не выпадали из поля зрения, на странице Q history под четырьмя квартилями есть справочный блок «ожидающие включения». Он не влияет на backtest, графики и составы Q1-Q4 — это только информация.

Тикер попадает в блок за месяц t, если выполнены оба условия:

Что показываем, по возрасту с листинга:

Оценка грубая по построению: короткое окно (6-11 точек) даёт шумную σ, а score кандидата считается в simple-форме при сравнении с curve_fit-границами. Это ориентир, а не часть методики ранжирования.

Конвенция периода

Период с меткой t на сайте означает: «состав Q1-Q4 по итогам месяца t, посчитан на close последнего торгового дня t». NAV-значение для периода t — реализованная доходность от close-(t-1) до close-t.

Из этого следует:

Учёт издержек

Параметр Значение
Налог на дивиденды (резидент РФ) 13%
Комиссия брокера на сторону 0.05%
Ребаланс ежемесячный

Комиссия применяется к торговому обороту между составами Q-портфелей соседних месяцев (вход + выход). Дивиденды реинвестируются после удержания налога.

Бенчмарк

MCFTRR — индекс полной доходности MOEX после налога на дивиденды. Совпадает с базой нашего расчёта, прямое сравнение корректное.

Источники данных

Класс Источники
Цены (raw, daily) MOEX ISS
Дивиденды MOEX ISS (primary) + dohod.ru + Yahoo Finance + Tinkoff (backfill pre-2014, дополняющие транши)
Сплиты / bonus issues MOEX ISS + manual override
Бенчмарк (MCFTRR) MOEX ISS
Корпоративные ребрендинги MOEX ISS changeover + manual

ISS — единственный first-class источник; остальные подключены каскадом для покрытия известных пропусков (pre-2014 dividend cutoff, отдельные транши совместных выплат). Cross-source расхождения адъюдицируются вручную и логируются в репозитории.

Корпоративные действия

Покрытие исторических данных

Реализация

Стек, конфигурация и инструкции по запуску — в README репозитория. Единственный источник правды по налогам, комиссиям и коэффициентам формулы — src/config.py.