fix: 修复因子前向填充不生效的 bug(清理调试代码)

问题根因:
- pandas reindex(method='ffill') 只填充新增行的 NaN,不填充已存在的 NaN
- 当 factor_df 中已有境外市场放假日期的 NaN 值时,reindex 无法填充

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

验证结果:
- 2026-04-30 HSI: None → 0.2388 
- 2026-04-30 GDAXI: None → 0.5647 
- 2026-05-08 HSI: None → 0.1144 
This commit is contained in:
2026-05-25 19:16:14 +08:00
parent b8d433d519
commit a62cfb4cd5
2 changed files with 0 additions and 31 deletions

View File

@@ -143,14 +143,8 @@ def main():
# 因子数据DataFrame 格式)
factor_df = pd.DataFrame(factors)
# 调试输出
print(f"[DEBUG] factor_df 索引类型: {type(factor_df.index)}")
print(f"[DEBUG] factor_df 索引是否为 DatetimeIndex: {isinstance(factor_df.index, pd.DatetimeIndex)}")
print(f"[DEBUG] factor_df 索引示例: {factor_df.index[:3]}")
# 确保索引是 DatetimeIndex
if not isinstance(factor_df.index, pd.DatetimeIndex):
print("[DEBUG] 转换索引为 DatetimeIndex...")
factor_df.index = pd.to_datetime(factor_df.index)
# 将因子对齐到实际展示日历(前向填充)
@@ -159,18 +153,6 @@ def main():
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}}
prev_holdings = set()

View File

@@ -177,19 +177,6 @@ class GlobalRotationStrategy(StrategyBase):
# 对齐所有因子的日期
factor_df = pd.DataFrame(factors)
# 调试输出
print(f"\n [DEBUG] generate_signals - factor_df 信息:")
print(f" 索引类型: {type(factor_df.index)}")
print(f" 总行数: {len(factor_df)}")
print(f" 日期范围: {factor_df.index[0]} ~ {factor_df.index[-1]}")
# 检查 HSI 的有效数据
if 'HSI' in factor_df.columns:
hsi_valid = factor_df['HSI'].dropna()
print(f" HSI 有效数据: {len(hsi_valid)}")
print(f" HSI 最后3个有效值:")
print(f" {hsi_valid.tail(3).to_dict()}")
# 获取动态短债阈值(如果使用)
bond_threshold = None
if self.use_dynamic_threshold and self.bond_code and self.bond_code in factors: