前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python风险价值计算投资组合VaR、期望损失ES

Python风险价值计算投资组合VaR、期望损失ES

作者头像
拓端
发布于 2022-03-05 03:17:34
发布于 2022-03-05 03:17:34
1.2K00
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:0
代码可运行

原文链接:http://tecdat.cn/?p=22788

Python计算获得多资产投资组合的风险度量。

关键概念

  1. 随着价格的变动,投资经理所持有的市场价值也会发生变化。后者就是所谓的市场风险,衡量它的最流行的方法之一是定义为风险价值。风险本身被看作是实际收益和期望收益之间的差异,两者可能不同。如果它们相等,投资被认为是无风险的。同时,它不能有违约风险,也不能有再投资风险。请注意,期望收益不是投资者认为他们将获得的收益,而是反映了所有经济情况下所有可能结果的平均值。
  2. 风险价值(VaR)告诉你在一个给定的时间段内,在预先确定的置信水平下,你能损失多少钱。典型的置信度是95%和99%,意味着分析师有95%或99%的信心,损失不会超过这个数字,即5%(或1%)的VaR反映了5%(或1%)最坏情况下的未来最佳收益率。风险值是一个最先进的衡量标准,因为它可以为所有类型的资产进行计算,并考虑到多样化的因素。然而,风险值并不是一个最大的损失数字,所以分析师可能会遇到大于风险值的损失。
  3. 关于历史序列的假设:
  • 过去的收益率是未来收益率的预测指标,但不能保证历史记录会显示未来最坏和最好的情况,但我们用几何平均法将价格转化为收益,所以我们对所有不同的周/月/...收益给予同等的权重,来获得T年内投资收益的复合最终价值。
  • 如果资产价格中的期望收益是合理的,那么实际收益率应该围绕这些预期呈正态分布。当收益率可以很好地接近于正态分布时,投资管理就变得更加容易操作了。

定义证明

收益的计算(PT为最终价格,P0为初始价格和股息收益率)。

将价格动态转换为收益(2),用几何时间序列(4)计算期望收益(3),而不是算术平均(收益率的波动越大,算术平均和几何平均之间的差异越大)。

正态分布,以波动率作为风险的衡量标准,即投资的已实现收益的加权平均值的方差的平方根(σ^2),权重等于每种情况的概率ps(6)。

最后,正如 "投资"(Bodie, Kane, Marcus)中所说,VaR是指在给定的时间范围内,收益分布的左尾概率α和右尾概率1-α累积的最小损失额。

在方差-协方差方法中,我们使用的是参数方法,假设收益是正态分布。因此,我们只需要计算两个参数,即给定收益的平均值和SD(即标准差)。

后者对Excel的计算很有用,我们用Average函数计算收益的平均值,然后STDEV将帮助我们计算标准偏差,最后得出NORMINV将达到VaR计算的目标,VaR(95)和VaR(99)的概率分别为0.05和0.01。

单资产组合VaR

在Python中,单资产组合VaR计算没有那么复杂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#VaR计算在Python中的应用 

#准备工作(每个库都要用 "pip install \*libraryname\*"来预安装
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


#从雅虎财经下载谷歌数据到定义的时间段内
yf.download('GOOG', '2010-01-01', '2019-01-31')

#收益率的计算 
df\['return'\] = Close.pct_change()


#VaR计算 
VaR\_90 = norm.ppf(1-0.9, mean, std\_dev)


print('VaR 90%置信度: ', VaR_90)

最终输出将是这样的:

雅虎是一个获得免费金融数据的好方法,另一个途径是Quandl的API库。

为了保持代码结构的连续性,我在下面介绍一个资产类别的样本,以及一个多资产的投资组合结构,其中包括VaR计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#准备工作 
import numpy as np
import pandas as pd
#从Quandl API导入银行数据(.4表示收盘价)。
ticker = "WIKI/BAC.4"
quandl.get(ticker, 
    
#以升序方式呈现数据
sorted( percentage\["Close"\])


print ("99.99%的实际损失不会超过" ,percentile(order_percentage, .01) * 100)

输出以及VaR计算。

多资产投资组合VaR

对于 多资产类别投资组合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#将数据集扩展到5种不同的资产,将它们组合成一个具有替代风险的投资组合。
\[ "WIKI/NKE.4", "WIKI/NFLX.4", "WIKI/AMZN.4"\]



#收益率的计算
df.pct_change()

#不同的风险敞口进入投资组合
percentage * exposures
ptf\_percentage = value\_ptf\['投资组合的价值'\] 。
np.percentile(ptf_percentage, .01)

print ("99.99%的实际损失不会超过:" round(VaR, 2)

print ("预计损失将超过" + (ptf\_percentage)) + "超过" ptf\_percentage)) + "天数")

