Commit Graph

336 Commits

Author SHA1 Message Date
claude_dev 728b8ccec9 feat(portfolio): 任务中心UX(GitHub Actions模式)—提交后跳历史任务页+自动刷新运行中状态+发起新回测入口; PortfolioBacktest 回归表单/查看两态(治单任务跟踪丢失) [nas]
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 11s
2026-08-13 13:50:24 +08:00
claude_dev 15f132ccb5 feat(portfolio): 参数表单分块(策略与选股/时间与资金/基准与费用); 进行中页加「发起新回测」(治等待页无法新建) [nas]
CI/CD / test (push) Successful in 13s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 9s
2026-08-13 11:36:35 +08:00
claude_dev ebe368f54a fix(portfolio): run_backtest_json main params+Namespace 漏费用字段致 rc=1(组合回测失败) [vps]
CI/CD / test (push) Successful in 13s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 10s
2026-08-13 11:34:03 +08:00
claude_dev 66b393df16 feat(portfolio): 组合回测接入A股费用(佣金/印花税/最低佣金/滑点)对齐个股回测; BulletTrade set_order_cost/set_slippage [vps]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 10s
2026-08-13 10:32:49 +08:00
claude_dev b48a3b5c75 feat(portfolio): 组合回测改 trackTask 三态+localStorage 持久(提交后可切页,回来续看进度/结果,治同步等待体验) [nas]
CI/CD / test (push) Successful in 17s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 9s
2026-08-13 10:14:47 +08:00
claude_dev 523105650d fix(api): GET /task 内存失后 DB fallback 返 status(治回测 done 后前端轮询 404 死循环卡等待) [nas]
CI/CD / test (push) Successful in 13s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 12s
2026-08-13 08:52:53 +08:00
claude_dev c833c07fd6 fix(portfolio): 历史组合结果可查看(PortfolioBacktest查看模式+History跳转/筛选/标签); 回测等待加已耗时提示(治卡顿错觉) [nas]
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 8s
2026-08-13 08:34:34 +08:00
claude_dev e07cf7cd81 fix(portfolio): 默认日期改最近1年+记忆; MOCK_ON=import.meta.env.DEV(NAS构建走真实,治组合回测2022日期/不在历史mock假象) [nas]
CI/CD / test (push) Successful in 16s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 12s
2026-08-13 08:05:46 +08:00
claude_dev 4ad505434b feat(backtest): 个股回测接入费用(cfg通道)+slippage+benchmark放宽至4基准 [vps]
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 9s
2026-08-12 23:56:14 +08:00
claude_dev 1d8e39709f feat(strategy): 策略代码+实例路由组(routes_strategy)并注册 app [nas] 2026-08-12 23:56:14 +08:00
claude_dev 31836701f6 feat(strategy): 策略实例 JSON 存储 CRUD(list/get/create/update/delete) [nas] 2026-08-12 23:47:51 +08:00
claude_dev a272741dd6 feat(strategy): registry 扩展自研目录扫描(AST)+文件读写+py_compile; __init__ 惰性化(纯逻辑模块脱离 fastapi 可单测) [nas] 2026-08-12 23:47:07 +08:00
claude_dev 93bd251cc9 fix(frontend): 组合回测基准下拉 + 新建回测改名个股回测(消除歧义) [nas]
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 9s
2026-08-12 23:32:15 +08:00
claude_dev 29b663acfc fix(monaco): defineTheme 去掉多余 name 字段(治 CI build TS2353) [nas]
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 10s
2026-08-12 23:26:32 +08:00
claude_dev 5c8a7e12c6 feat(frontend): 终端化重构+策略管理(代码→实例→4运行)+撮合设计+回测参数 [nas]
CI/CD / test (push) Successful in 18s
CI/CD / nas-deploy (push) Failing after 17s
CI/CD / nas-verify (push) Has been skipped
- 终端化: 科幻色板(tokens/EP/reset/chips/echarts)+Layout(Cmd+K/时钟/状态灯)+mock全接口+Dashboard/Result/Monitor样板+6图表配色
- 策略管理: 策略库三层(代码→实例→4运行)+新建策略(组合/CTA模板+Monaco)+在线代码编辑(Monaco)+实例CRUD(参数反射/标的池type切/interval/match_session)
- 实例→运行关联: backtest/paper/live New页读instance预填
- 撮合设计: match_session(下一根K线开盘/收盘/集合竞价)+interval定频率+实走限日线/分钟走miniQMT
- 回测参数: 基准下拉+日期默认1年localStorage记忆+滑点/手续费UI
- 账户管理页+命名重整(模拟盘/实盘,消除撞名)
- spec §11-13(菜单/策略管理/撮合设计) + Monaco编辑器 + 策略实例删除/编辑入口 + 列表实例列
2026-08-12 23:23:23 +08:00
claude_dev 58b5d08280 docs: 补 NAS 组合回测验证截图(2026-07-31 all_weather 跑通) [nas]
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 32s
CI/CD / nas-verify (push) Successful in 13s
2026-08-12 08:45:24 +08:00
claude_dev 4f6cd43b21 feat(nas_sync): parquet 断点续传脚本(逐文件scp+NAS size校验跳过,治VPS无rsync) [nas] 2026-08-12 08:45:24 +08:00
claude_dev bf30283ac5 fix(ci): nas-verify 加 checkout(check-vps-needed 需 git log+脚本,原 job 只 curl/ssh 无代码) [nas]
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 10s
2026-08-02 23:27:51 +08:00
claude_dev 67d1c1ef2f ci(vps-gate): commit必打[vps]/[nas]标签+vps-deployed tag+待推issue [nas]
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Failing after 4s
- ci-cd: enforce-label(本次push无标签→fail,merge豁免) + check-vps-needed(nas-verify绿后对比vps-deployed tag,有[vps]未部署→开issue)
- vps-deploy: 成功打vps-deployed tag + 关issue(gap清空)
- scripts/ci/vps_pending_check.py: issue开/关/更新(CI复用)
- docs: vps-impact-map触及面表 + vps-deploy-pending判定记录
- CLAUDE.md: 部署流程段补标签约定
2026-08-02 23:25:40 +08:00
claude_dev b66a6c5958 fix(ashare_engine): load_data 直查 dbbardata 绕 vnpy peewee(治 CTA 死算)
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 4m11s
根因:vnpy 父类 load_data 走 get_database().load_bar_data()(peewee ORM),
get_database init 时 create_indexes 对 26G dbbardata 库 → spawn 建 26G
索引 CPU 死算 1:27+ / web 并发 database is locked(2026-08-02 根因,
vnpy_db 指向 v2 大库 2cb2ab0 后触发)。load_data 读 0 bars → 回测空/卡。

