历史模拟与蒙特卡洛模拟

Python 中的定量风险管理

Jamsheed Shorish

Computational Economist

历史模拟

  • 没有合适的分布族?
  • 历史模拟:以史推今
    • 不需任何分布假设
    • 过去的损失数据作为明天的"模拟"损失
Python 中的定量风险管理

Python 中的历史模拟

  • VaR:从 asset_returns 的收益开始
  • 用投资组合 weights 计算 portfolio_returns
  • portfolio_returns 转为 losses
  • VaR:对 losses 计算 np.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 中的定量风险管理

蒙特卡洛模拟

  • 蒙特卡洛模拟:参数估计与模拟的强力结合
    • 对投资组合损失和/或风险因子设定分布
    • 依赖从分布的随机抽样生成随机"路径",称为一次"运行"
    • 重复抽样 ⇒ 得到一组模拟运行
  • 在每次运行内计算至目标时点的组合损失
  • VaR:取模拟损失的分位数
Python 中的定量风险管理

Python 中的蒙特卡洛模拟

  • 步骤一
    • scipy.stats 导入正态分布 norm
    • 定义 total_steps(1 天 = 1440 分钟)
    • 定义运行次数 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 次运行初始化 daily_loss 向量
    • 遍历 N 次运行
      • 计算蒙特卡洛模拟的 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 中的蒙特卡洛模拟

  • 步骤三
    • 为每次运行 n 生成累计 daily_loss
    • np.quantile()daily_loss 上计算 VaR(如 95% 置信水平)

 

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
      • 在步骤 2 中用于计算资产收益
  • 练习:结合资产收益模拟的蒙特卡洛
Python 中的定量风险管理

¡Vamos a practicar!

Python 中的定量风险管理

Preparing Video For Download...