Files
sanguo_vnpy_v2/docs/spec_quant_terminal_redesign.md
claude_dev 5c8a7e12c6
CI/CD / test (push) Successful in 18s
CI/CD / nas-deploy (push) Failing after 17s
CI/CD / nas-verify (push) Has been skipped
feat(frontend): 终端化重构+策略管理(代码→实例→4运行)+撮合设计+回测参数 [nas]
- 终端化: 科幻色板(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

18 KiB
Raw Permalink Blame History

三国量化研究台 · 终端化重构 Spec

范围:前端视觉/功能改造 + 后端引擎适配 + 模拟实盘功能改造 制定:前后端 session · 2026-08-12 · 状态:待评审


1. 背景与目标

现状:功能骨架齐全(回测/组合/优化/因子/模拟/实盘/Dashboard),视觉停留在 GitHub Dark 工具风——信息密度低、无命令面板、分析深度停在 P0 基线、组合策略只回测得了跑不了模拟实盘。

目标:重做为科幻量化终端(深空黑+荧光青+琥珀),对标 Bloomberg/Wind 终端 UX + QuantConnect 分析深度,组合策略贯通 backtest→paper→live。

三大改造

  1. 前端终端化(视觉 + 功能补齐 + 多面板)
  2. 组合策略引擎贯通模拟/实盘(适配层接入)
  3. 模拟实盘功能完善(组合/多账户/多策略同账户)

2. 核心原则(不可违背)

# 原则 说明
P1 vnpy 是适配不是改造 vnpy_v4.4.0/ 为上游源码,零改动CTA 侧通过子类化适配层(ashare_engine.py 模式)扩展。验收:git diff vnpy_v4.4.0/ 恒为空
P2 组合策略为主线 选股+择时+调仓+风控一体(bullet_trade 聚宽风格)是产品重心;未来加 AI 辅助、多策略同账户
P3 CTA 不淡化 所有功能 CTA/组合都做,CTA 优先级靠后。关注同功能下两者实现分歧,一套代码覆盖优先
P4 miniQMT 只管交易 下单通道与策略引擎解耦,CTA/组合共用 QMT;策略差异在引擎层不在 QMT 层
P5 自研可改、上游只适配 bullet_trade/sanguo_trader/sanguo_live/sanguo_qmt_bridge 是自研可改;vnpy 是上游只适配

3. 现状基线(改造起点)

3.1 引擎层

引擎 归属 backtest paper 模拟 live 实盘
vnpy CTAashare_engine 适配) 上游·只适配 per-symbol 单标的
bullet_trade 组合 自研·可改 runner_live 有 / web 接入层缺
sanguo_trader 自研撮合 自研·可改 paper 用
sanguo_qmt_bridge 自研·可改 QMT 下单通道(共用)

3.2 前端层

  • 回测:New/Progress/Result/History/Optimize/PortfolioBacktest
  • 模拟:paper(New/List/Result/Live) · live(New/List/Monitor)
  • 设计系统已变量化(CSS tokens + echartsDark)→ 换肤友好

3.3 模拟实盘 3 种运行方式

方式 引擎 数据源 撮合 策略范式
① paper-replay 回放 自研撮合 历史 parquet 快速重放·立即出结果 CTA per-symbol+组合待加)
② paper-live 实走 自研撮合 日终 parquet 每日定时 step·checkpoint 续跑 CTA+组合待加)
③ live-miniQMT 实盘模拟 QMT 直连 QMT 实时行情 券商模拟账户真实下单 CTA 单标的(+组合 runner_live 待接入)

4. 前端改造