修复:load_data 统一直查 dbbardata(原仅 5m/15m 走 _load_intraday_data,
扩展到日线 d),绕 vnpy peewee get_database。sqlite3 busy_timeout=30s
防并发锁。d → BarData(interval=Interval.DAILY)。

验证:日线 600519 2024H1 load_data 0.1s bars=116(was database locked
5.2s/0 bars) interval=DAILY;run_backtesting 5.6s(was 死算 1:27+);
000001 compute_metrics 完成 daily_df=(116,25) benchmark=116(5图metrics恢复)。
vps-deployed
2026-08-02 21:48:33 +08:00
claude_dev c263aa14ab chore(cta_engine): 加 load_data bar数+run_backtesting logging(确诊卡点)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 3s
cta_6f7e8036 日线卡 run_backtesting(CPU85%,read_index_daily 前即卡),日线111bar该秒级→疑似 load_data 读多了(vnpy_db 2cb2ab0修复后读真实dbbardata,区间过滤/interval疑失效)。加 load_data history bars 数 + run_backtesting 完成 logging,重跑看 bar 数确诊。
2026-08-02 21:21:42 +08:00
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 2ff8ecaf52 perf(metrics): rolling alpha/beta 向量化(O(n²)→O(n),治分钟级卡死)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 5s
compute_metrics rolling alpha/beta 原 for 循环每点 iloc[:i+1].cov/var = O(n²)。日线 111 天没事,分钟级 daily_df(万行)卡死(cta_c287f4b5 卡 5min CPU88%)。改 pandas expanding 向量化(cov/var/mean O(n)),数值与原循环一致(beta/alpha diff<1e-15,NaN 位置匹配)。pytest 6 绿。触发:b2c41c7 降级让 compute_metrics 首次在 benchmark 有数据时真跑(此前 benchmark 空被 skip),暴露 rolling O(n²) 性能 bug。
2026-08-02 20:54:50 +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 2cb2ab0dd8 fix(config): vnpy_db 改 NAS v2 dbbardata 库(治 CTA 结果页 5图空白)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
根因:vnpy_db 指向旧路径 /volume1/stock/sanguo_vnpy/data/quant_trading.db
(v1 残留,库不存在)→ read_index_daily 连空库报错 → cta_engine try catch
(line 307)静默跳过 compute_metrics → metrics.json 不写 → CTA 结果页
5图全空(基准/Alpha/Beta/回撤/波动)。个股回测走 parquet 不受影响,故只
5图空,日志无 traceback(静默跳过非崩溃)。

