首页 > 编程语言 >多资产VBA风险--基于python处理

多资产VBA风险--基于python处理

时间:2023-02-02 14:59:37浏览次数:43  
标签:10 VBA -- 模拟法 value python ret VaR np

一、数据准备,先在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

相关文章

  • nginx 日志分析之 access.log 格式详解
    说明:access.log的格式是可以自己自定义,输出的信息格式在nginx.conf中设置一般默认配置如下:http{...log_formatmain'$remote_addr-$remote_user[$time_lo......
  • Java基础-浅拷贝和深拷贝
    浅拷贝浅拷贝会在堆上创建一个新的对象,如果原对象的属性是一个引用类型,拷贝的内部对象是原对象内部对象的引用地址,即原对象和拷贝对象用的是同一个内部对象。classInner......
  • vue添加css样式的方式
    vue添加css样式的方式1、在.vue文件中引入css<stylescopedlang="scss"type="text/scss">@import"../css/style.css";</style> 2、直接在<style>中写......
  • windows常用dns相关命令
    ipconfig/displaydns查询当前DNS缓存   ipconfig/flushdns清空本机缓存   互联网上常见的公共DNS服务器的IP地址如下:首选DNS服务器地址 备用D......
  • maven settings.xml 配置 镜像仓库
    <?xmlversion="1.0"encoding="UTF-8"?><settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:sch......
  • 【分布式链路追踪】Skywalking分布式链路追踪基于Docker安装与使用
    1.服务监控三要素[1]服务监控需要满足的三要素分别如下:日志监控指标监控请求链路追踪服务监控只要能满足这三个要素,基本就能实现我们想要的监控效果。1.1.主流APM......
  • 线程池
    目录详解详解https://blog.csdn.net/qq_24983911/article/details/94722569?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167531837716800211589297%2522%......
  • 提高效率工具-开发环境代码自动跳IDE
    在日常开发中,当项目组件特别多或者刚接手一个项目时,可能需要花费一定时间去查找页面元素/组件对应的代码。下面就来分享几个插件,通过这些插件,点击页面元素就可以直接跳转到......
  • Linux运维的简单解释与分析
    运维解释:这里指互联网运维,通常属于技术部门,与研发、测试、系统管理同为互联网产品技术支撑的四大部门,这个划分在国内和国外以及大小公司间都会有不同。一个互联网产品的......
  • pyplot绘图常用代码
    https://zhuanlan.zhihu.com/p/366489354importmatplotlib.pyplotaspltx=[iforiinrange(10)]y=[random.random()for_inrange(10)]y1=[random.random......