去年某天,我对着满屏的均线交叉策略发呆——回测曲线完美得能上教科书的策略,实盘跑了两周亏掉20%。后来才发现,问题出在基础行情延迟了整整5秒。这才明白过来:市面上教人写策略的教程,和真正能跑通的交易系统之间,隔着一整条马里亚纳海沟。
今天要聊的,不是怎么设计策略(这种内容已经烂大街了),而是实实在在的工程难题:如何用最低成本把策略变成真金白银的交易。别担心,不需要租机房搞专线,咱们普通散户也能玩得转。
刚开始做自动化交易时,我试遍了各种数据源。Tushare的15分钟延迟让人抓狂,某券商API动不动就断连。最坑的是有次做ETF套利,因为拿不到Level2的十档行情,挂单价直接插针,单笔损失够买十台MacBook Pro。
后来发现用WebSocket直连行情源,这里给个接入多市场行情的代码骨架(:
#!python3
# -*- coding:utf-8 -*-
import time
import websocket
import zlib
# 发送订阅
def on_open(ws):
ws.send("all=lv2_600519,lv1_000001")
# 接收推送
def on_message(ws, message, type, flag):
# 命令返回文本消息
if type == websocket.ABNF.OPCODE_TEXT:
print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)
# 行情推送压缩二进制消息,在此解压缩
if type == websocket.ABNF.OPCODE_BINARY:
rb = zlib.decompress(message, -zlib.MAX_WBITS)
print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Binary响应:", rb.decode("utf-8"))
def on_error(ws, error):
print(error)
def on_close(ws, code, msg):
print(time.strftime('%H:%M:%S', time.localtime(time.time())), "连接已断开")
wsUrl = "ws://<服务器地址>/?token="
ws = websocket.WebSocketApp(wsUrl,
on_open=on_open,
on_data=on_message,
on_error=on_error,
on_close=on_close)
ws.run_forever()
重点说三个实战经验:
别在本地跑!放云服务器才能保证低延迟(实测上海区域能控制在5ms内)
多市场订阅用逗号分隔就行,港美股记得处理时区转换
Level2数据每秒20+次推送,Python脚本处理起来也完全没压力。
第一次尝试程序化交易时,我在某券商页面蹲了俩小时找API文档,结果客服告诉我个人用户不开放。后来发现用HTTP协议反而更简单,这里分享个委托模板:
# 买入的核心逻辑就一行
下单地址 = f"http://交易服务器/buy?token=xxx&code=600519&price={实时价*0.995}&volume=100"
别小看这个朴素的操作:
价格挂单建议浮动±0.5%,防止卡在盘口
返回的order_id一定要存库,撤单全靠它
持仓查询接口记得设置止损线,我吃过闪崩没止损的亏
策略失效的罪魁祸首,往往是数据质量。试过用网络爬虫抓财务数据,结果字段对不齐,日期格式都能出三种花样。直到用了语义化查询,才体会到什么叫降维打击:
# 找最近三个月北向资金连续增持的半导体个股
query = "半导体,北向持仓比例连续增长3月,市盈率<行业均值"
这种查询模式最爽的是:
不需要记字段名(比如"main_net_inflow"这种反人类命名)
支持自然语言时间段("过去30天"自动转时间戳)
能直接导出DataFrame,和backtrader无缝对接
现在的我,策略逻辑、行情解析、交易风控三个进程跑在2核4G的服务器上,日均交易成本不到2块钱(包括行情费)。全套系统搭下来,最贵的投入其实是券商的交易手续费...
说到底,量化交易的技术门槛早就不在算法层面。真正的信息差在于:
怎么找到稳定的行情源(延迟低于1秒)
如何绕过券商的各种限制(比如自动撤单频率)
哪里能获取结构化的基本面数据(特别是A股)
这些脏活累活,与其自己折腾,不如找个靠谱的基础服务。毕竟咱们的时间,应该花在策略逻辑上,而不是和API文档斗智斗勇。
原文链接:https://zhuanlan.zhihu.com/p/31296882820