修复:vnpy_db → /volume1/stock/sanguo_vnpy_v2/data_backup/quant_trading.db
(NAS v2 dbbardata 库,000300 SSE 4025行实证)。yaml 本就是 NAS 路径基准
(daily_dir 等 /volume1/stock/...),VPS 走 SANGUO_DATA_ROOT env 覆盖、
Mac 走 fixture,三环境互不影响。

端到端验证:NAS 容器 load_config(find_config_path()) → vnpy_db v2 →
read_index_daily('sh000300',2024-01-02,2024-06-28) 返回 117行(was 0)。
2026-08-02 20:22:44 +08:00
claude_dev 4c5270cf7a fix(frontend): EquityCurve 去 v-if + watch flush:post(治净值图永不init)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 2s
EquityCurve 用 v-if/v-else(空数据占位/否则chart-box),但数据异步到达时 v-else 切换 + watch 默认 pre flush → el.value 尚未绑定 → echarts.init 跳过 → 净值图 hasEchartsInstance=false 永不画。改为总渲染 chart-box(同 BenchmarkCurve 模式) + watch flush:post 保证 DOM patch 后 render。vue-tsc RC=0。
2026-08-02 20:01:55 +08:00
claude_dev c049e0e97d fix(frontend): MetricCards fmt 兜底字符串值(治结果页整页渲染崩溃)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
后端 statistics 字段可返字符串(如 sharpe_ratio="0",vnpy原始统计),原 fmt 直接 value.toFixed 在字符串上抛 TypeError。stack trace 证实:Result.vue onMounted 赋值 relativeMetrics 后 MetricCards fmt 崩溃,中断 Vue re-render → echarts setOption 从未执行 → 指标卡+所有图表全空(cta_3919916e 零成交复现,canvas:0)。Number() 统一转换兜底。vue-tsc RC=0。
2026-08-02 19:51:51 +08:00
claude_dev 857d43c6c2 fix(frontend): CTA结果页补净值曲线图(零成交也出图)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
Result.vue 拉了 equity-curve 数据却未画净值曲线;且 benchmark-curve/risk-series 依赖 *_metrics.json,CTA 引擎当前未生成该文件,致收益概述图全空。新增 EquityCurve.vue 走 equity-curve 接口(独立于 metrics.json,数据源 BacktestResult.equity_curve),零成交时画 N 天平线(初始资金不变),满足'有结果就有图'。vue-tsc RC=0。
2026-08-02 19:10:55 +08:00
claude_dev 9588a77a01 feat(portfolio): 回测可观测性 L1+L2+L3(治排查黑盒)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 4s
L1 worker logging: portfolio_worker 模块级 basicConfig(spawn子进程logger进docker logs)
  + subprocess stderr=None 继承(runner_backtest日志实时进docker logs,原capture_output吞了)
  + 失败处理适配(stderr未捕获,改提示查docker logs)
L2 task状态区分: 加 GET /portfolio/task/{id}/status(返state+error)
  + get_result 区分 failed(422+error)/running·pending(404 not ready)/done(原全404分不清)
