使用Binance API获取套利交易对价格计算结果异常求助
三角套利计算结果异常问题解决
问题背景
通过Binance API获取交易对价格用于三角套利,但计算结果远偏离预期(实际输出23.52、16.47,预期为0.909、0.929),尝试多种方法未解决。
原代码
last_data = [["ETHBTC", "BTCPAX", "PAXETH"],["ETHBTC", "BTCTUSD", "TUSDETH"],... ...] for a in last_data: az = 1.0 for y in a: response = requests.get(f"https://api.binance.com/api/v3/ticker/price?symbol={y}") az *= float(response.json()["price"]) print(y) print(az)
实际输出
ETHBTC BTCPAX PAXETH 23.520797834005702 ETHBTC BTCTUSD TUSDETH 16.47345165311804
预期结果
first avg: 0,909 second avg: 0,929
问题原因
- 价格方向理解错误:Binance
api/v3/ticker/price返回的是1个基础币可兑换的计价币数量,原代码直接相乘未匹配套利循环的正确方向,导致结果异常放大。 - 使用错误的价格类型:用最新成交价而非盘口挂单的买/卖价,无法模拟真实交易的成交成本,结果偏离实际套利空间。
- 未扣除交易手续费:套利需扣除每笔交易的手续费,预期结果是扣除手续费后的合理数值,原计算未考虑这一点。
- 交易对有效性问题:PAX已被Binance替换为USDP,PAXETH交易可能已下线,导致获取的价格异常。
修正后的代码
import requests # 手续费率,根据你的Binance VIP等级调整,默认0.1% FEE_RATE = 0.001 last_data = [["ETHBTC", "BTCPAX", "PAXETH"], ["ETHBTC", "BTCTUSD", "TUSDETH"]] for pair_group in last_data: arbitrage_result = 1.0 for pair in pair_group: # 获取盘口买卖价,替代最新成交价 response = requests.get(f"https://api.binance.com/api/v3/ticker/bookTicker?symbol={pair}") ticker_data = response.json() # 此处用bidPrice模拟卖出基础币的成交价,若套利方向相反需改用askPrice price = float(ticker_data["bidPrice"]) arbitrage_result *= price print(pair) # 扣除三次交易的手续费 arbitrage_result *= (1 - FEE_RATE) ** 3 print(f"计算结果: {arbitrage_result:.3f}\n")
说明
- 改用
bookTicker接口获取盘口买/卖价,能更准确模拟真实交易的成交价格。 - 加入手续费计算,结果会更接近预期的扣除成本后的数值。
- 需确认交易对的有效性,建议将PAX相关交易对替换为USDP对应交易对(如USDPETH)。
内容的提问来源于stack exchange,提问作者eymentakak
相关产品推荐
相关产品推荐

