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