Все статьиИнвестиции

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

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 сегодня не обновлялся.

Источник:
Нет комментариев. Ваш будет первым!
Загрузка...