4.1 视觉语言(科幻终端)

  • 色板:深空黑 #05080d + 荧光青 #00e5ff(主强调)+ 琥珀 #ffb000(数据高亮)+ 红涨 #ff4d5e/绿跌 #2ee68a
  • 字体:等宽数据字体(全局 tabular-nums+ 无衬线正文
  • 元素:1px 网格底 / 信号灯(绿运行·琥警告·红 critical)/ 扫描线 / 几何角标(无 emoji)/ 直角·2px 圆角
  • 落地:CSS 变量层换肤,不改 Element Plus 组件结构,全站一次性换肤
  • 参考:提案页 docs/frontend_terminal_redesign_proposal.html(已验证视觉)

4.2 功能补齐(回测结果页,CTA+组合共用一套)

功能 优先级 说明
月度收益热力图 / 每日收益柱状 / 回撤 Top5 / 收益分布 P0 QuantConnect 标杆
指标卡补齐:胜率/盈亏比/换手率/PSR P0 现 11 项缺这 4 个
净值图超额线 + brush 缩放 P0 现仅策略+基准两线
克隆重跑 / 导出报告(Excel/PDF) P0 效率闭环
Cmd+K 命令面板 / 所有表导出 P0 终端 UX 共识
多回测对比页 / Rolling Sharpe·Beta P1 差异化
参数优化热力图·3D 曲面 / 选股→回测→归因闭环 P1 vnpy 只有表格,超越
Crisis Events 压力测试 P1 QuantConnect 独占
Brinson/Barra 归因 / 多面板可拖拽 / 股票智能补全 P1 专业化
AI 策略助手 / 无代码策略生成器 / 社区广场 / Bar Replay P2 长期

4.3 页面改造

  • 结果页:单列堆叠 → 多面板终端布局(指标塔 + 主图 + 回撤 + 月度热力 + 持仓信号 + 交易 ticker),一屏高密度
  • 模拟盘/实盘监控:科幻风监控台(状态灯 + 实时净值 + 持仓 + 信号 + 告警 + 下次运行时刻)
  • 多账户/多策略:多账户管理列表 + 一账户多策略分策略展示
  • 组合策略创建入口:新建回测/模拟/实盘时能选组合策略 + 股票池(不只是 CTA 类名 + 单 symbol

5. 后端改造(引擎适配层)

原则 P1/P5vnpy 只适配不改源码;bullet_trade/sanguo_trader/sanguo_live/sanguo_qmt_bridge 自研可改

5.1 任务 A — 组合 paper 模拟

  • 目标:组合策略能跑模拟盘(replay 回放 + live 实走)
  • 方案bullet_trade 接入 sanguo_trader/matcher(自研撮合),复用 paper 的 checkpoint / 跨日 pending 机制
  • vnpy:不涉及(纯自研引擎链路)

5.2 任务 B — 组合 live 接入 web

  • 现状sanguo_portfolio/runner_live.py 引擎就绪(bullet_trade LiveEngine + QmtBroker + AllWeather),但未接 web
  • 方案
    • sanguo_live/supervisor 识别"组合账户"类型 → 起 bullet_trade LiveEngine(非 vnpy engine
    • 新建 sanguo_api/routes_portfolio_live(创建/启停/监控组合实盘)
    • 前端组合实盘入口 + 监控台
  • 下单:复用 QmtBroker/miniQMT不碰 QMT 适配层
  • vnpy:不涉及

5.3 任务 C — 多策略同账户 + 多账户

  • 多账户:架构已支持(live_accounts 表每行一账户 + per-account mini_path)→ 多行记录 + 多 miniQMT 客户端实例;待 VPS 实测单机并行实例数
  • 多策略同账户supervisor + engine 支持一账户多策略路由 + 资金/持仓隔离
  • 前端:多账户管理 + 一账户多策略视图

5.4 CTA 侧(适配层,不改造 vnpy)

  • CTA paper/live 继续走 ashare_engine / vnpy 适配层
  • 功能补齐(同组合)通过适配层扩展,vnpy_v4.4.0 源码零改动

5.5 CTA vs 组合实现分歧(评估)

功能 分歧 处理
backtest 各有引擎,已就绪
paper 撮合 组合接 matcher
live web 接入 组合接 supervisor+routes
下单通道 共用 miniQMT
结果分析/监控/导出 一套组件 CTA+组合共用P5 一套优先)

6. 模拟实盘功能改造目标

目标 现状 改造后
组合策略跑模拟 paper-replay + paper-live
组合策略跑实盘 runner_live 有、未接 web web 创建/启停/监控
多账户 架构支持、未暴露 多账户管理 UI
多策略同账户 一账户多策略 + 隔离
监控视觉 朴素 科幻风监控台
结果分析 基础 复用回测深度(月度/归因/Top5

7. 路线图

Sprint 内容 风险 优先级
S1 视觉层 CSS 变量换肤全站 + 结果页科幻样板 即时
S2 结果页重构 + P0 功能 多面板布局 + 月度/Top5/每日收益 + 指标补齐 + 克隆/导出/Cmd+K
S2.5 策略管理 菜单重构(策略+账户两组) + 策略配置CRUD(类+参数+标的 命名预设) + 策略在线代码编辑(Monaco+热重载) 高·已启动
S3 组合贯通模拟实盘 任务 A(组合 paper+ B(组合 live 接 web)+ C(多账户/多策略前端) 中高 高(组合主线)
S4 P1 差异化 多回测对比 + Rolling + 优化可视化 + 选股闭环 + Crisis + 归因 + 多面板拖拽
S5 P2 选型 AI 助手 + 无代码策略 + 社区 + Bar Replay 长期
CTA 并行 各 Sprint CTA 侧同步(适配层),优先级靠后 P3 靠后

8. 职责与依赖

Session 职责
前后端(本 session 前端全部 + 后端引擎适配(A/B/C)+ CTA 适配层 + Spec/路线图
数据 组合策略所需数据/因子(归因数据、风格因子)
策略 策略逻辑(all_weather 等 bullet_trade 策略本身)
基建 CI/CD/部署(commit 标 [vps]/[nas]NAS 自动/VPS dispatch

引擎改造归属已记 memoryportfolio-engine-paper-live-ownership.md(防职责混淆)


9. 验收标准

  • 视觉:全站科幻终端风;结果页一屏多面板(对标提案 mockup)
  • 功能:P0 全齐;CTA 与组合共用一套结果分析组件
  • 组合贯通:组合策略能 backtest → paper(replay+live) → live(miniQMT) 全链路
  • 模拟实盘:3 种方式都支持组合 + 多账户 + 多策略同账户
  • 原则 P1git diff vnpy_v4.4.0/ 恒空(vnpy 零改动)
  • CTA:功能不退化,同组合功能,优先级靠后

10. 待评审决策点

  1. spec 整体方向认可吗? ——>认可
  2. S1 先做(视觉换肤 + 结果页样板)作为第一步? -> 没问题,所有页面都给我一个样板,假的数据带页面跳转即可
  3. 多账户多 miniQMT 实例数 → 安排 VPS 实测时机?-> 作为一个长期todu就行,现在不需要
  4. 归因(Brinson/Barra)放 S4,还是要提前(依赖数据 session 的风格因子数据)? -> 可以放s4

11. 菜单结构(2026-08-12 定稿)

用户决策:在现有 5 组基础上加「策略」「账户」两组,最小破坏现有分组。

工作台
策略            ← 新增
  ├ 策略库          策略配置 CRUD(列表/新建/编辑/删除)
  ├ 新建策略
  └ 代码编辑        策略在线代码编辑(Monaco)
回测
  ├ 新建回测 / ├ 组合回测 / ├ 参数优化 / └ 历史任务
投研
  └ 因子分析
模拟
  ├ 模拟盘列表 / └ 新建模拟盘
实盘模拟
  ├ 实盘列表 / └ 新建实盘
账户            ← 新增(多账户/多 miniQMT 统一视图)

12. 策略管理(2026-08-12 增补)

两层管理,对象与工作量不同:

12.1 策略配置 CRUD(参数层)

  • 对象:策略类 + 参数 + 标的/池 + 基准 的命名预设(如"茅台双均线(10,30)"
  • 痛点:当前每次回测/模拟现选现填、跑完即丢;CRUD 让配置可命名/复用/一键发起回测·模拟·实盘
  • 后端strategies 表(id/name/strategy_class/params JSON/symbol_or_pool/benchmark/interval/remark/created_at) + 5 路由(list/create/update/delete/duplicate),复用 strategy_registry 校验类名。纯自研,不碰 vnpy
  • 前端:策略库列表(卡片) + 新建/编辑表单(选类自动载入参数) + 各 New 页"从已存策略载入"
  • 工作量~1-2 天 状态 前端完成(mock) / 后端待做(task16)

12.2 策略在线代码编辑(代码层)

  • 对象:策略 Python 代码本身(.py 文件)
  • 边界(P1 原则):只编辑自研策略sanguo_trader/strategysanguo_portfolio/strategiessanguo_live/strategies);不编辑 vnpy 上游包vnpy_ctastrategy/strategies 属适配不改造红线)
  • 方案Monaco EditorVSCode 同款)+ 文件树 + 语法校验(py_compile) + 保存 + 模板新建
  • 架构利好:回测走 ProcessPool spawn(每次新进程)→ 改完代码下次回测自动加载最新,天然热重载,无需处理 Python reload 缓存
  • 安全:单用户内部研究台,py_compile 校验 + 进程超时 + ProcessPool 隔离崩溃即可,不需沙箱
  • 层次:①只读查看(~0.5天) / ②在线编辑(~2.5-3天) / ③无代码生成(~1-2周·P2)
  • 工作量(②)Monaco 集成 ~1.5天 + 后端文件 CRUD ~0.5天 + registry 扩展扫描自研目录 + 模板 ~1天
  • 状态📋 本轮先做前端原型(Monaco mock)供体验,后端待体验后定

12.3 决策记录

  • 策略 CRUD 对象 = 策略配置实例(非代码类)
  • 菜单 = 加「策略」「账户」两组(保留现有分组)
  • 在线编辑 = 先前端原型体验,再定是否上后端
  • 多账户多 miniQMT 实例数实测 = 长期 todo(不阻塞)

12.4 业界调研结论(2026-08-12 · 7 平台 agent 调研)

调研聚宽/米筐/掘金/QuantConnect/Quantopian/Alpaca/VnPy,核心结论:

  1. 策略 = 代码(6/7 一致,Alpaca 无策略层)。本轮"策略=代码"重做方向正确。
  2. "先建策略 → 再发起回测/模拟/实盘"是唯一主流模式(6/6)。回测/模拟/实盘是策略的运行模式,不是独立顶层对象。没有一家用"回测页直接填配置"。
  3. 🔑 两层模型(VnPy 范式,推荐采纳):策略类(代码)+ 策略实例(setting 参数 dict)。
    • 顶层 = 策略类列表(从 strategies/ 自动发现)
    • 二级 = 该类下的实例(每组参数 + 标的/池 = 一个实例,VnPy strategy_name
    • 每实例一键:回测 / 模拟 / 实盘
    • 这正是"编辑策略=编辑参数"纠结的正解:参数属于"实例",不属于"策略代码",也不该独立叫"策略"
  4. 新建策略分流:业界按资产类别(股票/期货/加密)分流,不按组合/CTA。本项目按"组合/CTA 范式"分流(A股组合 vs CTA 差异大),是合理的本地化,保留。
  5. 参数归属:策略专用参数(快慢线/持仓数)绑策略类(parameters=[] 反射生成 UI 输入框);回测运行配置(日期/资金/基准/频率/滑点/手续费)独立,每次可改。

组合策略 UI 配置项清单(业界共识):

  • 实例参数层:选股池/Universe、调仓周期(日/周/月)、持仓数 Top-N、仓位算法(等权/风险平价)、风控(止损%/止盈%/单标的最大仓位%)、策略专用参数(反射 parameters
  • 运行配置层:初始资金、起止日期、基准、频率、滑点、手续费
  • 不配置化(留代码):选股逻辑、因子计算、下单触发条件

修正:当前重做(S2.5)只做了"策略类(代码)"第一层;应补**"策略实例"第二层**(策略类下创建多组参数实例,每实例一键回测/模拟/实盘)。待用户确认后补。

12.5 最终落地设计(2026-08-12 定稿 · 已实现前端 mock)

策略管理「三层 + 4 运行全生命周期」:

策略代码(.py · 编辑代码)
  └ 策略实例(参数变体 + 标的/池)
      ├ [回测]       历史全量 · 秒出 · 验证逻辑
      ├ [模拟·回放]  历史 parquet · 快速重放 · 验证撮合/滑点
      ├ [模拟·实走]  日终 parquet · 每日推进+断点续跑 · 模拟真实节奏
      └ [实盘]       miniQMT · 真下单(券商模拟/真账户)

命名定稿(消除撞名):

  • 回测(不变)
  • 模拟盘 = 原"模拟"(自研撮合,不走 QMT),内含 回放/实走 两 mode
  • 实盘 = 原"实盘模拟"miniQMT 真下单;"实盘模拟"撞名已删)

菜单最终:工作台 / 策略(策略库·新建策略·代码编辑) / 回测 / 投研 / 模拟盘 / 实盘 / 账户

策略库 UI(已实现):按策略代码分组,每组下列实例;每实例一行 = 参数摘要 + 标的/池 + 最近收益 + 4 运行状态灯(已测/运行/已停/—) + 一键发起按钮。代码无实例时提示"编辑代码后可创建"。

业界「策略=代码+实例」两层 + 「先建策略→再发起运行」模式,全部落地。后端待补:策略代码文件 CRUD + 实例 CRUD + 各运行入口接实例参数。

13. 撮合机制与回放设计(2026-08-12 定稿)

13.1 撮合频率原则(理论硬约束)

撮合频率 = 策略决策频率。撮合 < 决策频率 → 丢信号 + 价格失真。业界(聚宽 run_minute / vnpy on_bar / backtrader cerebro)均逐 bar 撮合,没有"统一日级"的设计

用户选 3 样,撮合频率由它们推导,不独立选(避免矛盾配置如"15m策略+日终撮合"):

  • interval(数据频率 d/15m)— 决定决策频率
  • match_session(撮合时点:开盘价/收盘价/集合竞价)
  • 运行模式(回测/回放/实走/实盘)

13.2 撮合频率 = interval × 运行模式

运行模式 撮合频率 适合策略
回测 / 回放 = interval(逐历史 bar 全频率
paper 实走 固定日级(日终一次) 只日线
实盘(miniQMT 实时(行情驱动) 全频率(含分钟盘中)

两路分工:日线策略 → paper 实走(日终低成本模拟);分钟策略 → miniQMT 实盘(盘中实时)。paper 实走为日线设计,分钟策略不该迁就它。UI 校验:分钟策略(interval=15m) + paper 实走 = 不匹配,提示引导到 实盘/回放。

13.3 回放设计

回放 = 历史数据按选定 interval 逐根 K 线快速重放 + 自研 A 股撮合

  • 精度 = interval:日线 = 每天 1 撮合点;15m = 每天 ~16 点(每根 15m bar 撮合)。选 interval 即选撮合频率
  • 逐 bar 流程:撮合上根 pending → 喂 on_bar 算信号 → 新单按 match_session 当根/下根撮合 → 记账 + 涨跌停封板/最小手数/滑点/费率/T+1 校验。
  • 速度:本地历史毫秒级/根,一段历史秒~分钟跑完,立即出结果。
  • vs 回测:回放用自研 A 股精细撮合(封板/集合竞价/滑点/T+1),比 vnpy 回测更贴近实盘真实发生。
  • 数据精度:当前支持 d / 15mbaostock 5.5 年 15m);1m / 5m 待数据源补齐后扩展

13.4 标的 / 池控件(按策略 type)

  • CTA(单标的):股票代码输入框 + 智能补全
  • 组合池选择框(沪深300 / 中证500 / 中证1000 / 中证2000 / 全市场 / 自定义成分),不手输