一、数据准备,先在excel表格上计算每日的波动率;
excel数据为:
二、数据导入:
import pandas as pd import numpy as np import akshare as ak import scipy.stats as st ret=pd.read_excel('text.xlsx',index_col="date") ret
三、协方差法:
value = 100000000 #投资组合市值为1亿元 R_mean = ret.mean() #计算均值 R_cov = ret.cov() #计算协方差 R_vol = ret.std() #计算标准差 #投资组合各资产权重 weights = np.array([0.15,0.20,0.5,0.05,0.1]) #计算投资组合的期望收益率 Rp_daily = np.sum(weights*R_mean) #计算投资组合的日波动率 Vp_daily = np.sqrt(np.dot(weights,np.dot(R_cov,weights.T))) def VaR_VCM(value,mu,sig,X,T): ''' Parameters ---------- value : 资产的价值 mu : 资产的日均收益率 sig : 资产的日均波动率(标准差) X : 置信水平 T : 持有天数 ''' z = abs(st.norm.ppf(q=1-X)) return np.sqrt(T)*value*(z*sig-mu) VaR99_1day_VCM = VaR_VCM(value,Rp_daily,Vp_daily, 0.99, 1) VaR99_10day_VCM = VaR_VCM(value,Rp_daily,Vp_daily, 0.99, 10) VaR95_1day_VCM = VaR_VCM(value,Rp_daily,Vp_daily, 0.95, 1) VaR95_10day_VCM = VaR_VCM(value,Rp_daily,Vp_daily,0.95, 10) print(f'方差-协方差法1天、99%的VaR:{VaR99_1day_VCM/10000:.2f}万元') print(f'方差-协方差法10天、99%的VaR:{VaR99_10day_VCM/10000:.2f}万元') print(f'方差-协方差法1天、95%的VaR:{VaR95_1day_VCM/10000:.2f}万元') print(f'方差-协方差法10天、95%的VaR:{VaR95_10day_VCM/10000:.2f}万元')
结果:
方差-协方差法1天、99%的VaR:544.65万元
方差-协方差法10天、99%的VaR:1722.32万元
方差-协方差法1天、95%的VaR:385.20万元
方差-协方差法10天、95%的VaR:1218.12万元
四、历史模拟法
value = 100000000 #投资组合市值为1亿元 #投资组合各资产权重 weights = np.array([0.15,0.20,0.5,0.05,0.1]) #历史交易日投资组合的收益率序列 Rp = np.dot(ret,weights) Rp = pd.DataFrame(Rp,index=ret.index,columns=['投资组合日收益']) def VaR_history(value,ret,X,T): ''' Parameters ---------- value : 资产的价值 ret : 资产的日收益率序列 X : 置信水平 T : 持有天数 ''' # Numpy 的 percentile 函数,可以直接返回序列相应的分位数 return value*np.sqrt(T)*abs(np.percentile(ret,(1-X)*100)) VaR99_1day_history = VaR_history(value,Rp,0.99,1) VaR99_10day_history = VaR_history(value,Rp,0.99,10) VaR95_1day_history = VaR_history(value,Rp,0.95,1) VaR95_10day_history = VaR_history(value,Rp,0.95,10) print(f'历史模拟法1天、99%的VaR:{VaR99_1day_history/10000:.2f}万元') print(f'历史模拟法10天、99%的VaR:{VaR99_10day_history/10000:.2f}万元') print(f'历史模拟法1天、95%的VaR:{VaR95_1day_history/10000:.2f}万元') print(f'历史模拟法10天、95%的VaR:{VaR95_10day_history/10000:.2f}万元')
结果:
历史模拟法1天、99%的VaR:725.59万元
历史模拟法10天、99%的VaR:2294.51万元
历史模拟法1天、95%的VaR:333.50万元
历史模拟法10天、95%的VaR:1054.62万元
五、蒙特卡洛模拟法
value = 100000000 #投资组合市值为1亿元 #投资组合各资产权重 weights = np.array([0.15,0.20,0.5,0.05,0.1]) m = 10000 #模拟次数 e1 = np.random.standard_t(df=len(ret),size=m) #自由度为收益率数据长度的t分布 #e1 = np.random.standard_normal(size=m) #若服从正态分布,则此代码代替上行代码 R_mean_year = ret.mean()*252 #计算每一资产的年化平均收益率 R_vol_year = ret.std()*np.sqrt(252) #计算每一资产的年化波动率 dt=1/252 #时间间隔 S0=np.ones(len(weights)) S=np.zeros(shape=(m,len(weights))) #存放(模拟次数×资产数量)个模拟价格数据 for i in range(len(weights)):#代入随机过程 S[:,i]=S0[i]*(np.exp((R_mean_year[i]-0.5*R_vol_year[i]**2)*dt+R_vol_year[i]*e1*np.sqrt(dt))) #每一行∑资产收益率×相应权重就得到资产组合的收益率,一共10000行 Sp_ret=(np.dot(S/S0-1,weights)) #资产组合收益率 #蒙特卡洛模拟法计算VaR VaR99_1day_MS = value*abs(np.percentile(Sp_ret,1)) VaR99_10day_MS = np.sqrt(10)*VaR99_1day_MS VaR95_1day_MS = value*abs(np.percentile(Sp_ret,5)) VaR95_10day_MS = np.sqrt(10)*VaR95_1day_MS #由于抽样随机数的原因,结果可能会有不同 print(f'蒙特卡罗模拟法1天、99%的VaR:{VaR99_1day_MS/10000:.2f}万元') print(f'蒙特卡罗模拟法10天、99%的VaR:{VaR99_10day_MS/10000:.2f}万元') print(f'蒙特卡罗模拟法1天、95%的VaR:{VaR95_1day_MS/10000:.2f}万元') print(f'蒙特卡罗模拟法10天、95%的VaR:{VaR95_10day_MS/10000:.2f}万元')
结果:
蒙特卡罗模拟法1天、99%的VaR:712.66万元
蒙特卡罗模拟法10天、99%的VaR:2253.64万元
蒙特卡罗模拟法1天、95%的VaR:510.74万元
蒙特卡罗模拟法10天、95%的VAR:1615.09万元
参考资料:https://blog.csdn.net/mfsdmlove/article/details/126081926
标签:10,VBA,--,模拟法,value,python,ret,VaR,np From: https://www.cnblogs.com/leon507/p/17085967.html