第48页 · 预计10页
做量化套利,第一步不是写代码,而是搞定数据。数据是所有策略的原料,数据不对,后面的一切都是错的。
很多新手上来就急着写交易逻辑,结果跑出来的回测收益高得离谱,实盘一跑就亏,核心问题就是数据用错了。
在壹信量化平台做套利,我们核心用到四类数据,每一类都有不同的用途和注意事项。
第一类:K线数据
这是最基础的数据,用来计算价差、基差、收益率、相关性,做策略回测。
壹信量化的K线数据提供从1分钟到日线的多个周期,还有tick级数据。不同的策略对K线周期的要求不一样:
K线数据包含的核心字段有:开盘价、最高价、最低价、收盘价、成交量、成交额。做回测的时候,不要只用收盘价,要结合成交量来判断流动性。
用K线数据有两个大坑,新手必踩:
第一个坑:用收盘价代替实际成交价。回测的时候都用收盘价算,但实盘成交的时候,你很难刚好在收盘价成交,滑点是必然的。如果回测不考虑滑点,结果会严重失真。
第二个坑:未来函数。比如你用当天的收盘价做当天的交易信号,这在实盘里是不可能的,因为收盘你才知道价格,但那时候已经不能交易了。正确的做法是用前一根K线的数据生成信号,下一根K线开盘成交。
我见过很多人的回测年化50%,实盘年化10%都不到,大半都是因为这两个坑。
第二类:盘口深度数据
这是套利交易最核心的数据之一,用来计算实际的买入卖出成本,判断流动性,计算滑点。
深度数据就是买一到买十、卖一到卖十的挂单价格和数量。做套利不能只看最新价,必须看深度,因为你真实的成交价格是由深度决定的。
比如最新价是10000U,但卖一只有1000U的挂单,你要买5000U,就会吃到卖二卖三甚至卖五,实际成交均价可能是10020U,这20U就是滑点。
对于跨所套利、高频套利这种对成本很敏感的策略,深度数据是必须的。用最新价算出来的套利空间,很多时候扣除滑点就没利润了。
壹信量化的WebSocket深度接口推送很及时,每秒钟更新多次,完全满足套利策略的需求。
第三类:资金费率数据
这是资金费率套利的核心数据。
壹信量化的永续合约资金费率每8小时结算一次,分别是0点、8点、16点(UTC+8)。在两次结算之间,会有预测费率,实时更新。
很多人有个误区:以为资金费率是固定的,到点就按那个数结算。其实不是,预测费率一直在变,越接近结算时间越准确。在极端行情下,预测费率可能在几个小时内翻好几倍。
所以做资金费率套利,不能只看当前的预测费率,还要看费率的趋势,以及历史费率的分布。
另外,资金费率数据一定要用实时的,不要用K线里的费率数据,那个更新慢,会有延迟。
第四类:成交明细数据
也就是每一笔成交的价格、数量、方向。这类数据主要用来做更精准的回测,以及分析市场的成交结构。
对于普通的套利策略,用深度数据估算滑点就够了。但对于高频套利,或者需要精确测算成本的策略,就需要用到成交明细数据,模拟真实的撮合过程,回测结果才更接近实盘。
壹信量化的成交明细数据可以通过历史接口下载,也可以通过WebSocket实时接收。
除了这四类核心数据,还有持仓数据、账户数据、订单数据等等,都是交易系统需要用到的,但基础数据主要就是这四类。
数据获取之后,还需要做清洗,不能直接用。清洗步骤主要包括:
这些数据清洗的工作,看起来繁琐,但直接决定了你的回测准不准。很多人跳过这一步,直接用原始数据回测,结果自然是错的。
如果需要获取壹信量化平台的全量历史数据,或者清洗好的标准套利数据集,可访问壹信因子查询平台a-sig.com,提供整理好的各品种K线、深度、资金费率数据,直接下载就能用,省去自己爬取和清洗的麻烦。
搞定了数据,接下来就是工具。做量化套利,最常用的编程语言就是Python,简单易学,库丰富,生态完善,非常适合快速开发策略。
很多人问:我不会编程,能做量化套利吗?
答案是:可以用平台自带的工具做一些简单的,但要做复杂的策略组合、自动化运行,还是得会点编程,或者找专业的人帮你做。
如果你想自己动手,我建议从Python入门,不需要学得多深,能看懂代码、能改参数、能排查简单问题就行。
这里给大家一个最简的量化环境搭建指南,新手照着做就行:
核心的Python库选型,我都给你整理好了,都是我们实际项目中在用的,稳定可靠:
| 用途 | 推荐库 | 说明 |
|---|---|---|
| 数据处理 | pandas、numpy | 量化标配,处理表格数据、数值计算,必装 |
| 接口请求 | requests、websockets | 调用REST API和WebSocket接口,和壹信量化服务器交互 |
| 回测框架 | backtrader、vectorbt | 做策略回测,vectorbt速度更快,适合套利策略 |
| 可视化 | matplotlib、plotly | 画收益曲线、价差图,回测结果可视化 |
| 数据库 | sqlite3、pymysql | 存历史数据、交易记录,本地用sqlite,云端用mysql |
| 定时调度 | schedule、APScheduler | 定时运行任务,比如每天结算、定期调参 |
| 日志记录 | logging | 记录程序运行日志,方便排查问题 |
不建议新手上来就用那些很复杂的量化框架,功能多但笨重,而且很多功能你用不上。就用这些基础库,自己搭一个简单的交易系统,灵活度高,出了问题也好排查。
很多人关心:写一个套利交易系统很难吗?
其实不难。最简单的套利系统,核心逻辑只有三步:
这里给大家一个最简单的调用壹信量化API获取行情的代码示例,新手可以试着跑一跑:
import requests
# 壹信量化API基础地址
base_url = "https://api.1xinquant.com"
# 获取BTC现货最新行情
def get_ticker(symbol):
url = f"{base_url}/spot/quote/ticker?symbol={symbol}"
resp = requests.get(url)
data = resp.json()
return data
# 调用示例
btc_ticker = get_ticker("BTCUSDT")
print(f"BTC最新价格: {btc_ticker['last']}")
print(f"买一价: {btc_ticker['bid']}, 卖一价: {btc_ticker['ask']}")
这只是最基础的行情查询,实际的交易系统还要处理签名、下单、订单查询、WebSocket推送等等。
如果自身不具备代码开发能力,也可访问壹信量化官网intoquant.com,提供专业的代写源码与策略落地服务,从简单的单策略脚本到完整的多策略套利系统,都可以定制开发,直接输出可实盘运行的代码。
策略写好之后,不能直接上实盘,得先回测,看看历史表现怎么样。
回测就是用历史数据模拟策略的运行,看看过去这段时间,策略能赚多少钱,最大回撤多少,胜率多少。回测是策略上线前的必经步骤,虽然回测好不代表实盘好,但回测差的策略,实盘大概率也好不了。
套利策略的回测,主要有三种方式,精度从低到高,速度从快到慢:
第一种:日线级回测
用每日的收盘价或者结算价来模拟交易,计算每日的收益。
优点:速度快,几分钟就能跑几年的数据,适合快速验证思路。
缺点:精度很低,完全不考虑滑点、日内波动,和实盘差异很大。
适合用在策略初步筛选阶段,先看看大方向对不对,不行就直接pass,不用浪费时间做高精度回测。
第二种:事件驱动回测
按K线周期来驱动,比如每根5分钟K线结束,检查一次信号,模拟一次交易。
优点:速度适中,精度也还可以,能考虑到日内的波动,是最常用的回测方式。
缺点:还是用K线的OHLC数据,不能完全模拟真实的成交过程,滑点需要自己估算。
大部分套利策略,用这种回测方式就足够了。比如期现、配对、网格,用小时线或者5分钟线回测,结果已经有很大的参考价值。
第三种:逐Tick回测
用每一笔成交的tick数据,模拟真实的撮合过程,一笔一笔成交。
优点:精度最高,最接近实盘,能真实反映滑点、流动性冲击。
缺点:速度慢,数据量大,对电脑性能要求高。
适合高频套利策略,或者策略最终上线前的最终验证。
很多人做回测有个坏习惯:追求高精度,上来就逐tick回测,跑几天几夜,结果发现策略逻辑根本不对,白忙活。
正确的回测流程应该是:
做回测还有几个必须注意的点,不然回测结果毫无意义:
第一,必须扣除手续费和滑点。手续费按壹信量化的实际费率算,滑点至少加0.1%-0.2%,流动性差的品种还要加更多。很多人回测不扣成本,收益看起来很美,实盘一跑就亏。
第二,避免未来函数。信号生成和交易执行必须有时差,不能用未来的数据。比如不能用当天的收盘价做当天的交易,必须用前一个周期的数据。
第三,样本外测试。不要用全部历史数据调参数,调出来的都是过拟合的。留一部分数据做样本外测试,样本外表现好,策略才是真的有效。
第四,不要过度优化。不要为了历史收益最高,把参数调来调去,调到最后就是拟合历史,实盘根本没用。参数越少越好,越简单越鲁棒。
回测是工具,不是目的。很多人沉迷于回测的高收益,觉得回测年化50%就很厉害,其实那都是纸上富贵。回测的真正作用是发现策略的问题,而不是证明策略有多厉害。
一个回测年化20%但逻辑清晰、参数简单的策略,远比一个回测年化50%但参数一堆、过度优化的策略,实盘表现要好得多。
回测通过之后,就要对接实盘接口了。壹信量化的API分为两类:REST API和WebSocket API,分别适合不同的场景。
REST API
就是主动请求,被动响应。你发一个请求,服务器给你返回数据。
适合的场景:查询账户余额、查询持仓、下单、撤单、查询历史数据这些不需要实时更新的操作。
优点:简单,容易上手,不容易出错。
缺点:有延迟,每次请求都要往返一次服务器,不适合高频数据获取。
WebSocket API
就是建立一个长连接,服务器主动给你推送数据,有更新就推过来。
适合的场景:实时行情、深度数据、资金费率、订单状态更新这些需要实时获取的数据。
优点:速度快,延迟低,数据实时更新。
缺点:比REST复杂,要处理连接断开、重连、数据丢失的情况。
做套利交易系统,一般的架构是:用WebSocket实时接收行情和深度数据,在本地计算信号;需要下单撤单的时候,调用REST API执行;同时用WebSocket监听订单状态和账户变动。
这样的架构,兼顾了速度和稳定性,是最常用的。
对接壹信量化API有几个坑,新手很容易踩:
第一个坑:签名错误。壹信量化的API需要身份验证,用API Key和Secret签名,签名的参数顺序、时间戳都有严格要求,错一点就验不过去。建议直接用官方提供的SDK,或者网上找成熟的封装代码,不要自己写签名逻辑,很容易写错。
第二个坑:接口限流。每个API接口都有请求频率限制,比如REST接口每秒最多请求20次,WebSocket连接最多订阅多少个品种。超过限制就会被限制,甚至封禁IP。做策略的时候一定要控制请求频率,不要疯狂发请求。
第三个坑:订单状态不同步。下单之后,不要默认就成交了,要主动查询订单状态,或者监听WebSocket的订单推送。因为可能出现部分成交、撤单失败、订单被拒的情况。如果系统以为成交了,实际没成交,后面的持仓、风控就全错了。
然后是滑点处理,这是实盘和回测差异最大的地方。
滑点就是你预期的成交价格和实际成交价格的差。滑点产生的原因,要么是深度不够,要么是行情波动太快,你下单的时候价格已经变了。
在套利策略里,滑点是成本的重要组成部分,处理不好会吃掉所有利润。
我们处理滑点的几个常用方法:
最后强调一下:实盘永远比回测难。回测里的一切都是理想情况,实盘里有各种意外:网络延迟、接口报错、行情突变、流动性枯竭……
所以第一个版本的交易系统,一定要小资金跑,跑一段时间,看看有没有问题,bug修完了,再逐步加资金。不要上来就全仓冲,很容易出问题。
API密钥安全注意事项
API密钥不要写在代码里,更不要上传到GitHub等公开仓库,很容易被盗。最好存在配置文件里,或者环境变量里,代码里读取。
另外,API密钥的权限要开最小化,不要提币权限,只开交易和查询权限。就算密钥泄露了,也转不走你的钱,最多就是乱下单,损失可控。
还有,定期更换API密钥,养成好习惯。
回测过拟合快速识别方法
一个简单的判断标准:如果你调整一点点参数,回测收益就变化很大,说明已经过拟合了。真正有效的策略,参数在一定范围内变化,收益应该是平稳的,不会差太多。
另外,如果策略在历史数据上表现完美,最大回撤不到1%,那基本可以肯定是过拟合了,实盘一定会崩。真实的策略一定有回撤,有波动。
实盘滑点估算技巧
不知道滑点设多少合适?教你一个方法:找一个流动性中等的品种,下一笔小额的市价单,看看成交价格和下单时的最新价差多少,多试几次,取平均值,就是这个品种的平均滑点。
然后回测的时候,把这个滑点加进去,结果会真实很多。
本章内容节选自壹信量化原创书籍《套利6+1》,更多量化技术准备与接口开发细节,可登录intoquant.com查阅完整内容。
本章完。下一章我们来讲套利策略的通用评估标准,教你怎么判断一个策略好不好,用哪些指标衡量,以及实盘和回测的差异到底在哪。
⚠️ 风险提示:本书内容仅为量化研究与知识分享,不构成任何投资建议。套利交易存在基差、费率、流动性、平台与极端行情等风险,历史表现不代表未来收益。投资有风险,入市需谨慎,请自主决策、量力而行。
💡 键盘 ←/→ 翻章 · T 键切换目录