
Рано или поздно в жизни каждого алготрейдера, особенно начинающего, случается типичная ситуация: стратегии/модели/алгоритмы, которые на бэктесте показывали хорошие результаты и, возможно, даже работали на реальном рынке, внезапно начинают сливать. График, чисто визуально, не меняется — нет волатильности от новостей, обвала или, наоборот, резких скачков. На это есть несколько причин. В этой статье разберём, какие из них реальны, а какие — упрощение, пусть и корректное.
На мой взгляд, наиболее интересными являются два таких объяснения:
Рынок является динамической системой, а следовательно, модель, обученная на срезе статистики, постепенно будет терять актуальность. Просто потому, что статистика будет меняться. Направление во многом верное, стоит лишь уточнить, какая именно динамика подразумевается — фразу «рынок меняется» можно понимать разными способами.
Обученный робот или, что ещё хуже, жёстко заданный алгоритм действует предсказуемо, по фиксированным правилам. Другие участники рынка замечают эти паттерны и начинают целенаправленно торговать против него, провоцировать. Идея имеет место быть, но едва ли применима к обычному трейдеру. Речь здесь об очень ограниченном классе участников.
Причина 1 — нестационарность рынка (concept drift)
Интуитивно любая модель, будь то набор индикаторов или нейросеть, обучается на конечной выборке. Следовательно, неявно адаптируется именно под статистические свойства именно этой выборки. Модель, будучи статичной, предполагает, что эти свойства сохранятся и в будущем. В случае, когда распределение будущих данных начинает отличаться от исходного распределения, качество падает. У этого явления есть 2 названия: дрейф концепции или же, в анализе временных рядов, нестационарность.
При этом важно понимать, что этот дрейф не всегда является плавным. Порой он не нарастает, как снежный ком — смена происходит скачкообразно. Рынок переключается между режимами: низкая/высокая волатильность, тренд/боковик, разная корреляция между активами. Момент этого переключения может быть резким: изменилась монетарная политика, геополитический шок, изменения в регулировании, кто‑то заблокировал пролив.
Рассмотрим тот же механизм, но с точки зрения математики. Временной ряд называется слабо (ковариационно) стационарным, если выполняются три условия:
То есть среднее, дисперсия и автоковариационная структура ряда не меняются во времени. Большинство моделей, вроде ARIMA или линейной регрессии, неявно опираются на стационарность данных в обучении. Следовательно, если она нарушается, оценённые параметры теряют свою состоятельность и модель деградирует.
На практике используется тест Дики‑Фуллера или же ADF‑тест. Он проверяет, есть ли единичный корень в модели вида:
Нулевая гипотеза соответствует наличию единичного корня, в таком случае можем говорить, что ряд нестационарен, имеем дело со случайным блужданием. Если же тест отвергает нулевую гипотезу, значит, есть основания полагать, что ряд (или по крайней мере его часть) стационарны.
Из этого можно сделать вывод: цены активов сами по себе почти всегда нестационарны, что оправдывает переход к доходностям/логарифмическим приращениям. Впрочем, даже ряд доходностей не обязательно стационарен на длинных горизонтах — волатильность кластеризуется, меняется во времени.

