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

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存在一些局限性,例如无法考虑极端事件的影响等。因此,在实际应用中,需要结合其他方法来进行风险管理和控制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strangequark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值