python实现VaR和CVaR的计算

article/2025/11/7 14:27:35

python实现VaR和CVaR的计算

      • 1.引言
      • 2.问题
        • 2.1问题描述
        • 2.2 问题解析
      • 3. 数据导入与数据预处理
      • 4.VaR的计算
        • 4.1 参数法
        • 4.2 蒙特卡洛法
        • 4.3 历史模拟法
        • 4.4 不同方法的VaR比较
      • 5.CVaR的计算
        • 5.1 CVaR的计算
        • 5.2 VaR和CVaR的比较
      • 6.结语
      • 7.代码和数据集链接
      • 8.参考资料

1.引言

VaR和CVaR的计算是金融基础建设的作业,不过VaR和CVaR在风险管理课上都有讲过,难度也不大。需要注意的是CVaR就是Expected Shortfall,两个是一样的东西,只是说法不同而已。接下来我将主要展现的是代码的实现,至于原理我就不过多解释了,网上资料都有很多(后面有时间我再完善)。由于作业还没有截止,数据我也不提供了,自己去找吧,避免结果都是一样的,如果真的有需要,可以给我留言,我再考虑考虑给不给你👀

2.问题

2.1问题描述

针对①HSI index futures ② 其他任意一个Index futures ③其他任意一个Stock futures

  1. 使用参数法、蒙特卡洛法以及历史数据法计算该期货产品在95%置信度下的VaR
  2. 计算该期货产品在95%置信度下的CVaR

2.2 问题解析

VaR和CVaR是可以用来衡量金融资产的风险,包括股票和期货等等。VaR和CVaR的计算公式如下:
VaR : V a R α ( x ) = m i n { z ∈ R : P { f ( x , r ) ≤ z } ≥ 1 − α } VaR_\alpha(x)=min\{z \in R:P\{ f(x,r)\le z\}\ge 1-\alpha\} VaRα(x)=min{zR:P{f(x,r)z}1α}
CVaR : C V a R α ( x ) = E [ f ( x , r ) ∣ f ( x , r ) ≤ V a R α ( x ) ] CVaR_\alpha(x)=E[f(x,r) | f(x,r)\le VaR_\alpha(x)] CVaRα(x)=E[f(x,r)f(x,r)VaRα(x)]

CVaR能更好地测度极端风险情况,使用 CVaR 进行风险度量可以更加稳健地估计可能发生的风险。

这题要求我们计算期货商品的VaR和CVaR,关键就是拿什么数据来计算,收盘价和结算价还是保证金?先说结论:都可以。不过需要注意的是收盘价和结算价是有些不一样的,具体的可以自己百度下(后面再完善)。这里主要讲下为什么保证金也可以,因为保证金是按照收盘价的一定比例来进行计算的,所以你无论你用保证金还是收盘价结果都是一样的,不过不一样的是你用保证金来计算的时候要将保证金转换为保证金的变换来进行VaR和CVaR的计算。而且对于香港市场来说,它的保证金是按月来进行调整的,这时候你算1个月的VaR和CVaR就还可以,但想算1-day的VaR和CVaR的话就不太合适了。下面主要展示的是HSI index futures的相关计算,其他期货商品处理过程都一样,数据不一样而已,用的是结算价来进行计算。最后还想提醒下,下面计算的VaR和CVaR都是负的,但我们知道VaR和CVaR都应该为正的,所以你得加个负号将其变正。

3. 数据导入与数据预处理

先导入一些基本库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn
import math 
#设置字体为楷体
plt.rcParams['font.sans-serif'] = ['KaiTi']
%matplotlib inline

导入提前收集好的数据,包括日期和结算价(⚠️ 只需要日期和结算价就行,其他都可以不用)

#倒入恒生指数期货数据
HSIF= pd.read_excel('恒生指数期货结算价.xlsx')
HSIF.head()

数据是长这样的:
在这里插入图片描述
接下来还需要对结算价进行处理,收集到的结算价可能为0,所以需要先将其剔除,然后计算它的每日收益率,这里采用python自带的函数pct_change()便可以处理

#剔除结算价为0的数据
HSIF=HSIF[HSIF.settle!=0]
#计算恒生指数期货的每日收益率
HSIF['d_return'] = HSIF['settle'].pct_change() 

最终处理完后的数据如下所示:
在这里插入图片描述

4.VaR的计算

4.1 参数法

下面的参数法是基于分布是正态分布才是成立的,如果数据不是正态分布可能就会有问题,具体的可以看看这一篇文章:https://blog.csdn.net/hzk427/article/details/104858021

