手撸量化系统?先搞懂这4层架构再动手(附脑图)

1 阅读1分钟

一、几乎所有新手都在这翻车

说实话,你是不是也遇到过这种情况?

本来一顿操作,回测曲线好看到飞起,年化高达30~40%!结果一上实盘直接傻眼——代码根本跑不通。

数据拿不到、信号触发逻辑全乱套、真实下单跟回测里完全是两码事……

我身边的好些朋友都栽在这个坑里:回测一套代码,实盘另一套代码

那怎么破?我的经验是:分层架构

今天这篇不贴代码,就聊聊一个4层架构设计,把核心思路和需要注意的坑点都给你扒一下,也希望这个文章能给你带来一些新思路。

二、一个能用的量化系统长这样

text

┌─────────────┐
│   数据层    │ —— 喂数据
├─────────────┤
│   策略层    │ —— 算信号
├─────────────┤
│   风控层    │ —— 做拦截
├─────────────┤
│   执行层    │ —— 去下单
└─────────────┘

这么分层的好处也挺明显:

  • 改个策略,数据获取和下单逻辑不用动。

  • 换数据源,策略代码完全不受影响。

  • 最关键的是:回测和实盘能共用同一套策略逻辑。

三、第1层:数据层 —— 别让脏数据坑了你

核心职责:把行情数据扒下来、洗干净、对齐好。

数据类型

用在哪儿

特别注意

历史数据

回测

千万别引入未来数据,得做清洗

实时数据

实盘

得处理延迟,保证数据连续

最阴的坑:未来函数

用“未来”的数据计算“现在”的信号。比如拿当天的收盘价算均线,然后当天买入。

回测里看着没问题(因为你本来就知道了收盘价),但实盘里收盘价是收盘后才出来的,根本没法用。

正确姿势:日线策略就用前一天的收盘价算信号,第二天开盘再操作。

一句话原则:不管回测还是实盘,策略层拿到的数据格式必须完全一致。

四、第2层:策略层 —— 只负责拍板

干的事:根据行情和当前持仓,决定要不要出手。

  • 输入:行情数据 + 现在手里有啥。

  • 输出:买/卖/躺平。

设计铁律

  • 才不管数据从哪来,统一格式就行。

  • 不下单,只给信号。

  • 核心判断逻辑得能复用。

这里有个小坑:回测和实盘,策略逻辑可以复用,但要适配不同接口。回测接的是模拟引擎,实盘接的是交易所API。

五、第3层:风控层 —— 位置放不对等于白搞

很多人会放错!风控必须卡在策略层和执行层中间,而不是放在执行后面。

为啥?你得在下单前就拦住,总不能等订单都发出去了再拦截吧?

举个栗子

触发了啥

怎么处理

单笔亏太多

不给开单或者直接平仓

账户回撤过大

暂停所有新开仓

某只票买太多了

拒绝继续加仓

信号太密集

降频或者忽略

设计原则

  • 独立跑着,不跟策略逻辑搅和在一起。

  • 优先级高于策略信号。

  • 每个信号进执行层之前,先过风控这道关。

六、第4层:执行层 —— 负责把单子送出去

干的活:拿到过了风控的信号,变成真正的订单,发到交易所。

功能

实际作用

订单转换

把“买100股”变成限价单或市价单

状态管理

盯着订单走到哪一步了(提交了/成了/撤了)

重试机制

没成交就按规矩撤单重发

成交反馈

把成交结果告诉策略层

最容易被忽略的坑:以为“一定会成交”

回测里下个买单,默认下一秒就自动成交。实盘里呢?可能流动性不够、滑点吃掉你、网络还卡一下。

执行层要记住

  • 别假设成交,等交易所告诉你“成了”才算数。

  • 设置超时,超了就撤单或者降一级处理。

  • 把实际成交价记下来,反馈给风控层。

七、完整跑一遍数据流

  1. 数据层把最新行情推过来

  2. 策略层算一下:买还是卖?

  3. 风控层检查:没问题就往下走,有问题就记日志拦下来

  4. 执行层把订单发交易所

  5. 交易所返回:成了还是没成

  6. 执行层更新持仓,告诉策略层结果

  7. 等下一笔行情,继续循环

有一个关键点:成交结果必须告诉策略层,不然策略层根本不知道现在手里有几股,下一步信号怎么算?

八、最后总结

总结一下这个四层架构:

  • 数据层:喂数据,保证干净统一。

  • 策略层:算信号,不碰别的事。

  • 风控层:卡在中间做拦截,位置最重要。

  • 执行层:发订单,反馈结果。

分层最大的价值就是:策略逻辑可复用,每一层都能独立迭代

如果你也是手撸量化系统的话我觉得你可以检查下:

  1. 看看你现在的系统,风控环节是在下单前还是下单后?如果是在后面就要赶紧挪到前面来。

  2. 至少要加一个最简单的风控,比如单笔亏多少就直接拒绝下一个开仓信号。

如果你有更好的思路或者踩过什么奇怪的坑,欢迎在评论区一起聊聊