第 8 课 · 执行闭环架构

从"回测好看"到"实盘敢用"的最后一公里:信号 → 风控 → 执行 → 复盘,以及一台能跑的风控检查器

预计用时:40 分钟 上一课:第 7 课 · Agent 辅助写策略

这节课你将得到什么

一张完整的执行闭环架构图:你的前七课组件(数据、情绪 Agent、策略、监控)分别住在哪一层,它们怎么连成一台能辅助实盘的机器。以及一台纯离线的风控检查器 scripts/risk_check.py:输入账户持仓和拟下单指令,逐条裁决"放行 / 拦截"并给出理由——单票仓位、总仓位、单日熔断、T+1 冻结、涨跌停,五条硬规则全部落成代码。

最后是落地路径的选型课:聚宽模拟盘、vn.py、券商 QMT / PTrade,各自的门槛、合规要求和适合的阶段。看完你就知道从现在的位置到第一笔实盘,中间还有几步、每步花多少钱。

一、执行闭环:四层架构

把你过去七课学的东西摆进一张图:

① 信号层   策略 / 情绪 Agent 产出"拟下单指令"(只有建议权)
     │
     ▼
② 风控层   五条硬规则,独立模块,逐条裁决:放行 or 拦截(有否决权)
     │
     ▼
③ 执行层   券商接口:模拟盘 → 小资金实盘 → 实盘(人工确认可介入)
     │
     ▼
④ 复盘层   成交记录、盈亏归因 → 反馈给 ① 修策略、给 ② 调规则
住户你已经有的组件
① 信号层双均线策略、新闻情绪打分、异动监控第 3、4、6、7 课的脚本——它们的产出统一收敛为一种东西:拟下单指令(买/卖、代码、数量、价格)
② 风控层本课的风控检查器今天新装上的闸门。注意它的位置:夹在信号和执行之间,所有指令无论来自策略、Agent 还是你自己的手滑,都必须过它
③ 执行层券商交易接口本课第五节专门讲:模拟盘先行,实盘走 QMT / PTrade / vn.py
④ 复盘层成交记录、盈亏归因盘后运行——这正是你的 Agent 辅助决策系统的正确形态(第 4 课就说过:盘后分析 → 次日计划,T+1 制度下盘中瞬时反应没有优势)

新手搭系统最容易犯的错,是把这四层揉成一个大脚本:策略算出信号就直接下单。短期省事,长期致命——因为没有任何一层拥有否决权。下面第二节讲为什么,第三节把否决权造出来。

二、为什么风控必须独立于策略代码

回到第 4 课的活例:双均线策略在茅台 2024 年真实数据上,8 笔交易 7 亏 1 赚,胜率 12%,全年 -23.79%。当时我们讨论的是策略失效;今天换个视角:如果这套策略连着实盘、并且仓位决策也归它自己管,会发生什么?

风控的工程形态:物理隔离的否决权

独立的意思是:风控模块不 import 策略代码、不被策略 import,只接收标准格式的拟下单指令,返回"放行 / 拦截 + 理由"。策略想让一笔单子过关,唯一的办法是让这笔单子本身合规——没有后门、没有"这次例外"。参数(20%、90%、2%)写在风控侧的配置里,改它们是一次严肃的决策,而不是策略迭代时顺手的一行 diff。

三、动手:跑风控检查器

脚本 scripts/risk_check.py 纯离线,账户与指令全部内置——能离线就离线,免费接口会挂的道理不用再强调。逐行复制:

cd "$HOME/AI Project/Quant Learning"
source .venv/bin/activate
python scripts/risk_check.py

你会看到(我已在你的环境实测通过,以下为真实运行结果):

==============================================================
风控检查器 · 五条硬规则
  ① 单票仓位 ≤ 20%   ② 总仓位 ≤ 90%   ③ 单日亏损达 2% 熔断
  ④ T+1 冻结股不可卖  ⑤ 涨跌停不可成交(按板块幅度表)
==============================================================

【场景一:正常账户】
账户快照:总资产 1,000,000    现金 248,800    持仓市值 751,200(仓位 75.1%)
今日盈亏:+30,200(+3.02%),未触发熔断

  代码    名称          持仓    可用      现价      昨收     今日
  600519  贵州茅台       100     100  1,242.00  1,380.00   -10.0% [跌停]
  300750  宁德时代       800     800    240.00    200.00   +20.0% [涨停]
  000001  平安银行    10,000       0     12.00     11.50    +4.3%
  601318  中国平安     3,000   3,000     45.00     44.00    +2.3%
  000002  万 科A      20,000  20,000      9.00      8.80    +2.3%

指令 #1:买入 600519 贵州茅台 100 股 @ 1,242.00(金额 124,200)
  → 拦截|单票仓位将达 24.8%,超过上限 20%

指令 #2:买入 600036 招商银行 1,000 股 @ 35.00(金额 35,000)
  → 放行

指令 #3:买入 600900 长江电力 6,000 股 @ 28.00(金额 168,000)
  → 拦截|总仓位将达 95.4%,超过上限 90%

指令 #4:卖出 000001 平安银行 10,000 股 @ 12.00(金额 120,000)
  → 拦截|T+1 冻结:该票今日买入,可用 0 股,最早明日可卖

指令 #5:卖出 300750 宁德时代 800 股 @ 240.00(金额 192,000)
  → 放行

指令 #6:买入 300750 宁德时代 100 股 @ 240.00(金额 24,000)
  → 拦截|现价 240.00 已涨停(幅度 20%),买单无法成交

