Узнайте, как с помощью ранговой корреляции Спирмена отличить шум от сигнала при поиске параметров. Примените тест, чтобы избежать ложных результатов.
Вы потратили недели на оптимизацию параметров, но на новых данных стратегия теряет? Возможно, проблема не в оптимизаторе, а в том, что в данных просто нет сигнала. В этой статье я покажу, как за один день проверить, есть ли вообще что искать, и избежать ложных открытий.
Я потратил несколько дней на аудит живой торговой системы на FX, которую сам же и написал. За 16 лет истории система показала отрицательный результат, но не так, как я ожидал. Диагностика, которая это выявила, универсальна — она применима к любому поиску параметров, не только к трейдингу.
17 конфигураций, 4-часовые бары входа, выходы симулировались на часовых барах, период с 2010-05-28 по 2026-07-08 (16.1 года), 7641 сделка. Важно: я подавал в production-функции исторический CSV вместо живого потока данных, так что тестировался тот же код, что работает в реальном времени.
Платформенные OHLC бары — это цены BID. Бэктест размещал вход на закрытии бара, стоп-лосс и тейк-профит на расстоянии ± n·ATR от закрытия, проверял касания по максимумам/минимумам BID, а затем вычитал спред из итогового P&L. В реальной жизни длинная позиция открывается по ASK, стоп-ордера выставляются относительно этой цены ASK, а закрытие происходит по BID. Значит, в реальности цена должна пройти дополнительный спред до цели и достигает стоп-лосса на один спред раньше.
Вычитание стоимости из результата — не то же самое, что учёт её в моменте срабатывания. Первое меняет, сколько вы выигрываете. Второе меняет, какие сделки вообще выигрывают. Измерения показали: 2–5 процентных пункта винрейта, всегда в минус. Это обобщается: если ваша симуляция применяет издержки как постфактум-корректировку, а не моделирует механизм их возникновения, то количество событий неверно, а не только итоговые суммы.
Цели были 0.5–0.8×ATR, стопы 1.5–2.0×ATR. Это риск-вознаграждение 0.25–0.4, что фиксирует безубыточный винрейт арифметически: безубыточный винрейт = SL / (TP + SL) = 75–82%. На вневыборке: 4947 сделок, 73.5% винрейт, -4669.9 пипсов, -0.944 пипса на сделку. Винрейт 73.5%, который теряет деньги, — не парадокс. Маленькие цели срабатывают часто. Так работают маленькие цели.
Прежде чем переоптимизировать что-либо, я спросил: можно ли вообще обучиться на поверхности параметров? Для каждого walk-forward фолда я оцениваю всю сетку параметров на обучающем окне и на тестовом окне, затем вычисляю ранговую корреляцию Спирмена между ними.
import numpy as np
from scipy.stats import spearmanr
# Предположим, у нас есть сетка параметров и результаты на train и test
# param_grid: список конфигураций
# train_perf: метрика (например, Sharpe) для каждой конфигурации на обучении
# test_perf: метрика на тесте
rho, p_value = spearmanr(train_perf, test_perf)
# Если rho > 0: ранги на обучении предсказывают ранги на тесте — отбор осмыслен
# Если rho ~ 0: поверхность — шум, никакое правило отбора не поможетВторой случай — самая ценная часть. Он отделяет «мой оптимизатор плох» от «здесь ничего нет» — две ситуации, которые выглядят одинаково со стороны, но требуют противоположных действий. Результат по 119 фолдам: медианный rho = -0.024, средний rho = -0.03, 95% доверительный интервал [-0.09, 0.03] — включает ноль. Доля фолдов с rho > 0: 47.9% — подбрасывание монетки. Ноль информации.
Соответственно, walk-forward оптимизация с плато-сглаживанием дала худшие результаты вне выборки, чем параметры, которые я не трогал, и выбрала границу сетки в 11 из 17 конфигураций — признак оптимизатора, которому не за что зацепиться.
Затем я проверил, существует ли эффект вообще: 38 инструментов, непересекающиеся периоды удержания, масштабирование по волатильности, объединение по классам активов (1140 тестов свёрнуты в 6), разбивка на первую и вторую половины:
Две вещи, которые я бы не угадал: безубыточные транзакционные издержки полезнее для принятия решений, чем Sharpe. FX major окупаются при ~3bp, crosses при ~1bp — оба ниже реального спреда. Вопрос «есть ли преимущество» решён до написания кода стратегии. Значимый результат оказался ложным: Energy показывает t=3.73 на полной выборке, но во второй половине он плоский или отрицательный. Без разбивки это выглядело бы лучшим результатом в таблице.
Постройте опровергатель до стратегии. Причина, по которой длинная серия конфигураций выглядела «подтверждённой», в том, что ни один компонент пайплайна не имел задачи сказать «здесь ничего нет». Каждая часть была спроектирована находить что-то, и она находила, каждый раз. Тест ранговой корреляции, описанный выше, занял один день и аннулировал месяцы параметрической работы — включая ту идею, в которой я был наиболее уверен. Это тест выполняет свою работу, и это самая дешёвая страховка, которую я добавил в исследовательский процесс за долгое время.
Что делать прямо сейчас: Возьмите свою текущую задачу поиска параметров. Разделите данные на две части по времени. Для каждой конфигурации вычислите метрику на первой и второй половине. Вычислите ранговую корреляцию Спирмена. Если rho около нуля — остановитесь. Не пытайтесь оптимизировать шум.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →