跳到主内容
研究主线因子策略、对冲与尾部风险 · 第37–42讲2/6 · 配套练习模块导览 →
练习

第38讲:案例·多空策略算法 (Example: Long-Short Equity Algorithm) · 练习

计算并对齐横截面因子与未来收益,构造多空权重和换手成本,再核对净敞口与净收益。

← 返回父案例
完成状态保存在当前浏览器,可随时取消。

一、因子计算与数据对齐#

问题背景

在计算月度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-312023-04-28的持仓数据,编写收益计算函数:

  1. 计算旧头寸在持有期间的收益

  2. 计算平仓旧头寸产生的交易成本

  3. 计算新头寸建仓时的交易成本

  4. 综合计算净收益

输入数据示例

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}
}

完成练习后,自评一次

建议先独立作答,再展开参考答案进行核对。