Сверху — цена закрытия (log‑шкала): устойчивые многолетние тренды, ADF‑тест не отвергает наличие единичного корня (p = 0.66) — ряд нестационарен. Снизу — логарифмические доходности того же ряда: колеблются вокруг нуля, ADF отвергает единичный корень (p ≈ 0) — ряд стационарен. При этом хорошо видно кластеризацию волатильности: просадка марта 2020-го, циклы 2021 и 2024–2025 годов резко выделяются на фоне более спокойных периодов.
Смена режима
Наиболее точно описать, что происходит с рынком можно с помощью модели со скрытыми режимами — regime‑switching model — или, классическое наименование — модель Хэмилтона. С этой моделью связано одно фундаментальное понятие — марковское переключение режимов. Рассмотрим его:
Пусть наблюдаемый процесс зависит от ненаблюдаемого (скрытого) состояния
, которое эволюционирует как марковская цепь с матрицей переходных вероятностей:
Внутри каждого режима процесс описывается собственными параметрами, например AR(1) с разным средним и дисперсией:
Бот, который обучался только внутри одного из режимов, будет оптимален для некоторых параметров конкретно этого режима. Если режим сменится, j ≠ i, то параметры изменятся. Часто это происходит резко. Стратегия, оптимизированная под старый режим, не просто начинает работать хуже, она умирает.
Хороший кейс — крах фонда LTCM в 1998 году. Модели были откалиброваны на исторической статистике корреляций между облигациями, предполагали экстремальные совместные движения крайне маловероятными, рассчитывая на возврат рыночных цен к историческим средним значениям. История показала, что «маловероятное» не значит «никогда». Россия объявляет дефолт в августе 1998 года, что, в свою очередь, провоцирует панику на глобальных рынках и экстремальный рост волатильности. Модель перестаёт работать, в короткие сроки фонд несёт катастрофические убытки.
Причина 2 — переобучение
Банально, но распространено. Механизм похож на предыдущий, но в отличие от дрейфа, он не требует изменения на рынке. Здесь уже проблема не в том, что «мир стал другим», а в том, что модель изначально просто удачно подстроилась под шум конкретной выборки.
Дилемма смещения‑дисперсии или же bias‑variance tradeoff
В основе этого лежит разложение ошибки на смещение и дисперсию.
Для модели , которая предсказывает истинную зависимость
, ожидаемая квадратичная ошибка на новых данных раскладывается как:
Простая модель просто не способна уловить реальную закономерность, поэтому даёт высокое смещение. Слишком сложная (с большим числом параметров, индикаторов, условий и так далее), напротив, даст низкое смещение на обучающей выборке, но высокую дисперсию, то есть подстроится под шум конкретной выборки. На новых данных ошибка будет расти. Это становится причиной, по которой тяжелая модель может отлично пройти бэктест, но рассыпаться на реальном счёте: высокая дисперсия оценки маскируется под кажущуюся точность.
Множественное тестирование и переподбор параметров
Это отдельная, менее очевидная, грань той же проблемы. Если мы переберём достаточно большое число комбинаций параметров (периоды скользящих средних, пороги индикаторов, комбинации фильтров и тому подобное), то по вероятностным причинам найдётся такой набор, который покажет положительный результат на исторических данных. Такой эффект можно получить даже на случайных данных, которые не имеют никакой предсказуемой структуры.
Проведём эксперимент. Сгенерируем синтетический ценовой ряд как случайное блуждание без сноса (нулевое истинное математическое ожидание доходности на каждом шаге). По построению в этом ряду нет и не может быть предсказуемой закономерности:
import numpy as np import pandas as pd np.random.seed(7) N = 4000 sigma = 0.01 log_returns = np.random.normal(loc=0.0, scale=sigma, size=N) price = pd.Series(100 * np.exp(np.cumsum(log_returns)))
Возьмём наивную стратегию пересечения скользящих средних (long, когда быстрая MA выше медленной, иначе — вне рынка) и переберём сеткой периоды fast и slow:
def backtest_ma_crossover(price_series, fast, slow): ma_fast = price_series.rolling(fast).mean() ma_slow = price_series.rolling(slow).mean() signal = (ma_fast > ma_slow).astype(int).shift(1) # без заглядывания вперёд daily_ret = price_series.pct_change() return (signal * daily_ret).dropna() def sharpe(returns, periods_per_year=252): return (returns.mean() / returns.std()) * np.sqrt(periods_per_year)
Делим набор данных на in‑sample и out‑of‑sample части, 60 и 40 процентов соответственно. На первой честно подбираем, на второй — проверяем, не трогая параметры. Перебор дал 356 допустимых комбинаций.
Результат
Метрика |
Значение |
Протестировано комбинаций параметров |
356 |
Лучшая на in‑sample: fast / slow |
19/50 |
Sharpe на in‑sample (лучшая комбинация) |
0.22 |
Sharpe той же стратегии на out‑of‑sample |
−0.17 |
Корреляция Sharpe(in‑sample) и Sharpe(out‑of‑sample) по всей сетке |
−0.57 |
Место выбранной стратегии по out‑of‑sample Sharpe |
266-е из 356 |

Та комбинация параметров, которая на in‑sample (“исторических”) данных выглядела лучшей, на новых, out‑of‑sample, оказалась не просто «средней», а хуже подавляющего числа других вариантов. При этом, что особенно любопытно, корреляция между результатами на in‑sample и out‑of‑sample по всей сетке параметров отрицательна. Это буквально говорит о том, что чем лучше комбинация на бэктесте, тем в среднем хуже она на новых данных. Переобучение в чистом виде. Данные были шумом изначально, а значит любой «хороший» результат — не более чем удачная подгонка, которая не переносится на будущее.
Существует инструмент, который учитывает этот эффект — дефлированный коэффициент Шарпа (Deflated Sharpe Ratio, Bailey & López de Prado, 2014). Он корректирует оценённый коэффициент Шарпа с поправкой на число протестированных вариантов стратегии и дисперсию их результатов. Тем самым предоставляет ответ, является ли найденный вариант лучшим или удачным.
Причина 3 — alpha decay и переполненность стратегии
Третий механизм похож на первый, но с важным отличием: при нестационарности мы становимся жертвой, а в данном случае мы проблему порождаем. Стратегия становится известной, ей пользуется большое число участников одновременно, что, просто по механике спроса, приводит к потере актуальности: многие покупают на одном и том же сигнале, само исполнение этого сигнала толкает цену против запаздывающих участников. Именно поэтому никто никогда не продаст «100% прибыльную стратегию», ведь в таком случае она просто перестанет быть прибыльной.
Здесь хочется упомянуть про ещё один механизм, с которым обычный трейдер едва ли столкнётся, но это не отменяет его существования: predatory trading (хищническая торговля). Одни участники могут выявлять и торговать против вынужденных крупных позиций других. Ключевое слово здесь — «крупных». Сделки должны не только оставлять характерный паттерн в стакане, но и быть различимыми. Для рядового алгоритма с объёмом в несколько лотов такого паттерна просто не возникает — сделки теряются в общем потоке ордеров и выделить их как след конкретного бота невозможно.
Итог
Итогом всего этого может стать простой вывод: создать алгоритм или обучить модель, которые будут работать всегда невозможно, на то есть как минимум 3 основных причины. Но это не значит, что создать работающего робота невозможно в принципе. Робота постоянно нужно актуализировать, выстраивать автоматические пайплайны и системы мониторинга. Здесь стоит помнить про катастрофическое забывание, но это уже другая история.
© 2026 ООО «МТ ФИНАНС»