L3 _wait_future日志: runner.py except 加 logger.error(原只task.fail静默,治非timeout异常排查)
前端无需改(轮询通用/task/{id}已处理failed)
2026-08-02 13:42:06 +08:00
claude_dev 6d23f7b5ec fix(portfolio): worker _TIMEOUT 3600→10800(3h)+timeout非静默日志
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 6s
全市场(max_pool=0)全周期(726天)回测每策略 60-100min,原 3600s(1h)不够→
subprocess.run kill→_wait_future 静默 task.fail→404。改 10800(3h)覆盖。
加 try/except TimeoutExpired 显式 logger.error(task_id+argv)+raise RuntimeError,
timeout 不再静默(治基建反馈排查困难)
2026-08-02 07:14:00 +08:00
claude_dev e22c8ee939 feat(portfolio): max_pool 字段透传(model+handler+前端,解除30硬编码)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
model 加 max_pool 字段(默认30,0=全市场不限);handler 用 req.max_pool 替换硬编码30;
前端加选股池上限 input + onSubmit 透传。下游 submit_portfolio→spec→argv--max-pool
链路异步化时已存在,本次只补入口。全周期验收可传 max_pool=0 对比 docker exec 旁证
2026-08-01 23:20:40 +08:00
claude_dev 7a14d7da82 feat(portfolio): strategy 字段全链透传(API→orchestrator→worker→runner_backtest + 前端选择器)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 20s
CI/CD / nas-verify (push) Successful in 3s
后端: PortfolioBacktestRequest.strategy → submit_portfolio(strategy=) → spec →
portfolio_worker _build_argv --strategy(NAS local + Mac SSH 两分支)
前端: PortfolioBacktestReq.strategy? + 策略下拉(4选项) + 副标题动态 + onSubmit 透传
runner_backtest CLI 已支持 --strategy(choices 4 策略),本提交不动
2026-08-01 23:01:26 +08:00
claude_dev 5c5bd9d7bb fix(docker): PYTHONPATH ENV 移 COPY 后(缓存命中 TA-Lib,避 sourceforge wget 卡)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 20s
CI/CD / nas-verify (push) Successful in 2s
PYTHONPATH ENV 原在 Step2 前置,致其后所有层 cache miss,TA-Lib 步骤重编译触发
wget sourceforge 国内卡死(build_v3 卡 29min load0.04)。移到 COPY 代码后:Step1-19
(apt/TA-Lib/pip)与旧 build 相同→缓存命中跳过 wget,只 ENV+COPY 重跑(秒级)。
功能等价(PYTHONPATH 在镜像 env,spawn 子进程继承),仅层缓存优化。

build_v4 实证:Step5 TA-Lib Using cache(跳 wget)+镜像 ENV PYTHONPATH 固化
(docker exec 探针可见 /app:/app/vnpy_v4.4.0,修复前空)。
2026-08-01 22:49:21 +08:00
claude_dev 0f6cdbedc9 fix(entrypoint): uvicorn --log-level 转小写(治 exit2 crash loop,第3根因)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 2s
新版 entrypoint(uvicorn 工厂)拼 --log-level ${VNPY_LOG_LEVEL:-info},但 VNPY_LOG_LEVEL
已 export INFO 大写,默认值不生效→传 INFO→uvicorn case-sensitive 拒绝→exit2 crash。
改 ${VNPY_LOG_LEVEL,,} 转小写(bash4+,shebang /bin/bash 支持)。

新版 entrypoint uvicorn 工厂首次在 NAS 跑,连暴露 3 个 crash 根因(已全修):
  6d786fb: PYTHONPATH(spawn import 治 BrokenProcessPool)
  c210197: +x 执行位(tini exit126) + SKIP_REDIS_CHECK(Redis 超时)
  本commit: --log-level 小写(uvicorn exit2)
旧版 python run_web.py 硬编码 log_level='info' 无后两个问题。
2026-08-01 21:59:39 +08:00
claude_dev c210197778 fix(entrypoint): +x 执行位 + SKIP_REDIS_CHECK 默认1(治 run535 NAS crash loop)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Failing after 34s
CI/CD / nas-verify (push) Has been skipped
run535 部署后容器 crash loop(exit126),两个独立根因:
1. Permission denied: entrypoint.sh git mv 后 644 无执行位,rsync 推 NAS 也是 644,
   bind mount 覆盖镜像层 chmod +x 无效,tini exec 失败。→ entrypoint.sh git 100755。
2. Redis 连接超时:新版 entrypoint 检查 SKIP_REDIS_CHECK!=1 才查 Redis(旧版 if false
   硬跳过),NAS 无 Redis 卡检查 crash。→ 默认 SKIP_REDIS_CHECK=1(复现旧版跳过)。

