shy3130
4696fef959
feat(composite): 新增叠加策略(composite)支持选股与回测
引入第四种执行后端 composite: 声明式引用多个子策略, 复用现有注册表/缓存/撮合全链路。
核心设计:
- 退出采用来源投影(每个子策略 exit 仅在自己持仓窗口生效, 不串平其他子策略仓位)
- 评分用标准化排名加权(跨子策略可比, 不依赖 per-strategy 的 min-max 量纲)
- 来源归因(entry_signal_code 标记来源子策略)
后端:
- engine.py: CompositeSpec 数据模型, 两阶段引用校验(孤儿移除/嵌套禁止/asset_types 子集/≤8 上限), _run_composite_strategy 选股执行, find_dependents 删除防护, override_loader 注入保证子策略与单独跑同口径
- composite.py(新): 选股 merge_results + 回测 merge_signal_matrices 合并器(退出投影/排名融合/归因)
- backtest/strategy.py: composite 回测分支(特征计划合并/逐子信号/统一风控/basic_filter/归因)
- api/strategy.py: POST /composite/save 端点, _strategy_detail 返回 composite_children(含 name/source), 删除依赖 409 防护
- monitor.py: 实时监控 fail-closed(回退盘后缓存)
- walkforward.py: 对 composite 显式中文报错
- worker.py: _strategy_dirs 补 composite 目录(修复回测子进程找不到 composite 的 bug)
前端:
- CompositeStrategyDialog(新): 创建/编辑弹窗(自动生成 composite_ ID, 权重归一, 类型标签, 增删子策略)
- StrategySettingsDialog: composite 设置面板(子策略增删改/归一/类型标签)
- StrategyBacktest: 回测页 composite 适配(分组/参数区/结果区展示子策略构成)
- api.ts: 类型扩展(source/backend 加 composite, composite_children 含 name/source)
测试: 36 个 composite 专项测试(加载/选股/回测退出投影/排名/归因/override 透传/API/删除防护), 端到端验证真实内置策略回测通过
2026-08-02 10:56:03 +08:00
..
2026-08-02 10:56:03 +08:00
2026-07-18 18:31:02 +08:00
2026-07-14 11:51:35 +08:00
2026-07-18 16:59:53 +08:00
2026-07-12 13:52:49 +08:00
2026-08-02 10:56:03 +08:00
2026-08-02 10:56:03 +08:00
2026-08-02 10:56:03 +08:00
2026-07-25 22:51:27 +08:00
2026-07-26 18:35:31 +08:00
2026-07-08 13:42:53 +08:00
2026-07-15 21:34:44 +08:00
2026-07-18 00:49:28 +08:00
2026-07-16 14:34:07 +08:00
2026-07-31 19:56:33 +08:00
2026-07-19 16:42:03 +08:00
2026-07-16 12:17:27 +08:00
2026-07-16 12:17:27 +08:00
2026-07-31 19:38:36 +08:00
2026-07-26 19:59:10 +08:00
2026-07-18 00:49:28 +08:00
2026-07-28 09:46:51 +08:00
2026-07-26 19:59:10 +08:00
2026-07-08 12:12:29 +08:00
2026-07-28 21:13:10 +08:00
2026-07-09 17:38:44 +08:00
2026-07-18 16:59:53 +08:00
2026-07-20 10:33:06 +08:00
2026-07-19 09:36:55 +08:00
2026-07-19 10:06:26 +08:00
2026-07-28 21:13:10 +08:00
2026-07-19 10:06:26 +08:00
2026-07-30 13:09:07 +08:00
2026-07-09 19:14:50 +08:00
2026-07-26 18:35:31 +08:00
2026-07-26 18:35:31 +08:00
2026-07-20 13:01:03 +08:00
2026-07-20 13:01:03 +08:00
2026-07-16 12:17:27 +08:00
2026-07-18 23:37:54 +08:00
2026-07-26 18:35:31 +08:00
2026-07-08 14:19:52 +08:00
2026-07-16 14:34:07 +08:00
2026-07-20 13:01:03 +08:00
2026-07-18 16:59:53 +08:00
2026-07-22 11:21:13 +08:00
2026-07-08 11:27:59 +08:00
2026-07-26 16:08:42 +08:00
2026-07-08 12:34:08 +08:00
2026-07-16 12:17:27 +08:00
2026-07-16 12:17:27 +08:00
2026-07-16 12:17:27 +08:00
2026-07-18 16:59:53 +08:00
2026-07-28 21:13:10 +08:00
2026-07-26 18:35:31 +08:00
2026-07-26 12:19:55 +08:00
2026-07-26 18:35:31 +08:00