蒙地卡羅風險模擬 — 投資組合結果建模
蒙地卡羅模擬讓您能模擬超過10萬種投資組合的潛在未來路徑,量化風險指標如風險價值(VaR)和預期缺口。不再假設單一結果,您將看到可能性的分佈。
範例: 對您的交易策略進行10萬次模擬。您將看到:68%的結果獲利$10-$50,25%虧損$10-$30,5%虧損$50-$200,2%獲利$100+。現在您了解自己的風險輪廓了。
基礎幾何布朗運動(GBM)
將未來價格建模為帶有漂移和波動性的隨機漫步:
Python — 蒙地卡羅價格路徑
import numpy as np
def simulate_price_paths(S0, mu, sigma, T, dt, n_sims=10000):
# S0: 當前價格, mu: 漂移率, sigma: 波動率
# T: 時間週期(天), dt: 時間步長, n_sims: 模擬次數
steps = int(T / dt)
paths = np.zeros((n_sims, steps))
paths[:, 0] = S0
for i in range(1, steps):
# dS = mu*S*dt + sigma*S*sqrt(dt)*Z
Z = np.random.normal(0, 1, n_sims)
dS = mu * paths[:, i-1] * dt + sigma * paths[:, i-1] * np.sqrt(dt) * Z
paths[:, i] = paths[:, i-1] + dS
return paths
投資組合風險指標
風險價值(VaR)
僅在5%情境下會超出的損失(95%置信度):
Python — 計算VaR
def calculate_var(simulations, confidence=0.95):
pnl = simulations[:, -1] - simulations[:, 0]
var = np.percentile(pnl, (1 - confidence) * 100)
return var # 例如:-$2,340
預期缺口(CVaR)
最差5%情況的平均損失:
Python — 計算CVaR
def calculate_cvar(simulations, confidence=0.95):
pnl = simulations[:, -1] - simulations[:, 0]
var_threshold = np.percentile(pnl, (1 - confidence) * 100)
worst_5_pct = pnl[pnl <= var_threshold]
cvar = np.mean(worst_5_pct)
return cvar # 例如:-$3,800(比VaR更糟)
策略專屬模擬
模擬您的實際交易規則,而不僅是價格路徑:
Python — 策略蒙地卡羅
def simulate_strategy(capital, win_rate, avg_win, avg_loss, trades_per_day=10, days=30, n_sims=10000):
results = np.zeros(n_sims)
for sim in range(n_sims):
equity = capital
n_trades = trades_per_day * days
for _ in range(n_trades):
if np.random.rand() < win_rate:
pnl = np.random.normal(avg_win, avg_win * 0.2)
else:
pnl = -np.random.normal(avg_loss, avg_loss * 0.2)
equity += pnl
if equity < capital * 0.5:
break # 虧損50%時停損
results[sim] = equity
return results
使用Smart Money信號進行壓力測試
模擬Smart Money信心下降時的最壞情境:
Python — 壓力測試情境
def stress_test_scenarios(base_win_rate):
# 情境1: 正常狀況(高信心)
scenario_normal = simulate_strategy(10000, win_rate=base_win_rate)
# 情境2: 信號惡化(中等信心)
scenario_medium = simulate_strategy(10000, win_rate=base_win_rate * 0.95)
# 情境3: 崩潰(VETO條件)
scenario_veto = simulate_strategy(10000, win_rate=0.45) # 負面優勢
return {
'normal': {'var': np.percentile(scenario_normal, 5), 'mean': np.mean(scenario_normal)},
'medium': {'var': np.percentile(scenario_medium, 5), 'mean': np.mean(scenario_medium)},
'veto': {'var': np.percentile(scenario_veto, 5), 'mean': np.mean(scenario_veto)}
}
解讀
從1萬次模擬中,您將了解:
- 中位數結果(第50百分位數)
- 最佳情況(第95百分位數)
- 最差情況(第5百分位數)
- 破產機率(權益<0)
- 預期回撤長度