附:文档(nas-deploy-plan 方案①已实施 + ops/README 根治标记)。
2026-08-01 21:43:29 +08:00
claude_dev 6d786fbf41 fix(orchestrator): spawn 子进程 PYTHONPATH + entrypoint 回根治孤儿
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Failing after 33s
CI/CD / nas-verify (push) Has been skipped
ProcessPoolExecutor(spawn)子进程不继承主进程 sys.path(insert 是内存修改),
import sanguo_orchestrator 失败->BrokenProcessPool->API 回测静默失败,POST 秒回
task_id 但轮询永远 404。spawn 继承 env 不继承 sys.path,故:
1. Dockerfile ENV PYTHONPATH=/app:/app/vnpy_v4.4.0(镜像层,bind mount 覆盖不了)
2. entrypoint.sh 回仓库根(git mv 自 docker/):promote --exclude /docker 致旧版
   entrypoint 在 NAS 成 git 外孤儿(340行,被 bind mount 覆盖镜像层);回根后全量
   rsync 自动推可复现(对齐 docs/deployment/nas-deploy-plan.md 预设修复)+export 兜底
3. 三 Dockerfile COPY 路径同步

反馈: 策略 session(根因诊断+探针验证)
2026-08-01 21:33:20 +08:00
claude_dev ca0ec016f9 ci(nas-verify): 加 /health gate 防存活探针回归
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
/health 是 Docker HEALTHCHECK 依赖端点,后端漏实现致容器恒unhealthy
(a17f291 已补端点)。nas-verify 加 gate:/health 非200→CI 红灯,防漏部署/被改坏。
public 端点无需 token,$BASE 已是 http://192.168.2.154:8000。

反馈: 前后端 session
2026-08-01 21:07:34 +08:00
claude_dev 1989a54ee5 fix(deps): requirements-lock 补 bullet-trade/jqdatasdk 治重装丢包
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
VPS lock 缺这俩包(实为手动 pip install 在 c:\python310),重装 Python 环境会丢
——与 NAS docker 重建丢包同源坑。版本与 docker 侧/VPS 实装对齐(0.9.2/1.9.8)。

polars[rtcompat] 不入 lock:NAS Celeron 无 AVX2 专属,VPS AMD64 有 AVX2 用普通 polars。
2026-08-01 21:05:27 +08:00
claude_dev a17f291850 fix(api): 加 /health 存活探针端点(治Docker HEALTHCHECK恒unhealthy,/health原404)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
2026-08-01 21:01:35 +08:00
claude_dev f9b7c103c0 docs: §10 可复现构建更新(单阶段Dockerfile+polars[rtcompat]+已验证换装)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 3s
2026-08-01 20:39:58 +08:00
claude_dev 7bed73aa4c fix(docker): polars[rtcompat]==1.42.1(治 NAS AVX2 SIGILL 根因)
深查:pre-init-rebuild 有 polars-runtime-compat 兜底层才跑得通;
plain polars==1.42.1 新镜像缺 rtcompat → import 即 SIGILL exit132;
vnpy_ctastrategy 的132是transitively import polars 同根因。
改 polars[rtcompat]==1.42.1 拉 polars-runtime-compat
2026-08-01 20:09:03 +08:00
claude_dev e0808859da fix(docker): polars 钉 1.42.1(NAS 无 AVX2,>=1.43 SIGILL 崩溃 exit132)
构建验证抓到:>=1.26.0 拉到 1.43.2 在 NAS(Celeron 无AVX2)import 即崩;
pre-init-rebuild 的 1.42.1 实证可跑,钉死。>= 松约束版本漂移教训
2026-08-01 19:49:06 +08:00
claude_dev 0332aef3d4 fix(docker): 加 .dockerignore 瘦身构建上下文(1.9G→~50MB)+Dockerfile apt清华镜像
NAS容器bind-mount提供代码/data,镜像只需Python+依赖层;
排除data_cache/frontend/venv/logs/.git等;治上下文发送慢+输出不可监控
2026-08-01 19:20:12 +08:00
claude_dev 53daf9b57b fix(docker): Dockerfile apt 换清华 debian 镜像(原 deb.debian.org 国内不稳) 2026-08-01 19:16:10 +08:00
claude_dev 608574b49b fix(docker): Dockerfile pip install 对齐清华源(与 Dockerfile.test+运行时env一致)
原用默认 pypi.org,国内构建拉 torch 等大包极慢易超时;对齐项目标准清华源
2026-08-01 19:07:52 +08:00
claude_dev e64b5906da fix(portfolio-backtest): 净值曲线 echarts 空白 - watch漏触发手动兜底
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 3s
根因(浏览器实证): onSubmit 异步轮询 done 后 result/equityCurve 同帧赋值,
v-if result 块(含 chart-box div)此帧才挂载, watch(equityCurve, flush:post)
在该时序下漏触发 renderEquity → echarts 从未 init(chart-box 无 _echarts_instance_)。
手动 echarts.init+setOption 实证容器/echarts/数据全正常(37点),纯 watch 触发遗漏。

