Python使用历史数据模拟法计算投资组合VaR(数据来源为Tushare)

2023-11-12

Python如何使用历史数据模拟法计算投资组合VaR?(数据来源为Tushare)

本文数据可以点赞关注私信我获取!

VaR(Value at Risk)是一种常用的风险管理指标,用于衡量投资组合在特定时间内的最大可能损失。历史数据模拟法是一种计算VaR的方法,本文将介绍如何使用Tushare数据库获取“中国工商银行”和“兴业银行”2022年10月1日至2023年3月31日期间每个交易日的收盘价格数据,假设两个股票的投资额分别是3/4和1/4,如果目前两种股票的市值共计50万元人民币,置信度为99%,利用历史数据模拟法计算该投资组合持有期为5天的VaR。

步骤1:获取数据

首先,需要获取股票数据。我们以中国工商银行和兴业银行为例,获取它们在2022年10月1日至2023年3月31日期间每个交易日的收盘价格数据。代码如下:

import pandas as pd
import numpy as np
import tushare as ts
from scipy.stats import norm

# Tushare设置
pro = ts.pro_api('你的token') #你的token

start_date = '20221001' #起始日期
end_date = '20230331' #结束日期

code_list = ['601398.SH','601166.SH'] #你需要的股票代码,上海的是.SH,深圳的是.SZ

for i in code_list: #遍历list
    df = pro.daily(ts_code=i, start_date=start_date, end_date=end_date) #tushare获取股票日度信息
    df = df[['ts_code','trade_date','close']]  #只保留需要的数据
    df.to_csv(f'{i}.csv',encoding='gbk')  #导出为csv文件

以上代码中,我们使用了Tushare获取股票数据,并将数据导出为csv文件。

步骤2:处理数据

获取数据后,需要对数据进行处理。首先,我们需要将数据框中的日期列转换为日期格式,并将数据框中的收盘价列转换为浮点数。代码如下:

# 读取数据文件
df1 = pd.read_csv('601398.SH.csv')  #工商银行
df2 = pd.read_csv('601166.SH.csv')  #兴业银行

# 合并数据框
df = pd.concat([df1, df2])

# 将数据框中的日期列转换为日期格式
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')

# 将数据框中的收盘价列转换为浮点数
df['close'] = df['close'].astype(float)

# 重新索引数据框
df = df.set_index('trade_date')

然后,我们需要计算每个股票的收益率,并将两个股票的收益率组合成投资组合的收益率。最后,计算投资组合的每日价值和每日收益率。代码如下:

# 计算每个股票的收益率
returns1 = df.loc[df['ts_code'] == '601398.SH', 'close'].pct_change()
returns2 = df.loc[df['ts_code'] == '601166.SH', 'close'].pct_change()

# 将两个股票的收益率组合成投资组合的收益率
returns = 0.75 * returns1 + 0.25 * returns2

# 计算投资组合的每日价值
initial_value = 500000 # 初始投资组合价值 
values = (returns + 1).cumprod() * initial_value

# 计算投资组合的每日收益率
portfolio_returns = values.pct_change()

# 计算投资组合的总价值
portfolio_value = values[-1]
步骤3:计算VaR

计算VaR需要确定置信度和持有期。本文中,我们使用置信度为99%、持有期为5天的参数。然后,我们需要计算标准正态分布的alpha分位数和投资组合每日收益率的标准差。最后,根据历史数据模拟法的公式计算投资组合VaR。代码如下:

#使用历史数据模拟法计算VaR
confidence_level = 0.99 # 置信度
holding_period = 5 # 持有期,单位为天数
alpha = norm.ppf(1 - confidence_level) # 标准正态分布的alpha分位数
daily_volatility = portfolio_returns.std() # 投资组合每日收益率的标准差
VaR = portfolio_value * daily_volatility * alpha * np.sqrt(holding_period / 252)
print(f'置信度99%VaR为:{VaR:.2f} RMB')

最后,运行以上代码即可得到投资组合VaR的结果。

完整代码:

