歷史模擬與蒙地卡羅模擬

Python 量化風險管理

Jamsheed Shorish

Computational Economist

歷史模擬

  • 找不到合適的分配族?
  • 歷史模擬:以過去推估未來
    • 不需任何分配假設
    • 過去損失資料成為明日的「模擬」損失
Python 量化風險管理

以 Python 進行歷史模擬

  • VaR:從 asset_returns 的報酬開始
  • 使用投資組合 weights 計算 portfolio_returns
  • portfolio_returns 轉為 losses
  • VaR:對 lossesnp.quantile(),例如 95% 信心水準
  • 假設未來損失分配與過去「完全」相同

 

weights = [0.25, 0.25, 0.25, 0.25]

portfolio_returns = asset_returns.dot(weights)
losses = - portfolio_returns
VaR_95 = np.quantile(losses, 0.95)
Python 量化風險管理

蒙地卡羅模擬

  • 蒙地卡羅模擬:參數估計與模擬的有力結合
    • 為投組損失與/或風險因子假設分配
    • 依分配隨機抽樣生成隨機「路徑」,稱為一次 run
    • 重複抽樣 $\Rightarrow$ 形成一組模擬 runs
  • 逐次 run 計算至目標時間的模擬投組損失
  • 以模擬損失的分位數作為 VaR 估計
Python 量化風險管理

以 Python 進行蒙地卡羅模擬

  • 步驟一
    • scipy.stats 匯入常態分配 norm
    • 定義 total_steps(1 天 = 1440 分鐘)
    • 定義 run 數 N
    • 計算 portfolio_losses 的平均 mu 與標準差 sigma
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Python 量化風險管理

以 Python 進行蒙地卡羅模擬

  • 步驟二
    • N 次 run 初始化向量 daily_loss
    • 針對 N 次 run 迴圈
      • 計算蒙地卡羅模擬的 loss 向量
        • norm.rvs() 從標準常態反覆抽樣
        • 以 1/total_steps 對應的 musigma 縮放
daily_loss = np.zeros(N)

for n in range(N):
loss = ( mu * (1/total_steps) + norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps) )
Python 量化風險管理

以 Python 進行蒙地卡羅模擬

  • 步驟三
    • 產生每次 run n 的累積 daily_loss
    • daily_lossnp.quantile() 取例如 95% 信心水準的 VaR

 

daily_loss = np.zeros(N)
for n in range(N):

loss = mu * (1/total_steps) + ... norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps)
daily_loss[n] = sum(loss)
VaR_95 = np.quantile(daily_loss, 0.95)
Python 量化風險管理

模擬資產報酬

  • 進一步:為投組中的「資產報酬」產生隨機路徑
    • 更貼近真實:可分別模擬各資產報酬
    • 資產報酬可具「相關性」
      • 回顧:有效率的共變異數矩陣 e_cov
      • 在步驟二用來計算資產報酬
  • 練習:結合資產報酬模擬的蒙地卡羅
Python 量化風險管理

一起來練習吧!

Python 量化風險管理

Preparing Video For Download...