Commit Graph

15 Commits

Author SHA1 Message Date
claude_dev 3d934f5fa6 chore(cta_engine): 加阶段 logging(治 spawn 子进程黑盒,定位卡死)
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 30s
CI/CD / nas-verify (push) Successful in 7s
CTA 回测走 ProcessPool spawn 子进程,cta_engine 没配 basicConfig → 回测日志不进 docker logs(卡死看不到卡哪行,反复诊断障碍)。加模块级 basicConfig + read_index_daily/compute_metrics 阶段 logging + daily_df shape。下次卡死 docker logs 可见卡段(同 portfolio_worker)。诊断 cta_8aab3823 日线卡(rolling 已修非根因)。
2026-08-02 21:14:40 +08:00
claude_dev b2c41c73b8 fix(backtest): CTA metrics benchmark 缺失降级(不阻塞整组指标图)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 42s
CI/CD / nas-verify (push) Successful in 5s
benchmark 数据缺失时原实现 if 跳过整段 compute_metrics → {task_id}_metrics.json 不写 → 策略净值/回撤/波动图也空(不只基准图)。改为:benchmark 空时传空 Series + log WARN,compute_metrics 内部 reindex→fillna(0) 容空(基准类指标 NaN→None,策略指标正常),metrics.json 照写。效果:策略图照常出,只基准/Alpha/Beta 图空(前端 benchmark-curve/risk-series 已容错)。加测试 test_run_cta_backtest_benchmark_missing_degrades(mock read_index_daily 返空 → 验 compute_metrics 仍 called + metrics.json 仍写 + 策略指标有值)。6 测试全绿(Mac pytest)。
2026-08-02 20:37:50 +08:00
claude_dev 43b6a58ba7 feat(backtest): 支持5m/15m周期回测(ashare适配绕vnpy Interval enum)
ashare_engine override load_data: 5m/15m 直查 dbbardata 转 BarData(MINUTE),
绕过 vnpy Interval enum 限制(原生只认 d/1h/1m)。cta_engine +interval 参数,
5m/15m 映射 MINUTE 过父类校验。api(schema/routes)+orchestrator 透传 interval。
顺带修 cta_engine DB路径污染(yaml NAS路径在Win VPS误解析→改读vt_setting.json)。

测试: 15m 600519一年 3888bars total_return-0.22 sharpe-2.04; 5m 11664bars; 日线未回归(237bars)。
2026-07-18 18:45:24 +08:00
claude_dev 7fe3fb0844 fix(backtest): 结果页垃圾值/无图表端到端修复(empyrical×numpy2.0根因)
根因: empyrical 0.5.5 引用 numpy2.0 已移除的 np.NINF → compute_metrics 静默崩 → _metrics.json 不生成 → 结果页回退 vnpy 原始字段(单位混乱: total_return当百分数、max_drawdown当元 → 前端×100显 3305%/-50M%)。
- metrics.py: 导入 empyrical 前补回 np 别名(NINF/Inf/PINF/NaN/NAN/infty)
- routes.py: benchmark-curve/risk-series 缺 metrics 文件时返空200(不再404拖垮整页); get_result 从 statistics 抽 relative_metrics
- cta_engine.py: bench_df 日期 strip tz 防 pct_change 崩; metrics 块加 traceback 日志
- Result.vue: onMounted 用 Promise.allSettled 隔离7端点, 单接口失败不拖垮整页
- result_store.py: _safe_read_json 容错迁移后残留 NAS 绝对路径, stale path 不崩 list_results
- datareader.py: read_index_daily 改从 vnpy DB 读 + 前缀解析交易所(sh→SSE, 避免 000300 被 guess_exchange 误判 SZSE)
2026-07-17 08:24:01 +08:00
claude_dev b322f4e07b fix(backtest): degenerate改status=done+flag—前端status map兼容
degenerate 原为独立 status 值,但前端 statusLabelMap 只认 done/failed/running/pending,
21个零成交结果在 Dashboard 计数/History 筛选/chip 标签消失或空白。改 status='done'+
statistics.degenerate=True+reason,结果页诚实显示 0+空成交,列表/计数正常。
2026-07-13 11:56:23 +08:00
claude_dev 8d55e414fa fix(backtest): A股适配层—定寸/做空拦截/真实费用/口径统一(Phase1+2)
审计发现包装层系统性失真(2 CRITICAL+7 HIGH),vnpy底座可信但A股场景未适配:
- C1 定寸: engine.size=N(满仓手数),策略volume=1手=N股,开平对称(pos归零)
- C2 做空拦截: SHORT+OPEN拒单,long-only,SHORT+CLOSE平多允许
- H3 A股费用: AShareDailyResult重算(佣金保底5元/印花税卖方/过户费沪市)
- H4 收益口径: simple return从balance算(不再用vnpy log return喂empyrical)
- H5+口径: benchmark ffill对齐不缩样本; sizing_shares_per_lot暴露
- H7 退化检测: 零成交/空数据标degenerate不静默done
- H8 task_id: optimize/factor用uuid4(原id()内存地址)
- 静默except改warning

