Justin Gu
|
c8535e2596
|
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(输出样例均为真实行情实测)
|
2026-09-04 12:17:36 +08:00 |
|
GitHub
|
b2509a8d0e
|
release: v1.25.0 — Walk-Forward/适配性/一条龙评估防过拟合链 + 评分评级后端化 + 寻优加速
升级计划 P1:补上两个下游项目都在自研的样本外验证空白。
- Walk-Forward 引擎(walkforward.py):7 窗样本外、每窗独立开仓(backtest-system v1.2.1 踩坑语义)、
上下文预热不污染;CLI --wf、REST /backtest/wf/run/async
- 适配性评估(fitness.py):train/valid/test 三段 + 8 项可解释检查 + 高适配标记;
evaluate_prefix 滚动过滤原语(无未来泄漏)
- 一条龙评估(benchmark.py evaluate_strategy):回测+WF+适配性+评分+评级+买入持有基准对比;
CLI --evaluate、REST /backtest/evaluate/run/async
- 综合评分(scoring.py,收益50/夏普15/回撤10/Sortino5/WF20)+ 评级后端化(grading.py,
前端 TS 忠实移植,REST 响应新增 grade/score 字段)
- 多 seed 验证 + 四项晋级门槛(validation.py);REST /backtest/multiseed/run/async
- 寻优两段式加速:IndicatorCache(36 点网格命中率 41.7%)+ workers 进程并行(实测约 2x);
诚实注:指标缓存墙钟 ~1.01x,瓶颈在逐 bar 循环,后续向量化
- strategy.I() 指标缓存钩子 + 数据代理零拷贝(astype copy=False);
types.to_json_native 统一 numpy 清洗
|
2026-09-01 22:17:08 +08:00 |
|
GitHub
|
3180ab3002
|
fix(backtest): 策略参数加跨语义约束,杜绝寻优选出快慢倒挂组合(issue #39)
寻优器网格探索不区分语义:ma_cross 的 fast∈[5..60] × slow∈[10..250]
笛卡尔积包含 {"fast":30,"slow":20} 这类倒挂组合,倒挂的双均线交叉
本质是反向策略,回测成绩可能反而突出,从而被选为"最优参数"展示
(即 issue #39 截图中 {"fast":30,"slow":20} 的来源)。presets.py 的
注释"快线<慢线才有意义;去重无效组合"早已写下意图但从未实现。
根因是参数校验只有单参数 min/max,缺跨参数语义约束:
- ParametrizedStrategy 新增 param_constraints 类属性 [(a,b), ...]
表示要求 a<b,在 __init__ 解析后统一校验,报错带中文标签;
语义约束不受 skip_bounds 影响(寻优跳过的只是数值边界)
- 7 个策略声明约束:ma_cross/ema_cross(fast<slow)、macd
(short<long)、triple_ma(short<mid<long)、rsi_reversal/cci/
wr_reversal(oversold<overbought)
- 寻优器 build 阶段的 ValueError 降为 info 级跳过(无堆栈噪音),
回测异常仍走 warning;预设网格 36 组合 → 有效 25 个
- 新增 10 个回归测试(旧代码全失败、新代码全通过)
|
2026-08-19 18:55:48 +08:00 |
|
Justin Gu
|
8323223937
|
fix: 寻优跳过参数范围/对比支持组合/日线x轴年份/寻优跳转填充参数
4 个独立修复:
1. 寻优跳过参数范围检查:Param.validate 加 skip_bounds 参数,
RegisteredStrategy.build 透传,ParamGridOptimizer 传 skip_bounds=True。
修复寻优时 fast=250 被 max_value=60 拦截的问题(探索超范围值是寻优目的)。
2. 对比页支持组合回测:CompareView 新增 extractComparable() 统一提取净值+指标,
支持单标的(performance/equity_curve)和组合(total_performance/combined_equity)。
修复勾选组合回测任务报「非单标的回测」错误。
3. K线x轴日线显示完整年份:isIntraday 判断从 length>10 改为检查时分秒非零
(日线归一化后带 T00:00:00 后缀,长度也 >10 导致误判为分钟线,slice 砍年份)。
4. 寻优跳转填充参数:BacktestView 加 useRoute(),onMounted 读 query.strategy +
query.params,await nextTick 后覆盖(避免 StrategyPicker watch 重置)。
修复寻优点「查看」跳转后参数未填充、仍用默认值的问题。
测试:823 passed, mypy 211 files OK, vue-tsc OK
|
2026-07-03 11:32:44 +08:00 |
|
Justin Gu
|
87fafe9131
|
feat(backtest): 参数网格寻优(optimizer + 前端寻优页)
对单个策略的 1-2 个参数做网格搜索,遍历用户指定的取值列表笛卡尔积,
每个组合跑一次回测,按 total_return 排序,返回排名表 + 热力图。
后端:
- ParamGridOptimizer(backtest/optimizer.py):itertools.product 遍历网格,
每点 entry.build(params) + BacktestEngine.run(df),复用同一 DataFrame
- 网格大小上限 200 防组合爆炸,单点失败容错(跳过不中断)
- 2 参数时生成热力图矩阵(x/y 轴取值 + cell 收益率)
- POST /backtest/optimize/run/async 端点(后台任务)
- OptimizeBacktestRequest schema(param_grid 1-2 参数)
前端(/optimize 寻优页):
- ParamGridPicker:勾选 1-2 个寻优参数,逗号分隔填取值列表
- OptimizeResultTable:网格点排名表(按收益降序,最优高亮)
- OptimizeHeatmap:2 参数热力图(ECharts heatmap,绿→红映射收益)
- 最优点「查看」按钮跳转单标的页用该参数回测
测试:821 passed(+10 寻优器单测 + 3 寻优路由测试)
|
2026-07-03 03:55:35 +08:00 |
|