VaR模型 - 用历史模拟法计算VaR

前言

既然本站的名称就叫作cnVaR,那就不得不介绍在险价值(Value at risk)的计算方法。VaR模型有多种的计算方法,比较常见的有历史模拟法、方差-协方差法 和 蒙特.卡洛模拟法 本文将介绍历史模拟法并计算VaR。

其实用历史模拟法计算VaR的整体思路是,先计算出某只股票某段时间的整体回报率和波动, 然后根据置信区间的百分比,如10%、5%或 1% 来确定最大损失值。

下面我们将用到tushare.pro的数据来计算上市公司的相关统计数据。

免费注册Tushare.pro账号

首先,我们需要从tushare.pro注册一个账号并调用其API获取股票日线数据。可能大多数的童稚是第一次接触tushare.pro, 那我就直接贴上官方介绍:

Tushare是一个免费提供各类金融数据和区块链数据 , 助力智能投资与创新型投资的python财经数据接口包。拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据。

步骤

  1. 我们首先调用Tushare的API 获取股票数据;
  2. 再通过python计算出其股票价格每日的百分比变化;
  3. 历史模拟法计算VaR

(一)收益率计算

因为计算股票的历史回报率不是本文的重点,所以我直接就用代码带过,过程如下:


(二)用历史模拟法计算VaR

我们将使用到上面收益率计算中的returns变量。

1. 用百分比来表示在险价值

1
2
3
4
5
6
7
VaR_90 = returns.quantile(0.1)
VaR_95 = returns.quantile(0.05)
VaR_99 = returns.quantile(0.01)
VaR_9999 = returns.quantile(0.001)

h_VaR = {'90%':VaR_90, '95%':VaR_95,'99%':VaR_99,'99.99%':VaR_9999}
pd.DataFrame.from_dict(h_VaR, orient='index',columns=['在险损失(VaR)'])

输出:

- 在险损失(VaR)
90% -0.019468
95% -0.029046
99% -0.052938
99.99% -0.090910

2. 用绝对金额来表示在险价值

假设你的投资金额为100万,那么用绝对值来算,那么:

1
2
3
4
5
6
7
8
invest =100
VaR_90 = returns.quantile(0.1)*invest
VaR_95 = returns.quantile(0.05)*invest
VaR_99 = returns.quantile(0.01)*invest
VaR_9999 = returns.quantile(0.001)*invest

h_VaR = {'90%':VaR_90, '95%':VaR_95,'99%':VaR_99,'99.99%':VaR_9999}
pd.DataFrame.from_dict(h_VaR, orient='index',columns=['在险价值(金额)'])

输出:

- 在险损失(金额)
90% -1.938319
95% -2.904585
99% -5.293842
99.99% -9.090971

解释: 假设你投资了100万股票600377(宁沪高速),你单日的投资损失有90%的机率会少于1.94万;你单日的投资损失有95%的机率会少于2.90万;你单日的投资损失有99%的机率会少于5.29万;你单日的投资损失有99%的机率会少于9.09万。

用图来显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 假设置信区间为95%
varg = np.percentile(returns, 5)

#柱状图
plt.figure(figsize=(15, 5))
plt.hist(returns,density=True)
plt.xlabel('回报率')
plt.ylabel('频率')
plt.title(r'收益柱状图', fontsize=18, fontweight='bold')
plt.axvline(x=varg, color='r', linestyle='--', label='95% 置信区间 VaR: ' + "{0:.2f}%".format(varg * 100))
plt.legend(loc='upper right')
plt.show()

print ("你单日的最大投资损失有95%的机率会少于" + "{0:.2f}%".format(np.percentile(returns, 5) * 100))
print(" 占" + str(len(returns)) + " 天中的" + "{0:.2f}".format(.05*len(returns)) + "天")

输出:

你单日的最大投资损失有95%的机率会少于-2.90%, 占3999 天中的199.95天。

0%