期望损失(Expected Shortfall)

接下来我们讨论另一个基本指标的重要性:期望损失(Expected Shortfall)。

在搜索VaR相关文献时,你会发现有很多关于VaR作为市场风险衡量标准的批评意见。你不可避免地看到期望损失(ES)被提出来作为一种替代。 这两者之间有什么区别呢?

假设我们在99%的置信水平下评估我们的VaR(或者简单地说,潜在的损失),我们将有一系列的损失结果在1%的尾部,

VaR回答了问题:在1%的尾部,整个结果范围内的最小损失是多少? ES回答了问题:在1%的尾部,整个结果范围内的平均损失是多少?

首先,VaR。

VaR

如果X是h天的收益,那么

,其中

。例如,对于h=10天的收益,

,我们可以从正态分布中计算出99%的风险值,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
h = 10. # 为10天
mu_h = 0.1 # 这是10天内收益率的平均值 - 10%。
sig = 0.3 # 这是一年内收益率的波动 - 30%。

VaR\_n = normppf(1-alpha)*sig\_h - mu_h

以上是参数化的VaR,这意味着我们假设有一定的收益分布。在使用VaR时,通常会使用经验性的VaR,它不假设任何分布形状。在这些情况下,获得VaR只是一个简单的问题,即获得必要的百分数。

条件VaR/期望损失EXPECTED SHORTFALL

考虑到VaR,我们可以通过以下方式定义条件VaR,或CVaR或期望损失。

对这一点的解释很简单。基本上,它是X的期望值(平均值)。

如果我们再假设一个正态分布,我们可以应用以下公式

其中

是正态分布,

是标准正态分布的

四分位数。

接下来是ES。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 与上述参数相同
alpha**-1 * norm.pdf(norm.ppf(alpha))*sig\_h - mu\_h

我们不一定要假设正态分布。

上述假设为正态分布,但我们也可以应用学生-T分布。得到等价公式的推导涉及到了这个问题。然而,我们可以通过以下公式计算学生-T分布下的等效风险值

