claude_dev
|
ee27313644
|
feat(data): 全市场5m/15m下载+灌库+每日增量链
xtdata逐只下载(非批量download_history_data2,后者5201只触发xtquant死锁),
先5m后15m(15m依赖5m),看get bars判成败(ret=None正常非失败)。
download_15m_xtdata.py + relaunch_15m_wrapper.ps1(auto-restart兜底segfault)。
import_vnpy_minute_fast.py灌库(INSERT OR REPLACE,interval存5m/15m,8028万行)。
_run_daily.ps1加5m/15m增量段(每天16:30)。validate_import.py校验。
全市场5201只,5m 6020万/15m 2007万bar,2025-07-17~2026-07-17。
|
2026-07-18 18:45:24 +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
|
d6162d1928
|
fix(factor): 因子任务持久化到 backtest_results.db(type=factor)
此前 FactorReport 无 id,_on_done 不存 DB → 因子任务不进任务列表、重启丢失
(用户:历史任务列表看不到因子分析)。_on_done 现对 FactorReport 调
_persist_factor 存 backtest_stats(type=factor, strategy=因子名, symbol=标的池,
statistics={ic_summary, report_paths})。FactorReport 加 symbols/start/end 字段。
|
2026-07-17 17:06:57 +08:00 |
|
claude_dev
|
f4cf35a7d1
|
fix(history): optimize 任务查看跳 optimize-result 页(此前跳 CTA result 致指标全空)
Dashboard/History 的 open() 只区分 factor,optimize 任务也跳 /backtest/result/,
但优化任务无单一 metrics/equity → 指标卡片全显示 —。改为按 type 分流到
/backtest/optimize-result/(同 Progress.vue 已有逻辑)。
|
2026-07-17 16:48:12 +08:00 |
|
claude_dev
|
f465756499
|
fix(optimize): 不再为每个 combo 存独立记录,避免污染历史任务列表
cta_optimizer 每跑一个 combo 就 save_result 存一条 type=optimize 记录
(statistics 是单 combo stats,无 combos key)。每次优化额外产生 N 条子记录,
历史任务列表全是这些,点开后 optimization-results endpoint 查 combos 找不到
→ 空页面。实证 142 条 optimize 里 137 条是这种空子记录(12/12 匹配主任务 combo)。
combo 结果只在内存聚合,由 aggregate 主任务统一存 {combos:[...]}。
|
2026-07-17 16:01:01 +08:00 |
|
claude_dev
|
4f0e3162b3
|
fix(optimize): 策略切换时按策略参数自动填网格,避免 grid 不匹配
Optimize.vue 硬编码默认 grid 为 fast_window/slow_window(DoubleMa 参数),
切换策略不更新。选 DualThrust/AtrRsi 等策略时 grid 仍是 fast/slow_window,
参数对该策略无效 → 所有组合跑出完全相同结果(实证 opt_235fa738 DualThrust
24 组合 total_return 全=-0.0023, distinct=1/24)。
加 watch(form.strategy):切换时拉 /strategy/{name}/params,按 parameters+
defaults 以默认值为中心生成网格,保证参数名匹配策略。历史无效优化无法挽回。
|
2026-07-17 15:33:03 +08:00 |
|
claude_dev
|
65021bd32c
|
fix(factor): tears iframe 渲染——patch GridFigure.close 收集 figure 生成 HTML
alphalens-reloaded create_full_tear_sheet 内部每个 tear sheet 末尾调
GridFigure.close()→plt.close(fig),Agg 后端下 figure 被销毁,plt.savefig
只能拿到最后一个空占位 figure(实证 2.3KB 空 PNG);原代码 savefig 存
.png 却把 report_paths 记成 .html,report endpoint os.path.exists 失败
返回 404,iframe 加载空白(回退到 SPA 首页标题)。
monkey-patch GridFigure.close 收集 figure 而非销毁(同 empyrical/demean
适配思路,不改 alphalens 源码),跑完把所有 figure savefig 成 base64 嵌入
真 HTML 文件,report_paths 指向该 html。
浏览器端到端验证(VPS factor_2d01a718):report endpoint 404→200,iframe
渲染 4 张 tearsheet 图(returns/information/turnover/quantile table,2.4MB),
naturalWidth>0 确认非 broken,console 无报错。
|
2026-07-17 14:38:03 +08:00 |
|
claude_dev
|
3b116b63f9
|
fix(factor): patch alphalens demean 兼容 pandas2,tears 报告跑通
alphalens-reloaded 的 demean_forward_returns 用 groupby.transform(lambda x: x-x.mean()),pandas2 走 _transform_general → concat 空(No objects to concatenate),tears 崩。
monkey-patch alphalens.utils.demean_forward_returns:改 transform("mean") 走 _transform_fast(广播组均值不 concat)再相减,等价且兼容。不改 alphalens 源码(同 empyrical np.NINF 适配思路)。
验证: 单点 patch 无 cascade,tears create_full_tear_sheet 全链跑通,report 生成,IC + tears 报告都出。
|
2026-07-17 13:21:18 +08:00 |
|
claude_dev
|
b3ea8e7b04
|
fix(factor): 因子分析端到端修复(依赖缺失+vt_symbol+IC/tears解耦)
根因链:
1. alphalens + scikit-learn 没装 → analyzer:76 软错误 return {error:alphalens not installed}(已 pip 装 alphalens-reloaded 0.4.6 + scikit-learn 1.7.2,requirements-lock 已锁)。
2. symbols 传 vt_symbol(600000.SSE)但 read_db_daily 查 DB 用裸代码 → bars 空 → factor/prices 全空 → alphalens infer_trading_calendar weekmask 全零 → busdaycal 崩。
3. statistics 含 date/numpy(之前 optimize 已修 result_store _json_default)。
4. alphalens-reloaded × pandas2 的 groupby.transform 兼容:demean_forward_returns tears 崩 No objects to concatenate。
适配修复(不动 vnpy/alphalens 源码):
- symbols 归一:vt_symbol → 裸代码(split '.'),read_db_daily 能查到。
- IC/tears 解耦:IC 算完先存 ic_summary success,tears 独立 try(失败标 tears_error 不覆盖 IC)——IC 核心数值可用,tears 报告作为已知限制。
- error 加 traceback 字段(调试友好)。
验证: 3 symbol(600000/000001/600519) ma5 因子 IC 成功(1D/5D/10D mean/icir/t_stat count=49),浏览器 /factor/result 页表格渲染。单 symbol IC NaN 是截面用法(需≥2标的),非 bug。
|
2026-07-17 11:51:08 +08:00 |
|
claude_dev
|
6ed71ed8cf
|
fix(optimize): 参数优化端到端修复(空statistics/500/不跳页)
根因: vnpy run_optimization 孙进程 spawn re-import setting.py 重置 DB → load 0根 → 空 statistics;连带 task_id 不一致 + statistics 含 date/numpy 序列化失败 + 前端单页轮询 180s 超时。
修复(不动 vnpy 源码):
- cta_optimizer: vt_setting.json 适配(vnpy 原生机制 setting.py:43 load_json,孙进程拿到正确 DB) + task_id 贯通 + 主聚合持久化(combos) + 过滤空 statistics 记录
- result_store: _json_default(date→isoformat + numpy→原生),save_result 两处 json.dumps 加 default
- routes: optimization-results 改读 DB 主聚合, fallback 内存(重启不丢)
- runner: _opt_worker 加 task_id 参数 + submit_optimize 传递(对齐 _cta_worker)
- 前端: Optimize 提交后跳 progress;Progress 用 opt_ 前缀判断跳 optimize-result;新建 OptimizeResult 参数表格页;router 加路由
验证: 端到端 optimization-results http=200 + 4组合非空 statistics + 浏览器提交→跳 optimize-result 页表格渲染。
|
2026-07-17 10:58:49 +08:00 |
|
claude_dev
|
799292d89c
|
chore: gitignore 补充 venv*/data_xtdata_stage/backup 模式
|
2026-07-17 08:24:01 +08:00 |
|
claude_dev
|
b966fce1e9
|
feat(data): 导入脚本 env 化 + xtdata 日线增量脚本
- import_vnpy_daily_fast.py: DB_PATH/DAILY_DIR 读 env(VNPY_DB_PATH/DAILY_DIR, Windows用正斜杠); amount 列缺失时容错填0
- daily_update_xtdata.py: 新增, 全市场日线从 miniQMT xtdata 本地缓存增量下载(零漂移), 部署文档 §4/§8 引用
|
2026-07-17 08:24:01 +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
|
37c850d0c5
|
docs(deploy): VPS统一部署权威文档(取代vps-native-brain,覆盖07-17全统一架构)
|
2026-07-17 08:10:04 +08:00 |
|
claude_dev
|
a75e094e7d
|
feat(data): build_daily_from_xtdata 全市场日线从xtdata重建到staging
miniQMT的xtdata作源(已证价格与parquet一致/T+0/深历史),重建VPS全市场日线。
- 只写 staging(DATA/_staging_xtdata),不动主库,验后再swap
- download一次raw,读两次(dividend_type none=raw/front=qfq,复权读时应用)
- volume×100(手→股),列 date/open/high/low/close/volume 对齐 datareader
- 单线程paced(分批200+sleep),per-stock写不全量进内存,避全市场崩
- 布局 {raw,qfq}/<year>/{sh|sz}{sym}_daily.parquet,沪深A股~5201只
|
2026-07-15 22:59:32 +08:00 |
|
claude_dev
|
346133415f
|
fix(data): run_daily_update 注入 homebrew PATH 修 launchd 下 timeout not found
launchd/cron 最小 env 不含 /opt/homebrew/bin,探针 'timeout 30 python3 ...'
报 command not found → 误判新浪源挂 → abort → 每日增量 07-14 起失效、生产数据
停在 07-13。脚本顶部 export homebrew+系统 PATH,兼容 launchd/cron/手动。
根因见 memory cron-python-env-gotchas(timeout 在 homebrew 不在 /usr/bin)。
|
2026-07-15 21:35:59 +08:00 |
|
claude_dev
|
dfa72e1440
|
fix(trader): cancel_order 补 symbol/exchange
vnpy 4.4.0 的 CancelRequest 必填 (orderid,symbol,exchange),原代码只传
orderid → TypeError → 撤单从不工作。改为从 _exec.orders 缓存查 OrderData
拿 symbol/exchange 一起传。E2E 实证 {ok:True} 无 TypeError(盘后 miniQMT
非交易时段不实际撤单,是另一回事)。
|
2026-07-15 21:28:19 +08:00 |
|
claude_dev
|
70d72f35bb
|
chore(vendor): vendor vnpy_qmt 0.3.3 源码自行维护
vnpy_qmt 是唯一券商交易 gateway(关键路径),社区包断更有风险。
按 vnpy_v4.4.0 同一套约定 vendor 源码、sys.path 引用、不 pip install。
- vnpy_qmt_v0.3.3/vnpy_qmt/ (5文件587行) + LICENSE(Apache-2.0) + README
- run_web.py 加 if-exists 路径块,import 方式不变 (from vnpy_qmt import QmtGateway)
Mac 验证: py_compile 全过 + import 解析到 vendor 副本(仅卡 xtquant Win-only,符合预期)
VPS 生产切换(Part B: rsync+pip uninstall+重启+实证) 待确认
|
2026-07-15 21:15:53 +08:00 |
|
claude_dev
|
992f53d4db
|
feat(trader): Phase2—vnpy_qmt 进程内执行客户端,替 HTTP bridge
- qmt_gateway_client.py: QmtGatewayClient(同 BridgeClient 接口 place_order/
get_account/get_positions/get_orders/cancel_order),底层进程内 QmtGateway 直连
miniQMT(单例 _QmtExec: EventEngine+QmtGateway+账本缓存,懒连接复用)。
实证:连真实 miniQMT 读账户(9997081)+持仓(600000/000001),place_order 落单 QMT.xxxxx#1。
- live_orchestrator.py: _make_exec_client 工厂,SANGUO_USE_QMT_GATEWAY=1 → QmtGatewayClient
(bridge 已退),否则 HTTP bridge 兼容。shadow + reconcile 两处替换。
同机部署后 HTTP 跳无必要,brain→vnpy_qmt→xtquant→miniQMT 零跳直链。
bridge+sanguo-caddy schtasks 可 disable(vnpy_qmt 路径已实证)。
|
2026-07-15 18:57:20 +08:00 |
|
claude_dev
|
2b26174977
|
feat(ops): NAS→VPS 数据同步脚本(Mac中继,符dev→prod)
sync_nas_to_vps.sh: 同步质量验证日线(raw+qfq parquet)NAS→VPS via Mac
(光猫拦直连)。符号可配置(默认模拟账户持仓600000/000001),幂等(rsync --update),
前缀规则对齐 bridge_client.to_bridge_code。已验证:24文件落地VPS结构正确。
验证通过→Mac cron每日收盘后跑=生产数据管道。
|
2026-07-15 13:56:23 +08:00 |
|
claude_dev
|
3ef8c617f0
|
feat(deploy): VPS原生大脑部署—env覆盖配置+部署文档(Option B落地)
- sanguo_data/config.py: load_config 加 env 覆盖(SANGUO_DATA_ROOT 重映射
daily/raw/qfq/15min/vnpy_db;SANGUO_LIVE_ENABLED/SANGUO_BRIDGE_URL 覆盖 live 段),
三机共用一份 git config 零漂移
- sanguo_api/main.py: build_app 加 SANGUO_DB_PATH/SANGUO_FILE_PATH env 覆盖
- docs/deployment/vps-native-brain.md: VPS原生部署全记录(安装/配置/服务/验证/
数据staging/Phase2暂缓理由)
实证:VPS vnpy4.4.0+vnpy_qmt0.3.3 连真实miniQMT读真实账户/持仓;
live_step全链路+影子transport(本机bridge)通过。详见文档。
|
2026-07-15 12:55:58 +08:00 |
|
claude_dev
|
c66f7cb14e
|
chore(deps): 锁三机统一依赖基线(Python3.10+pandas2.3/numpy2.2新稳定版, requirements-lock.txt)
依据:
- vnpy 4.4.0 pyproject: numpy>=2.2.3 / pandas>=2.2.3(均无上限,不钉<3)
- pandas 目标=2.3.3(2.x 稳定线顶端,3.0 破坏性变更未回归,按稳定优先不采用)
- numpy 目标=2.2.6(与 TA-Lib 0.6.8 在 NAS 生产容器实证兼容)
- 其余依赖==钉到 NAS 容器已验证可跑版本(fastapi 0.139/uvicorn 0.49/polars 1.42 等)
- Python 3.10 三机统一基线(xtquant 限 3.6-3.12,VPS 锁 3.10)
- 不含 vnpy(源码引用)/ xtquant(VPS Windows only)/ CUDA(torch 传递依赖)
- 矩阵文档新增「锁定决策(2026-07-15)」小节:依据+迁移步骤+验证前置
- 验证前置:落生产前须全套 pytest 0 回归 + 一个 CTA 回测冒烟
|
2026-07-15 08:12:40 +08:00 |
|
claude_dev
|
e3b688354f
|
fix(data): data_platform硬化(增量merge/verify+raw_redownload/run_daily_update)+测试
merge_increment/verify_increment 增量staging→验证→合并工具; raw_redownload/run_daily_update/import_vnpy_daily 强化; 补 data_platform 与 index_downloader 测试.
|
2026-07-15 07:12:46 +08:00 |
|
claude_dev
|
54f9ab4c4f
|
docs(deploy): VPS生产runbook+三机环境矩阵+NAS ops脚本+修rsync危险命令
vps-production-runbook(VPS运维一站式,已验证状态+拓扑+发布流水线+人类闸口+排障); env-version-matrix(三机Python/deps矩阵+Lock建议); scripts/ops(NAS bridge探针-容器无curl-+VPS→NAS备份脚本); nas-deploy-plan§3(修rsync --exclude语法,原会删万级staging parquet+破坏entrypoint启动).
|
2026-07-15 07:12:46 +08:00 |
|
claude_dev
|
8c06ef1e53
|
feat(bridge): 补 /orders+/cancel 端点与客户端(实盘查委托/撤单)
bridge.py: POST /cancel + GET /orders; xt_gateway: query_orders/cancel_order(含xtquant状态映射50挂单/56已成/57拒单/54撤单); bridge_client: get_orders/cancel_order. 已在 VPS 生产验证.
|
2026-07-15 07:12:46 +08:00 |
|
claude_dev
|
0761342baf
|
feat(trader): live bridge token 改从 config 读取,免容器重建
容器 docker run(非 compose)注入 BRIDGE_TOKEN env 需重建容器,风险大。改为 live_cfg.bridge_token 优先、fallback BRIDGE_TOKEN env。run_live_step 每次 load_config,改 config 免重启即生效。
- _shadow_trades_to_bridge + reconcile_from_bridge 两处 token 读取
- config: live.bridge_token 占位空值(真实值填 NAS gitignored config,不入库)
- tests: +6 测试(config优先/env fallback/都无跳过),191 passed
|
2026-07-13 19:30:58 +08:00 |
|
claude_dev
|
c041227139
|
chore: gitignore放行tests/data+docs/data(老坑data/误伤),补回硬化测试
data/ 规则匹配任意 data 目录,误伤 tests/data(硬化测试)和 docs/data(15min设计文档),
此前靠 git add -f 临时绕。加 !tests/data/ !docs/data/ 例外一劳永逸。
|
2026-07-13 11:59:39 +08:00 |
|
claude_dev
|
4b83452294
|
fix(data): backfill硬化—重登on-error/登录超时/断路器/marker-resume+冷却续跑watcher
首跑5yr 673/5493后baostock连接死、定时重连没恢复、登录卡死=被限流。修四个硬伤:
- 重登on-error: except分支强制bs.logout+login建新socket再retry(原只sleep重试同死socket)
- 登录超时: SIGALRM给bs.login套30s闹钟,防永久挂起
- 断路器: 连续30只failed→save_progress+break+exit 2,不再假完成空跑2000票
- marker-resume: load_progress扫.baostock marker文件(非done JSON),failed无marker永远重试
- watcher: 每30min探测baostock,可登就续跑,冷却就等,exit 0则退出
9/9单测绿(Mac venv311 mock baostock)。
|
2026-07-13 11:56:23 +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
|
292de31eaf
|
perf(data): backfill支持--shard/--total分片并行(6-worker,39h→6h)
|
2026-07-12 09:15:12 +08:00 |
|
claude_dev
|
d77e1ff7a1
|
fix(data): backfill脚本参数化NAS_ROOT/BS_START_DATE(Mac/NAS+5.5yr兼容)
|
2026-07-12 08:57:15 +08:00 |
|
claude_dev
|
cf4b3a2cb0
|
feat(data): 15min数据补全—路径参数化+cron入口+回填+设计文档
- download_minute.py: STOCK_ROOT环境变量参数化(Mac/NAS兼容); 修tencent备源amount聚合 last→sum
- refresh_15min_daily.py: 新建cron入口(交易日判断baostock/直连pop代理/日志)
- 回填470缺口(170 SH/SZ成功, 300 BSE源不支持)
- docs/data/15min-data-design.md: 15min数据层设计文档(源/覆盖/脚本/刷新/约束/路径映射)
|
2026-07-12 08:26:30 +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
|
0c7b030773
|
fix(charts): 回测结果5图canvas宽度仅100px被压扁
根因: useChart 在 onMounted 调 echarts.init 时, 容器(在 el-tab-pane 内)尚未拿到
真实宽度 → canvas 用默认 100px; 且 setOption 后从不 resize, 数据异步到达后 canvas
仍停在初始窄宽 → 5 条曲线全被压成窄条。
修复(useChart 一处, 全部图表受益):
- setOption 后调 chart.resize() (数据到达时容器已布局, 同步真实宽度)
- 加 ResizeObserver 监听容器尺寸变化 (兼容 init 偏早 / tab 切换 / 窗口缩放)
- ensureChart() 懒初始化兜底
验证: canvas 宽 100→830px(满宽), 5 图横向铺满曲线正常
|
2026-07-11 23:16:05 +08:00 |
|
claude_dev
|
a8105264cd
|
fix(layout): 顶栏被挤成窄条、用户区跑到中央不在右上角
根因: Layout 内层 <el-container> 用原生 <header>(非 <el-header>),
element-plus 不会自动转纵向 → flex-direction 保持 row, header 与 el-main
横向并排, header 被挤成 308px 窄条(应满宽 ~992px), 用户区(头像/用户名/登出)
随 justify-content 落到屏幕中央, 不在右上角。
修复:
- 内层 <el-container direction="vertical"> 强制纵向 → header 回到顶部满宽栏,
el-main 在下; 用户区回到右上角
- 顶栏静态口号 "投研·回测·模拟 控制台" 换成动态面包屑(分组/页名, 按路由推断)
|
2026-07-11 22:53:04 +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
|
41a788c431
|
feat(frontend): P2全平台聚宽级复刻—模拟盘/因子/回测表单页重做+模拟盘列表页
模拟盘模块:
- 新增模拟盘列表页(List.vue):统计行+富表格(名称/模式/频率/收益/最新净值/状态/操作)+搜索筛选
- 后端加 GET /paper 列表端点(类比 GET /task,带最新净值+收益率)
- paper/New 分区富表单(卡式模式选择+频率+撮合时点说明)
- paper/Result 重做(收益/年化/回撤/夏普/波动指标卡+净值曲线+归因表+成交明细,净值客户端算指标)
因子模块:
- factor/Result 重做(最优ICIR/平均IC/显著数指标卡+彩色IC表+tears报告tab化)
- factor/New 重做(因子按类分组多选+标的批量+实时计数)
回测模块:
- backtest/Progress 重做(步骤时间线+进度条+实时日志尾3s刷新)
- backtest/New 重做(策略/参数/标的区间/基准分区富表单)
- backtest/Optimize 重做(结果列头可排序+Top1高亮+按收益默认降序)
- History 迁移scoped chip→全局chips.css(DRY清理)
全局:深色主题统一,复用 tokens.css + chips.css
|
2026-07-11 21:10:27 +08:00 |
|
claude_dev
|
e0d32c0d1a
|
feat(frontend): P1仪表盘首页(统计卡+快捷入口+最近任务)+全局chip样式+侧栏工作台入口
|
2026-07-11 20:45:57 +08:00 |
|
claude_dev
|
d52db7f00c
|
feat(frontend): P0样板—历史任务页聚宽级重做(计数+类型筛选+状态色chip+搜索+分页+刷新)
|
2026-07-11 19:37:17 +08:00 |
|
claude_dev
|
b2ee9f7341
|
fix: 深链SPA fallback(刷新/收藏结果页不再404) + 新建回测加基准选择器(hs300/zz500)
|
2026-07-11 16:20:41 +08:00 |
|
claude_dev
|
9a0b2f6131
|
fix(frontend): MetricCards格式化null-safe—退化指标NaN→null不再崩toFixed(显'—')
|
2026-07-11 16:10:22 +08:00 |
|
claude_dev
|
0cee8353fe
|
deps: baostock加入requirements-docker.txt—持久化(容器重建不丢沪深300下载能力)
|
2026-07-11 16:05:39 +08:00 |
|
claude_dev
|
f1fc18bc86
|
feat(backtest): 补全第5图VolatilityChart—metrics加rolling波动率时序+risk-series端点+前端接入(凑齐聚宽5图全套)
|
2026-07-11 15:03:30 +08:00 |
|
claude_dev
|
468f5829b9
|
fix(data): baostock参数 adjustfield→adjustflag(真实参数名)
|
2026-07-11 15:00:05 +08:00 |
|
claude_dev
|
4ea740083a
|
fix(data): index_downloader baostock error_code判断修(真实为'0'非'success',容两者)——mock与真实baostock分歧
|
2026-07-11 14:59:34 +08:00 |
|
claude_dev
|
21dd30969f
|
fix(api): _get_metrics_file_path 两步查找(直查task_id→回退result.task_id)—兼容单测直查与API的uuid文件名
|
2026-07-11 14:48:35 +08:00 |
|
claude_dev
|
5e1ea6efa1
|
fix(api): _get_metrics_file_path 先解析 result.task_id(uuid)—修 runner task_id≠文件名 task_id 导致 benchmark-curve/risk-series 404
|
2026-07-11 14:43:08 +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 |
|