修复: equityCurve 赋值后 await nextTick()(等 chart-box 挂载)+ 手动 renderEquity()兜底。
watch 保留(双保险, ensureChart 幂等)。
2026-08-01 16:56:26 +08:00
claude_dev 4986e5c3c4 feat(portfolio): 组合回测异步化(接入 orchestrator task 框架)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
routes_portfolio 同步 subprocess.run(timeout=600) >10min 回测被 504 杀。
改异步复用现有 sanguo_orchestrator:submit_portfolio 仿 submit_factor,
子进程执行搬至 portfolio_worker.py(三机自适应保留,timeout 600→3600),
复用 _wait_future/_on_done 持久化。前端 onSubmit 改 POST 拿 task_id
→ 轮询 /task/{id} → done 取 /portfolio/task/{id}/result。

- runner.py: + submit_portfolio + _portfolio_worker(lazy import)
- portfolio_worker.py(新): 三机自适应 argv + 子进程 + stdout JSON → BacktestResult
- routes_portfolio.py: POST async 返 task_id + GET /portfolio/task/{id}/result
- 前端: postPortfolioBacktest 返 task_id + 轮询 status + 取 result(去 600s timeout)

不动策略逻辑/runner_backtest 核心/现有 task 接口。
2026-08-01 13:52:46 +08:00
claude_dev 2ca2facce3 fix(docker): requirements-docker 补组合/CTA 运行时依赖(治重建丢包后患)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 4s
容器是 docker commit 快照链(pre-init-rebuild 比 with-sqlite 多64包),
手动装的 bullet-trade/jqdatasdk/vnpy_ctastrategy/vnpy_sqlite 只活容器层,
从 base 重建会全丢。补进 requirements-docker.txt 钉到容器实证版(均PyPI可装):
- bullet-trade==0.9.2(组合框架,import bullet_trade)
- jqdatasdk==1.9.8(bullet_trade import 链必需)
- vnpy_ctastrategy==1.4.1(CTA引擎)
- vnpy_sqlite==1.1.3(vnpy sqlite驱动)
不补 pyecharts(0import残留)/jupyter栈(bloat)
docs §10 记可复现重建步骤;干净重建待 env 空闲验证
2026-08-01 12:23:53 +08:00
claude_dev 4fccfad4ca fix(nas): 固化容器 --init 铁律(防后台回测被清复发)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 2s
- docker-compose.yml vnpy 服务加 init:true(供未来 compose 部署)
- three-env-code-promote.md 新增 §9:NAS 容器必须 --init 创建,
  手动重建命令+image(pre-init-rebuild勿用with-sqlite)+复发风险(手动rm+run)
根因:无init时docker exec nohup后台进程会话结束后被清(02 day0 4min被清)
ci-cd只restart不重建,--init保留;唯一丢--init路径=手动rm+run
2026-08-01 08:49:32 +08:00
claude_dev 3b3e42985e fix(datareader): read_index_daily 切 dbbardata(治 benchmark 读陈旧 vnpy DbBarData)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 3s
cta_engine benchmark 经 read_index_daily 读 vnpy DbBarData(方案A前陈旧源)。
切 dbbardata(指数点位已由 sina_index_eod 灌 exchange=SSE)。

- 数据源:vnpy get_database.load_bar_data → sqlite3 直连 dbbardata
- 消除覆写 vnpy SETTINGS 副作用(cta_engine.py:73/199)
- 回归坑1(000300读空):CODES 已加 000300 → dbbardata 有数据(本轮修复)
- 回归坑2(sz000905):默认 benchmark sh000300 不触发;中证指数用 sh 前缀
- 复用 provider 模式:substr(datetime,1,10) 比日期规避混合格式
- 测试:mock vnpy → 真实 tmp sqlite 库测 SQL 路径(2测重写)
- 验证:Mac 4+5 passed + VPS 真实库 sh000300 7月23行 close4588.197
2026-08-01 08:41:57 +08:00