从"回测好看"到"实盘敢用"的最后一公里:信号 → 风控 → 执行 → 复盘,以及一台能跑的风控检查器
一张完整的执行闭环架构图:你的前七课组件(数据、情绪 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% |
两个细节值得停下来看:
execute()),后续指令在新状态上检查。实盘风控就是这样一条一条往下走的。脚本顶部三个常量 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 里的目标对齐):
凭记忆作答——答错比答对更能加固记忆。
打开scripts/risk_check.py,把MAX_SINGLE_POSITION改成0.30重跑,看场景一哪条指令的裁决发生变化、为什么。然后在场景一加一条 ST 股(名字里带 "ST")的交易指令,验证幅度表自动切换成 5%——想想为什么 ST 股的风控意义远不止幅度小。
第 9 课 · 美股与加密货币对照:T+0、无涨跌停、7×24 小时的市场里,本课这套风控框架哪些照搬、哪些必须重写——看清 A 股规则到底是束缚还是保护。
有任何不清楚的地方(比如熔断的实现、涨跌停幅度表、QMT 开户门槛),直接问我——我是你的老师。