Всероссийская олимпиада по вычислительным финансам
Работы оценивает
не жюри, а рынок
Участник не рассказывает, почему его модель хороша. Он сдаёт предсказания, а проверяет их рынок — на данных, которых в момент сдачи не существовало. Ниже тот же путь целиком: файл проходит те же проверки допуска и тот же расчёт, что и настоящая работа участника.
Задание трека A
По каждой торговой неделе — эре — участник расставляет акции Московской биржи по ожидаемой относительной доходности на десять торговых дней вперёд. Предсказание даётся по всей кросс-секции: выбирать, о каких бумагах высказываться, нельзя — иначе результат считался бы на выборке, отобранной самим участником.
Полное описание обоих треков — на странице треков; состав балла — на странице оценки.
| Горизонт | 10 торговых дней |
|---|---|
| Эра | Одна торговая неделя |
| Вселенная | Ликвидные акции Московской биржи, состав пересматривается на границе каждой эры |
| Мера результата | Ранговая корреляция предсказаний с реализованной доходностью, считается поэрно |
Как это выглядит на настоящих данных
Ниже — прогон учебного правила на настоящей истории Московской биржи. Правило объявлено заранее и ни к чему не подгонялось: три эффекта из учебника, знаки названы до расчёта, веса равные.
| инерция за год без последнего месяца | знак плюс |
|---|---|
| аномалия низкой волатильности | знак минус |
| краткосрочный разворот | знак минус |
- накопленная сумма по эрам
- корреляция эры
- эра исключена из оценки
| Период | 2022-01-06 — 2022-12-16 |
|---|---|
| Эр в периоде | 46, из них в оценку вошло 46 |
| Средняя поэрная корреляция | -0,0006 |
| Эффективное число наблюдений | 23,25 при 46 эрах |
| Приведение цен | split_only |
| Версия набора | a.moex.20221230.1338d64e |
- Доходность в наборе ценовая: дивиденды не учтены, потому что реестр отсечек ещё не наполнен. Бумага, прошедшая отсечку внутри горизонта, получает заниженный ранг вне связи с качеством прогноза.
Источник данных: Московская биржа (ISS)
Исторический прогон на данных прошлого. Не прогноз и не индивидуальная инвестиционная рекомендация.
Числа выше — то, что получилось, а не то, что хотелось: веса правила по этому же периоду не подбирались. Кривая, подогнанная выше нуля, показывала бы качество подгонки, а не качество прогноза. Демонстрация показывает механику оценки, а не доходность.
Скачать этот файл предсказаний — загрузите его ниже и пройдите путь целиком: те же гейты, тот же расчёт, те же числа. Демонстрацию, которую нельзя повторить, проверить нечем.
Готовая стратегия для проверки
Своей модели под рукой нет — возьмите эту. Ниже весь её код, без пересказа: именно он построил файл, который вы скачаете. Загрузите файл в форму ниже, и рынок оценит стратегию тем же расчётом, что и работу участника.
Стратегия «Инерция»
Внутри каждой эры бумаги ранжируются по доходности за год без последнего месяца: что опережало рынок, по замыслу стратегии опережает его и дальше. Один признак набора, знак объявлен до расчёта, ничего не подбиралось.
momentum.py
"""Стратегия «Инерция»: бумаги, обогнавшие рынок за год, обгоняют его и дальше."""
from __future__ import annotations
import polars as pl
#: Признак набора: доходность бумаги за год без последнего месяца.
FEATURE = "momentum_year_without_month"
#: Предсказание для бумаги без годовой истории — середина шкалы:
#: о такой бумаге стратегия ничего не утверждает.
MIDDLE = 0.5
def predict(data: pl.DataFrame) -> pl.DataFrame:
"""Ранжирует бумаги каждой эры по доходности за год без последнего месяца.
Последний месяц исключён намеренно: на горизонте недель цены склонны
к развороту, и свежий рост смазал бы эффект инерции.
Ранг переводится в середину доли шкалы от нуля до единицы: при n бумагах
это 1/2n, 3/2n, …, (2n−1)/2n. Шкала симметрична, и бумага без истории
встаёт ровно посередине, не сливаясь ни с одной из известных.
Args:
data: Таблица набора: ``era_id``, ``asset_id`` и признаки.
Returns:
Предсказания: ``era_id``, ``asset_id``, ``prediction``.
"""
momentum = pl.col(FEATURE).fill_nan(None)
rank = momentum.rank("average").over("era_id")
count = momentum.count().over("era_id")
share = (2 * rank - 1) / (2 * count)
return data.select("era_id", "asset_id", share.fill_null(MIDDLE).alias("prediction"))
- Скачайте файл предсказаний этой стратегии.
- Загрузите его в форму «Загрузить файл предсказаний» ниже.
- Через несколько секунд откроется разбор: гейты допуска, корреляция по эрам, кривая.
В файле 2760 предсказаний по 46 эрам набора a.moex.20221230.1338d64e. Код к набору применил организатор: сам набор участникам пока не выдаётся.
Стратегия выбрана до расчёта и ни к чему не подгонялась — каким выйдет результат,
покажет разбор, а не обещание на этой странице.
Что происходит с файлом
1
Гейты допуска
Схема файла и полнота покрытия. Не прошёл — работа не оценивается, и причина называется дословно.
2
Расчёт по эрам
Корреляция считается внутри каждой эры отдельно, а не по всей выборке сразу.
3
Сведение
Соседние эры делят часть периода реализации таргета, поэтому значимость считается по эффективному числу независимых наблюдений, а не по сырому.
Загрузить файл предсказаний
CSV с тремя колонками: era_id, asset_id,
prediction. Схема закрыта: лишняя колонка отвергается наравне
с недостающей.
Ограничения демонстрации: не больше 8 МБ на файл и не больше 5 загрузок за 60 мин с одного адреса — чтобы очередь оценки оставалась доступной остальным.
Куда дальше
Обучение
Бесплатные курсы
Вероятность и статистика для финансов, временные ряды, методология корректного тестирования моделей, управление риском.
Соревнование
Два трека
Институциональный на инструментах Московской биржи и фронтирный на криптовалютном рынке.
Участие
Регистрация
Бесплатно. Учётная запись открывает курсы, полигон и участие в сезоне.