import pandas as pd
import numpy as np
import tushare as ts
from scipy.stats import norm

# Tushare设置
pro = ts.pro_api('你的token') #你的token

start_date = '20221001' #起始日期
end_date = '20230331' #结束日期

code_list = ['601398.SH','601166.SH'] #你需要的股票代码,上海的是.SH,深圳的是.SZ

for i in code_list: #遍历list
    df = pro.daily(ts_code=i, start_date=start_date, end_date=end_date) #tushare获取股票日度信息
    df = df[['ts_code','trade_date','close']]  #只保留需要的数据
    df.to_csv(f'{i}.csv',encoding='gbk')  #导出为csv文件

# 读取数据文件
df1 = pd.read_csv('601398.SH.csv')  #工商银行
df2 = pd.read_csv('601166.SH.csv')  #兴业银行

# 合并数据框
df = pd.concat([df1, df2])

# 将数据框中的日期列转换为日期格式
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')

# 将数据框中的收盘价列转换为浮点数
df['close'] = df['close'].astype(float)

# 重新索引数据框
df = df.set_index('trade_date')

# 计算每个股票的收益率
returns1 = df.loc[df['ts_code'] == '601398.SH', 'close'].pct_change()
returns2 = df.loc[df['ts_code'] == '601166.SH', 'close'].pct_change()

# 将两个股票的收益率组合成投资组合的收益率
returns = 0.75 * returns1 + 0.25 * returns2

# 计算投资组合的每日价值
initial_value = 500000  # 初始投资组合价值
values = (returns + 1).cumprod() * initial_value

# 计算投资组合的每日收益率
portfolio_returns = values.pct_change()

# 计算投资组合的总价值
portfolio_value = values[-1]

# 使用历史数据模拟法计算VaR
confidence_level = 0.99  # 置信度
holding_period = 5  # 持有期,单位为天数
alpha = norm.ppf(1 - confidence_level)  # 标准正态分布的alpha分位数
daily_volatility = portfolio_returns.std()  # 投资组合每日收益率的标准差
VaR = portfolio_value * daily_volatility * alpha * np.sqrt(holding_period / 252)
print(f'置信度99%VaR为:{VaR:.2f} RMB')