验证: 容器内真实vnpy DoubleMa 600000 2022-2024, total_return 1e-6→42.3%,
end_balance 100万→142万, SHORT+OPEN成交0笔, N=7800股/手.
22 backtest测试全绿(含集成测试), API健康200.
2026-07-12 23:39:45 +08:00
claude_dev 10508db11d fix(backtest): 结果页4个显示bug—成交枚举/时间/浮点精度/日志空
1. 交易详情方向/开平显原始枚举: Direction.LONG/Offset.OPEN → 买/卖、开仓/平仓/平今/平昨
   (TradesTable 加 fmtDir/fmtOff, 方向带涨跌色)
2. 交易详情时间 2024-06-25T00:00:00+08:00 → 2024-06-25 (日内带时分则保留)
3. 每日收益浮点精度 0.6533000000054017 → 0.65 (toFixed2, 涨跌色), 日期去 00:00:00
4. 日志tab硬编码"暂无日志数据": 前端接 getLog(/task/:id/log) + 后端 cta_engine 加
   stdout tee 把引擎 load/run/stats 输出落盘到 {task_id}.log (worker 进程内隔离)
   → 新回测日志 tab 显示真实引擎输出(2117字)

验证: 交易 买/开仓/2024-06-25, 收益 0.15, 日志 2117字真实内容
2026-07-11 23:31:50 +08:00
claude_dev 59da65b839 fix(backtest): 结果页指标全显"—" + 任务重启后404
两个根因:

1. relative_metrics 缺字段(routes.py): get_result 的 relative_fields 列表
   漏了 total_return/annual_return/sharpe_ratio/max_drawdown 4 个字段, 导致
   这 4 个指标永远进不了响应 → 前端 MetricCards 显"—"。补全为 11 字段。

2. 任务 task_id 不持久(runner/cta_engine): submit_cta 用 cta_{symbol}_{id(params)}
   (内存地址) 作 runner id, 而 run_cta_backtest 内部另生成 cta_{uuid} 存 DB,
   两者持久层不相交 → 重启后 pool 内存映射丢失, get_result(runner_id) 的
   load_result_by_task_id 查不到 → /result 404 → 前端指标全 0 + 图表无数据。
   改为 submit 前置生成稳定 uuid, 透传给 run_cta_backtest 复用, 使
   runner-id == DB task_id (单一 id, 重启可查)。

附: Dashboard 最近任务"策略/因子"列 min-width 150→190(长策略名不再截断)
测试: test_runner task_id 断言同步新格式
2026-07-11 22:10:48 +08:00
claude_dev 3c6f25d1b0 fix(backtest): NaN/Inf浮点→None消毒(vnpy统计+empyrical指标+时序)修JSON序列化500 2026-07-11 14:33:41 +08:00
claude_dev f7c2e2eea3 fix(backtest): benchmark全链路透传(API→runner→engine) + metrics分支用_dcfg修cfg=None导致relative_metrics空 2026-07-11 14:27:19 +08:00
claude_dev b9197a8889 feat(backtest): 回测流程集成基准对比—产出相对指标+时序json 2026-07-11 13:44:27 +08:00
claude_dev 28aea67232 feat(s1): 回测核心端到端跑通(vnpy client 对齐)
- 修 submit_cta/optimize 策略字符串→类解析(get_strategy_class)
- cta_engine: worker 进程设 vnpy DB→quant_trading.db(修 0 根数据)
- equity_curve 取自 calculate_result 的 daily_df(修 get_all_daily_results 对象问题)
- kline 补 cfg(find_config_path 共享)
- 端到端冒烟通过:DoubleMaStrategy 600000 → equity111/pnl111/trades1/kline117
2026-07-07 06:21:17 +08:00
claude_dev 510f77e6ea fix(backtest): result_id 用 DB 行 id + equity/trades 落 JSON(S1.1+S1.2)
- BacktestResult 加 id;save_result 设 result.id=lastrowid(修 get_result bug)
- runner._on_done 用 result.id(getattr 兜底 FactorReport)
- cta_engine 构建 equity_curve/trades DataFrame;save 传 file_dir
- result_store parquet→JSON(去 pyarrow 依赖,本机/容器都稳)
- 16 tests passed
2026-07-07 06:06:10 +08:00
claude_dev cb220619ef feat(backtest): 接真实 CTA 策略跑通端到端回测(DoubleMaStrategy on 600000)
修复 cta_engine 在真数据上的多个 bug(Phase 2 未在真数据验证):
- interval "1d" -> "d"(vnpy Interval.DAILY.value)
- capital 0 -> 1_000_000(0 致首笔交易即爆仓,统计全 0)
- statistics 改用 calculate_statistics(df)(旧代码误用 calculate_result 拿 DataFrame)
- statistics JSON-safe(vnpy 可能含 Timestamp)
- test_cta_engine mock 匹配新流程(calculate_statistics 返回统计字典)

验证:diag_cta.py 真实回测 DoubleMaStrategy on 600000 (2024H1, 111 天)
→ 真实统计 total_return -0.017% / sharpe -1.03 / max_drawdown -2.17 / 1 trade
容器 79 tests passed。
2026-07-06 23:33:24 +08:00
claude_dev a4ce3aed85 feat(backtest): cta_engine BacktestingEngine wrapper 2026-07-06 10:57:29 +08:00