一个量化系统怎样连续运行,还能在断网、重启和部分成交后保持安全?

持续运行的量化交易系统

约 10 分钟1 个动手实验4 道小题

学完你能说清楚持续运行的关键不是永不出错,而是状态可见、故障可控、恢复不重复下单。

01学完这一课,你能做到什么

学完这一课,你应该能:

  1. 把一次晨报改造成按周期运行的监测主循环;
  2. 分清后端、控制台和通知模块的职责;
  3. 设计事实状态、控制意图、心跳和分级告警;
  4. 处理断网、超时、部分成交、重启和重复信号;
  5. 在模拟环境里验收系统,而不是把“页面能打开”当成系统可用。

本课讨论的是面向真实执行的系统架构,不等于已经部署、授权或适合直接交易。

一句话记住先保证状态一致,再恢复交易。

02从一次晨报变成持续监测

晨报只在固定时间运行一次;持续系统则按周期读取行情、账户和信号。假设每 60 秒运行一轮,但周期要按策略和风险要求配置。服务全天在线,也不等于全天允许交易:必须区分交易日、交易时段、休市、集合竞价,以及日线或分钟线是否已经完成。

一轮主循环可以按这个顺序组织:

  1. 读取暂停、恢复和状态;
  2. 检查行情与交易连接;
  3. 刷新持仓、现金、可卖数量和盈亏;
  4. 检查账户级日内亏损是否触发熔断;
  5. 检查持仓、退出和到期条件;
  6. 遍历 watchlist(关注清单),计算每个标的的信号;
  7. 对拟议订单运行风控;
  8. 进入模拟执行,或进入已授权的审批与真实执行流程;
  9. 保存状态、信号、订单、事件和心跳。

暂停买入、全局暂停、强制熔断、解除熔断和清仓必须有不同语义。停止新增风险时,账户刷新和风险监测仍应继续。

持续运行的一轮循环
  1. 1读控制状态暂停/熔断
  2. 2查连接和账户行情/持仓/现金
  3. 3算信号并过风控只用有效数据
  4. 4执行并记录订单/事件/心跳

一句话记住在线不等于可交易,先检查时间和数据。

03后端、控制台和通知各做什么

后端负责数据、信号、风控和订单;控制台负责展示状态并提交人的控制意图;通知模块按严重程度传递事件。页面卡顿不应该拖住风险处理。

环境检查也属于系统边界:数据库、MiniQMT 本地路径、资金账号、模型接口、Python 和依赖版本,都应从实际配置与日志确认。".env.sample"只是配置示例,密钥不能放入课程或公共仓库。"0.0.0.0"表示监听本机所有接口,不是浏览器访问地址,也不代表可以安全地暴露到公网。涉及账户的控制台应认证并限制权限。

、模拟账户、策略对比、投研对话和晨会可以接入同一控制台,但各模块的状态和失败要可追踪。历史展示中的年化约 9.31%、 约 5.59%等数字,只能视为特定样本的展示,不能据此承诺某标的或策略长期有效。

一句话记住界面是观察和控制层,不是交易逻辑本身。

04共享状态:事实和意图必须分开

共享状态可以暂存在 "live_state.json",但字段要分成两类:

  • 事实:权益、现金、持仓数量和成本、最新价、盈亏、信号、订单、健康度和事件;
  • 意图:暂停、恢复、阈值修改等人的控制请求。

事实应由后端从可信数据源写入,网页只读;人的操作写入控制通道,由后端验证、执行并回报。前端不能直接把一个数字改成“真实余额”。每类数据还要明确唯一写入者、格式版本和保留策略。页面可以只展示最近 200 条事件,审计记录则应追加保存,不能因为界面有限就丢失历史。

模拟账户可以从 100 万元初始资金和可配置初始持仓开始,但模拟成交、排队、、部分成交、拒单、和延迟可能被简化,不能把模拟状态当成真实账户。

一句话记住事实由数据源确认,意图由后端执行。

05原子写能防半个文件,但防不了所有并发

写 JSON 时,可以先在目标目录附近写临时文件,完整写入并关闭后,再用合适的原子替换操作替换正式文件。这样读者不会看到只写了一半的 JSON;需要断电后仍可靠保存时,还要考虑 flush 和 fsync。

但原子可见性不等于多写入者安全。控制台和后端如果都读到旧版本,再分别写入新版本,仍可能互相覆盖。更稳妥的方案包括单写入者、文件锁、版本比较或数据库事务。文件轻量,数据库便于历史查询和事务;两者都需要明确并发边界。

两个不同问题

原子替换

避免读到半个文件。

并发控制

避免多个写入者互相覆盖。

一句话记住不读半个文件,不等于不会丢更新。

06五级事件:越严重,越少自动冒险

可以把事件按严重程度分为五级:

