feat: CLI 对齐 WebUI/SDK 分析能力 — 一键参数寻优+策略列表+组合级WF/一条龙

CLI 此前缺失的三块补齐,引擎层复用现成实现(ParamGridOptimizer/
STRATEGY_PRESETS/evaluate_portfolio/PortfolioWalkForwardEngine),
CLI、Web API 与 Python SDK 三条通路能力对等:

- 新增 easy-tdx optimize 参数网格寻优命令:单策略网格搜索
  (--strategy 用预设网格或 --param 自定义),--all 一键寻优所有
  内置策略并按总收益率全局排名(对齐 WebUI /optimize 页与
  /backtest/optimize-all/run/async);--workers 进程级并行;
  策略名/参数名联网前前置校验快速失败
- optimizer 新增 optimize_all_strategies 规范实现(模块级 worker
  可 pickle、主进程解析 label、跨策略进程池并行、presets 可注入
  子集网格),CLI 与后续 Web 端共用
- 新增 easy-tdx strategies 内置策略列表命令(名称/参数默认值/
  预设网格/说明;--output json 与 GET /backtest/strategies 同构)
- portfolio 补 --evaluate(组合级一条龙)/ --wf(组合级 WF)/
  --auto-fees,输出与 WebUI /portfolio 页同构
- 测试新增 12 例(optimize 互斥/未知策略/未知参数校验、strategies
  表格与 JSON、portfolio 新旗标、optimize_all_strategies 排名序/
  skipped/JSON 原生类型);pytest 1611 通过、ruff/mypy 全绿
- 文档同步:README、docs/backtest_usage.md CLI 章节+目录、
  CHANGELOG 未发布小节、examples/20_cli/cli_examples.sh 补
  回测系列 §39-48(输出样例均为真实行情实测)
