fix: 修复因子前向填充不生效的 bug

问题根因:
- reindex(method='ffill') 不会填充已存在的 NaN 值
- 当 factor_df 中已有 NaN(境外市场放假),reindex 无法填充

修复方案:
- 改为两步操作:reindex() 然后 ffill()
- ffill() 会填充所有 NaN,包括已存在的

影响范围:
- rotation.py: positions 对齐到 A 股日历
- export_backtest_detail.py: 因子对齐到展示日历

验证结果:
- 2026-04-30 HSI: nan → 0.2388 
- 2026-05-08 HSI: nan → 0.1144 
This commit is contained in:
2026-05-25 08:53:42 +08:00
parent 2f6b031361
commit b8d433d519
2 changed files with 26 additions and 2 deletions

View File

@@ -155,12 +155,21 @@ def main():
# 将因子对齐到实际展示日历(前向填充)
# 因子已经在原始数据上计算完成,这里只是将结果对齐到展示日历
factor_df_aligned = factor_df.reindex(common_dates, method='ffill')
# 注意:必须先 reindex 再 ffill因为 reindex(method='ffill') 不会填充已有的 NaN
factor_df_aligned = factor_df.reindex(common_dates)
factor_df_aligned = factor_df_aligned.ffill()
# 调试:检查 2026-04-30 的值
if '2026-04-30' in common_dates:
hsi_val = factor_df_aligned.loc['2026-04-30', 'HSI'] if 'HSI' in factor_df_aligned.columns else 'NO COLUMN'
print(f"[DEBUG] factor_df_aligned['2026-04-30', 'HSI']: {hsi_val}")
# 检查 factor_df 中 HSI 的最后几个有效值
if 'HSI' in factor_df.columns:
hsi_last_valid = factor_df['HSI'].dropna()
if len(hsi_last_valid) > 0:
print(f"[DEBUG] factor_df['HSI'] 最后3个有效值:")
print(hsi_last_valid.tail(3))
# 持仓状态跟踪
holdings_state = {} # {code: {'entry_date': str, 'entry_price': float}}