等级示例处理方向
L1 轻微单次拉取失败记录并有限重试,不用缺失数据下单
L2 信息信号产生、正常风控拒绝记录并聚合通知
L3 警告委托失败、可恢复错误核对状态后有限处理
L4 严重连接失效、行情停滞暂停新增交易并即时告警
L5 紧急进程退出、重大熔断保持安全状态,人工处置

订单回报超时,不能直接重试:订单可能已经被接受,必须先用唯一订单号核对。普通信息可以约 30 分钟聚合一批,严重事件不能等待聚合。通知发送成功也不代表问题解决。

一句话记住超时先查订单,严重先停新增风险。

07三处心跳,分别回答三个问题

心跳是定期写出的“我还活着、数据还新鲜”的信号:交易连接可以约 30 秒更新,行情可以约 1 分钟检查,主循环写自己的最新时间戳。三者必须分开显示。

主循环没有更新,可能是进程卡住;行情没有更新,可能是数据源失效;交易连接没有更新,可能无法查询或提交订单。对 60 秒循环,直接把“30 分钟没有更新”当成死锁阈值可能太迟,阈值要按风险设置。监控进程不能和被监控进程一起卡住,关键守护应独立。自动重启后,先核对账户和外部订单,再决定是否恢复交易。

三种心跳

交易连接

还能查账户和订单吗?

行情连接

价格和时间戳新鲜吗?

主循环

程序按周期运行吗?

一句话记住进程活着,不代表行情新鲜。

08策略注册、信号去重与模拟验收

策略实现负责算法,YAML 等配置负责给某个标的选择已有策略和参数;配置里新增名称,不会自动生成算法。新策略还要完成实现、注册、界面暴露和测试,运行中不能在没有版本记录和验证的情况下悄悄替换。

同一根日 K 在每分钟轮询时可能反复满足条件。应使用信号编号、信号时间戳和去重,让同一信号最多产生预期的一次动作。回测与实盘尽量共用指标和信号函数,把成交模拟与真实执行适配器分开。

模拟盘可以用 100 万元虚拟资金和 mock 持仓运行,不需要券商模拟账号;一次展示中的约 107 万元净值或约 7.27%变化,只代表那次模拟状态,不代表真实收益。执行适配器必须在模拟模式下禁止真实发送。

一句话记住配置选择算法,不能凭名字创造算法。

动手试试

系统异常判断

面对断网、重复请求、部分成交和重启等情景,判断系统应如何安全处理。

SCENARIO JUDGE

你是持续运行系统的值班工程师。判断异常时,优先保护账户和数据一致性:先核对状态,再决定重试、暂停或人工处置。

第 1 / 7 张
情景 01

行情连接断开

主循环发现行情连接失效,最新行情已经超过有效期,账户连接仍可用。策略刚产生一条买入信号。

09持续运行的验收,不是把进程启动起来

阻塞式调度器本身没有守护能力。Linux 可以使用 systemd,Windows 可以使用任务或服务管理,但要按实际环境验证;调度还要考虑交易日、午休、时区和集合竞价,不能把 9:30—15:00当成连续可成交区间。

先在完全隔离真实发送的模式运行 "run_once",再连续运行多个周期,制造数据失败、重复信号、断网、重启、磁盘满、文件损坏、审批超时和未成交订单。最终至少拿出三类证据:主循环持续更新、告警按等级处理、模拟订单与账户对账一致。持续观察一周可以作为演练起点,不是生产高可用的充分条件。

一句话记住验收看证据,不看页面是否热闹。

检验
检验一下

4 道小题

全部答对,这一课就算真正读懂了。答错了会告诉你为什么。

01提交订单后网络超时,第一步应该做什么?
02原子替换主要解决哪类问题?
03行情心跳停止但主循环仍更新,最合理的处理是什么?
04卖出1000股只成交400股,应该怎样理解?
知识卡

这一课,浓缩成一张卡

学完可以保存或分享给朋友。保存成图片的功能会在下一版加上。

AI+金融投资训练营 · 持续运行的量化交易系统持续运行系统最重要的设计原则是什么?

让状态可见、故障可控、恢复不重复下单。

  • 事实和意图隔离
  • 三种心跳独立
  • 异常先核对再动作
quant.jtxaionline.com
这一课的要点

记住这 5 句话

  1. 01持续系统要区分交易时间、数据有效性和服务在线状态。
  2. 02主循环按控制状态、连接、账户、风险、信号、风控、执行、记录的顺序运行。
  3. 03事实状态与人的控制意图分开,原子替换不等于并发安全。
  4. 04超时、部分成交、重启和重复信号都要先核对外部状态,不能盲目重试。
  5. 05模拟、告警和一周观察只能提供验收证据,不能替代真实授权与生产验证。
完成这一课

完成这一课

读完讲义、动手做一次实验、答对小题,这一课就算学完了。

  • 读完讲义
  • 完成一轮系统异常判断
  • 通过随堂自测

实验数据AI+金融投资训练营教学样本。固定教学样本

固定教学样本只用于解释量化研究方法,不代表任何真实标的未来表现,也不构成投资建议。