11.11.2026 — портфельный тест и аудит random baseline

Финансовый результат (daily): +0,77%Бенчмарк SBMX: +1,58%Относительный результат: −0,81 п.п. (расчёт)Время фиксации: 19:49 МСК
Портфель
Состав без изменений:
- IMOEXF — 8,16%
- SBER — 8,16%
- XRP — 8,16%
- OZON — 8,16%
- GMKN — 8,16%
- SOL — 8,16%
- GAZP — 8,16%
Риск-сайзинг повышен.
Портфельный тест
Ребалансировка раз в 20 дней — аналогично бенчмарку.
Метрики:
- CAGR: +21,97%
- MDD: −15,32%
- VOL: +17,10%
- Sharpe: 1,2434
- Sortino: 0,542
- Calmar: 1,4344
- Turnover: +976,06%
WF на IS.
Есть вопросы к результату.
Оборот непозволительно высокий — он уничтожит доходность издержками.
Sortino требует проверки корректности расчёта.
Сам результат чересчур аккуратный.
Проверка WF
Вчера основной результат новой модели ранжирования — IC +0,0763 на IS. Сегодня проверяется уже портфельная сторона: насколько качество ранжирования превращается в результат и есть ли преимущество перед случайным выбором акций.
Проверка утечки на уровне признаков уже проводилась. Сейчас требуется повторная проверка всего Walk-Forward с re-check признаков.
На этапе независимой реконструкции портфеля возникла ошибка:
'Series' object has no attribute 'intersection'
После этого модуль был отлажен и запущен изолированно.
Результаты проверки:
- Target использует только будущие цены.
- Prediction date предшествует target horizon.
- Causality test: на 10 датах признаки в момент t не меняются при обрезке данных после t.
- Не обнаружены shift(-n) и center=True.
- Последние 20 дат target имеют NaN.
- Target-интервалы train/validation не пересекаются.
- Rank-gauss выполняется отдельно для каждой даты. Одинаковые ранги дают одинаковое gauss-значение на разных датах.
- Rank-gauss не обучается на данных.
- make_folds совпадает с независимой реконструкцией.
- Shuffle отсутствует.
- Validation не пересекается с train.
- Early stopping не использует validation.
- Все даты ребалансировки присутствуют в validation-фолдах.
- Дубликатов дат нет.
- Независимый пересчёт метрик совпадает с исходным.
- Future-data mutation: на 5 датах мутация будущих данных не меняет признаки в момент t.
Отдельно проверен Target permutation test.
Тест не пройден: после перестановки target IC не упал более чем на 50%. Shuffled-версия сохранила значительную часть сигнала.
Возможные причины:
- Если признак коррелирует с распределением, а не с рангом, shuffle не ломает связь.
- Признак может иметь структуру, коррелирующую с target не через ранг, а через уровень.
Random baseline
Обнаружена проблема survivorship bias: в выборке нет ни одного делистингованного тикера.
Реальный результат хуже среднего random. Модель не лучше случайного выбора из доступных акций.
Бэктест воспроизводится независимо.
Повторная проверка random baseline
Запущен независимый прогон:
- 10 000 Monte Carlo симуляций.
- Блочный bootstrap по времени.
- Scenario A — uniform random.
- Scenario B — persistent random, с несколькими уровнями persistence.
Две вечных вечности ожидания результата.
Спустя час:
Scenario A — uniform random
- 10 000 портфелей.
- Выполнение завершено за 1694,3 секунды.
Scenario B — persistent random
- Persistence 0.0: 10 000 портфелей.
- Persistence 0.25: 10 000 портфелей.
Расчёт оставлен выполняться на ночь. Полные результаты пока не получены.
GitHub сегодня не обновлялся.