我们也可以假设一个T分布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nu = 5 # 自由度,越大,越接近于正态分布
print("99% CVaR ", (CVaR_t*100,2)

自由度越大,越接近于正态分布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 验证正态分布和Student-t VaR是一样的
nu = 10000000 # 自由度,越大,越接近于正态分布

print("99% VaR", round(VaR_t*100,2))

我们可以用实际的市场数据计算出类似的结果。首先,将数据拟合为正态分布和t分布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mu\_norm, sig\_norm = norm.fit(returns

而各自的VaR和ES可以很容易地计算出来。

绘制具有不同自由度的VaR和CVaR图表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.plot(d\[0\], d\[1\]*100
plt.plot(np.arange(5, 100), VaR_n\*np.ones(95)\*100
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
VaR\_n = norm.ppf(1-alpha)*sig\_norm -munorm

可以很好地了解VaR和ES之间区别的图表如下。

Python确实是一个强大的工具,用于计算和数据可视化。它允许你导入几个不同的预包装库,大大降低了其他代码(如C++)的复杂性。


本文摘选《Python风险价值计算投资组合VaR(Value at Risk )、期望损失ES(Expected Shortfall)》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Opentsdb安装部署(单机版)
opentsdb是基于Hbase的时序数据库[时间序列数据库]。不具备通用性,主要针对具有时间特性和需求的数据,如监控数据、温度变化数据等。opentsdb说是数据库,但并不能称作为数据库,他是在Hbase(HBase才是具有存储功能的)的基础上,进行数据结构的优化和处理,从而适合存储具有时间特性的数据,同时提供特定的工具进行查询等操作。
子润先生
2021/07/09
1.5K0
时序列数据库武斗大会之 OpenTSDB 篇
刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融、通信以及Android手机操作系的开发,熟悉Linux及后台开发技术。曾参与翻译过《第一本Docker书》、《GitHub入门与实践》、《Web应用安全权威指南》、《WEB+DB PRESS》、《Software Design》等书籍,也是Docker入门与实践课程主讲人。本文所阐述的「时间序列数据库」,系笔者所负责产品 Cloud Insight 对性能指标进行聚合、分组、过滤过程中的梳理和总结。 在前面的《时序列数据库武斗大会之
CSDN技术头条
2018/02/12
1.3K0
时序列数据库武斗大会之 OpenTSDB 篇
OpenTSDB 数据存储详解
随着互联网、尤其是物联网的发展,我们需要把各种类型的终端实时监测、检查与分析设备所采集、产生的数据记录下来,在有时间的坐标中将这些数据连点成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。
2020labs小助手
2020/07/16
1.7K0
hbase+opentsdb 单机版搭建
cd /root/ tar xf zookeeper-3.4.8.tar.gz -C ./ mv zookeeper-3.4.8 /opt/zk
保持热爱奔赴山海
2019/09/18
1.7K1
hbase+opentsdb 单机版搭建
OpenTSDB实现原理与安装
特别适合用来做监控类别的数据存储,它的底层是基于HBase,是一种以Metirc为单元的存储结果,可以实现大数据量下的毫秒级别的查询
用户5252199
2022/04/18
8810
OpenTSDB实现原理与安装
源码图库-一文搞定janusgraph图数据库的本地源码编译(source code compile)
源码分析 的第一步就是要先编译好源代码,才能进行debug跟踪流程查看,本文总结了janusgraph源码编译的全流程!
洋仔聊编程
2020/06/12
1.1K0
源码图库-一文搞定janusgraph图数据库的本地源码编译(source code compile)
Hadoop 2.2.0和HBase-0.98 安装snappy
关于上面的依赖包,如果在Ubuntu下,使用sudo apt-get install * 命令安装,如果在CentOS下,使用sudo yum install *命令来安装。
星哥玩云
2022/07/03
1.3K0
OpenTSDB简介
OpenTSDB(Open time series data base),开发时间序列数据库。DB这个词很有误导性,其实并不是一个db,单独一个OpenTSDB无法存储任何数据,它只是一层数据读写的服务,更准确的说它只是建立在Hbase上的一层数据读写服务。行业内各种db都很多了,为什么还会出现它?它到底有什么好?它做了什么?别着急,我们来一一分析下。   其实OpenTSDB不是一个通用的数据存储服务,看名字就知道,它主要针对于时序数据。什么是时序数据,股票的变化趋势、温度的变化趋势、系统某个指标的变化趋势……其实都是时序数据,就是每个时间点上纪录一条数据。 关于数据的存储,我们最熟悉的就是mysql了,但是想想看,每5分钟存储一个点,一天288个点,一年就10万+,这还是单个维度,往往在实际应用中维度会非常多,比如股票交易所,成千上万支股票,每天所有股票数据就可能超过百万条,如果还得支持历史数据查询,mysql是远远扛不住的,必然要考虑分布式存储,最好的选择就是Hbase了,事实上业内基本上也是这么做的。(我对其他分布式存储不了解,就不对比了)。   了解Hbase的人都知道,它可以通过加机器的水平扩展迅速增加读写能力,非常适合存储海量的数据,但是它并不是关系数据库,无法进行类似mysql那种select、join等操作。 取而代之的只有非常简单的Get和Scan两种数据查询方式。这里不讨论Hbase的相关细节,总之,你可以通过Get获取到hbase里的一行数据,通过Scan来查询其中RowKey在某个范围里的一批数据。如此简单的查询方式虽然让hbase变得简单易用, 但也限制了它的使用场景。针对时序数据,只有get和scan远远满足不了你的需求。   这个时候OpenTSDB就应运而生。 首先它做了数据存储的优化,可以大幅度提升数据查询的效率和减少存储空间的使用。其次它基于hbase做了常用时序数据查询的API,比如数据的聚合、过滤等。另外它也针对数据热度倾斜做了优化。接下来挨个说下它分别是怎么做的。
xindoo
2021/01/21
2.5K0
Alex 的 Hadoop 菜鸟教程: 第21课 不只是在HBase中用SQL:Phoenix
Phoenix的团队用了一句话概括Phoenix:”We put the SQL back in NoSQL” 意思是:我们把SQL又放回NoSQL去了!这边说的NoSQL专指HBase,意思是可以用SQL语句来查询Hbase,你可能会说:“Hive和Impala也可以啊!”。但是Hive和Impala还可以查询文本文件,Phoenix的特点就是,它只能查Hbase,别的类型都不支持!但是也因为这种专一的态度,让Phoenix在Hbase上查询的性能超过了Hive和Impala!
全栈程序员站长
2022/08/11
8240
Alex 的 Hadoop 菜鸟教程: 第21课 不只是在HBase中用SQL:Phoenix
杨校老师课堂之分布式数据库HBase的部署和基本操作
(1) 安装JDK、Hadoop,这里采用的JDK1.8,Hadoop2.7.4,CentOS7.6
杨校
2022/05/11
3380
杨校老师课堂之分布式数据库HBase的部署和基本操作
图解图库JanusGraph系列-janusgraph图数据库的本地源码编译教程(janusgraph source code compile)
源码分析 的第一步就是要先编译好源代码,才能进行debug跟踪流程查看,本文总结了janusgraph源码编译的全流程!
洋仔聊编程
2022/05/11
5910
图解图库JanusGraph系列-janusgraph图数据库的本地源码编译教程(janusgraph source code compile)
HBase跨版本数据迁移总结
某客户大数据测试场景为:Solr类似画像的数据查出用户标签——通过这些标签在HBase查询详细信息。以上测试功能以及性能。 其中HBase的数据量为500G,Solr约5T。数据均需要从对方的集群人工
王亮
2016/09/30
2.9K6
HBase 分布式数据库
在5、6年前,我们就希望能用分布式存储和分布式数据库来替代集中存储,觉得分布式廉价,而且高可靠。
birdskyws
2018/09/12
2.3K0
HBase 分布式数据库
pinpoint 修改hbase表TTL值
缘起 Pinpoint接入业务监控后数据量大涨,平均每天Hbase数据增量20G左右,数据量太大,需要对数据进行定期清理,否则监控可用性降低,由于之前环境是由docker-compose部署,查到hbase可以修改表的ttl来清理数据,目前进入pinpoint-hbase容器操作,如果能在hbase表格生成时就修改ttl效果会更佳,该方法需要熟悉docker-compose里面pinpoint-web及pinpoint-hbase部署方法,后期跟进
三杯水Plus
2019/05/13
2.3K0
DockerSwarm 微服务部署
之前《服务Docker化》中,使用 docker-compose.yml 来一次配置启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。
程序员果果
2019/05/28
5290
15分钟熟悉HBase Shell命令
下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', '列名称1','列名称2','列名称N' 添加记录       put '表名称', '行名称', '列名称:', '值' 查看记录 get '表名称', '行名称' 查看表中的记录总数 count  '表名称' 删除记录 delete  '表名' ,'行
汤高
2018/01/11
2.7K0
使用Maven Archetype创建Java项目模板
简而言之,Archetype是一个Maven项目模板工具包。原型被定义为一种原始的模式或模型,所有其他同类的东西都是从中产生的。当我们试图提供一个提供生成Maven项目的一致方法的系统时,这个名字就合适了。Archetype将帮助作者为用户创建Maven项目模板,并为用户提供生成这些项目模板的参数化版本的方法。
东溪陈姓少年
2020/08/06
1.3K0
hbase 单机安装部署
这个困扰了很长时间,之前使用cdh版本的,各种报错各种出问题,最终换成了不是cdh版本的。
全栈程序员站长
2022/08/09
6720
hbase 单机安装部署
从零开始用好 Maven : 从 Hello World 到日常使用
Apache Maven 是一个软件项目管理工具。基于项目对象模型(POM)的理念,通过一段核心描述信息来管理项目构建、报告和文档信息。
用户1257393
2018/12/28
9320
Hbase入门(二)——安装与配置
本文讲述如何安装,部署,启停HBase集群,如何通过命令行对Hbase进行基本操作。
大数据流动
2019/09/30
1.8K0
Hbase入门(二)——安装与配置
相关推荐
Opentsdb安装部署(单机版)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 原文链接:http://tecdat.cn/?p=22788
  • 关键概念
  • 定义证明
  • 单资产组合VaR
  • 多资产投资组合VaR
  • 期望损失(Expected Shortfall)
  • VaR
  • 条件VaR/期望损失EXPECTED SHORTFALL
    • 绘制具有不同自由度的VaR和CVaR图表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档