指令 #7:卖出 600519 贵州茅台 100 股 @ 1,242.00(金额 124,200)
  → 拦截|现价 1242.00 已跌停(幅度 10%),卖单无法成交

指令 #8:卖出 601318 中国平安 3,000 股 @ 45.00(金额 135,000)
  → 放行

场景一:正常账户小结:8 条指令,放行 3 条,拦截 5 条

【场景二:熔断账户】
账户快照:总资产 940,000    现金 600,000    持仓市值 340,000(仓位 36.2%)
今日盈亏:-21,600(-2.30%),已触发熔断

  代码    名称          持仓    可用      现价      昨收     今日
  600036  招商银行    10,000  10,000     34.00     35.50    -4.2%

指令 #1:买入 600036 招商银行 5,000 股 @ 34.00(金额 170,000)
  → 拦截|单日亏损 -2.30% 已达 2% 熔断线,今日禁止开新仓
  → 拦截|单票仓位将达 54.3%,超过上限 20%

指令 #2:卖出 600036 招商银行 10,000 股 @ 34.00(金额 340,000)
  → 放行

场景二:熔断账户小结:2 条指令,放行 1 条,拦截 1 条

==============================================================
复盘要点:策略只负责产信号;这五条规则说'不',不需要策略同意。
==============================================================

四、把输出读成规则:五条硬规则逐条对照

输出里每条拦截都对应一类真实世界里爆仓或违规的死法:

规则命中的指令防的是什么
① 单票仓位 ≤ 20%场景一 #1:茅台已占 12.4%,再买 12.4 万达 24.8%单票暴雷(黑天鹅、财务造假、连续跌停)直接击穿账户。分散是最便宜的保险
② 总仓位 ≤ 90%场景一 #3:放行了 #2 之后账户已 78.6% 仓位,再买 16.8 万达 95.4%满仓 = 放弃流动性。永远留现金缓冲,应对追加保证金之外的更朴素需求:生活、机会、心态
③ 单日亏损 2% 熔断场景二 #1:已亏 -2.30%,任何开新仓被拦状态最差的那天不让你做决策。注意 #1 命中了两条规则——检查器会列出全部命中项,方便复盘
④ T+1 冻结股不可卖场景一 #4:平安银行今日刚买入,可用 0 股制度红线(第 1 课)。这不是风控偏好,是交易所规则,委托了也会被废单
⑤ 涨跌停不可成交场景一 #6 涨停买入被拦;#7 跌停卖出被拦涨停时买单前面排着天量封单,跌停时卖单同理。按板块幅度表判断:主板 ±10%、创业板/科创板 ±20%、北交所 ±30%、ST ±5%

两个细节值得停下来看:

脚本顶部三个常量 MAX_SINGLE_POSITION / MAX_TOTAL_POSITION / DAILY_LOSS_CIRCUIT 就是你的风控配置。20% / 90% / 2% 是本课给的保守起点,不是标准答案——但它们应该写在这里,而不是散落在各策略代码里。

五、落地路径对比:从模拟盘到实盘

信号和风控都有了,第③层"执行"怎么落地?四条主流路径:

路径是什么门槛适合阶段
聚宽模拟盘在线量化平台(JoinQuant)的仿真账户,策略跑在平台云端免费,注册即用;不碰实盘资金,无报备问题你现在:策略验证期,先跑 2-3 个月仿真
vn.py本地运行的开源 Python 交易框架(VeighNa),社区最活跃的国产量化框架框架免费;但它是框架不是通道——A 股股票实盘仍需券商提供的接口/网关配合想掌控全链路的工程派:数据、策略、风控、执行全在自己机器上
券商 QMT(迅投)券商提供的专业交易终端,内置 Python 策略接口(miniQMT),是散户程序化交易的主流实盘通道多数券商设资金门槛(常见 50 万元,各家不同,问你的券商)实盘执行期:策略仿真跑稳、小资金验证之后
恒生 PTrade券商采购后提供给客户的云端量化平台,策略跑在券商机房同样有资金门槛,各行差异大同 QMT,二选一主要看你的券商支持哪家
合规红线:程序化交易"先报告、后交易"

证监会《证券市场程序化交易管理规定(试行)》自 2024 年 10 月 8 日起施行:程序化交易投资者须报告账户、资金、交易、软件等信息,先报告、后交易。走 QMT / PTrade 正规通道时券商会带你完成报告;真正要躲的是网上那些"免报备直连接口"——绕过券商和交易所监控属于违规,账户可能被封,别碰。

给你的路线建议(和 MISSION 里的目标对齐):

自测

凭记忆作答——答错比答对更能加固记忆。

动手挑战(可选,10 分钟)

打开 scripts/risk_check.py,把 MAX_SINGLE_POSITION 改成 0.30 重跑,看场景一哪条指令的裁决发生变化、为什么。然后在场景一加一条 ST 股(名字里带 "ST")的交易指令,验证幅度表自动切换成 5%——想想为什么 ST 股的风控意义远不止幅度小。

延伸阅读

下一课预告

第 9 课 · 美股与加密货币对照:T+0、无涨跌停、7×24 小时的市场里,本课这套风控框架哪些照搬、哪些必须重写——看清 A 股规则到底是束缚还是保护。

有任何不清楚的地方(比如熔断的实现、涨跌停幅度表、QMT 开户门槛),直接问我——我是你的老师。