1. 课程导入

在实盘交易系统中,一笔订单从“用户点击下单”到“真正进入交易所撮合”,中间存在一条极短但极其关键的时间窗口。Pre-Trade风控(交易前风控)就是在这条窗口内,对订单进行实时校验、拦截或放行的控制层。它不负责行情预测,也不负责事后清算,而是回答一个非常具体的问题:这笔订单现在能不能发出去?

与Post-Trade风控(事后风控)不同,Pre-Trade风控必须在毫秒级完成判断,且一旦误判,要么造成风险敞口,要么导致正常交易被错误拒绝。因此,它既是技术问题,也是业务规则问题,更是实盘系统稳定性的第一道闸门。

一、Pre-Trade风控在交易链路中的位置

一个典型的实盘交易链路可以抽象为:策略/用户 → 订单生成 → Pre-Trade风控 → 订单路由 → 交易所/柜台 → 成交回报 → Post-Trade风控与清算。Pre-Trade风控位于订单生成之后、订单路由之前,是订单离开本地系统前的最后一道检查。

这个位置决定了它的三个核心特征:

  • 同步阻塞:风控不通过,订单不能继续向下走,必须立即返回拒绝原因。
  • 低延迟:通常要求在1~10毫秒内完成,否则会拖慢整体交易链路。
  • 规则可配置:不同账户、不同品种、不同时段的风控阈值可能完全不同。

关键理解:Pre-Trade风控不是“建议系统”,而是“拦截系统”。它的输出只有三种:通过、拒绝、挂起待人工确认。

二、核心原理:订单校验的四个维度

Pre-Trade风控的校验逻辑通常围绕四个维度展开,可以用下面的清单来理解:

维度 典型校验内容 常见拦截原因
资金/持仓 可用资金、可用持仓、保证金占用 资金不足、持仓不足、保证金超限
价格/数量 涨跌停价、最小变动单位、单笔最大数量 价格偏离过大、数量超限、非合法报价单位
频率/行为 单位时间报单次数、撤单率、自成交检查 报单过于频繁、撤单率过高、自成交风险
账户/权限 账户状态、交易权限、品种白名单 账户冻结、无权限交易该品种、被限制开仓

这四个维度并非孤立存在。例如,一个账户资金充足,但若其报单频率超过阈值,仍然会被拦截。风控引擎需要按优先级依次检查,并在任意一项失败时立即短路返回。

三、方法流程:一笔订单的风控生命周期

下面用一个简化的伪代码流程,展示Pre-Trade风控在订单进入后的处理顺序:

function preTradeCheck(order):
    if not checkAccountStatus(order.account):
        return REJECT("账户状态异常")

    if not checkInstrumentPermission(order.account, order.symbol):
        return REJECT("无该品种交易权限")

    if not checkPriceLimit(order.symbol, order.price):
        return REJECT("价格超出涨跌停范围")

    if not checkOrderSize(order.symbol, order.qty):
        return REJECT("单笔数量超限")

    if not checkAvailableFunds(order.account, order):
        return REJECT("可用资金不足")

    if not checkOrderFrequency(order.account):
        return REJECT("报单频率超限")

    if not checkSelfTrade(order.account, order):
        return REJECT("自成交风险")

    return PASS("风控通过,允许路由")

实际系统中,这些检查会被组织成规则链或规则树,并支持热更新。规则链的顺序会影响性能:高频失败项应前置,避免无谓计算。

四、案例场景:一次典型的拦截复盘

假设某量化账户在开盘集合竞价阶段连续发送了多笔买单,系统日志如下:

[09:15:01.223] ORDER 1001 BUY 600519 1800.00 x 100
[09:15:01.224] PRETRADE REJECT: price 1800.00 > limit_up 1795.00
[09:15:01.225] ORDER 1002 BUY 600519 1794.00 x 100
[09:15:01.226] PRETRADE REJECT: order_frequency 12/10 per second
[09:15:01.227] ORDER 1003 BUY 600519 1794.00 x 50
[09:15:01.228] PRETRADE PASS

复盘时发现两个问题:第一,策略未读取当日涨跌停价,导致第一笔价格越界;第二,报单频率阈值设置为每秒10笔,但策略在集合竞价阶段集中发单,触发了频率拦截。这两个问题都不是系统故障,而是策略与风控参数不匹配。

常见误区:把Pre-Trade风控当成“越严格越好”。过严的阈值会导致大量正常订单被拒,策略无法执行;过松则失去保护意义。风控参数必须与策略频率、资金规模、品种特性联合调优。

五、学习目标与整体课程框架

本课程共30章,围绕“能理解、能配置、能排障、能优化”四个目标展开。第1章建立整体认知后,后续将依次深入规则引擎设计、资金与持仓校验、价格与数量控制、频率与行为风控、自成交与异常检测、日志与监控、性能优化以及实盘故障复盘。

学习完本课程,你应当能够:

  1. 说清Pre-Trade风控在交易链路中的精确位置与职责边界。
  2. 独立设计一套可配置的订单校验规则链。
  3. 读懂风控日志,快速定位拦截原因。
  4. 在延迟与安全之间做出合理的参数权衡。
Pre-Trade风控:交易链路中的拦截闸门 策略/用户 订单生成 订单参数 价格/数量/方向 Pre-Trade风控 实时校验 · 拦截 · 放行 订单路由 发往交易所 交易所 撮合成交 PASS → 继续路由 REJECT → 返回原因 校验维度 资金 / 持仓 可用资金、保证金 价格 / 数量 涨跌停、最小变动 频率 / 行为 报单频率、撤单率 账户 / 权限 状态、白名单

这张图展示了Pre-Trade风控在链路中的位置:它位于订单参数生成之后、订单路由之前,输出只有“通过”或“拒绝”两条路径。下方四个维度则是风控引擎实际检查的内容。理解这张图,就理解了本课程后续所有章节的讨论范围。