有一个dataframe,是5个资产的每日收盘价,用python写一个策略,每季度末调仓,用风险平价模型计算权重,其中协方差矩阵用该季度末调仓日前一年的收益率序列计算
时间: 2024-03-05 21:49:00 浏览: 21
好的,下面是一个简单的示例代码,供您参考:
```python
import pandas as pd
import numpy as np
import datetime as dt
from pypfopt import risk_models
from pypfopt import expected_returns
from pypfopt import EfficientRiskParity
from pypfopt import DiscreteAllocation
# 读取数据
df = pd.read_csv('data.csv', index_col=0, parse_dates=True)
# 计算日收益率
returns = df.pct_change()
# 获取每个季度最后一天的日期
quarters = returns.resample('Q').last().index
# 定义调仓日为每个季度的最后一天
rebalance_dates = [quarter + pd.offsets.QuarterEnd() for quarter in quarters]
# 初始化权重矩阵
weights = pd.DataFrame(columns=returns.columns, index=rebalance_dates)
# 计算每个调仓日前一年的收益率序列,并用它计算协方差矩阵
for i, date in enumerate(rebalance_dates):
if i == 0:
continue # 第一个调仓日无法计算前一年收益率序列
start_date = rebalance_dates[i-1] - pd.DateOffset(years=1)
end_date = rebalance_dates[i-1]
returns_slice = returns[start_date:end_date]
cov_matrix = risk_models.sample_cov(returns_slice) # 计算协方差矩阵
# 使用风险平价模型计算权重
er = expected_returns.ema_historical_return(returns_slice)
ef = EfficientRiskParity(cov_matrix, er)
weights.loc[date] = ef.clean_weights()
# 最后一个调仓日的权重使用该日的收益率序列计算
cov_matrix = risk_models.sample_cov(returns[rebalance_dates[-1]-pd.DateOffset(years=1):rebalance_dates[-1]])
er = expected_returns.ema_historical_return(returns[rebalance_dates[-1]-pd.DateOffset(years=1):rebalance_dates[-1]])
ef = EfficientRiskParity(cov_matrix, er)
weights.loc[returns.index[-1]] = ef.clean_weights()
# 输出权重矩阵
print(weights)
# 计算每个资产的持仓数量
latest_prices = df.iloc[-1] # 获取最新收盘价
da = DiscreteAllocation(weights.iloc[-1], latest_prices, total_portfolio_value=100000)
allocation, leftover_cash = da.lp_portfolio()
print("Discrete allocation:", allocation)
print("Funds remaining: ${:.2f}".format(leftover_cash))
```
注:上述代码中,假设投资组合总价值为100,000美元。如果您的实际情况不同,请自行修改`total_portfolio_value`参数。