###利用参数法计算1天的VaR
HSIF_mean_return = HSIF['d_return'].mean()
HSIF_std = HSIF['d_return'].std()
HSIF_VaR1 = HSIF_mean_return-1.96*HSIF_std
HSIF_VaR1

4.2 蒙特卡洛法

⚠️ 由于下面的蒙特卡洛法是基于最后一天的结算价去生成的,所以你得确保你最后一天的结算价不能为0,否则会报错。

###利用蒙特卡洛法
# 定义一个函数,用于计算一次几何布朗运动的价格数据,single simualtion;
def GBM(s_0, mu, sigma, T ,n):"""计算几何布朗运动的价格数据parameters:s_0: 开始价格mu: 观察期日收益率的均值sigma: 观察期日收益率的标准差T: 预测价格的周期长度,如预测下一天,T=1,预测后10天,T=10;n: 单次模拟的步数,步数越大,模拟得越精确;"""# 计算delta_tdelta_t = T/n# 创建一个空的列表用于储存价格数据simulated_price = [s_0]# 模拟价格走势for i in range(n):# 获取期初价格start_price = simulated_price[i]# 按照标准正态分布产生一个随机数epsilon = np.random.normal()# 根据几何布朗运动公式计算期末价格end_price = start_price + start_price * (mu*delta_t + sigma*epsilon*np.sqrt(delta_t))# 价格应大于0#print(end_price)#end_price = max(0, end_price)# 将算的的结果存入列表simulated_price.append(end_price)return simulated_price# 产生10000个1天的模拟价格,取出它们的最终价格,并保存在simulated_prices_1空列表中
simulated_prices_HSIF = []
s_HSIF=HSIF['settle'].iloc[-1]
mu_HSIF=HSIF['d_return'].mean()
sigma_HSIF=HSIF['d_return'].std()
for i in range(10000):# 模拟一次几何布朗运动simulated_price = GBM(s_HSIF, mu_HSIF, sigma_HSIF, 1,100)#print(simulated_price)# 取出最终价格final_price = simulated_price[-1]simulated_prices_HSIF.append(final_price)simulated_return_HSIF = simulated_prices_HSIF/s_HSIF-1  
HSIF_VaR2 = np.percentile(simulated_return_HSIF, 1) 
HSIF_VaR2 

4.3 历史模拟法

### 利用历史模拟法计算VaR
# np.percentile方法计算分位数,前提是不能有空值;
HSIF_VaR3= np.percentile(HSIF.d_return.dropna(), 5)         
HSIF_VaR3

4.4 不同方法的VaR比较

#恒生指数期货的VaR绘图
plt.figure(figsize= (8,6))
HSIF.d_return.hist(bins=50, alpha=0.6, color='steelblue')
plt.axvline(HSIF_VaR1, color='y', linewidth=1,label = 'parametric method')
plt.axvline(HSIF_VaR2, color='b', linewidth=1,label = 'Monte Carlo method')
plt.axvline(HSIF_VaR3, color='r', linewidth=1,label = 'historical simulation method')plt.title("The VaR of HSIF(95%)")
plt.legend()
plt.xlabel('return')
plt.ylabel('count')

在这里插入图片描述

5.CVaR的计算

5.1 CVaR的计算

先封装好ES_daily()函数来方便后续CVaR的计算

# 开始计算 ES 值
'''
输入:a:每日收益率x:置信度
输出:ES
'''
def ES_Daily(a,x):VaR=np.percentile(a,(1-x)*100)ES=a[a<=VaR].mean()return ES
#print('99%置信水平下的ES为{:.2f}'.format(\
#ES_daily(df1.rev_rate,0.99)))

接下来就直接调用ES_daily函数即可

#计算恒生指数期货的CVaR
CVaR_HSIF=ES_Daily(HSIF.d_return.dropna(),0.95)
CVaR_HSIF

5.2 VaR和CVaR的比较

这里我就用历史模拟法计算得到的VaR来和CVaR进行比较

#用历史模拟法来对比恒生指数期货的VaR和CVaR
plt.figure(figsize= (8,6))
HSIF.d_return.hist(bins=50, alpha=0.6, color='steelblue')
plt.axvline(HSIF_VaR3, color='b', linewidth=1,label = 'VaR')
plt.axvline(CVaR_HSIF, color='r', linewidth=1,label = 'CVaR')
#plt.xlim(-0.3,0.3)
plt.title("VaR Vs CVaR(HSIF)")
plt.legend()
plt.xlabel('return')
plt.ylabel('count')

在这里插入图片描述

