风控系统架构总览:分层设计与核心组件
做市商的风控系统,说白了就是你的「刹车系统」。没有它,策略跑得再快也是裸奔。我见过不少团队,策略收益看着漂亮,结果一次黑天鹅事件直接穿仓——嗯,风控没做好,赚再多也是白搭。
今天咱们聊聊风控系统的整体架构。我个人习惯把风控系统拆成四个层次:接入层、计算层、决策层、执行层。每一层各司其职,又紧密联动。你想想看,如果所有逻辑都揉在一起,出问题你连排查都无从下手。
核心观点:风控系统不是「事后诸葛亮」,而是「事前防火墙」。分层设计的目的,就是让每一层都能独立演进、独立测试、独立降级。
一、分层设计:四层架构详解
先看一张整体架构图,我手绘的,凑合看:
这张图我画了好几个版本,最终选了这种「流水线」式的布局。为什么?因为数据流就是从上往下走的,你理解了这个流向,就理解了风控系统的本质。
1. 接入层:风控的「耳朵和眼睛」
接入层负责跟外部世界打交道。行情数据、订单回报、账户信息,全从这进来。我在项目中遇到过一个问题:行情网关挂了,但订单网关还在跑,结果策略按旧行情下单,直接爆亏。所以接入层一定要做健康检查和降级策略。
实战建议:接入层最好做成「无状态」的。这样你可以随时启停,不影响上层逻辑。我习惯用连接池+心跳检测,一旦发现某个交易所的行情延迟超过50ms,立刻切到备用源。
2. 计算层:风控的「大脑皮层」
计算层做的是「脏活累活」。实时计算风险敞口、希腊值、资金利用率、最大回撤……这些指标是决策层的「原材料」。你想想看,如果计算层慢了,决策层拿到的就是过期数据,那风控还有什么意义?
我个人习惯把计算层拆成两部分:
- 实时计算:毫秒级,用于高频风控(如瞬时敞口、订单频率)
- 准实时计算:秒级,用于低频风控(如日累计亏损、资金利用率)
为什么要分开?因为实时计算太贵了。你不可能每笔订单都算一遍所有指标,那CPU扛不住。我曾经踩过这个坑——把所有指标都放在实时流水线上,结果系统直接卡死。后来改成「分级计算」,问题就解决了。
3. 决策层:风控的「法官」
决策层是规则引擎的所在地。它拿到计算层产出的指标,然后跟预设的阈值做比较。比如:
| 规则名称 | 触发条件 | 动作 | 优先级 |
|---|---|---|---|
| 瞬时敞口上限 | 净敞口 > 100万USDT | 禁止开新仓 | P0 |
| 日亏损熔断 | 当日亏损 > 5% | 全部平仓 | P0 |
| 订单频率限制 | 每秒订单 > 50笔 | 限速 | P1 |
| 资金利用率 | 保证金使用 > 80% | 告警+限制开仓 | P2 |
决策层最怕什么?规则冲突。比如一条规则说「禁止开新仓」,另一条说「必须对冲」。这时候怎么办?我建议给每条规则设定优先级,P0的规则可以覆盖P1的规则。嗯,这个设计在实战中非常关键。
4. 执行层:风控的「手脚」
执行层负责把决策层的指令落地。说白了就是:该撤单的撤单,该平仓的平仓,该发告警的发告警。执行层一定要快,而且要幂等——同一个指令执行两次,效果应该跟执行一次一样。
避坑指南:我曾经遇到过执行层重复执行的问题。原因是网络超时,指令发了但没收到确认,于是又发了一次。结果仓位被平了两次,直接变成反向敞口。后来我加了一个「指令去重」的机制,每个指令带唯一ID,执行层做幂等校验。
二、核心组件详解
分层架构是骨架,核心组件才是血肉。咱们重点聊四个组件:规则引擎、行情网关、订单管理、仓位管理。
1. 规则引擎:风控的「心脏」
规则引擎不是简单的if-else。它需要支持:
- 热加载:规则变更不停机
- 优先级:高优规则先执行
- 组合逻辑:与、或、非、计数、滑动窗口
- 降级:规则引擎挂了,有兜底策略
我见过最蠢的设计是把规则写在代码里,每次改规则都要发版。你想想看,风控规则是动态的,市场变了、策略变了、监管变了,规则就得跟着变。所以规则引擎一定要做成配置化的。
// 伪代码:规则引擎的核心逻辑
class RuleEngine {
List<Rule> rules; // 从配置中心加载
Decision evaluate(MarketData data) {
for (Rule rule : rules.sortByPriority()) {
if (rule.matches(data)) {
return rule.getAction(); // 返回决策
}
}
return Decision.PASS; // 默认通过
}
}
2. 行情网关:风控的「眼睛」
行情网关负责接收和处理市场数据。它不只是「转发」,还要做:
- 数据清洗:去重、去异常值、补缺失
- 时间对齐:不同交易所的时间戳统一
- 快照管理:维护最新的市场状态
- 延迟监控:记录每个数据源的延迟
行情网关的延迟直接决定了风控的「反应速度」。我建议行情网关用零拷贝技术,减少数据在内存中的搬运次数。嗯,这个优化能让延迟降低30%以上。
3. 订单管理:风控的「手」
订单管理负责订单的全生命周期:创建、提交、确认、撤销、成交。它跟风控系统的联动非常紧密:
- 订单提交前,先问风控「能不能下」
- 订单成交后,通知风控「仓位变了」
- 订单超时,风控决定「要不要撤」
我习惯在订单管理里加一个「预检」环节。订单在发往交易所之前,先过一遍本地风控。如果本地风控就判定违规,那根本不用发出去,省了网络延迟。
4. 仓位管理:风控的「账本」
仓位管理记录的是「我们到底持有了什么」。它需要做到:
- 实时同步:每笔成交后立即更新
- 多维度:按币对、按策略、按账户
- 快照+增量:既要有当前快照,也要有变更日志
- 对账:定期跟交易所对账,发现差异
关键点:仓位管理是风控系统的「真相来源」。如果仓位数据不准,那所有风控规则都是瞎扯。我建议仓位管理做「双写」——内存里一份用于实时查询,数据库里一份用于持久化和对账。
三、层与层之间的联动
分层不是「各干各的」,而是紧密联动。我给你画个典型的流程:
- 行情网关收到新tick,推送给计算层
- 计算层更新风险敞口,推送给决策层
- 决策层的规则引擎判断「敞口超限」,生成「禁止开仓」指令
- 执行层收到指令,通知订单管理:新订单一律拒绝
- 订单管理在预检环节拦截后续订单
你看,这个流程从行情到执行,走完只需要几毫秒。但如果某一层出了问题,整个链路就断了。所以每一层都要有超时机制和降级策略。
举个例子:如果计算层挂了,决策层能不能直接用上一轮的指标?可以,但你要知道指标是「过时」的。我建议降级时把阈值收窄,比如正常敞口上限是100万,降级时自动降到80万。这样虽然保守,但至少安全。
四、架构设计的几个原则
最后,分享几个我在实战中总结的原则:
- 隔离性:每一层独立部署,独立扩缩容。行情网关挂了,不影响订单管理。
- 可观测性:每一层都要有监控、日志、指标。出了问题能快速定位。
- 降级优先:系统压力大时,优先降级非核心功能。比如先停掉告警推送,保证核心风控不中断。
- 幂等性:所有操作都要支持重复执行。网络抖动是常态,不是异常。
嗯,今天就聊到这。风控系统的架构设计,说白了就是「把复杂问题拆成简单问题,再把简单问题做扎实」。下一节咱们深入聊聊规则引擎的具体实现,包括规则的热加载、优先级调度、以及如何避免规则冲突。
公众号:蓝海资料掘金营,微信deep3321