b8d433d519
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 ✅
2026-05-25 08:53:42 +08:00
2f6b031361
feat: 添加因子对齐调试输出
...
- 检查 factor_df 索引类型
- 检查 reindex 后 2026-04-30 的 HSI 动量值
- 待进一步分析为何 ffill 未生效
2026-05-25 02:45:27 +08:00
0ef0623538
fix: 导出脚本因子前向填充对齐到展示日历
...
- 先定义 common_dates = equity_curve.index
- 再执行 factor_df.reindex(common_dates, method='ffill')
- 修复境外市场放假时动量显示为 None 的问题
2026-05-25 02:30:58 +08:00
959a863b5e
fix: 导出脚本因子对齐到A股日历
...
- 因子在原始数据上计算(正确)
- 导出时将因子前向填充到A股交易日历
- 修复境外市场放假时动量显示为None的问题
2026-05-25 02:07:18 +08:00
e8e4e9c3ac
fix: GlobalRotationStrategy select_num 未生效
...
- 修复分散化选股逻辑:每个 group 选 Top 1 后,需要再按动量排序选 Top select_num
- 之前:所有 group 的 Top 1 都标记为信号(忽略 select_num)
- 现在:先从每个 group 选 Top 1,再从中按动量选 Top select_num 个
- 影响:配置 select_num=3 时,实际持仓 3 只而不是 4 只(group 数量)
2026-05-25 01:23:00 +08:00
2be81ba00d
feat(v2): 添加回测逐日明细导出脚本
...
新增功能:
- 创建 framework_v2/scripts/export_backtest_detail.py
- 导出 GlobalRotationStrategy 回测细节到 JSON
- 输出路径: framework_v2/results/backtest_detail_v2.json
导出数据内容:
1. 元数据(meta)
- 策略版本、模式、日期范围
- 动态阈值配置
- 调仓次数、最终净值
- 标的列表(名称、ETF、分组)
2. 逐日明细(days)
- 日期、净值、日收益率
- 调仓信息(is_rebalance、added、removed)
- 持仓列表(holdings)
- 每标的详情(11 个标的 × 1539 天)
* 动量得分、排名、阈值
* 持仓状态、权重
* 入场日期、入场价格、持仓天数
* 累计收益、当日收益、收益贡献
技术特性:
- 使用 CrossMarketAligner 对齐数据
- 支持动态短债阈值
- 支持强制分散化
- 包含交易成本计算
- Pydantic Schema 验证
回测验证(2020-01-10 ~ 2026-05-22):
- 总收益:137.64%
- 年化收益:15.23%
- 调仓次数:829 次
- 交易天数:1539 天
- 文件大小:4.5 MB
用途:
- 供 HTML 回放器加载
- 策略分析和调试
- 信号可视化
- 持仓明细查询
2026-05-25 00:39:47 +08:00