Разработка системы Monte Carlo симуляции для оценки торговой стратегии
Monte Carlo симуляция — метод оценки стохастических систем через многократное случайное моделирование. В торговле он отвечает на вопросы, которые backtesting не решает: "Мог ли такой же убыток случиться в другом порядке?", "Какова вероятность потерять 20% за следующие 6 месяцев?", "Выдержит ли стратегия 5-летний drawdown?".
Зачем Monte Carlo для торговли
Единственная backtest-кривая — случайность: Исторический backtest — один реализованный путь из бесконечного числа возможных. Трейды случались в конкретном порядке, при конкретной рыночной волатильности. MC генерирует тысячи альтернативных путей из тех же трейдов.
Ответы на ключевые вопросы:
- Confidence interval для ожидаемой доходности
- Вероятность конкретного уровня drawdown
- Требуемый начальный капитал для выживания с вероятностью 95%
- Ожидаемое время до recovery после drawdown
Методы Monte Carlo для торговых систем
Randomization по трейдам: Самый простой подход — перемешивание исторических трейдов:
import numpy as np
import pandas as pd
def monte_carlo_randomize_trades(trade_returns, n_simulations=10000, n_periods=252):
"""
trade_returns: массив доходностей каждой сделки
Каждая симуляция — случайная выборка с возвращением
"""
results = np.zeros((n_simulations, n_periods))
for i in range(n_simulations):
sampled_trades = np.random.choice(trade_returns, size=n_periods, replace=True)
results[i] = np.cumprod(1 + sampled_trades) - 1
return results
equity_curves = monte_carlo_randomize_trades(historical_trades)
# Статистики
p5, p50, p95 = np.percentile(equity_curves[:, -1], [5, 50, 95])
print(f"5th percentile final equity: {p5:.1%}")
print(f"Median final equity: {p50:.1%}")
print(f"95th percentile final equity: {p95:.1%}")
Maximum Adverse Excursion (MAE) симуляция:
def max_drawdown_distribution(equity_curves):
max_dd = np.zeros(len(equity_curves))
for i, curve in enumerate(equity_curves):
running_max = np.maximum.accumulate(1 + curve)
drawdown = (1 + curve) / running_max - 1
max_dd[i] = drawdown.min()
return max_dd
dd_dist = max_drawdown_distribution(equity_curves)
prob_20pct_drawdown = np.mean(dd_dist < -0.20)
print(f"Probability of 20%+ drawdown: {prob_20pct_drawdown:.1%}")
Параметрическая Monte Carlo симуляция
Альтернативный подход: не перемешивать трейды, а генерировать новые из статистической модели:
GBM (Geometric Brownian Motion):
def gbm_simulation(mu, sigma, S0, T, n_steps, n_sims):
dt = T / n_steps
returns = np.random.normal((mu - 0.5*sigma**2)*dt, sigma*np.sqrt(dt), (n_sims, n_steps))
price_paths = S0 * np.exp(np.cumsum(returns, axis=1))
return price_paths
Student-t distribution (лучше для финансов): Нормальное распределение underestimates fat tails. Student-t с 3-7 степенями свободы лучше описывает реальные return distributions:
from scipy import stats
def student_t_simulation(mu, sigma, df, n_steps, n_sims):
returns = stats.t.rvs(df=df, loc=mu, scale=sigma, size=(n_sims, n_steps))
return np.cumprod(1 + returns, axis=1)
Bootstrap методы:
- Stationary Bootstrap: случайные блоки переменной длины (сохраняет временные зависимости)
- Block Bootstrap: фиксированные блоки по k периодов
Оценка Risk of Ruin
def probability_of_ruin(equity_curves, ruin_threshold=0.5):
"""
Вероятность потерять >50% капитала хотя бы один раз
"""
min_equity = equity_curves.min(axis=1)
return np.mean(min_equity < (1 - ruin_threshold))
prob_ruin = probability_of_ruin(equity_curves, ruin_threshold=0.5)
print(f"Probability of 50% drawdown (ruin): {prob_ruin:.1%}")
Оптимизация через MC
Monte Carlo для position sizing: Для разного f (фракция Келли) симулируем 10,000 путей и выбираем f*, максимизирующее конечный капитал при ограничении max drawdown < X%:
optimal_f = find_optimal_f(
trade_returns,
max_acceptable_drawdown=0.25,
n_simulations=10000
)
Stress testing сценарии:
- Кризис 2008: увеличиваем negative skew и fat tails на 2σ
- COVID crash: серия из 10 убыточных трейдов подряд (реальная последовательность)
- 2022 bear market: высокая корреляция убытков (не диверсифицируемый риск)
Тестируем стратегию в этих stress-сценариях: выживет ли при соответствующем risk management?
Визуализация и отчётность
Стандартные выводы для trader/investor:
- Конус вероятности (fan chart): p5/p25/p50/p75/p95 пути капитала
- Распределение итоговой доходности
- Распределение максимальной просадки
- Вероятность различных уровней drawdown
- Expected time to new equity high
Automated reporting: Каждый раз при добавлении новых трейдов — автоматический перерасчёт MC и обновление отчёта. Если вероятность рuin выросла с 3% до 8% — алерт для управляющего.
Сроки: базовая MC рандомизация трейдов + визуализация — 1-2 недели. Полноценная система с параметрическими моделями, stress testing и automated reporting — 4-6 недель.







