一、几乎所有新手都在这翻车
说实话,你是不是也遇到过这种情况?
本来一顿操作,回测曲线好看到飞起,年化高达30~40%!结果一上实盘直接傻眼——代码根本跑不通。
数据拿不到、信号触发逻辑全乱套、真实下单跟回测里完全是两码事……
我身边的好些朋友都栽在这个坑里:回测一套代码,实盘另一套代码。
那怎么破?我的经验是:分层架构。
今天这篇不贴代码,就聊聊一个4层架构设计,把核心思路和需要注意的坑点都给你扒一下,也希望这个文章能给你带来一些新思路。
二、一个能用的量化系统长这样
text
┌─────────────┐
│ 数据层 │ —— 喂数据
├─────────────┤
│ 策略层 │ —— 算信号
├─────────────┤
│ 风控层 │ —— 做拦截
├─────────────┤
│ 执行层 │ —— 去下单
└─────────────┘
这么分层的好处也挺明显:
-
改个策略,数据获取和下单逻辑不用动。
-
换数据源,策略代码完全不受影响。
-
最关键的是:回测和实盘能共用同一套策略逻辑。
三、第1层:数据层 —— 别让脏数据坑了你
核心职责:把行情数据扒下来、洗干净、对齐好。
数据类型
用在哪儿
特别注意
历史数据
回测
千万别引入未来数据,得做清洗
实时数据
实盘
得处理延迟,保证数据连续
最阴的坑:未来函数
用“未来”的数据计算“现在”的信号。比如拿当天的收盘价算均线,然后当天买入。
回测里看着没问题(因为你本来就知道了收盘价),但实盘里收盘价是收盘后才出来的,根本没法用。
正确姿势:日线策略就用前一天的收盘价算信号,第二天开盘再操作。
一句话原则:不管回测还是实盘,策略层拿到的数据格式必须完全一致。
四、第2层:策略层 —— 只负责拍板
干的事:根据行情和当前持仓,决定要不要出手。
-
输入:行情数据 + 现在手里有啥。
-
输出:买/卖/躺平。
设计铁律:
-
才不管数据从哪来,统一格式就行。
-
不下单,只给信号。
-
核心判断逻辑得能复用。
这里有个小坑:回测和实盘,策略逻辑可以复用,但要适配不同接口。回测接的是模拟引擎,实盘接的是交易所API。
五、第3层:风控层 —— 位置放不对等于白搞
很多人会放错!风控必须卡在策略层和执行层中间,而不是放在执行后面。
为啥?你得在下单前就拦住,总不能等订单都发出去了再拦截吧?
举个栗子
触发了啥
怎么处理
单笔亏太多
不给开单或者直接平仓
账户回撤过大
暂停所有新开仓
某只票买太多了
拒绝继续加仓
信号太密集
降频或者忽略
设计原则:
-
独立跑着,不跟策略逻辑搅和在一起。
-
优先级高于策略信号。
-
每个信号进执行层之前,先过风控这道关。
六、第4层:执行层 —— 负责把单子送出去
干的活:拿到过了风控的信号,变成真正的订单,发到交易所。
功能
实际作用
订单转换
把“买100股”变成限价单或市价单
状态管理
盯着订单走到哪一步了(提交了/成了/撤了)
重试机制
没成交就按规矩撤单重发
成交反馈
把成交结果告诉策略层
最容易被忽略的坑:以为“一定会成交”
回测里下个买单,默认下一秒就自动成交。实盘里呢?可能流动性不够、滑点吃掉你、网络还卡一下。
执行层要记住:
-
别假设成交,等交易所告诉你“成了”才算数。
-
设置超时,超了就撤单或者降一级处理。
-
把实际成交价记下来,反馈给风控层。
七、完整跑一遍数据流
-
数据层把最新行情推过来
-
策略层算一下:买还是卖?
-
风控层检查:没问题就往下走,有问题就记日志拦下来
-
执行层把订单发交易所
-
交易所返回:成了还是没成
-
执行层更新持仓,告诉策略层结果
-
等下一笔行情,继续循环
有一个关键点:成交结果必须告诉策略层,不然策略层根本不知道现在手里有几股,下一步信号怎么算?
八、最后总结
总结一下这个四层架构:
-
数据层:喂数据,保证干净统一。
-
策略层:算信号,不碰别的事。
-
风控层:卡在中间做拦截,位置最重要。
-
执行层:发订单,反馈结果。
分层最大的价值就是:策略逻辑可复用,每一层都能独立迭代。
如果你也是手撸量化系统的话我觉得你可以检查下:
-
看看你现在的系统,风控环节是在下单前还是下单后?如果是在后面就要赶紧挪到前面来。
-
至少要加一个最简单的风控,比如单笔亏多少就直接拒绝下一个开仓信号。
如果你有更好的思路或者踩过什么奇怪的坑,欢迎在评论区一起聊聊