GitHub
c49ba4c4b5
feat: 组合回测分析体系对齐单标的 — 组合级WF/一条龙/完整25项绩效/AI解读
组合回测(一策略×多标的)此前只能看 4 个数字,本轮把单标的的整条
分析链路在组合端补齐(WebUI/REST 双端):
- portfolio_engine:合并净值+汇总成交喂 PerformanceAnalyzer,输出
完整 25 项指标(SQN/最大连胜连亏/Ulcer/VaR/CVaR 等)+ 组合层
trades(symbol 列);修复假年化与回撤口径(负值+固定分母 →
逐点峰值,与单标的/多策略一致)
- walkforward:新增 PortfolioWalkForwardEngine,按标的日期并集切窗、
每窗独立开仓、合成组合窗内净值,复用 WalkForwardResult 结构
- benchmark:新增 evaluate_portfolio 一条龙(组合回测+组合WF+
跨标的多数口径适配性体检+综合评分+组合评级+等权买入持有基准对比),
报告结构与单标的 evaluate_strategy 同构
- performance:FIFO 持仓天数配对支持 symbol 分组
- Web:新增 POST /backtest/portfolio/wf/run/async 与
/backtest/portfolio/evaluate/run/async;组合回测响应附带
grade(组合净值口径)与 score;新增 _normalize_bars_dt 修复
按标的取数路径的字符串日期/遗留 date 列崩溃(E2E 揭露)
- 前端:组合页新增附加分析勾选区与组合绩效指标/WF/一条龙/成交明细
区块;buildPortfolioAiPrompt 组合版 Prompt;抽通用
AiInterpretModal(回测页迁移共用,行为不变);TradeTable 支持
showSymbol;EvaluatePanel 支持 gradeOverride
- 测试:后端 +17 例(pytest 1603 绿)、aiPrompt 组合版 2 例、
Playwright 组合页 E2E 2 例(9/9 绿)
2026-09-03 23:22:48 +08:00
..
2026-04-11 19:55:19 +08:00
2026-08-26 15:00:53 +08:00
2026-09-02 20:23:27 +08:00
2026-05-22 22:44:45 +08:00
2026-06-12 21:10:50 +08:00
2026-06-09 18:15:37 +08:00
2026-06-10 15:03:41 +08:00
2026-09-03 03:07:57 +08:00
2026-07-04 00:08:38 +08:00
2026-06-12 20:59:59 +08:00
2026-09-01 22:16:44 +08:00
2026-09-03 23:22:48 +08:00
2026-07-04 00:08:38 +08:00
2026-07-09 20:34:23 +08:00
2026-07-10 15:17:00 +08:00
2026-09-01 22:17:57 +08:00
2026-06-12 20:47:03 +08:00
2026-07-09 20:16:12 +08:00
2026-06-09 16:43:44 +08:00
2026-09-01 22:17:08 +08:00
2026-09-02 20:19:17 +08:00
2026-09-02 17:12:00 +08:00
2026-05-22 04:19:07 +08:00
2026-06-11 22:56:23 +08:00
2026-08-26 15:21:35 +08:00
2026-09-02 20:54:59 +08:00
2026-06-10 15:03:41 +08:00
2026-06-11 02:25:42 +08:00
2026-06-17 18:17:32 +08:00
2026-07-02 03:37:37 +08:00
2026-06-14 23:58:24 +08:00
2026-07-02 03:37:37 +08:00
2026-06-30 15:02:27 +08:00
2026-05-21 23:21:21 +08:00
2026-05-21 23:21:21 +08:00
2026-05-21 23:21:21 +08:00
2026-09-01 17:45:07 +08:00
2026-07-07 20:36:44 +08:00
2026-07-07 20:13:39 +08:00
2026-09-01 22:56:38 +08:00
2026-09-03 00:46:28 +08:00
2026-07-13 15:59:28 +08:00
2026-09-01 17:58:12 +08:00
2026-06-13 21:21:33 +08:00
2026-06-13 21:21:33 +08:00
2026-06-13 21:21:33 +08:00
2026-06-13 21:21:33 +08:00
2026-06-13 21:21:33 +08:00
2026-08-05 15:58:00 +08:00
2026-06-10 15:03:41 +08:00
2026-09-01 22:17:57 +08:00
2026-09-01 22:17:57 +08:00
2026-09-02 11:53:53 +08:00
2026-09-01 22:17:08 +08:00
2026-07-13 15:59:28 +08:00
2026-06-10 15:03:41 +08:00
2026-07-04 02:11:27 +08:00
2026-06-10 15:03:41 +08:00
2026-06-30 15:02:27 +08:00
2026-09-03 02:02:19 +08:00
2026-07-03 22:42:04 +08:00
2026-07-04 00:17:06 +08:00
2026-07-03 15:42:06 +08:00
2026-07-04 21:07:39 +08:00
2026-09-03 03:07:57 +08:00
2026-09-01 22:17:08 +08:00
2026-09-03 03:27:04 +08:00
2026-09-03 23:22:48 +08:00
2026-07-09 20:16:12 +08:00
2026-07-10 15:17:00 +08:00
2026-06-13 21:21:33 +08:00
2026-09-03 23:22:48 +08:00
2026-08-26 15:00:53 +08:00
2026-09-02 10:44:09 +08:00
2026-09-01 22:16:44 +08:00
2026-09-01 17:45:07 +08:00
2026-09-01 23:21:42 +08:00
2026-09-02 20:19:17 +08:00
2026-09-01 23:21:42 +08:00
2026-06-11 02:34:00 +08:00
2026-07-02 03:37:37 +08:00
2026-09-02 20:19:17 +08:00
2026-06-25 03:46:57 +08:00
2026-08-21 16:57:12 +08:00
2026-06-15 00:31:13 +08:00
2026-07-04 20:50:07 +08:00
2026-06-13 21:09:55 +08:00
2026-09-01 22:16:44 +08:00
2026-09-02 10:44:09 +08:00
2026-09-01 22:17:28 +08:00
2026-09-01 17:52:36 +08:00
2026-09-01 18:33:49 +08:00
2026-09-03 23:22:48 +08:00
2026-09-02 20:19:17 +08:00
2026-06-07 21:13:49 +08:00
2026-08-31 20:43:35 +08:00
2026-06-07 21:13:49 +08:00