拓端tecdat|Python计算股票投资组合的风险价值(VaR)
原文链接:http://tecdat.cn/?p=17758
什么是风险价值(VaR)?
风险价值(VaR)用于尝试量化指定时间范围内公司或投资组合中的财务风险水平。VaR提供了一段时间内投资组合的最大损失的估计,您可以在各种置信度水平上进行计算。
估计投资组合的风险对于长期资本增长和风险管理非常重要,尤其是在大型公司或机构内部。VaR通常按以下格式构架:
- “我们下个月的投资组合VaR为250,000元 ,置信度为95%”
- 这意味着,以95%的置信度,我们可以说投资组合的损失在一个月内不会超过250,000元
在这篇文章中,我将引导您完成在股票投资组合中计算该指标的步骤。
VaR如何计算?
有两种主要方法来计算VaR:
- 使用蒙特卡洛模拟
- 使用方差-协方差方法
在本文中,我们将重点介绍使用方法(2)(方差-协方差)。简而言之,方差-协方差方法着眼于给定回溯期内给定股票或股票投资组合的历史价格走势(标准差,平均价格),然后使用概率理论来计算指定置信区间内的最大损失。我们将在下面使用Python逐步进行计算。
在开始之前,请注意,标准VaR计算假定以下条件:
- 收益的正态分布 -VaR假设投资组合的收益是正态分布。对于大多数资产而言,这当然是不现实的,但允许我们使用更为简单的计算来制定基准。
- (可以对VaR进行修改来说明不同的分布,但是这里我们将重点介绍标准VaR计算)
- 标准市场条件 -与许多金融工具一样,VaR最适合用于考虑标准市场中的损失,并且不适用于极端/异常事件。
计算投资组合的VaR的步骤
为了计算投资组合的VaR,您可以按照以下步骤操作:
- 计算投资组合中股票的定期收益
- 根据收益创建协方差矩阵
- 计算投资组合均值和标准差
- (根据投资组合中每只股票的投资水平加权)
- 用指定的置信区间,标准差和均值计算正态累积分布(PPF)的反函数
- 通过从步骤(4)的计算中减去初始投资,估算投资组合的风险价值(VaR)
1)计算投资组合中股票的定期收益
-
# 创建我们的股票投资组合
-
-
tickers = ['AAPL','FB', 'C', 'DIS']
-
-
#设置投资权重
-
-
weights = np.array([.25, .3, .15, .3])
-
-
# 设定初始投资水平
-
-
initial_investment = 1000000
-
-
# 下载收盘价
-
-
data = pdr.get_data_yahoo(tickers, start="2018-01-01", end=dt.date.today())['Close']
-
-
#从收盘价计算定期收益
-
-
returns = data.pct_change()
-
returns.tail()
2)根据收益建立协方差矩阵
-
# 生成Var-Cov矩阵
-
cov_matrix = returns.cov()
-
cov_matrix
这将使我们能够计算整个投资组合的标准差和收益平均值。
3)计算投资组合的平均值和标准差
-
# 计算每只股票的平均收益
-
returns.mean()
-
# 计算整个投资组合的平均回报,
-
# 对投资权重进行归一化
-
avg_rets.dot(weights)
-
# 计算投资组合标准差
-
np.sqrt(weights.T.dot(cov_matri
-
# 计算投资平均值
-
(1+port_mean) * initial_investment
-
# 计算投资标准差
-
initial_investment * port_st
接下来,我们可以将这些变量插入下面的百分比函数(PPF)中。
4)计算具有指定置信区间,标准偏差和均值的正态累积分布(PPF)的逆
-
# 选择我们的置信区间(我将在此处选择95%)
-
-
conf_level1 = 0.05
-
-
#逆累积分布函数为正态分布
-
-
#插入我们投资组合的均值,标准差
-
-
cutoff1 = norm.ppf(conf_level1, mean_investment, stdev_investment)
5)通过从步骤4的计算中减去初始投资,估算投资组合的风险价值(VaR)
-
#最后,我们可以在置信区间内计算VaR
-
-
var_1d1
-
-
#output
-
-
#22347.7792230231
在这里,我们有95%的信心说,我们的100万投资组合在一天之内不会超过损失超过2.23万元的损失。
n天时间段内的风险价值
如果我们想在更大的时间范围内计算该怎么办?只需获取1天的VaR并将其乘以 时间段的平方根即可 (这是由于股票收益的标准偏差往往随时间的平方根而增加)。
-
# 计算n天VaR
-
var_array = []
-
-
-
var_array.append(np.round(var_1d1 * np.sqrt(x),2))
-
-
-
-
-
# 绘制图形
-
-
plt.title("Max portfolio loss (VaR) over 15-day period")
-
-
-
1 day VaR @ 95% confidence: 10635.31
-
-
2 day VaR @ 95% confidence: 13534.26
-
-
...
-
14 day VaR @ 95% confidence: 73456.51
-
-
15 day VaR @ 95% confidence: 83564.53
对照正态分布检查我们的股票分布
如计算部分所述,我们假设在计算VaR时,我们投资组合中股票的收益呈正态分布。
当然,我们无法预测这种情况,但我们至少可以检查历史收益如何分配,以帮助我们评估VaR是否适合用于我们的投资组合。
-
-
-
plt.plot(x, scipy.stats.norm.pdf(x, port_mean, port_stdev), "r")
-
-
plt.show()
收益与正态分布比较
从上面我们可以看到,自2018年以来,我们选择的股票的收益都已经符合正态分布。
最受欢迎的见解
1.R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究