Розробка системи Walk-Forward оптимізації торговельної стратегії
Walk-Forward Optimization (WFO) — методологія оцінки робастності торговельної стратегії. На відміну від традиційного backtesting, WFO імітує реальне застосування: параметри оптимізуються на одному періоді, тестуються на наступному, потім все зміщується вперед. Це мінімізує переобладання до історичних даних.
Чому звичайний backtest недостатньо
Проблема curve fitting: Оптимізуючи параметри стратегії (ковзаючі середні, період RSI, stop-loss) на всій історії, ми отримуємо параметри, ідеально підходящі для минулого. Але ринки змінюються: оптимальні параметри 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 кращий: стратегія адаптується до зміни ринку, старі дані не перешкоджають.
Ефективність Ratio:
WFE (Walk-Forward Efficiency) = OOS_Return / IS_Return
Ідеально: WFE > 0.7. WFE < 0.3 → сильне переобладання, стратегія не працює.
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: випадкова вибірка, більш ефективна з великим простором
- 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 шляхів — дає розподіл результатів, а не один backtesting шлях.
Distribution of OOS Results: Будуємо розподіл Sharpe 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
"Плоский плато" навколо оптимуму → стратегія робастна. Гострий пік → переобладання.
Production Pipeline
Автоматична переоптимізація: Кожні 3 місяці:
- Отримуємо нові дані
- Запускаємо WFO на розширеному IS вікні
- Якщо OOS метрики в межах норми → використовуємо нові параметри
- Якщо деградація > 20% → сигнал на ручний огляд
Версіонування стратегій: MLflow або Git для збереження кожної версії: параметри, IS/OOS метрики, дата застосування.
Часовая шкала: реалізація WFO framework для однієї стратегії з Optuna — 3-4 тижні. Повна система з CPCV, Monte Carlo тестами та auto re-optimization — 8-10 тижнів.







