跨所价差套利(上):原理与触发条件、主流交易所API对接、实时价差监控程序编写
各位同学,欢迎来到跨所价差套利的第一讲。
说实话,价差套利是量化交易里最“稳”的策略之一。为什么?因为你不赌方向。你赚的是两个市场之间的“价差”,而不是比特币涨还是跌。我刚开始做套利那会儿,总觉得这事简单——不就是低价买、高价卖嘛。结果一上手就踩了不少坑。嗯,今天咱们把这些坑提前填上。
一、跨所价差套利的底层逻辑
先搞清楚一件事:价差是怎么来的?
同一个币种,在不同交易所的价格不一样。比如BTC在Binance卖100000 USDT,在OKX卖100050 USDT。这50块的差价就是套利空间。
为什么会这样?说白了,交易所之间资金流动有摩擦。大额转账慢、手续费高、甚至网络拥堵,导致价格不能瞬间同步。你想想看,如果全球所有交易所价格都一样,那套利者就失业了。正是因为有延迟和不完美,我们才有饭吃。
核心公式:
价差 = (交易所A价格 - 交易所B价格) / 交易所B价格 × 100%
当价差 > 阈值(比如0.1%),触发套利信号。
但这里有个关键点:价差不是越大越好。我见过新手看到价差0.5%就冲进去,结果手续费一扣,倒亏。所以触发条件必须考虑三个因素:
- 手续费成本:现货吃单手续费一般在0.1%左右,合约可能更低。你得算清楚双边成本。
- 滑点:你看到的价差是盘口价,但成交价可能不一样。尤其流动性差的币种,滑点能吃掉你所有利润。
- 转账时间:如果你做的是“搬砖”套利(从一个所提币到另一个所卖),那转账时间内的价格波动就是风险。
我的经验:我个人习惯把触发阈值设为手续费的2-3倍。比如双边手续费0.2%,那我至少等价差到0.4%才动手。留点安全垫,别做“刀口舔血”的事。
二、主流交易所API对接(Binance / OKX / Bybit)
好,理论讲完了,咱们来点实际的。写代码之前,你得先搞定交易所的API对接。我以Python为例,因为生态最成熟。
2.1 Binance API
Binance的API文档写得最清楚,新手建议从这里开始。你需要做两件事:
- 去官网创建API Key,权限勾选“读取”和“交易”
- 安装python-binance库:
pip install python-binance
from binance.client import Client
api_key = "你的API_KEY"
api_secret = "你的API_SECRET"
client = Client(api_key, api_secret)
# 获取BTC/USDT实时价格
ticker = client.get_symbol_ticker(symbol="BTCUSDT")
print(f"Binance BTC价格: {ticker['price']}")
嗯,这里要注意:API Key千万别硬编码在代码里。我曾经把Key直接写在脚本里,然后不小心上传到了GitHub……结果几分钟内账户就被盗了。现在我用环境变量或者配置文件来管理。
避坑指南:我曾经因为API权限设置太松,导致别人用我的Key下了几百笔小单,手续费亏了几百U。记住:只开你需要的权限,用完就删。
2.2 OKX API
OKX的API跟Binance略有不同。它需要额外的passphrase参数。安装库:pip install okx-py
from okx import MarketData
api_key = "你的API_KEY"
api_secret = "你的API_SECRET"
passphrase = "你的PASSPHRASE"
market = MarketData(api_key, api_secret, passphrase)
# 获取BTC/USDT实时价格
ticker = market.get_ticker(instId="BTC-USDT")
print(f"OKX BTC价格: {ticker['data'][0]['last']}")
OKX的返回数据结构跟Binance不一样,它是个嵌套的JSON。你写代码时一定要先打印出来看看结构,别想当然。
2.3 Bybit API
Bybit的API跟Binance风格接近,但有些细节不同。安装库:pip install pybit
from pybit.unified_trading import HTTP
api_key = "你的API_KEY"
api_secret = "你的API_SECRET"
session = HTTP(api_key=api_key, api_secret=api_secret)
# 获取BTC/USDT实时价格
ticker = session.get_tickers(category="spot", symbol="BTCUSDT")
print(f"Bybit BTC价格: {ticker['result']['list'][0]['lastPrice']}")
你看,三个交易所的API调用方式大同小异,但返回字段名不一样。Binance用price,OKX用last,Bybit用lastPrice。这就是为什么我建议你写一个统一的“价格获取接口”,把差异封装起来。
三、实时价差监控程序编写
好,现在我们把三个交易所的价格拉到一个程序里,实时计算价差。下面是一个简化版的监控脚本:
import time
from binance.client import Client
from okx import MarketData
from pybit.unified_trading import HTTP
# 初始化客户端(请替换为你的Key)
binance_client = Client("KEY", "SECRET")
okx_market = MarketData("KEY", "SECRET", "PASSPHRASE")
bybit_session = HTTP(api_key="KEY", api_secret="SECRET")
def get_prices():
"""获取三个交易所的BTC价格"""
prices = {}
# Binance
b_ticker = binance_client.get_symbol_ticker(symbol="BTCUSDT")
prices['binance'] = float(b_ticker['price'])
# OKX
o_ticker = okx_market.get_ticker(instId="BTC-USDT")
prices['okx'] = float(o_ticker['data'][0]['last'])
# Bybit
by_ticker = bybit_session.get_tickers(category="spot", symbol="BTCUSDT")
prices['bybit'] = float(by_ticker['result']['list'][0]['lastPrice'])
return prices
def calculate_spread(prices):
"""计算价差矩阵"""
exchanges = list(prices.keys())
print(f"\n=== {time.strftime('%H:%M:%S')} ===")
for i in range(len(exchanges)):
for j in range(i+1, len(exchanges)):
ex1, ex2 = exchanges[i], exchanges[j]
spread = (prices[ex1] - prices[ex2]) / prices[ex2] * 100
print(f"{ex1} vs {ex2}: {spread:.4f}%")
# 主循环
while True:
try:
prices = get_prices()
calculate_spread(prices)
time.sleep(1) # 每秒刷新一次
except Exception as e:
print(f"出错了: {e}")
time.sleep(5)
这个脚本每秒打印一次三个交易所之间的价差。你运行后会发现,价差大部分时间在0.01%~0.05%之间波动。一旦超过0.1%,就值得关注了。
优化建议:我个人习惯把价差数据写入数据库或者CSV文件,方便回测。你可以加一行with open('spread_log.csv', 'a') as f: f.write(...),这样就能分析历史价差分布了。
四、本章知识体系图
下面我用一张SVG图来总结本章的核心逻辑。你看完应该能明白整个流程是怎么串起来的。
这张图把今天的知识点串起来了:从价差原理出发,到触发条件的计算,再到三个交易所的API对接,最后用监控程序把一切跑起来。下一章我们会在这个基础上,加入自动下单逻辑,真正实现“看到价差就吃”。
好,今天就到这里。代码部分你可以直接复制运行,但记得替换成你自己的API Key。有任何问题,欢迎在课程群里交流。
公众号:蓝海资料掘金营,微信deep3321