2. 交易市场基础
做Pre-Trade实盘风控,第一步不是写规则,而是把“订单从哪来、长什么样、经过哪些环节、最终去哪”彻底搞清楚。风控拦截点如果放错位置,要么拦不住风险,要么误杀正常交易。本节围绕订单类型、交易生命周期、交易所接口和典型业务场景四个维度,建立后续所有风控逻辑的基础坐标系。
一、核心原理:订单是风控的最小输入单元
订单(Order)是交易意图的结构化表达。风控系统看到的不是“用户想买股票”,而是一组字段:证券代码、买卖方向、价格、数量、订单类型、有效期、账户、席位、通道等。不同订单类型决定了价格与数量的约束方式,也决定了风控校验的复杂度。
- 市价单(Market Order):只指定数量,不指定价格,追求立即成交。风控重点在于数量上限、可用资金/持仓、涨跌停保护,以及极端行情下的价格偏离。
- 限价单(Limit Order):指定价格与数量,价格是硬约束。风控需校验价格是否在涨跌停范围内、是否偏离最新价过多。
- 止损单/条件单(Stop / Conditional Order):触发条件满足后才转为市价或限价单。风控要关注触发价与当前价的偏离、触发后的二次校验。
- 冰山单/隐藏单(Iceberg / Hidden):只显示部分数量,风控需按总数量而非显示数量计算敞口。
- FOK / IOC:FOK要求全部成交否则撤销,IOC要求立即成交否则撤销。风控需结合有效期字段判断是否允许部分成交。
关键原则:风控校验必须基于订单的完整语义,而不是只看价格和数量两个字段。例如冰山单若只按显示数量校验,会严重低估真实敞口。
二、交易生命周期:订单的六个关键状态
一笔订单从生成到终结,通常经历以下阶段。理解每个阶段的“可拦截窗口”,是Pre-Trade风控设计的核心。
- 订单生成(New):客户端或策略生成订单,尚未发送。这是最理想的拦截点,可在本地完成大部分校验。
- 风控校验(Pre-Trade Check):检查资金、持仓、价格、数量、频率、权限等。通过则放行,不通过则拒绝并返回原因。
- 报单(Sent / Pending):订单发送至交易所或柜台,等待确认。此时订单已离开本地,拦截成本变高。
- 交易所确认(Accepted / Rejected):交易所返回接受或拒绝。被拒绝的订单需记录原因,用于复盘。
- 部分成交 / 全部成交(Partially Filled / Filled):订单进入撮合阶段,风控需实时更新敞口。
- 撤销 / 终结(Cancelled / Expired):订单失效,释放冻结资金或持仓。
Pre-Trade风控的最佳拦截窗口在“订单生成”与“风控校验”之间。一旦进入“报单”阶段,撤单和改单都会带来额外延迟与风险,尤其在极端行情下可能无法及时撤回。
三、交易所接口:订单如何真正到达市场
不同交易所和柜台提供的接口差异很大,但核心字段和交互模式有共性。以下是一个典型的报单请求结构:
{
"account": "A123456",
"symbol": "600519.SH",
"side": "BUY",
"order_type": "LIMIT",
"price": 1680.00,
"quantity": 100,
"time_in_force": "DAY",
"client_order_id": "c-20240612-0001"
}
常见接口类型包括:
- 柜台API(如CTP、恒生、金证):国内期货、证券常用,字段规范,需处理会话与重连。
- 交易所直连(如FIX、Binary):低延迟场景,字段紧凑,风控需在网关层完成。
- 券商/期货公司网关:封装了部分风控,但机构仍需自建Pre-Trade层。
接口返回的“已接受”不等于“已成交”。风控系统必须区分“报单成功”与“成交回报”,否则会误判敞口。建议以成交回报(Fill)为准更新持仓和资金。
四、常见业务场景与误区复盘
以下场景在实盘中高频出现,也是风控规则最容易出错的地方。
| 场景 | 风险点 | 风控动作 |
|---|---|---|
| 市价单在涨跌停附近 | 成交价严重偏离预期 | 限制市价单最大数量,或强制转限价 |
| 冰山单只校验显示数量 | 真实敞口被低估 | 按总数量校验资金与持仓 |
| 条件单触发后行情跳空 | 触发价与成交价差距大 | 触发后二次校验价格偏离阈值 |
| 高频撤单 | 触发交易所异常交易监控 | 设置撤单频率上限与冷却时间 |
| 多账户同标的集中下单 | 超出自营/资管持仓限制 | 按账户组维度合并计算敞口 |
复盘时常见误区:一是把风控规则写死在客户端,导致策略绕过;二是只校验单笔订单,忽略账户组和标的维度的合并敞口;三是忽略订单类型差异,用同一套阈值处理市价单和限价单。正确做法是按订单类型、账户维度、标的维度分层校验,并在报单前完成全部检查。