Блог им. dvstarkov
Привет, Smart-Lab. Я Данил, исследую рынок и торгую то, что наресёрчил. Это первый пост — сразу с материала, без прелюдий.
Задача. Есть kNN-бейзлайн для аллокации по 29 инструментам. Гипотеза: проблема в фичах. Решил прогнать полновесный greedy forward feature selection на 150 фичах. Логика: модель выбирает первую фичу с наибольшим Score, потом с одной фичей идёт по всему списку и выбирает вторую лучшую, и так далее — без предварительного стопа.
Что пошло не так на старте. Грид упал в баг: NaN-скоры для всех инструментов, включая BRENT, где всего 30% NaN. Причина оказалась в обработке состояния: state(t) с −1 либо пропускался, либо давал n_common = 0 при сравнении с аналогами. Починил, но осадок остался.
Результат greedy. 4085 секунд работы. Выбрана одна фича:
| Шаг | Фича | Score |
|---|---|---|
| 1 | VOL_OF_VOL_20 | 1.8090 |
На второй итерации лучшая фича дала improvement −0.0616. Стоп по условию improvement < 0.001. 149 фич прогнаны впустую.
Диагностика. Прогнал распределение корреляций P&L субмоделей. 10878 пар:
| Перцентиль | Корреляция |
|---|---|
| p5 | +0.6677 |
| p10 | +0.7939 |
| p25 | +0.8362 |
| p50 | +0.8574 |
| p75 | +0.8696 |
| p90 | +0.8790 |
| p95 | +0.8839 |
Гистограмма: 9924 пары из 10878 лежат в бакете [0.7, 0.9]. Это 91%.
Кластеризация. Union-find по порогам корреляций:
| Порог | Кластеров | Размеры топ-кластеров |
|---|---|---|
| 0.5 | 2 | [145, 3] |
| 0.7 | 2 | [145, 3] |
| 0.8696 (auto) | 12 | [135, 3, 1×10] |
| 0.9 | 110 | [9, 8, 5, 5, 3, 3, 3, 3, 2, 2] |
При пороге 0.5 и 0.7 — фактически один кластер на 145 фич. Это не кластеры, это одна фича в 145 обёртках.
Финальный тест. Лучший результат среди всех конфигураций:
| Конфигурация | Score |
|---|---|
| Baseline (7 фич) | 2.1456 |
| Лучшая 1 фича | 1.8090 |
| thr=0.9, size=8 | 1.8499 |
Baseline не был «сильнее». Он был другим типом: 6 per-instrument + 1 cross-sectional.
Вывод. Все 150 per-instrument фич несут одну и ту же информацию — состояние инструмента в его собственной истории. Ортогональности нет. Feature mining на этом юниверсе закрыт.
Найденный ключ. Cross-sectional фичи ортогональны per-instrument. Проверил на baseline из 8 per-instrument фич (Score 1.85):
| Добавленная фича | Score | Δ |
|---|---|---|
| + Q2.01_CS_RET_RANK_20 | 2.30 | +0.45 |
| + Q2.12_DIST_CS_MEDIAN | 2.37 | +0.07 |
Итог: 2.37 > 2.15 (baseline exp_016). Из 14 Q2 и 2 KURT фич зашли только две.
Гипотеза, почему именно эти две.
Q2.01 — rank инструмента по return 20d. Где мы в рейтинге.
Q2.12 — расстояние от CS median. Насколько далеко от центра.
Обе описывают положение в cross-section. Другие Q2 описывают другие свойства — correlation, beta, breadth. Не положение. Поэтому не зашли.
Вопрос к сообществу. Кто-нибудь находил ортогональные фичи через cross-sectional положение, а не через свойства? Интересно, какие ещё оси ортогональности существуют