单一资产VAR风险--基于python

数据源:使用 AKShare包。它是一个免费、开源的 Python 财经数据接口包。网址https://www.akshare.xyz/index.html

一、获取数据:

计算日收益率:

import pandas as pd
import numpy as np
import akshare as ak

# 读入中国平安 「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}万元') 

 

posted @ 2023-02-02 15:09  方木--数据分析与挖掘  阅读(98)  评论(0编辑  收藏  举报