
为什么你的量化策略跑不出回测效果
很多散户朋友写了个策略,回测年化30%,一上实盘就亏钱。问题往往不在策略逻辑本身,而在执行环节。量化交易API就是连接策略代码和交易所的管道,管道太细、太弯、太慢,策略再好也白搭。
高效执行的核心就三件事:快、准、稳。快是指从信号触发到订单到达交易所的延迟要低;准是指订单价格和数量不能出错;稳是指异常情况下不能崩。下面拆开讲,用大白话把技术细节翻译成人话。
API不是万能钥匙 先搞懂它的三种调用模式
量化交易API一般分REST、WebSocket和FIX三种。REST适合查账户、查历史数据,简单但延迟高,几百毫秒起步。WebSocket是推送模式,行情来了服务器主动告诉你,适合做实时信号。FIX协议是机构用的,延迟能压到微秒级,散户一般接触不到。
高效策略执行的第一条原则:行情用WebSocket,下单用REST或专线。很多新手拿REST轮询行情,一秒查一次,等看到价格信号时黄花菜都凉了。

低延迟架构 把服务器搬到交易所隔壁
延迟分三种:网络延迟、处理延迟、排队延迟。网络延迟最要命,你家的宽带再快,从北京到上海交易所机房也要十几毫秒。专业量化团队会把服务器托管在交易所附近的机房,这叫co-location,延迟能降到1毫秒以内。
散户没这个条件,但可以做到两件事:一是选离交易所近的云服务器,比如做上海期货交易所的品种就选华东节点;二是把策略程序写成事件驱动模式,别用死循环轮询。事件驱动就是“行情来了才干活”,省CPU也省时间。
处理延迟方面,Python写策略方便但慢,C++快但难写。折中方案是用Python做信号计算,把订单生成和执行交给用C++或Rust写的执行模块,中间用消息队列传数据。这样既保留了开发效率,又压住了执行延迟。
订单算法 别傻傻用市价单
散户下单就两种:限价单和市价单。市价单成交快但滑点大,限价单价格好但可能不成交。量化API的高效执行要用算法订单,把大单拆成小单,跟着盘口挂。
常见的执行算法有TWAP和VWAP。TWAP是把大单按时间均匀拆,比如要买100手螺纹钢,分10分钟每次买10手。VWAP是按成交量分布拆,开盘收盘成交量大就多买,中午清淡就少买。这两种算法在API里都能通过参数控制,散户用好了能省不少滑点成本。
还有一个细节:用限价单代替市价单做止损。市价止损在流动性差的时候能滑出好几个点,用限价单挂在前一档价位,成交概率高且成本可控。API里设置好价格偏移量就行。
风控前置 别等亏钱了才想起止损
高效执行不只是快,还得安全。很多散户把风控写在策略主循环里,结果程序卡死或者网络断了,止损单根本没发出去。正确做法是风控前置,在订单发往交易所之前就拦截。
具体怎么做?在API调用层加一个风控中间件,检查三件事:单笔订单最大手数、账户总持仓上限、当日最大亏损额。任何一项超标直接拒单。这个中间件独立于策略逻辑,策略再怎么bug也突破不了风控墙。
还有一点:用交易所的条件单功能。很多期货交易所支持止损止盈条件单,你提前把触发价格报给交易所,价格到了交易所自动帮你下单,不依赖你的程序和网络。这是最稳的风控执行方式,API里调一下条件单接口就行。
代码演示 一个极简的事件驱动执行框架
下面用Python伪代码展示核心结构,重点关注事件循环和风控拦截。
import queue
import threading
# 订单事件队列
order_queue = queue.Queue()
# 风控参数
MAX_LOTS = 10
MAX_POSITION = 50
MAX_DAILY_LOSS = 5000
def risk_check(order):
if order['lots'] > MAX_LOTS:
return False
if abs(current_position + order['lots']) > MAX_POSITION:
return False
if daily_pnl < -MAX_DAILY_LOSS:
return False
return True
def execution_worker():
while True:
order = order_queue.get()
if not risk_check(order):
print('风控拦截', order)
continue
# 调用交易所API下单
api.send_order(order)
# 行情回调里生成信号
def on_tick(tick):
signal = strategy.calc(tick)
if signal == 'buy':
order = {'symbol': tick.symbol, 'side': 'buy', 'lots': 1, 'price': tick.ask}
order_queue.put(order)
这个框架把策略和执理解耦,策略只管往队列里扔订单,执行线程负责风控和发单。网络卡了不影响策略计算,策略崩了也不影响已有订单的风控检查。
散户容易踩的三个坑
第一个坑是用同步请求发单。一次下单要等服务器返回才发下一单,行情剧烈时根本来不及。改成异步发单,发出去就不管了,用回调处理成交回报。
第二个坑是忽略订单状态查询。限价单挂出去可能部分成交,也可能被交易所拒绝。API要处理这些回报,更新本地持仓和资金。很多散户的策略持仓和实际持仓对不上,就是没处理回报。
第三个坑是重连逻辑缺失。WebSocket断线是常态,断线后要自动重连并补拉缺失的行情。API里设置心跳检测和自动重连,别等程序报错了才手动处理。
把执行成本算进策略里
高效执行的终极目标是降低交易成本。佣金、滑点、冲击成本加起来可能吃掉策略一半的收益。回测时要把这些成本算进去,实盘时用算法订单和限价单压成本。一个简单的判断标准:如果你的策略年化收益跑不赢交易成本的三倍,就别上实盘。
量化交易API只是工具,高效执行靠的是对细节的抠。把延迟降下来、把风控做扎实、把订单算法用对,散户也能让策略跑出接近回测的效果。