結構性斷點

Python 量化風險管理

Jamsheed Shorish

Computational Economist

風險與分配

  • 風險管理工具箱
    • 風險緩解:MPT
    • 風險量測:VaR、CVaR
  • 風險:離散、波動性
    • 以變異數(標準差)定義風險
  • 風險與將風險因子視為隨機變數之分配的關聯
Python 量化風險管理

定態性(Stationarity)

  • 假設:分配隨時間不變
  • 分配不變=定態
  • 全球金融危機期間的效率前緣
    • 非定態
  • 估計技術需要定態
    • 歷史法:從過去資料推估未知的定態分配
    • 參數法:假設定態的分配族
    • 蒙地卡羅:為隨機抽樣假設定態分配
Python 量化風險管理

結構性斷點

  • 非定態 ⇒ 分配可能會隨時間改變
  • 假設在特定時間點發生改變
    • 將資料切成次期
    • 各次期內,假設定態
  • 結構性斷點:發生改變的時間點
    • 平均數和/或波動性「趨勢」的改變
Python 量化風險管理

範例:中國人口成長

  • 檢視期間 1950 - 2019
  • 趨勢大致為_線性_…

中國 1950-2019 人口隨時間變化圖

Python 量化風險管理

範例:中國人口成長

  • 檢視期間 1950 - 2019
  • 趨勢大致為_線性_…
  • …但約自 1990 年開始似乎放緩
  • 1990 年附近可能有結構性斷點
  • 意味著淨人口(出生-死亡)的分配已_改變_
  • 可能原因:政府政策、生活水準等

中國 1950-2019 人口趨勢圖(含趨勢箭頭)

Python 量化風險管理

Chow 檢定

  • 前述範例:結構性斷點的視覺證據
  • 量化:統計量度
  • Chow 檢定
    • 在_線性_模型下檢定是否存在結構性斷點
    • 虛無假設:無斷點
    • 需進行三個 OLS 迴歸
      • 全期的迴歸
      • 斷點_前_與_後_各一個迴歸
    • 收集殘差平方和
    • 檢定統計量服從 F 分配
Python 量化風險管理

在 Python 中做 Chow 檢定

  • 假設:中國人口在 1990 年有結構性斷點
  • 假設線性「因子模型」: $$\log(\text{Population}_t) = \alpha + \beta * \text{Year}_t + u_t$$
  • statsmodelsOLS 物件對 1950 - 2019 全期做 OLS 迴歸
    • 取出殘差平方和 res.ssr
import statsmodels.api as sm
res = sm.OLS(log_pop, year).fit()

print('SSR 1950-2019: ', res.ssr)
SSR 1950-2019: 0.29240576138055463
Python 量化風險管理

在 Python 中做 Chow 檢定

  • 將 1950 - 2019 分成 1950 - 19891990 - 2019 次期
  • 對各次期進行 OLS 迴歸
    • 取出 res_before.ssrres_after.ssr
pop_before = log_pop.loc['1950':'1989']; year_before = year.loc['1950':'1989'];
pop_after  = log_pop.loc['1990':'2019']; year_after =  year.loc['1990':'2019'];

res_before = sm.OLS(pop_before, year_before).fit() res_after = sm.OLS(pop_after, year_after).fit()
print('SSR 1950-1989: ', res_before.ssr) print('SSR 1990-2019: ', res_after.ssr)
SSR 1950-1989: 0.011741113017411783
SSR 1990-2019: 0.0013717593339608077
Python 量化風險管理

在 Python 中做 Chow 檢定

  • 計算服從 F 分配的Chow 檢定統計量
    • 計算分子
      • k = 2 個自由度=2 個 OLS 係數 $\alpha$、$\beta$
    • 計算分母
      • 66 個自由度=資料點總數(70)− 2*k
numerator = (ssr_total - (ssr_before + ssr_after)) / 2

denominator = (ssr_before + ssr_after) / 66
chow_test = numerator / denominator print("Chow test statistic: ", chow_test, "; Critical value, 99.9%: ", 7.7)
Chow test statistic: 702.8715822890057; Critical value, 99.9%: 7.7
Python 量化風險管理

一起來練習吧!

Python 量化風險管理

Preparing Video For Download...