本文介绍了如何使用历史数据模拟法计算投资组合VaR,并以代码示例的形式进行了详细说明。但是VaR存在一些局限性,例如无法考虑极端事件的影响等。因此,在实际应用中,需要结合其他方法来进行风险管理和控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python使用历史数据模拟法计算投资组合VaR(数据来源为Tushare) 的相关文章

  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • javaWeb基础二:Servlet(java前后端交互的技术)

    2 Servlet 2 1 定义 Servlet是sun公司提供的一门用于开发动态web资源的技术 可以实现和客户端的交互 接收客户端请求和给客户端返回响应 Sun公司在其API中提供了一个servlet接口 用户若想开发一个动态web资源
  • 获取id_rsa.pub和id_rsa.pub的作用

    SSH SSH为Secure Shell的缩写 由IETF的网络小组 Network Working Group 所制定 SSH为建立在应用层基础上的安全协议 SSH是目前较可靠 专为远程登录会话和其他网络服务提供安全性的协议 利用SSH协
  • Ubuntu 20.04 搭建NFS server

    文章目录 一 测试环境 二 安装 NFS server 一 测试环境 Ubuntu 20 04 64位 二 安装 NFS server 执行以下命令 sudo apt get install nfs kernel server 出现报错 从
  • C Primer Plus 第一章编程练习

    第一章 1 13编程练习 题 目 你刚被MacroMuscle有限公司聘用 该公司准备进入欧洲市场 需要一个把英尺单位转换为厘米单位 1英寸 2 54厘米 的 程序 该程序要提醒用户输入英寸值 你的任务是定义程序 目标和设计程序 编程过程的
  • 杂项(每天看到的感兴趣的)

    Tomcat最大承受的并发数 Tomcat的最大并发数取决于多个因素 包括硬件资源 如CPU 内存等 网络带宽 应用程序性能以及Tomcat本身的配置 在默认情况下 Tomcat可以处理的最大并发连接数为200 然而 在实际生产环境中 这个
  • 华为OD机试(JAVA)真题 -- 输出最大差

    import java util Arrays import java util Scanner 判断一组不等式是否满足约束并输出最大差 给定一组不等式 判断是否成立并输出不等式的最大差 输出浮点数的整数部分 要求 1 不等式系数为doub
  • Python简单制作GUI界面

    不管你是 Mac OS 系统 还是 Windows 系统 它都可以生成相对应的操作界面 这就是所谓的跨平台 其原理就是我们使用 Python代码去调用 Tkinter Tkinter 已经封装了访问TK的接口 这个接口是一个图形库 支持多跨
  • vscode写PHP代码双击无法复制变量$ 解决方法

    第一步 文件 gt 首选项 gt 设置 第二步 设置里面搜索 word separators 然后用此处的正则替换红框处的正则配置 lt gt
  • 实训三:文件系统命令及vi编辑

    实训三 文件系统命令及vi编辑 2017年 11 月 1 日 今日公布 vim 编辑又三种模型 一般模式 命令模式 编辑模式 练习1 Linux文件系统管理命令 分别用下列命令创建两个用户 useradd 用户名 创建一个用户 passwd
  • 毕业设计 基于Arduino工业温度计

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • 第十四届蓝桥杯校内模拟赛(第二期)题解分享

    文章目录 填空题 最小数 数天数 非常特殊的数 最大值路径 拆分质数个数 编程题 文件拷贝 去除重复单词 变成回文字符串 找X图案 交换的代价 本篇文章中的题解是我在比赛中的思路或者所写的代码 总结出的一篇相对来说比较清晰的个人题解 希望要
  • python抓网页数据(python爬取网站数据)

    标题 Python神器 抓取网页数据轻松搞定 Python语言作为一种强大的编程工具 不仅在数据分析 人工智能等领域大放异彩 而且在网络爬虫方面也有着出色的表现 利用Python抓取网页数据已成为许多程序员和研究人员的首选方法 下面就让我们
  • 几种常见的HTML分割线

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 一 基础代码 1 hr 2 hr align cent
  • git使用之上传项目文件到本地仓库

    git使用方式 一 初始化基本信息 1 设置用户名 git config global user name 用户名 例如 git config global user name gumeimen 2 设置邮箱 git config glob
  • c++模板实参推断

    模板实参推断 类型转换与模板类型参数 template
  • this 和 super的区别

    1 this的用法 this 关键字 1 作用范围 本类 不是实例化的对象 而是正在写的对象 2 作用效果 1 表示当前对象 简单来说就是来区分哪个是形参那个是成员变量 例 public void show String name this
  • 制作一份简单的网络地图(世博地图的配准和切割)

    其实我很早的时候就写过一篇 我的 2010世博地图1 0版发布 但没有和大家做明确的说明和制作方法 今天就和大家一起来分享地图配准和地图切割并进行网络发布的问题 其实就是以世博为例制作一份简单的网络地图 网络地图是以Google Maps
  • postgresql日期时间范围查询:一年前到现在日期时间范围

    获取当前时间方式 1 获取当前日期时间 SELECT CURRENT TIMESTAMP 2019 09 02 11 27 37 282 08 2 获取当前时间 SELECT CURRENT TIME 11 28 39 636 08 3 获
  • 【Unity 3D】学习笔记 - 粒子系统初探

    Particle System是Unity内用于制作特效的系统 相对比较复杂 粒子系统可以用来制作烟雾 蒸汽 火焰和其他雾化效果 添加粒子系统 GameObject gt Effect gt Particle System 添加一个粒子系统
  • Python使用历史数据模拟法计算投资组合VaR(数据来源为Tushare)

    Python如何使用历史数据模拟法计算投资组合VaR 数据来源为Tushare 本文数据可以点赞关注私信我获取 VaR Value at Risk 是一种常用的风险管理指标 用于衡量投资组合在特定时间内的最大可能损失 历史数据模拟法是一种计