结构性突变

Python 中的定量风险管理

Jamsheed Shorish

Computational Economist

风险与分布

  • 风险管理工具箱
    • 风险缓释:MPT
    • 风险度量:VaR、CVaR
  • 风险:离散度、波动率
    • 方差(标准差)作为风险定义
  • 风险与风险因子作为随机变量之分布的关系
Python 中的定量风险管理

平稳性

  • 假设:分布随时间保持不变
  • 分布不变 = 平稳
  • 金融危机期间的有效前沿
    • _不_平稳
  • 估计方法要求平稳性
    • 历史法:用过去数据估计未知的_平稳_分布
    • 参数法:假定_平稳_的分布族
    • 蒙特卡罗:为随机抽样假定_平稳_分布
Python 中的定量风险管理

结构性突变

  • 非平稳 => 分布可能随时间_变化_
  • 假定在特定时点发生变化
    • 将数据分为_子期_
    • 每个子期内假定平稳
  • 结构性突变:发生变化的时点
    • 均值趋势和/或波动率的变化
Python 中的定量风险管理

示例:中国人口增长

  • 检查时期:1950–2019
  • 趋势大致为_线性_…

中国人口随时间变化的图,1950-2019

Python 中的定量风险管理

示例:中国人口增长

  • 检查时期:1950–2019
  • 趋势大致为_线性_…
  • …但约1990年起放缓
  • 1990年前后可能有结构性突变
  • 表明净人口(出生-死亡)的分布已_改变_
  • 可能原因:政府政策、生活水平等

中国人口随时间变化的图,含趋势箭头,1950-2019

Python 中的定量风险管理

Chow 检验

  • 上例:有结构性突变的视觉证据
  • 量化:统计度量
  • Chow 检验
    • 在线性模型下检验是否存在结构性突变
    • 原假设:无突变
    • 需要三次 OLS 回归
      • 全时期的回归
      • 突变点前与后的两次回归
    • 收集残差平方和(SSR)
    • 统计量服从F 分布
Python 中的定量风险管理

在 Python 中进行 Chow 检验

  • 假设:1990 年中国人口有结构性突变
  • 假定线性"因子模型": $$\log(\text{Population}_t) = \alpha + \beta * \text{Year}_t + u_t$$
  • statsmodelsOLS 在 1950–2019 全时期回归
    • 取残差平方和 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 中的定量风险管理

Vamos praticar!

Python 中的定量风险管理

Preparing Video For Download...