6.结语

严格意义上来说,我上面计算的VaR和CVaR是有一点问题的,因为VaR和CVaR算的是预期的最大损失,应该算出具体的数值,但我上面计算的VaR和CVaR都是百分比,没有乘以初始资金(乘以初始资金才是正确的),不过转念一想,如果你把初始资金当作1,也是可以说得通的,比如你有1元,算出的VaR是5%,也就是说你预期的最大损失就是1*5%=0.05,也就是5%。

至此就基本完成了所有的问题,美中不足的是matplotlib绘画的图实在是太丑了,所以我还对数据展示的图进行优化。不过这部分是收费环节了,你得帮我点个赞我才发代码给你(明示👀)
在这里插入图片描述

7.代码和数据集链接

下面附上代码和相关数据集,包括恒生指数期货、恒生国企指数期货以及腾讯控股期货
https://download.csdn.net/download/weixin_46366341/85853065

8.参考资料

代码主要参考以下文章
https://blog.csdn.net/leige_2020/article/details/104405116
https://www.pythonheidong.com/blog/article/498331/acba1f875635a1c52fd9/
https://www.lianxh.cn/news/5001362259713.html
https://blog.csdn.net/hzk427/article/details/104858021


http://chatgpt.dhexx.cn/article/Zr5HPUmF.shtml

相关文章

【FinE】正态分布和t分布下的CVaR

导航 CVaR and VaRModelnormal distributionstudent t distribution Case StudyReference CVaR and VaR CVaR(Conditional Value-at-Risk)也被称为Expected Shortfall(ES) 或者 Expected Tail Loss(ETL)&#xff0c;可以解释超过给定VaR值的期望损失&#xff0c;在很多风险分析…

条件风险价值CVaR

产生背景 &ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace; \;\;\;\;\;\; CVaR即条件风险价值&#xff0c;是由RockafeUar和Uryasev等于1997年提出的一种较VaR更优的风险计量技术&#xff0c;其含义为在投资组合的损失超过某…

VaR和CVaR举例说明_笔记转载

风险价值VaR成为金融市场风险度量的主流指标 VaR自1993年发展至今已作为金融市场风险度量的主流指标被各银行、投资公司、证券公司及金融监管机构广泛采用。VaR不仅具有概念简单&#xff0c;易于沟通和理解的优点&#xff0c; 而且为不同金融工具构成的复杂的投资组合提供了一…

两个命令行应用程序的交互——使用Java的Process类完成复杂控制台程序的自动化操作(以围棋GTP协议为例)

GitHub地址链接&#xff1a;https://github.com/zhmgczh/GTPService 这个项目其实继承并发展于我的上一个项目——用模式识别实现围棋转接器的开源Java项目——一个类似GTool2.exe的工具&#xff0c;是一个变相的补充&#xff0c;主要解决如何使用Java完成两个控制台应用程序相…

GTP(GPRS Tunnelling Protocol)协议http://blog.csdn.net/stephen_yin/article/details/6951237

GTP&#xff08;GPRS Tunnelling Protocol&#xff09;协议 标签&#xff1a; extensionheaderinternet网络wapxhtml 2011-11-09 10:15 6097人阅读 评论(0) 收藏 举报 GTP&#xff08;GPRS Tunnelling Protocol&#xff09; 协议在 GPRS 骨干网中在GSNs 之间&#xff08;…

GTP(GPRS Tunnelling Protocol)协议

GTP&#xff08;GPRS Tunnelling Protocol&#xff09; 协议在 GPRS 骨干网中在GSNs 之间&#xff08;如 SGSN 和 GGSN&#xff09;提供协议信道&#xff0c;所有的 PTP 分组数据协议的PDUs 应由GTP 协议进行封装。 GTP概述 GTP 协议应用在SGSN 和GGSN 之间&#xff0c;为各…

移动互联网新协议 GTP 中被曝多个高危漏洞,影响4G和5G 用户

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;奇安信代码卫士团队 Positive Technologies 公司上周发布报告《2020年 LTE 和5G 网络中的漏洞》指出&#xff0c;移动网络运营商 (MNOs) 使用的当代通信协议中被曝多个高危漏洞&#xff0c;可被用于…

GPRS核心网-GTP-C协议解析

GPRS隧道协议&#xff08;GTP&#xff09;是3GPP标准定义的隧道协议&#xff0c;用于在3G /4G/5G网络中承载通用分组无线服务&#xff08;GPRS&#xff09;。 GTP用于在服务网关&#xff08;S-GW&#xff09;和分组数据网络网关&#xff08;P-GW&#xff09;以及S-GW和移动性管…

