数据源:使用 AKShare包。它是一个免费、开源的 Python 财经数据接口包。网址https://www.akshare.xyz/index.html
一、获取数据:
计算日收益率:
import pandas as pd import numpy as np import akshare as ak import scipy.stats as st # 读入中国平安 「000001」 2015-01-01 到 2021-12-31 日收盘价数据 data = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20150101", end_date='20211231', adjust="") data.index = pd.to_datetime(data['日期'],format='%Y-%m-%d') #设置日期索引 close = data['收盘'] #日收盘价 ret = np.log(close/close.shift(1)) #日收益率 ret = ret.dropna()
二、方差-协方差法:
value = 1000000 #中国平安股票价值为100万元 R_mean = ret.mean() #计算均值 R_vol = ret.std() #计算标准差 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,R_mean,R_vol, 0.99, 1) VaR99_10day_VCM = VaR_VCM(value,R_mean,R_vol, 0.99, 10) VaR95_1day_VCM = VaR_VCM(value,R_mean,R_vol, 0.95, 1) VaR95_10day_VCM = VaR_VCM(value,R_mean,R_vol,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}万元')
三、历史模拟法:
value = 1000000 #中国平安股票价值为100万元 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,ret,0.99,1) VaR99_10day_history = VaR_history(value,ret,0.99,10) VaR95_1day_history = VaR_history(value,ret,0.95,1) VaR95_10day_history = VaR_history(value,ret,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}万元')
四、蒙特卡罗模拟法:
value = 1000000 #中国平安股票价值为100万元 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=1 S=np.zeros(m) #存放模拟次数个模拟价格数据 #代入随机过程 S=S0*(np.exp((R_mean_year-0.5*R_vol_year**2)*dt+R_vol_year*e1*np.sqrt(dt))) F_ret=S/S0-1 #模拟未来收益率 #蒙特卡洛模拟法计算VaR VaR99_1day_MS = value*abs(np.percentile(F_ret,1)) VaR99_10day_MS = np.sqrt(10)*VaR99_1day_MS VaR95_1day_MS = value*abs(np.percentile(F_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}万元')
标签:1day,--,ret,python,value,VaR,np,history From: https://www.cnblogs.com/leon507/p/17086103.html