【问题标题】:Calculating Value At Risk or "most probable loss", for a given distribution of returns计算给定收益分布的风险价值或“最可能损失”
【发布时间】:2015-09-01 21:39:19
【问题描述】:

鉴于历史每日回报,我如何计算单个股票头寸的投资组合分配,基于在 21 天内损失不超过初始投资组合价值的 10%? (有 95% 的置信度。)

基于例如的一些起始代码

import numpy as np
from scipy.stats import norm

returns = [-0.01, -0.02, -0.01, 0.04, 0.02, 0.01, -0.03]
mu = np.mean(returns)
std = np.std(returns)
valueAtRisk = norm.ppf(0.05, mu, sigma)

但是,以上仅告诉我 1 天的风险。我的问题是另一个方向;假设我不想在 21 天内损失超过 10%,我可以根据收益的分布分配什么。

我更喜欢可以直接计算的答案,但蒙特卡洛答案是可以接受的。

感谢您的帮助。

【问题讨论】:

  • 这对于 CrossValidated 来说可能是一个更好的问题,但不是有一个矩阵运算可以复合 n 天的收益分布吗?
  • 我想要一个 python/scipy 类型的解决方案(我不确定我是否理解纯粹基于统计的答案)。问题是norm.ppf(0.05, mu, sigma) 给出了“糟糕的一天”的概念,但考虑到正态分布,我们预计不会连续出现 21 个纯粹糟糕的日子。
  • 如果我的方法可以帮助您解决问题,您能接受我的回答吗?非常感谢。

标签: python pandas statistics scipy quantitative-finance


【解决方案1】:
import numpy as np

returns = np.random.randn(1000)

假设收益独立同分布(i.i.d.),那么 T 天的波动率等于 sqrt(T) 乘以一天的波动率。

# one-way 5% quantile, critical value is 1.64
VaR_21 = returns.std() * np.sqrt(21) * 1.645
VaR_21
Out[72]: 7.4161618430166989

或者,您可以进行引导。这是从历史数据集中随机选择 21 天,计算随机抽取的 21 天的回报。绘制直方图并获得 5% 分位数。

def generate_random_index(n=21):
    # could set replace to False as well
    return np.random.choice(np.arange(1000), size=n, replace=False)  

VaR_simulated_21 = []
n_bootstrap = 10000
for _ in range(n_bootstrap):
    VaR = returns[generate_random_index(21)].sum()
    VaR_simulated_21.append(VaR)

plt.hist(VaR_simulated_21)
np.percentile(VaR_simulated_21, q=5)
Out[108]: -8.0686958215041216

【讨论】:

  • 不会是VaR = (1+returns[generate_random_index(21)]).cumprod()[-1] 吗?
猜你喜欢
  • 2017-11-13
  • 2016-10-03
  • 2013-11-09
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多