网络协议 终章 - GTP 协议:复杂的移动网络

前面都是讲电脑上网的情景&#xff0c;今天我们就来认识下使用最多的移动网络上网场景。 移动网络的发展历程 你一定知道手机上网有 2G、3G、4G 的说法&#xff0c;究竟这都是什么意思呢&#xff1f;有一个通俗的说法就是&#xff1a;用 2G 看 txt&#xff0c;用 3G 看 jpg&…

gtp传输java_一种GTP数据包传输方法、相关装置及存储介质与流程

本申请实施例涉及通信领域,尤其涉及一种GTP数据包传输方法、相关装置及存储介质。 背景技术: 通用分组无线服务隧道协议(General Packet Radio Service Tunnelling Protocol,GTP)是一种用于传输分组数据的通信协议。目前,己使用的GTP协议可被分为通用分组无线服务(General …

GTP协议

GTP协议 (2010-08-27 17:20:54) 转载▼ 标签&#xff1a; 杂谈 分类&#xff1a; 计算机网络 摘要&#xff1a;本文分析GPRS的GSN之间的GTP协议&#xff0c;阐述GTP协议的含义及用法。 关键词&#xff1a;GPRS GTP 协议 一、 引言 在GPRS系统的GSN&#xff08;GPRS Support …

GTP协议格式分析

点击上方↑↑↑蓝字 [ 协议分析与还原 ] 关注我们 “ 分析GTP协议。” 本文对比较枯燥的协议资料进行学习&#xff0c;有需要可继续阅读&#xff0c;找到自己关注的知识点&#xff0c;暂时无需要可直接拉到文末表示阅读结束&#xff0c;让微信记下热爱学习的你的痕迹。 如果说T…

关于GTPv1协议解析

概述&#xff1a; ***&#xff08;简单说一下&#xff0c;不重点讲述啦&#xff09; GPRS 隧道协议 (GTP) 是一种隧道协议&#xff0c;用于 GPRS、UMTS、LTE 和 5G 网络。它分为两个独立的协议&#xff1a;GTP-C 和 GTP-U。GTP-C用于GPRS核心网络中&#xff0c;用于不同网络节…

GTP-U协议总结

1、​参考资料 3gpp TS 29.060 V17.1.0-GPRS Tunnelling Protocol (GTP) TS 29.281 V17.1.0-GPRS Tunnelling Protocol User Plane (GTPv1-U) 2、GTP协议 GTP&#xff08;GPRS隧道协议(GPRSTunnelingProtocol)&#xff09;&#xff0c;可以分解成三种独立的协议&#xff0…

【5G核心网】 GTP协议

GTP 可以提供移动性的功能。 使用 GTP&#xff0c;网络的终端能够在网络中移动位置&#xff0c;各个端点集之间可以建立多个隧道&#xff0c;从而根据业务不同可以提供不同的 Qos&#xff0c;可以隐藏 IP&#xff0c;安全性更高。 1. 定义概念 GTP-U Message: GTP-U&#xff…

GTP协议的分析

一、 引言 在GPRS系统的GSN&#xff08;GPRS Support Node&#xff0c;包括SGSN和GGSN&#xff09;之间采用GTP&#xff08;GPRS Tunnel Protocol&#xff09;协议&#xff0c;GTP在整个GPRS协议栈中起着举足轻重的作用&#xff0c;GTP协议承载在TCP或UDP协议之上&#xff0c;分…

JS JQuery添加、替换、删除元素class属性

1、先声明一个div和两个class样式&#xff0c;用来测试&#xff1a; <html><head><meta charset"utf-8"><title></title><script src"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><s…

jquery动态添加和删除class属性

在用jquery时&#xff0c;遇到一个问题&#xff0c;就是如何动态得添加和删除class的属性&#xff0c;下面是我的解决代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio…

用jQuery的.addClass()方法给元素加class

Target Elements by Class Using jQuery 你看到我们是怎么给所有的按钮做弹回效果了吗&#xff1f;我们用 $("button")来选中按钮&#xff0c;然后用.addClass("animated bounce")给按钮加CSS class。 你只需要用jQuery的.addClass()方法&#xff0c;就可…

js 关于动态添加class样式的学习

如果&#xff0c;我这里有一个需求。如下的页面代码 <body> <input type"button" value"红" id"btn1"/> <p id"p1"> 2016年圣诞前的一个星期天下午&#xff0c;我推开窗&#xff0c;加州明媚的阳光洒在街道上&…