Разработка системы Walk-Forward оптимизации торговой стратегии
Walk-Forward Optimization (WFO) — методология оценки робастности торговой стратегии. В отличие от традиционного backtesting, WFO имитирует реальное применение: параметры оптимизируются на одном периоде, тестируются на следующем, затем всё сдвигается вперёд. Это минимизирует overfit к историческим данным.
Почему обычный backtest недостаточен
Проблема curve fitting: Оптимизируя параметры стратегии (скользящие средние, RSI период, стоп-лосс) на всей истории, мы получаем параметры, идеально подходящие для прошлого. Но рынки меняются: оптимальные параметры 2015-2018 не обязательно хороши в 2021-2024.
Walk-Forward решает это:
| In-Sample (IS) | Out-of-Sample (OOS) |
| |--IS--| OOS |
| |--IS--| OOS |
|--IS--| OOS |
Каждый OOS-период — независимая оценка на данных, которых модель "не видела" при оптимизации.
Параметры Walk-Forward схемы
Anchored vs. Rolling:
- Anchored (expanding window): IS всегда начинается с одной даты, расширяется
- Rolling (sliding window): IS окно фиксированного размера сдвигается
Rolling предпочтителен: стратегия адаптируется к изменению рынка, старые данные не мешают.
Efficiency Ratio:
WFE (Walk-Forward Efficiency) = OOS_Return / IS_Return
Идеально: WFE > 0.7. WFE < 0.3 → сильный overfit, стратегия не работает.
Anchor periods:
- IS: 2-4 года данных
- OOS: 3-6 месяцев
- Количество итераций: 8-20 (зависит от длины истории)
Процесс оптимизации
Пространство параметров:
param_space = {
'fast_ma': range(5, 50, 5),
'slow_ma': range(20, 200, 10),
'rsi_period': range(7, 28, 1),
'stop_loss_atr': [1.0, 1.5, 2.0, 2.5, 3.0],
'position_size': [0.01, 0.02, 0.03]
}
# Общее число комбинаций: ~50,000+
Методы поиска:
- Grid Search: полный перебор, вычислительно дорогой
- Random Search: случайная выборка, эффективнее grid при большом пространстве
- Bayesian Optimization (Optuna): учитывает историю оценок, в 10-50× эффективнее grid
Целевая функция: Не только Return. Предпочтительные метрики для оптимизации:
- Sharpe Ratio: return / volatility
- Calmar Ratio: annual return / max drawdown
- Sortino Ratio: return / downside deviation
- Profit Factor: gross profit / gross loss
Робастность и статистическая значимость
Monte Carlo Permutation Test:
def permutation_test(returns, n_permutations=1000):
"""Проверяем: результат лучше, чем случайный трейдинг?"""
original_sharpe = compute_sharpe(returns)
random_sharpes = []
for _ in range(n_permutations):
shuffled = np.random.permutation(returns)
random_sharpes.append(compute_sharpe(shuffled))
p_value = np.mean(np.array(random_sharpes) >= original_sharpe)
return p_value # p < 0.05 → статистически значимо
Combinatorial Purged Cross-Validation (CPCV): Из книги Marcos Lopez de Prado. Генерирует 2^(k-1) различных backtest путей — даёт distribution результатов, а не один backtesting path.
Distribution of OOS Results: Строим распределение Sharp ratio по всем WFO-итерациям. Если медиана > 0.5 и < 10% итераций убыточны — стратегия робастна.
Параметрическая стабильность
Устойчивая стратегия должна работать при небольшом изменении параметров:
def parameter_sensitivity(strategy, optimal_params, perturbation=0.1):
"""3D-тепловая карта результата при ±10% от оптимальных параметров"""
results = {}
for p_a in np.linspace(0.9, 1.1, 5):
for p_b in np.linspace(0.9, 1.1, 5):
perturbed_params = {
'fast_ma': int(optimal_params['fast_ma'] * p_a),
'slow_ma': int(optimal_params['slow_ma'] * p_b)
}
results[(p_a, p_b)] = backtest_sharpe(strategy, perturbed_params)
return results
"Плоское плато" вокруг оптимума → стратегия устойчива. Острый пик → overfit.
Production Pipeline
Automated Re-optimization: Каждые 3 месяца:
- Получить новые данные
- Запустить WFO на расширенном IS окне
- Если OOS метрики в пределах нормы → использовать новые параметры
- Если деградация > 20% → сигнал на ручной review
Версионирование стратегий: MLflow или Git для хранения каждой версии: параметры, IS/OOS метрики, дата применения.
Сроки: реализация WFO framework для одной стратегии с Optuna — 3-4 недели. Полноценная система с CPCV, Monte Carlo тестами и auto re-optimization — 8-10 недель.







