一、因子计算与数据对齐#
问题背景
在计算月度P/B比率时,直接使用最新财务报表数据会导致未来数据偏差。已知上市公司季报在当季结束后第30天公布(例如Q1数据在4月30日公布),需在回测中严格避免数据窥探。
任务要求
修改以下代码,使每月调仓时使用的账面价值为当时可获取的最新季报数据。假设当前调仓日期为2020-05-31,此时可用数据应为4月30日公布的Q1数据;当调仓日为2020-08-31时,应使用7月31日公布的Q2数据。
依赖代码
code
# 原始问题代码
pb_ratios = {}
for t in tickers:
stock = yf.Ticker(t)
# 获取全部历史资产负债表
balance_sheets = stock.balance_sheet.T # 转置为时间索引在行的格式
# 示例数据时间索引:['2023-03-31','2022-12-31','2022-09-30',...]
# 价格数据索引示例
price_dates = pd.date_range('2020-01-01','2023-05-01',freq='D')二、交易成本与收益计算#
问题场景
策略每月产生调仓信号后,需计算扣除交易成本的实际收益。已知:
-
买入端成本:0.03%(佣金) + 0.1%(滑点)
-
卖出端成本:0.03%(佣金) + 0.1%(滑点)
-
多空头寸采用等权重分配
-
每次调仓时需平掉上期头寸并建新仓
计算要求
给定两个连续调仓日2023-03-31和2023-04-28的持仓数据,编写收益计算函数:
-
计算旧头寸在持有期间的收益
-
计算平仓旧头寸产生的交易成本
-
计算新头寸建仓时的交易成本
-
综合计算净收益
输入数据示例
code
# 持仓记录
prev_holdings = {
'long': ['MSFT','AAPL'],
'short': ['TSLA','NVDA'],
'capital': 1_000_000 # 期初本金
}
current_prices = {
'2023-03-31': {'MSFT':250, 'AAPL':160, 'TSLA':200, 'NVDA':300},
'2023-04-28': {'MSFT':270, 'AAPL':155, 'TSLA':210, 'NVDA':280}
}