歡迎!

Python 量化風險管理

Dr. Jamsheed Shorish

Computational Economist

關於我

  • 計算經濟學家
  • 專長:
    • 資產定價
    • 金融科技(「FinTech」)
    • 經濟與金融的電腦應用
  • ANU「數位經濟的經濟分析」共同授課教師
  • Shorish Research(比利時):計算型商業應用
Python 量化風險管理

什麼是量化風險管理?

  • 量化風險管理:研究「可量化的不確定性」
  • 不確定性
    • 未來報酬未知
    • 結果會影響規劃決策
  • 風險管理:降低不利結果的影響
  • 可量化的不確定性:找出可衡量風險的因素
    • :火險。哪些因素會提高失火機率?
  • 本課程:聚焦於「金融投資組合」的風險
Python 量化風險管理

風險管理與全球金融危機

  • 大衰退(2007–2010)
    • 全球成長損失逾 $2 兆
    • 美國家庭財富損失近 $10 兆
    • 美國股市市值蒸發約 $8 兆
  • 全球金融危機(2007–2009)
    • 基本資產價值大幅變動
    • 對未來報酬高度不確定
    • 報酬波動性高
    • 風險管理關乎成敗
Python 量化風險管理

快問快答:投資組合

  • 金融投資組合
    • 由未來報酬不確定的資產所組成
    • 股票
    • 債券
    • 外匯持有(forex)
    • 股票選擇權
  • 挑戰:量化風險以管理不確定性
    • 做出最適投資決策
    • 在風險偏好下最大化組合報酬
Python 量化風險管理

量化報酬

  • 組合報酬:各資產報酬的加權和
    • Pandas 資料分析函式庫
    • DataFrame prices
    • .pct_change() 方法
    • returns.dot() 方法
prices = pandas.read_csv("portfolio.csv")

returns = prices.pct_change()
weights = (weight_1, weight_2, ...)
portfolio_returns = returns.dot(weights)
Python 量化風險管理

量化風險

  • 組合報酬波動度=風險
  • 透過共變異數矩陣計算波動度
  • 使用 returns.cov() 方法並年化

 

 

covariance = returns.cov()*252

print(covariance)

4 檔資產的共變異數矩陣範例

Python 量化風險管理

量化風險

  • 組合報酬波動度=風險
  • 透過共變異數矩陣計算波動度
  • 使用 returns.cov() 方法並年化
  • covariance 的對角線為個別資產變異數  

   

covariance = returns.cov()*252

print(covariance)

對角線標示變異數的共變異數矩陣範例

Python 量化風險管理

量化風險

  • 組合報酬波動度=風險
  • 透過共變異數矩陣計算波動度
  • 使用 returns.cov() 方法並年化
  • covariance 的對角線為個別資產變異數
  • covariance 的非對角線為資產間的共變異數
covariance = returns.cov()*252

print(covariance)

非對角線標示共變異數的共變異數矩陣範例

Python 量化風險管理

投資組合風險

  • 取決於組合中的資產 weights
  • 組合變異數 $\sigma_p^2$ 為 $$ \sigma_p^2 := w^T \cdot \textnormal{Cov}_p \cdot w $$
  • Python 可用矩陣乘法運算子 @ 計算
  • 通常以標準差替代變異數
weights = [0.25, 0.25, 0.25, 0.25] # 假設組合含四檔資產

portfolio_variance = np.transpose(weights) @ covariance @ weights
portfolio_volatility = np.sqrt(portfolio_variance)
Python 量化風險管理

波動度時間序列

  • 也可隨時間計算組合波動度
  • 使用「視窗」計算固定期間(如週、30 天「月」)的波動度
  • Series.rolling() 建立視窗
  • 觀察波動度的趨勢與可能的極端事件
windowed = portfolio_returns.rolling(30)

volatility = windowed.std()*np.sqrt(252) volatility.plot() .set_ylabel("Standard Deviation...")

30 天滾動視窗的年化報酬波動度圖

Python 量化風險管理

一起來練習吧!

Python 量化風險管理

Preparing Video For Download...