与 docs/开发文档.md §10 实现顺序对齐。每完成一步标记 ✅,进行中标记 🔄,未开始为空。
| 步骤 |
内容 |
状态 |
备注 |
| 1 |
pyproject.toml — 依赖声明 |
✅ |
hatchling 构建,含 pytest markers |
| 2 |
config.py — 全部 dataclass(BacktestConfig, MAConfig, SignalConfig, PositionConfig, PositionTier, PositionInput, Regime 枚举, RiskOffConfig, StrategyConfig, SignalContext) |
✅ |
含校验逻辑,29 个单元测试通过 |
| 3 |
data/registry.py — 1x/2x/3x 全系列 ETF 元数据(含 financing_spread, total_return_index, fallback_dividend_yield) |
✅ |
AssetMeta dataclass,13 个单元测试通过 |
| 4 |
data/downloader.py + data/cache.py — 数据下载与 Parquet 缓存 |
✅ |
含版本化 cache key (D1_S1_TR1),24h TTL |
| 5 |
data/synthetic.py — LETF 合成重建(含融资成本建模、总回报口径处理) |
✅ |
三级口径处理,合成/真实合并,验证工具 |
| 6 |
test_synthetic.py — 合成 vs 真实数据验证 |
✅ |
22 个单元测试通过(含波动率损耗特性测试) |
| 6.1 |
集成验证:下载全系列指数+ETF,合成 1993~2026-03-16 完整序列,Parquet 读写正常,合成 vs 真实验证(相关系数 >0.995) |
✅ |
数据已持久化到 data/raw/ + data/full/,详见 ISSUES.md #001 |
| 步骤 |
内容 |
状态 |
备注 |
| 7 |
signals/ma.py — SMA/EMA/WMA 统一计算 + test_ma.py |
✅ |
17 个单元测试通过,与 pandas 内置函数交叉验证 |
| 8 |
signals/base.py — SignalGenerator Protocol |
✅ |
runtime_checkable Protocol |
| 9 |
signals/sma_bare.py — 裸均线信号 |
✅ |
支持 SMA/EMA/WMA,预热期输出 RISK_OFF |
| 10 |
signals/sma_buffered.py — 非对称缓冲带信号 |
✅ |
状态机实现,支持非对称 buy/sell buffer |
| 11 |
signals/composite.py — 信号组合器 |
✅ |
多信号取最保守 Regime |
| 12 |
test_signals.py |
✅ |
37 个单元测试通过(Protocol验证+BareMA+BufferedMA+Bodyguard+Composite) |
| 12.1 |
集成验证:用真实数据跑 SMA 信号,确认 1995-2025 产生约 7 次买卖循环 |
✅ |
4 个集成测试通过;实际 13 次买入循环(含 whipsaw),裸均线切换多于缓冲带 |
| 步骤 |
内容 |
状态 |
备注 |
| 13 |
positioning/base.py — Allocator Protocol + PositionInput |
✅ |
runtime_checkable Protocol |
| 14 |
positioning/binary.py — 二元切换(多资产权重) |
✅ |
支持 RISK_ON/DOWNGRADE_TO_1X/RISK_OFF 三态 |
| 15 |
positioning/tiered.py — 阶梯式(多资产权重) |
✅ |
离散阶梯状,RISK_OFF/DOWNGRADE 覆盖偏离度 |
| 16 |
positioning/linear.py — 线性渐进(多资产权重) |
✅ |
clamp 线性插值,RISK_OFF/DOWNGRADE 覆盖 |
| 17 |
positioning/factory.py — 工厂函数 |
✅ |
自动从 registry 解析 primary_1x |
| 18 |
test_positioning.py |
✅ |
33 个单元测试通过(Protocol+Binary+Tiered+Linear+Factory) |
| 18.1 |
集成验证:信号 → Allocator → 权重 dict,端到端数据流通畅 |
✅ |
2 个集成测试通过;Binary + Tiered 均验证真实 SPY 数据流 |
| 步骤 |
内容 |
状态 |
备注 |
| 19 |
engine/portfolio.py — BacktestResult / Trade dataclass |
✅ |
Trade(买卖循环) + BacktestResult(完整输出容器) |
| 20 |
engine/backtest.py — 回测主循环 |
✅ |
run_backtest() + create_signal() 工厂,含 shift(1) 前视偏差防护 |
| 21 |
engine/transition.py — 即时切换 / DCA 状态机 |
✅ |
TransitionEngine 支持 immediate/dca_6mo/dca_12mo,含中途反转 |
| 22 |
test_engine.py |
✅ |
26 个单元测试通过(dataclass+Transition+Signal工厂+回测主循环) |
| 22.1 |
集成验证:单策略完整回测跑通,输出 BacktestResult,净值曲线合理 |
✅ |
2 个集成测试(真实数据需 data/full/ + 合成 V 型走势);@pytest.mark.integration |
| 22.2 |
属性测试:权重和为1、净值非负、无前视偏差等系统不变量 |
✅ |
6 个属性测试通过;@pytest.mark.property |
| 22.3 |
极端输入测试:横盘/暴跌/极短数据/每日反转等边界场景 |
✅ |
7 个极端测试通过(含 DCA 过渡);@pytest.mark.extreme |
| 步骤 |
内容 |
状态 |
备注 |
| 23 |
analytics/metrics.py — 全套绩效指标 + test_metrics.py |
✅ |
32 个单元测试通过(收益/风险/风险调整/交易统计/基准比较) |
| 24 |
analytics/drawdown.py — 回撤深度分析 |
✅ |
11 个单元测试通过(DrawdownEvent/回撤序列/Top-N/滚动MaxDD) |
| 25 |
analytics/rolling.py — 滚动窗口分析 |
✅ |
8 个单元测试通过(滚动CAGR/Sharpe/MaxDD/Beta/Correlation) |
| 26 |
analytics/crisis.py + analytics/comparison.py |
✅ |
11 个单元测试通过(4预定义危机窗口/对比表/DataFrame构建) |
| 27 |
reporting/terminal.py — Rich 终端输出 |
✅ |
5 个单元测试通过(策略摘要/对比表/危机表/回撤表不崩溃) |
| 28 |
reporting/charts.py + reporting/html_report.py |
✅ |
5 个单元测试通过(Plotly Figure生成/HTML文件写出) |
| 28.1 |
集成验证:回测结果 → 全套指标 → 终端输出,数值与手算一致 |
✅ |
3 个集成测试通过(手算验证+终端输出+端到端全流程);@pytest.mark.integration |
| 步骤 |
内容 |
状态 |
备注 |
| 29 |
cli.py — CLI 入口(typer)+ __main__.py |
✅ |
YAML 解析 + 数据加载 + 回测编排 + 终端/HTML 输出 |
| 30 |
configs/default.yaml — 完整策略组合配置 |
✅ |
5 个策略: binary/tiered/linear × buffered/bare × immediate/dca |
| 31 |
端到端测试 |
✅ |
9 个集成测试通过 (YAML解析6 + E2E回测3); @pytest.mark.integration |
| 31.1 |
建立 Golden File 基线:固定数据+配置+预期输出,存入 tests/golden/ |
✅ |
3 个 golden 测试通过 (binary/tiered/linear); @pytest.mark.golden |
| 步骤 |
内容 |
状态 |
备注 |
| 32 |
reporting/static_charts.py — matplotlib 静态 PNG 图片 (9 函数) |
✅ |
12 个单元测试通过 |
| 33 |
reporting/json_report.py — JSON 结构化导出 |
✅ |
6 个单元测试通过 |
| 34 |
reporting/markdown_report.py — Markdown 摘要(含自动发现) |
✅ |
5 个单元测试通过 |
| 35 |
reporting/html_report.py 增强 + reporting/charts.py 新增 Plotly 图表 |
✅ |
generate_full_html_report() + 5 个新 Plotly 函数 |
| 36 |
reporting/report_engine.py — 报告编排层 |
✅ |
一站式生成 HTML/JSON/MD/PNG |
| 37 |
cli.py — 新增 --output-dir 参数 |
✅ |
向后兼容:无 --output-dir 时走旧流程 |
| 38 |
测试 |
✅ |
28 个新测试 (23 unit + 5 integration) |
| 步骤 |
内容 |
状态 |
备注 |
| 39 |
signals/vix_killswitch.py — VIX RSI 熔断 |
|
待实现 |
| 40 |
signals/macd_confirm.py — 周线 MACD 确认 |
|
待实现 |
| 41 |
signals/bodyguard.py — 泡沫偏离保镖 |
✅ |
10 个单元测试通过;支持自定义 bodyguard_source;Golden 回归通过 |
| 41.1 |
回归验证:每新增信号后跑 Golden File 回归测试 |
✅ |
3 个 golden 测试不受影响(bodyguard 为新增信号类型) |
| 41.2 |
Composite 信号 YAML 支持 |
✅ |
config.py/cli.py/backtest.py 支持 composite 方法解析 + sub_signals |
参数调优实验归档于 docs/实验记录.md。每次实验完成后在此更新索引。
| 编号 |
日期 |
主题 |
结论 |
| 001 |
2026-03-17 |
缓冲带宽度:+4%/-3% vs 5%/5% |
保留 +4%/-3% 为默认;QQQ 信号源场景可考虑加宽 |
| 002 |
2026-03-18 |
更紧卖出缓冲:+4%/-3% vs +4%/-2% |
保留 +4%/-3% 为默认;+4%/-2% 在 V 型反转场景更优但交易频率更高 |
| 003 |
2026-03-18 |
Risk-off 资产:基线 vs 全 SPY vs 全 QQQ |
建议纳指系策略 risk-off 改为 SPY;SPY 风险调整收益全面优于 QQQ |
| 004 |
2026-03-18 |
Risk-off = 现金 (0% 年化) |
cash 危机保护最强(08年仅-23%);Binary策略+cash最佳;Tiered/Linear用SPY更优 |
| 005 |
2026-03-18 |
4种LETF × 1x/cash (binary) |
QLD→cash综合最优(Sharpe 0.67, CAGR 24.65%); 2x全面优于3x风险调整; cash均优于1x |
| 005c |
2026-03-18 |
同005但仅2010后真实数据 |
1x反超cash(长牛无深度崩盘); QLD→QQQ最优(Sharpe 0.85); TQQQ→QQQ CAGR 36.68% |
| 006 |
2026-03-18 |
信号源: SPY vs QQQ × TQQQ/QLD × 1x/cash |
SPY信号全面碾压QQQ信号(少whipsaw); 13次交易vs25次; 建议纳指系统一用SPY信号 |
| 007 |
2026-03-18 |
缓冲带全排列 +2~+5/-2~-5 (16组合) |
+4/-2 Sharpe最高(0.68); +4/-3综合最优(100%胜率); 保留+4/-3为默认 |
| 008 |
2026-03-18 |
SMA窗口期 100/150/200/250/300 |
SMA-200全面最优(Sharpe 0.67, CAGR 24.65%); SMA-100最差(whipsaw过多); 保留200为默认 |
| 009 |
2026-03-18 |
Bodyguard阈值 downgrade×exit (10组合) |
所有bodyguard组合均优于基线; bg 20/35 MaxDD最低(-41%); bg 35/45低换手最佳折中; 推荐启用 |
| 010 |
2026-03-18 |
DCA过渡 immediate/6mo/12mo × cash/QQQ |
immediate→cash全面碾压; DCA拖累收益和风控; QQQ risk-off不推荐; 保留immediate+cash |
| 011 |
2026-03-18 |
佣金滑点敏感度 0/5/10/20 bps |
策略对成本几乎免疫(20bps仅-0.40pp CAGR); 13次交易天然低成本; 可忽略 |
| 012 |
2026-03-18 |
多LETF分散组合回测 |
分散不提升Sharpe; 集中QLD更优 |
| 013 |
2026-03-18 |
分散组合2010后真实数据 |
BG未触发; 相对排名不变 |
| 014 |
2026-03-18 |
LETF B&H vs SMA策略 — 泡沫后起点 |
SMA择时是杠杆ETF的必要前提 |
| 015 |
2026-03-19 |
Walk-Forward 过拟合检验 (168组合=7 SMA×2杠杆×2 RO×3 BG×2缓冲) |
策略未过拟合; SMA200是折中最优(前半段偏250+后半段偏175); QLD+cash鲁棒; 保留策略B |