运用python测度投资组合的风险价值
一、数据来源——Tushare
Tushare大数据开放社区免费提供各类金融数据。数据丰富:拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据;获取简单:SDK开发包支持语言,同时提供HTTP Restful接口,最大程度方便不同人群的使用;落地方便:提供多种数据储存方式,如Oracle、MySQL,MongoDB、HDF5、CSV等,为数据获取提供了性能保证。
二、方法及成果展示
1.方差-协方差法
V
a
R
=
V
P
[
z
e
σ
P
−
E
(
R
P
)
]
\mathrm{VaR}=V_{P}\left[z_{e} \sigma_{P}-E\left(R_{P}\right)\right]
VaR=VP[zeσP−E(RP)]
E
(
R
p
)
=
∑
i
=
1
N
w
i
E
(
R
i
)
E\left(R_{p}\right)=\sum_{i=1}^{N} w_{i} E\left(R_{i}\right)
E(Rp)=i=1∑NwiE(Ri)
import tushare as ts
import pandas as pd
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
cons = ts.get_apis()
GZ=ts.bar('600519', conn=cons, freq='D', start_date='2015-01-01',end_date='2019-01-01')#选取贵州茅台2015-2019的数据,以“GZ”缩写代表该股票
JT=ts.bar('601328', conn=cons, freq='D', start_date='2015-01-01',end_date='2019-01-01')#选取交通银行015-2019的数据,以“JT”缩写代表该股票
JS=ts.bar('000005', conn=cons, freq='D', start_date='2015-01-01',end_date='2019-01-01')#选取嘉实增强信用基金015-2019的数据,以“JS”缩写代表该股票
HX=ts.bar('159920', conn=cons, freq='D', start_date='2015-01-01',end_date='2019-01-01')#选取华夏恒生ETF基金015-2019的数据,以“HX”缩写代表该股票
BS=ts.bar('513500', conn=cons, freq='D', start_date='2015-01-01',end_date='2019-01-01')#选取博时标普500ETF基金015-2019的数据,以“BS”缩写代表该股票
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
GZ=GZ.rename(columns={'close':'贵州茅台'})
JT=JT.rename(columns={'close':'交通银行'})
JS=JS.rename(columns={'close':'嘉实增强信用基金'})
HX=HX.rename(columns={'close':'华夏恒生ETF基金'})
BS=BS.rename(columns={'close':'博时标普500ETF基金'})
data=pd.concat([GZ['贵州茅台'],JT['交通银行'],JS['嘉实增强信用基金'],HX['华夏恒生ETF基金'],BS['博时标普500ETF基金']],axis=1)
(data/data.iloc[0]).plot(figsize=(8,6))
<matplotlib.axes._subplots.AxesSubplot at 0x1de2ee51948>
R=np.log(data/data.shift(1))
R=R.dropna()
R.describe()
贵州茅台 | 交通银行 | 嘉实增强信用基金 | 华夏恒生ETF基金 | 博时标普500ETF基金 | |
---|---|---|---|---|---|
count | 875.000000 | 875.000000 | 875.000000 | 875.000000 | 875.000000 |
mean | 0.000976 | -0.000265 | -0.000813 | 0.000017 | 0.000280 |
std | 0.019842 | 0.016583 | 0.033128 | 0.011883 | 0.011271 |
min | -0.105361 | -0.104924 | -0.105999 | -0.059943 | -0.092759 |
25% | -0.009621 | -0.006344 | -0.012074 | -0.005995 | -0.004082 |
50% | 0.000148 | 0.000000 | 0.000000 | 0.000645 | 0.000608 |
75% | 0.011025 | 0.005376 | 0.009534 | 0.006940 | 0.005351 |
max | 0.078877 | 0.095557 | 0.096043 | 0.055439 | 0.051845 |
R_mean=R.mean() #计算每个资产的日平均收益率
R_cov=R.cov() #计算每个资产的相关系数矩阵
R_vol=R.std() #计算每个资产收益率的日波动率
R_mean
贵州茅台 0.000976
交通银行 -0.000265
嘉实增强信用基金 -0.000813
华夏恒生ETF基金 0.000017
博时标普500ETF基金 0.000280
dtype: float64
R_cov
贵州茅台 | 交通银行 | 嘉实增强信用基金 | 华夏恒生ETF基金 | 博时标普500ETF基金 | |
---|---|---|---|---|---|
贵州茅台 | 0.000394 | 0.000115 | 0.000158 | 0.000109 | 0.000046 |
交通银行 | 0.000115 | 0.000275 | 0.000088 | 0.000074 | 0.000027 |
嘉实增强信用基金 | 0.000158 | 0.000088 | 0.001097 | 0.000126 | 0.000069 |
华夏恒生ETF基金 | 0.000109 | 0.000074 | 0.000126 | 0.000141 | 0.000059 |
博时标普500ETF基金 | 0.000046 | 0.000027 | 0.000069 | 0.000059 | 0.000127 |
R_vol
贵州茅台 0.019842
交通银行 0.016583
嘉实增强信用基金 0.033128
华夏恒生ETF基金 0.011883
博时标普500ETF基金 0.011271
dtype: float64
weights=np.array([0.15,0.20,0.50,0.05,0.10]) #投资组合中各资产的配置权重
Rp_daily=np.sum(weights*R_mean) #按照当前权重计算投资组合过往日平均收益率
Vp_daily=np.sqrt(np.dot(weights,np.dot(R_cov,weights.T))) #按照当前权重计算投资组合过往日波动率
print('按照当前权重计算投资组合日平均收益率',Rp_daily)
print('按照当前权重计算投资组合日波动率',Vp_daily)
按照当前权重计算投资组合日平均收益率 -0.0002840553011451197
按照当前权重计算投资组合日波动率 0.019063133533068204
def VaR_VCM(Value,Rp,Vp,X,N):
'''运用方差-协方差法计算风险价值
Value:投资组合价值
Rp:投资组合日平均收益率
Vp:投资组合收益率的日波动率
X:置信水平
N:持有期,用天数表示
'''
import scipy.stats as st
import numpy as np
z=np.abs(st.norm.ppf(q=1-X))
return np.sqrt(N)*Value*(z*Vp-Rp)
D1=1 #持有期为1天
D2=10 #持有期为10天
X1=0.99 #置信水平为99%
X2=0.95 #置信水平为95%
Value_port=100000000 #投资组合的价值为1亿元
VaR99_1day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X1,N=D1) #持有期1天、置信水平99%的风险价值
VaR95_1day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X2,N=D1) #持有期1天、置信水平95%的风险价值
VaR99_10day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X1,N=D2) #持有期10天、置信水平99%的风险价值
VaR95_10day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X2,N=D2) #持有期10天、置信水平95%的风险价值
print('方差-协方差法计算的持有期1天、置信水平99%的风险价值',round(VaR99_1day_VCM,2))
print('方差-协方差法计算的持有期1天、置信水平95%的风险价值',round(VaR95_1day_VCM,2))
print('方差-协方差法计算的持有期10天、置信水平99%的风险价值',round(VaR99_10day_VCM,2))
print('方差-协方差法计算的持有期10天、置信水平95%的风险价值',round(VaR95_10day_VCM,2))
方差-协方差法计算的持有期1天、置信水平99%的风险价值 4463153.55
方差-协方差法计算的持有期1天、置信水平95%的风险价值 3164011.96
方差-协方差法计算的持有期10天、置信水平99%的风险价值 14113730.76
方差-协方差法计算的持有期10天、置信水平95%的风险价值 10005484.35
2.历史模拟法
模拟过去第t个交易日投资组合的收益
Δ
S
P
t
\Delta S_{P t}
ΔSPt表达式如下
Δ
S
P
t
=
∑
i
=
1
M
w
i
R
i
t
S
P
T
\Delta S_{P t}=\sum_{i=1}^{M} w_{i} R_{i t} S_{P T}
ΔSPt=i=1∑MwiRitSPT
Value_asset=Value_port*weights #按照投资组合最新市值和每个资产最新权重计算每个资产的最新市值
Return_history=np.dot(R,Value_asset)
Return_history=pd.DataFrame(Return_history,index=R.index,columns=['投资组合的模拟日收益'])
Return_history.describe()
投资组合的模拟日收益 | |
---|---|
count | 8.750000e+02 |
mean | -2.840553e+04 |
std | 1.906313e+06 |
min | -9.341354e+06 |
25% | -7.350990e+05 |
50% | -1.648808e+04 |
75% | 6.550495e+05 |
max | 6.380627e+06 |
Return_history.plot(figsize=(8,6))
<matplotlib.axes._subplots.AxesSubplot at 0x1de2f1eeb88>
plt.figure(figsize=(8,6))
plt.hist(np.array(Return_history),bins=30,facecolor='y',edgecolor='k')
plt.xticks(fontsize=13)
plt.xlabel(u'投资组合模拟的日收益金额',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13,rotation=0)
plt.title(u'投资组合模拟日收益金额的直方图',fontsize=13)
plt.grid(True)
st.kstest(rvs=Return_history['投资组合的模拟日收益'],cdf='norm') #正态性的kolmogrov-Smirnov检验
KstestResult(statistic=0.5085714285714286, pvalue=2.574247156362617e-210)
st.anderson(x=Return_history['投资组合的模拟日收益'],dist='norm') #正态性的Anderson-Darling检验
AndersonResult(statistic=29.30261836588511, critical_values=array([0.573, 0.653, 0.783, 0.914, 1.087]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
st.shapiro(Return_history['投资组合的模拟日收益']) #正态性的Shapiro-Wilk检验
(0.8967312574386597, 8.744595709578196e-24)
st.normaltest(Return_history['投资组合的模拟日收益']) #正态性检验
NormaltestResult(statistic=106.32215256349147, pvalue=8.174061836292735e-24)
无论是图像还是4个检验正态性的指标统计量,都可以得出投资组合模拟日收益数据不服从正态分布的结论,因此运用方差-协方差法计算得到的投资组合风险价值会存在偏差
VaR99_1day_history=np.abs(np.percentile(a=Return_history,q=(1-X1)*100)) ##持有期1天、置信水平99%的风险价值
VaR95_1day_history=np.abs(np.percentile(a=Return_history,q=(1-X2)*100)) ##持有期1天、置信水平95%的风险价值
VaR99_10day_history=np.sqrt(10)*VaR99_1day_history ##持有期10天、置信水平99%的风险价值
VaR95_10day_history=np.sqrt(10)*VaR95_1day_history ##持有期10天、置信水平95%的风险价值
print('历史模拟法计算的持有期1天、置信水平99%的风险价值',round(VaR99_1day_history,2))
print('历史模拟法计算的持有期1天、置信水平95%的风险价值',round(VaR95_1day_history,2))
print('历史模拟法计算的持有期10天、置信水平99%的风险价值',round(VaR99_10day_history,2))
print('历史模拟法计算的持有期10天、置信水平95%的风险价值',round(VaR95_10day_history,2))
历史模拟法计算的持有期1天、置信水平99%的风险价值 6762437.15
历史模拟法计算的持有期1天、置信水平95%的风险价值 2898598.86
历史模拟法计算的持有期10天、置信水平99%的风险价值 21384703.92
历史模拟法计算的持有期10天、置信水平95%的风险价值 9166174.41
历史模拟法计算的持有期10天、置信水平99%的风险价值>方差-协方差法计算的持有期10天、置信水平99%的风险价值,
历史模拟法计算的持有期10天、置信水平95%的风险价值<方差-协方差法计算的持有期10天、置信水平95%的风险价值。
历史模拟法有更强的对尾部极端风险的捕捉能力。
3.蒙特卡罗模拟法
import numpy.random as npr
I=10000 #模拟次数
epsilon=npr.standard_t(df=len(R),size=I) #从*度等于过往交易日天数的学生t分布中进行随机抽样
S1=data.iloc[-1,0] #投资组合中第1个资产的收盘价
S2=data.iloc[-1,1] #投资组合中第2个资产的收盘价
S3=data.iloc[-1,2] #投资组合中第3个资产的收盘价
S4=data.iloc[-1,3] #投资组合中第4个资产的收盘价
S5=data.iloc[-1,4] #投资组合中第5个资产的收盘价
R_mean=R.mean()*252 #计算每个资产的年化平均收益率
R_vol=R.std()*np.sqrt(252) #计算每个资产收益率的年化波动率
dt=1/252 #设定为1个交易日
S1_new=S1*np.exp((R_mean[0]-0.5*R_vol[0]**2)*dt+R_vol[0]*epsilon*np.sqrt(dt)) #模拟投资组合中第1个资产下一个交易日的收盘价
S2_new=S2*np.exp((R_mean[0]-0.5*R_vol[1]**2)*dt+R_vol[0]*epsilon*np.sqrt(dt)) #模拟投资组合中第2个资产下一个交易日的收盘价
S3_new=S3*np.exp((R_mean[0]-0.5*R_vol[2]**2)*dt+R_vol[0]*epsilon*np.sqrt(dt)) #模拟投资组合中第3个资产下一个交易日的收盘价
S4_new=S4*np.exp((R_mean[0]-0.5*R_vol[3]**2)*dt+R_vol[0]*epsilon*np.sqrt(dt)) #模拟投资组合中第4个资产下一个交易日的收盘价
S5_new=S5*np.exp((R_mean[0]-0.5*R_vol[4]**2)*dt+R_vol[0]*epsilon*np.sqrt(dt)) #模拟投资组合中第5个资产下一个交易日的收盘价
S1_delta=(S1_new/S1-1)*Value_port*weights[0] #模拟投资组合中第1个资产下一个交易日的收益
S2_delta=(S2_new/S2-1)*Value_port*weights[1] #模拟投资组合中第2个资产下一个交易日的收益
S3_delta=(S3_new/S3-1)*Value_port*weights[2] #模拟投资组合中第3个资产下一个交易日的收益
S4_delta=(S4_new/S4-1)*Value_port*weights[3] #模拟投资组合中第4个资产下一个交易日的收益
S5_delta=(S5_new/S5-1)*Value_port*weights[4] #模拟投资组合中第5个资产下一个交易日的收益
Sp_delta=S1_delta+S2_delta+S3_delta+S4_delta+S5_delta #模拟投资组合下一个交易日的收益
plt.figure(figsize=(8,6))
plt.hist(Sp_delta,bins=30,facecolor='y',edgecolor='k')
plt.xticks(fontsize=13)
plt.xlabel(u'投资组合模拟的日收益金额',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13,rotation=0)
plt.title(u'蒙特卡罗模拟(服从学生t分布)得到投资组合日收益金额的直方图',fontsize=13)
plt.grid(True)
VaR99_1day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X1,N=D1) #持有期1天、置信水平99%的风险价值
VaR95_1day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X2,N=D1) #持有期1天、置信水平95%的风险价值
VaR99_10day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X1,N=D2) #持有期10天、置信水平99%的风险价值
VaR95_10day_VCM=VaR_VCM(Value_port,Rp=Rp_daily,Vp=Vp_daily,X=X2,N=D2) #持有期10天、置信水平95%的风险价值
print('方差-协方差法计算的持有期1天、置信水平99%的风险价值',round(VaR99_1day_VCM,2))
print('方差-协方差法计算的持有期1天、置信水平95%的风险价值',round(VaR95_1day_VCM,2))
print('方差-协方差法计算的持有期10天、置信水平99%的风险价值',round(VaR99_10day_VCM,2))
print('方差-协方差法计算的持有期10天、置信水平95%的风险价值',round(VaR95_10day_VCM,2))
方差-协方差法计算的持有期1天、置信水平99%的风险价值 4463153.55
方差-协方差法计算的持有期1天、置信水平95%的风险价值 3164011.96
方差-协方差法计算的持有期10天、置信水平99%的风险价值 14113730.76
方差-协方差法计算的持有期10天、置信水平95%的风险价值 10005484.35
print('历史模拟法计算的持有期1天、置信水平99%的风险价值',round(VaR99_1day_history,2))
print('历史模拟法计算的持有期1天、置信水平95%的风险价值',round(VaR95_1day_history,2))
print('历史模拟法计算的持有期10天、置信水平99%的风险价值',round(VaR99_10day_history,2))
print('历史模拟法计算的持有期10天、置信水平95%的风险价值',round(VaR95_10day_history,2))
历史模拟法计算的持有期1天、置信水平99%的风险价值 6762437.15
历史模拟法计算的持有期1天、置信水平95%的风险价值 2898598.86
历史模拟法计算的持有期10天、置信水平99%的风险价值 21384703.92
历史模拟法计算的持有期10天、置信水平95%的风险价值 9166174.41
VaR99_1day_MSst=np.abs(np.percentile(a=Sp_delta,q=(1-X1)*100)) ##持有期1天、置信水平99%的风险价值
VaR95_1day_MSst=np.abs(np.percentile(a=Sp_delta,q=(1-X2)*100)) ##持有期1天、置信水平95%的风险价值
VaR99_10day_MSst=np.sqrt(10)*VaR99_1day_MSst ##持有期10天、置信水平99%的风险价值
VaR95_10day_MSst=np.sqrt(10)*VaR95_1day_MSst ##持有期10天、置信水平95%的风险价值
print('蒙特卡罗模拟法计算的持有期1天、置信水平99%的风险价值',round(VaR99_1day_MSst,2))
print('蒙特卡罗模拟法计算的持有期1天、置信水平95%的风险价值',round(VaR95_1day_MSst,2))
print('蒙特卡罗模拟法计算的持有期10天、置信水平99%的风险价值',round(VaR99_10day_MSst,2))
print('蒙特卡罗模拟法计算的持有期10天、置信水平95%的风险价值',round(VaR95_10day_MSst,2))
蒙特卡罗模拟法计算的持有期1天、置信水平99%的风险价值 4444075.46
蒙特卡罗模拟法计算的持有期1天、置信水平95%的风险价值 3173818.74
蒙特卡罗模拟法计算的持有期10天、置信水平99%的风险价值 14053400.56
蒙特卡罗模拟法计算的持有期10天、置信水平95%的风险价值 10036496.11
from prettytable import PrettyTable
x= PrettyTable(["测度方法","方差-协方差法", "历史模拟法", "蒙特卡罗模拟法"])
x.add_row(["持有期1天、置信水平99%的风险价值","4463153.55","6762437.15","4623509.83"])
x.add_row(["持有期1天、置信水平95%的风险价值","3164011.96","2898598.86","3152171.57"])
x.add_row(["持有期10天、置信水平99%的风险价值","14113730.76","21384703.92","14620821.86"])
x.add_row(["持有期10天、置信水平95%的风险价值","10005484.35","9166174.41","9968041.73"])
print(x)
+-----------------------------------+---------------+-------------+----------------+
| 测度方法 | 方差-协方差法 | 历史模拟法 | 蒙特卡罗模拟法 |
+-----------------------------------+---------------+-------------+----------------+
| 持有期1天、置信水平99%的风险价值 | 4463153.55 | 6762437.15 | 4623509.83 |
| 持有期1天、置信水平95%的风险价值 | 3164011.96 | 2898598.86 | 3152171.57 |
| 持有期10天、置信水平99%的风险价值 | 14113730.76 | 21384703.92 | 14620821.86 |
| 持有期10天、置信水平95%的风险价值 | 10005484.35 | 9166174.41 | 9968041.73 |
+-----------------------------------+---------------+-------------+----------------+
4.回溯检验
Return_2015=Return_history.loc['2015-01-01':'2015-12-31']
Return_2016=Return_history.loc['2016-01-01':'2016-12-31']
Return_2017=Return_history.loc['2017-01-01':'2017-12-31']
Return_2018=Return_history.loc['2018-01-01':'2018-12-31']
days_2015=len(Return_2015)
days_2016=len(Return_2016)
days_2017=len(Return_2017)
days_2018=len(Return_2018)
VaR_2015=pd.DataFrame(-VaR95_1day_VCM*np.ones_like(Return_2015),index=Return_2015.index) #生成2015年风险价值的时间序列
VaR_2016=pd.DataFrame(-VaR95_1day_VCM*np.ones_like(Return_2016),index=Return_2016.index) #生成2016年风险价值的时间序列
VaR_2017=pd.DataFrame(-VaR95_1day_VCM*np.ones_like(Return_2017),index=Return_2017.index) #生成2017年风险价值的时间序列
VaR_2018=pd.DataFrame(-VaR95_1day_VCM*np.ones_like(Return_2018),index=Return_2018.index) #生成2018年风险价值的时间序列
plt.figure(figsize=(9,15))
plt.subplot(4,1,1)
plt.plot(Return_2015,'b-',label=u'2015年投资组合日收益')
plt.plot(VaR_2015,'r-',label=u'风险价值对应的亏损',lw=2.0)
plt.ylabel(u'收益')
plt.xticks(rotation=30)
plt.legend(fontsize=12)
plt.grid('True')
plt.subplot(4,1,2)
plt.plot(Return_2016,'b-',label=u'2016年投资组合日收益')
plt.plot(VaR_2016,'r-',label=u'风险价值对应的亏损',lw=2.0)
plt.ylabel(u'收益')
plt.xticks(rotation=30)
plt.legend(fontsize=12)
plt.grid('True')
plt.subplot(4,1,3)
plt.plot(Return_2017,'b-',label=u'2017年投资组合日收益')
plt.plot(VaR_2017,'r-',label=u'风险价值对应的亏损',lw=2.0)
plt.ylabel(u'收益')
plt.xticks(rotation=30)
plt.legend(fontsize=12)
plt.grid('True')
plt.subplot(4,1,4)
plt.plot(Return_2018,'b-',label=u'2018年投资组合日收益')
plt.plot(VaR_2018,'r-',label=u'风险价值对应的亏损',lw=2.0)
plt.ylabel(u'收益')
plt.xticks(rotation=30)
plt.legend(fontsize=12)
plt.grid('True')
plt.show()
#方差-协方差法
dayexcept_2015_VCM=len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR95_1day_VCM])
dayexcept_2016_VCM=len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR95_1day_VCM])
dayexcept_2017_VCM=len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR95_1day_VCM])
dayexcept_2018_VCM=len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR95_1day_VCM])
print('2015年超过风险价值的天数',dayexcept_2015_VCM)
print('2015年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2015_VCM/days_2015,4))
print('2016年超过风险价值的天数',dayexcept_2016_VCM)
print('2016年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2016_VCM/days_2016,4))
print('2017年超过风险价值的天数',dayexcept_2017_VCM)
print('2017年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2017_VCM/days_2017,4))
print('2018年超过风险价值的天数',dayexcept_2018_VCM)
print('2018年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2018_VCM/days_2018,4))
2015年超过风险价值的天数 23
2015年超过风险价值的天数占全年交易天数的比例 0.1597
2016年超过风险价值的天数 9
2016年超过风险价值的天数占全年交易天数的比例 0.0369
2017年超过风险价值的天数 1
2017年超过风险价值的天数占全年交易天数的比例 0.0041
2018年超过风险价值的天数 7
2018年超过风险价值的天数占全年交易天数的比例 0.0288
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR99_1day_VCM])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR99_1day_VCM])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR99_1day_VCM])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR99_1day_VCM])/days_2018,4))
0.1111
0.0205
0.0
0.0082
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR99_10day_VCM])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR99_10day_VCM])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR99_10day_VCM])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR99_10day_VCM])/days_2018,4))
0.0
0.0
0.0
0.0
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR95_10day_VCM])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR95_10day_VCM])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR95_10day_VCM])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR95_10day_VCM])/days_2018,4))
0.0
0.0
0.0
0.0
#历史模拟法
dayexcept_2015_history=len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR95_1day_history])
dayexcept_2016_history=len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR95_1day_history])
dayexcept_2017_history=len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR95_1day_history])
dayexcept_2018_history=len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR95_1day_history])
print('2015年超过风险价值的天数',dayexcept_2015_history)
print('2015年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2015_history/days_2015,4))
print('2016年超过风险价值的天数',dayexcept_2016_history)
print('2016年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2016_history/days_2016,4))
print('2017年超过风险价值的天数',dayexcept_2017_history)
print('2017年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2017_history/days_2017,4))
print('2018年超过风险价值的天数',dayexcept_2018_history)
print('2018年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2018_history/days_2018,4))
2015年超过风险价值的天数 25
2015年超过风险价值的天数占全年交易天数的比例 0.1736
2016年超过风险价值的天数 10
2016年超过风险价值的天数占全年交易天数的比例 0.041
2017年超过风险价值的天数 1
2017年超过风险价值的天数占全年交易天数的比例 0.0041
2018年超过风险价值的天数 8
2018年超过风险价值的天数占全年交易天数的比例 0.0329
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR99_1day_history])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR99_1day_history])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR99_1day_history])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR99_1day_history])/days_2018,4))
0.0347
0.0123
0.0
0.0041
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR99_10day_history])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR99_10day_history])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR99_10day_history])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR99_10day_history])/days_2018,4))
0.0
0.0
0.0
0.0
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR95_10day_history])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR95_10day_history])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR95_10day_history])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR95_10day_history])/days_2018,4))
0.0069
0.0
0.0
0.0
#蒙特卡罗模拟法
dayexcept_2015_MSst=len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR95_1day_MSst])
dayexcept_2016_MSst=len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR95_1day_MSst])
dayexcept_2017_MSst=len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR95_1day_MSst])
dayexcept_2018_MSst=len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR95_1day_MSst])
print('2015年超过风险价值的天数',dayexcept_2015_MSst)
print('2015年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2015_MSst/days_2015,4))
print('2016年超过风险价值的天数',dayexcept_2016_MSst)
print('2016年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2016_MSst/days_2016,4))
print('2017年超过风险价值的天数',dayexcept_2017_MSst)
print('2017年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2017_MSst/days_2017,4))
print('2018年超过风险价值的天数',dayexcept_2018_MSst)
print('2018年超过风险价值的天数占全年交易天数的比例',round(dayexcept_2018_MSst/days_2018,4))
2015年超过风险价值的天数 23
2015年超过风险价值的天数占全年交易天数的比例 0.1597
2016年超过风险价值的天数 9
2016年超过风险价值的天数占全年交易天数的比例 0.0369
2017年超过风险价值的天数 1
2017年超过风险价值的天数占全年交易天数的比例 0.0041
2018年超过风险价值的天数 7
2018年超过风险价值的天数占全年交易天数的比例 0.0288
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR99_1day_MSst])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR99_1day_MSst])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR99_1day_MSst])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR99_1day_MSst])/days_2018,4))
0.1181
0.0205
0.0
0.0082
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR99_10day_MSst])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR99_10day_MSst])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR99_10day_MSst])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR99_10day_MSst])/days_2018,4))
0.0
0.0
0.0
0.0
print(round(len(Return_2015[Return_2015['投资组合的模拟日收益']< -VaR95_10day_MSst])/days_2015,4))
print(round(len(Return_2016[Return_2016['投资组合的模拟日收益']< -VaR95_10day_MSst])/days_2016,4))
print(round(len(Return_2017[Return_2017['投资组合的模拟日收益']< -VaR95_10day_MSst])/days_2017,4))
print(round(len(Return_2018[Return_2018['投资组合的模拟日收益']< -VaR95_10day_MSst])/days_2018,4))
0.0
0.0
0.0
0.0
from prettytable import PrettyTable
x= PrettyTable(["(方差-协方差法)年份","2015", "2016", "2017","2018"])
x.add_row(["持有期1天、置信水平99%的超额占比","0.1111","0.0205","0.0","0.0082"])
x.add_row(["持有期1天、置信水平95%的超额占比","0.1597","0.0369","0.0041","0.0288"])
x.add_row(["持有期10天、置信水平99%的超额占比","0","0","0","0"])
x.add_row(["持有期10天、置信水平95%的超额占比","0","0","0","0"])
print(x)
+-----------------------------------+--------+--------+--------+--------+
| (方差-协方差法)年份 | 2015 | 2016 | 2017 | 2018 |
+-----------------------------------+--------+--------+--------+--------+
| 持有期1天、置信水平99%的超额占比 | 0.1111 | 0.0205 | 0.0 | 0.0082 |
| 持有期1天、置信水平95%的超额占比 | 0.1597 | 0.0369 | 0.0041 | 0.0288 |
| 持有期10天、置信水平99%的超额占比 | 0 | 0 | 0 | 0 |
| 持有期10天、置信水平95%的超额占比 | 0 | 0 | 0 | 0 |
+-----------------------------------+--------+--------+--------+--------+
在持有期为1天的条件下,方差-协方差法不适用于2015年,但16、17、18年在95%置信度下通过检验,17、18年在99%置信度下通过检验。
from prettytable import PrettyTable
x= PrettyTable(["(历史模拟法)年份","2015", "2016", "2017","2018"])
x.add_row(["持有期1天、置信水平99%的超额占比","0.0347","0.0123","0.0","0.0041"])
x.add_row(["持有期1天、置信水平95%的超额占比","0.1736","0.041","0.0041","0.0329"])
x.add_row(["持有期10天、置信水平99%的超额占比","0","0","0","0"])
x.add_row(["持有期10天、置信水平95%的超额占比","0.0069","0","0","0"])
print(x)
+-----------------------------------+--------+--------+--------+--------+
| (历史模拟法)年份 | 2015 | 2016 | 2017 | 2018 |
+-----------------------------------+--------+--------+--------+--------+
| 持有期1天、置信水平99%的超额占比 | 0.0347 | 0.0123 | 0.0 | 0.0041 |
| 持有期1天、置信水平95%的超额占比 | 0.1736 | 0.041 | 0.0041 | 0.0329 |
| 持有期10天、置信水平99%的超额占比 | 0 | 0 | 0 | 0 |
| 持有期10天、置信水平95%的超额占比 | 0.0069 | 0 | 0 | 0 |
+-----------------------------------+--------+--------+--------+--------+
类似于方差-协方差模型的检测结果,在持有期为1天的条件下,历史模拟法不适用于2015年,但16、17、18年在95%置信度下通过检验,17、18年在99%置信度下通过检验。
from prettytable import PrettyTable
x= PrettyTable(["(蒙特卡罗模拟法)年份","2015", "2016", "2017","2018"])
x.add_row(["持有期1天、置信水平99%的超额占比","0.1111","0.0205","0.0","0.0082"])
x.add_row(["持有期1天、置信水平95%的超额占比","0.1597","0.0369","0.0041","0.0288"])
x.add_row(["持有期10天、置信水平99%的超额占比","0","0","0","0"])
x.add_row(["持有期10天、置信水平95%的超额占比","0","0","0","0"])
print(x)
+-----------------------------------+--------+--------+--------+--------+
| (蒙特卡罗模拟法)年份 | 2015 | 2016 | 2017 | 2018 |
+-----------------------------------+--------+--------+--------+--------+
| 持有期1天、置信水平99%的超额占比 | 0.1111 | 0.0205 | 0.0 | 0.0082 |
| 持有期1天、置信水平95%的超额占比 | 0.1597 | 0.0369 | 0.0041 | 0.0288 |
| 持有期10天、置信水平99%的超额占比 | 0 | 0 | 0 | 0 |
| 持有期10天、置信水平95%的超额占比 | 0 | 0 | 0 | 0 |
+-----------------------------------+--------+--------+--------+--------+
类似于方差-协方差模型的检测结果,在持有期为1天的条件下,蒙特卡罗模拟法不适用于2015年,但16、17、18年在95%置信度下通过检验,17、18年在99%置信度下通过检验。
参考书目:基于python的金融分析与风险管理第12章(斯文著)