This commit is contained in:
Justin Gu
2026-09-04 12:17:36 +08:00
parent 9d2b0397bd
commit c8535e2596
9 changed files with 914 additions and 3 deletions
+169
View File
@@ -454,3 +454,172 @@ echo "=== 38. 常用指标快速参考 ==="
# CCI: easy-tdx indicator CCI -m SH -c 600519 --table
# BIAS: easy-tdx indicator BIAS -m SZ -c 000001 --table
# OBV: easy-tdx indicator OBV -m SZ -c 000001 --table
# ═══════════════════════════════════════════════════════════════════════════
# 回测系列(backtest / portfolio / strategies / optimize / run-all
# 策略文件可用仓库自带的 strategies/ 目录(expma_cross.py 等),
# 也可参考 docs/backtest_usage.md 自己编写(继承 Strategy 基类)。
# ═══════════════════════════════════════════════════════════════════════════
echo "=== 39. 回测 - 单策略 ==="
# 加载 Python 策略文件跑回测,--table 输出绩效概要(默认 JSON 全量)。
# 参数: <市场> <代码> --strategy-file <路径> --cash N --commission F --count N --adjust <复权>
# 绩效含 25 项指标:收益/回撤/夏普 + Ulcer/VaR(95%)/CVaR(95%)/SQN/最大连胜连亏(深度风险)
# easy-tdx backtest SZ 000001 --strategy-file strategies/expma_cross.py --count 250 --table
# 输出:
# === 回测绩效概要 ===
# 总收益率: -0.79%
# 年化收益: -0.80%
# 最大回撤: 8.54%
# 夏普比率: -0.41
# 胜率: 0.00%
# 交易次数: 3
# Ulcer 指数: 0.0406
# 日 VaR(95%): 0.91%
# 日 CVaR(95%): 1.23%
# SQN 系统质量: -16.49
# 最大连胜/连亏: 0 / 3
#
# === 配置参数 ===
# 初始资金: 100000.00
# 佣金率: 0.0003
# 成交规则: next_open
#
# === 最近交易记录 ===
# [2025-11-21 00:00:00] 买入 数量=8400 价格=11.80 盈亏=0.00 [成交]
# [2025-12-04 00:00:00] 卖出 数量=8400 价格=11.55 盈亏=-2255.86 [成交]
# ...
echo "=== 40. 回测 - 成本模拟(滑点/自动费率/成交规则)==="
# --slippage F 固定滑点(元/股),让回测更贴近实盘
# --auto-fees 按标的品种自动解析费率(ETF/可转债免印花税等;显式 --commission 优先)
# --execution 成交价规则: next_open(默认) / next_close
# --chanlun-level 缠论自动桥接:引擎计算缠论并注入策略 self.chanlun(如 DAILY/30MIN
# easy-tdx backtest SZ 000001 --strategy-file strategies/expma_cross.py --slippage 0.01 --auto-fees
# easy-tdx backtest SH 600519 --strategy-file my_strategy.py --execution next_close
# easy-tdx backtest SZ 000001 --strategy-file strategies/chanlun_strategy.py --chanlun-level DAILY --table
echo "=== 41. 回测 - Walk-Forward 样本外验证 ==="
# 全样本收益好 ≠ 策略好。--wf 把时间轴切成 N 个连续窗口逐窗独立回测
# (每窗从空仓开始、窗口结束强制了结),检验策略在不同时段是否稳定盈利。
# consistency(盈利窗占比)是 WF 稳定性的核心指标。
# easy-tdx backtest SZ 000001 --strategy-file strategies/expma_cross.py --wf --wf-windows 5
# 输出(回测 JSON 之后附加 walkforward JSON:
# {
# "walkforward": {
# "n_windows": 5,
# "warmup_ratio": 0.3,
# "consistency": 0.2,
# "chained_return": -0.0045,
# "worst_window": -0.0719,
# "best_window": 0.0726,
# "windows": [
# {"index": 0, "start": "2025-12-17", "end": "2026-02-05", "bars": 35,
# "total_return": 0.0, "sharpe": 0.0, "max_drawdown": 0.0,
# "total_trades": 0, "win_rate": 0.0, "performance": {...}},
# ...
# ]
# }
# }
echo "=== 42. 回测 - 一条龙评估 ==="
# --evaluate 一条龙:回测 + WF + 适配性体检 + 综合评分 + S-D 评级 + 买入持有基准对比,
# 覆盖常规输出,直接给完整报告 JSON(与 WebUI 一条龙面板同构)。
# fitness.pass_ratio: 适配性体检通过率;grade: S-D 评级(不看收益,看净值质量);
# benchmark.excess_return: 相对买入持有的超额收益。
# easy-tdx backtest SZ 000001 --strategy-file strategies/expma_cross.py --evaluate
# 输出:
# {
# "performance": {...25 项绩效指标...},
# "score": {"total": 17.3, "components": {...}, ...},
# "grade": {"grade": "D", "score": 45.9, ...},
# "walkforward": {...同上 --wf...},
# "fitness": {"pass_ratio": ..., "checks": [...], "segments": [...], ...},
# "benchmark": {"buy_hold": {"total_return": -0.0343, ...}, "excess_return": 0.0264, ...},
# "config": {"symbol": "SZ:000001", "n_windows": 7, ...}
# }
echo "=== 43. 回测 - 多因子组合 ==="
# 多个策略文件合成一组信号:AND(全部看多) / OR(任一看多) / MAJORITY(多数,默认)。
# 至少 2 个策略文件,逗号分隔。
# easy-tdx backtest SZ 000001 \
# --combo-strategies strategies/macd_cross.py,strategies/rsi_reversal.py \
# --combo-mode MAJORITY --table
echo "=== 44. 回测 - 多标的组合回测(portfolio==="
# 多只股票共享资金池、均等分配、统一仓位管理。
# 参数: --stocks "市场:代码,..." --strategy-file <路径> --cash N --allocation equal
# easy-tdx portfolio --stocks SZ:000001,SH:600519 --strategy-file strategies/expma_cross.py --table
# 输出:
# === 组合回测绩效概要 ===
# 标的数量: 2.0
# 总资金: 200,000
# 组合收益率: -0.40%
# 组合年化: -0.40%
#
# ── 各标的详情 ──
# SZ000001: 收益=-0.79% 夏普=-0.41 回撤=8.54% 分配=50% 交易=3
# SH600519: 收益=0.00% 夏普=0.00 回撤=0.00% 分配=50% 交易=0
echo "=== 45. 回测 - 组合级 WF / 一条龙 ==="
# portfolio 也支持样本外验证与一条龙评估(全部标的日期并集切窗):
# --wf / --wf-windows 组合级 Walk-Forward
# --evaluate 组合级一条龙(组合回测+组合WF+跨标的适配性+评分+组合评级+等权买入持有基准)
# --auto-fees 按各标的品种自动解析费率
# easy-tdx portfolio --stocks SZ:000001,SH:600519 \
# --strategy-file strategies/expma_cross.py --wf --wf-windows 5
# easy-tdx portfolio --stocks SZ:000001,SH:600519 \
# --strategy-file strategies/expma_cross.py --evaluate
echo "=== 46. 回测 - 内置策略列表(strategies==="
# 列出注册表全部内置策略:名称、参数默认值、预设寻优网格、说明。
# 策略名可直接用于 optimize --strategy 与 Web API /backtest/run 的 strategy 字段。
# easy-tdx strategies
# 输出:
# === 内置策略(54 个)===
#
# ma_cross — 双均线交叉
# 参数: fast=5, slow=20
# 预设网格: fast:6 × slow:636 点)
# 说明: 快线上穿慢线买入,快线下穿慢线卖出。最经典的趋势跟随策略。
#
# macd — MACD 金叉
# 参数: short=12, long=26, signal=9
# 预设网格: short:4 × long:416 点)
# ...
# easy-tdx strategies --output json # 完整参数 schema(含 min/max/choices
echo "=== 47. 回测 - 参数网格寻优(optimize==="
# 对内置策略的 1-2 个参数做网格搜索,按总收益率排名。
# 不指定 --param 时自动用该策略的预设网格(见 strategies 命令)。
# --workers N: 1=串行+指标缓存复用(默认);2+=进程级并行。
# easy-tdx optimize SZ 000001 --strategy ma_cross --param fast=5,10,20 --param slow=20,30,60 --table
# 输出:
# === 参数寻优: ma_cross8 个有效网格点)===
#
# 排名 参数 总收益率 夏普 最大回撤 交易 胜率
# 1 fast=10, slow=30 0.54% -0.19 11.92% 4 25.0%
# 2 fast=20, slow=60 0.06% -0.33 8.88% 2 0.0%
# 3 fast=5, slow=30 -5.29% -0.76 15.54% 6 0.0%
# ...
#
# 最佳参数: fast=10, slow=30
# easy-tdx optimize SZ 000001 --strategy ma_cross # JSON 输出全量结果(含 2 参数热力图矩阵)
echo "=== 48. 回测 - 一键寻优所有策略 + 批量对比 ==="
# --all: 逐个内置策略按预设网格寻优,取各自最优点做全局排名(对应 WebUI /optimize 页)。
# easy-tdx optimize SZ 000001 --all --count 120 --workers 4 --table
# 输出:
# === 一键寻优所有策略(54 个策略,共 316 网格点)===
#
# 排名 策略 最佳参数 总收益率 夏普 最大回撤 交易 胜率
# 1 kdj_cross KDJ 金叉 n=5 18.59% 2.82 2.79% 7 71.4%
# 2 fisher_cross FISHER 费雪拐点 n=9 16.94% 2.58 5.04% 7 57.1%
# 3 sar_follow SAR 抛物线跟随 af_step=0.03 16.55% 2.53 4.69% 4 75.0%
# ...
#
# 全局最优: kdj_cross n=5
#
# run-all: 另一种批量方式——跑 strategies/ 目录下所有 .py 策略文件并排名(--combo 做组合)。
# easy-tdx run-all SZ 300308 --count 2000 --cash 1000000 --adjust QFQ
# easy-tdx run-all SZ 300308 --combo 2 --combo-mode MAJORITY