本文将详细介绍如何使用Python构建一个与币安交易所交互的量化交易机器人。该机器人通过币安REST API实现自动化交易,采用循环监控策略执行买卖决策。
核心原理与技术基础
币安REST API是一种符合REST架构标准的应用程序接口,允许开发者通过HTTP请求与币安交易平台进行通信。我们使用Python的requests库发送GET和POST请求,获取账户信息并执行交易操作。
这个交易机器人的核心是一个持续运行的while True:循环,包含四个关键功能函数:current_price()(获取当前交易对价格)、account_balance()(检查账户余额)、latest_transaction()(查询最近交易记录)和submit_order()(提交交易订单)。机器人采用市价单交易模式,其逻辑流程如下:
- 检查账户余额,确定可用交易资产数量
- 查询最近交易记录,获取上次交易价格
- 基于最新交易价格计算下次交易的买卖价格
- 当当前价格达到设定条件时,提交交易订单
- 等待指定时间后返回第一步
风险提示:本文仅供技术学习参考,不构成任何投资建议。加密货币交易存在高风险,请在使用前充分了解相关风险,并根据自身情况谨慎决策。
环境配置与密钥管理
首先需要导入必要的Python库:
import numpy as np
import time
from datetime import datetime, timezone, timedelta
import requests
import hmac
import hashlib
import yaml
import json使用YAML文件安全地存储API密钥,避免将敏感信息直接写入代码文件。配置文件格式如下:
apikey: '您的API密钥'
secretkey: '您的私钥'在主程序中加载配置并设置交易参数:
config = yaml.safe_load(open('config.yml'))
apikey = config['apikey']
secretkey = config['secretkey']
symbol_pair = 'BNBBUSD' # 交易对
symbol_first = 'BNB' # 基础货币
symbol_second = 'BUSD' # 报价货币重要提示:API密钥和私钥是访问账户的凭证,请勿与任何人分享!
实时价格获取功能
current_price()函数通过币安的价格查询接口获取指定交易对的当前市场价格:
def current_price():
urlcp = 'https://api.binance.us/api/v3/ticker/price'
paramscp = {'symbol': symbol_pair}
response_cp = requests.get(urlcp, params=paramscp)
pair_info = response_cp.json()
cp = pair_info['price']
print(f'{symbol_pair} 当前价格: {cp}')
return cp该函数返回的交易价格将作为后续交易决策的基础数据。
账户余额查询实现
account_balance()函数使用认证请求获取账户资产信息:
def account_balance():
url = "https://api.binance.us/api/v3/account"
now = datetime.now(timezone.utc)
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
posix_timestamp_millis = (now - epoch) // timedelta(microseconds=1) // 1000
queryString = "timestamp=" + str(posix_timestamp_millis)
signature = hmac.new(secretkey.encode(), queryString.encode(), hashlib.sha256).hexdigest()
url = url + f"?{queryString}&signature={signature}"
response_ai = requests.get(url, headers={'X-MBX-APIKEY': apikey})
account_info = response_ai.json()
# 提取特定交易对的资产信息
for i, balance in enumerate(account_info['balances']):
if balance['asset'] == symbol_first:
ifirst = i
if balance['asset'] == symbol_second:
isecond = i
assetfree = account_info['balances'][ifirst]['free'] # 第一种资产可用数量
assetfree2 = account_info['balances'][isecond]['free'] # 第二种资产可用数量
return assetfree, assetfree2此函数返回交易对中两种资产的可用余额,为后续交易量计算提供依据。
最近交易记录查询
latest_transaction()函数获取用户的最新交易记录:
def latest_transaction():
url = "https://api.binance.us/api/v3/myTrades"
now = datetime.now(timezone.utc)
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
posix_timestamp_millis = (now - epoch) // timedelta(microseconds=1) // 1000
queryString = "symbol=" + symbol_pair + "×tamp=" + str(posix_timestamp_millis)
signature = hmac.new(secretkey.encode(), queryString.encode(), hashlib.sha256).hexdigest()
url = url + f"?{queryString}&signature={signature}"
response_trades = requests.get(url, headers={'X-MBX-APIKEY': apikey})
trades = response_trades.json()
latest_transaction = trades[-1] # 获取最新交易
tp_price = latest_transaction['price'] # 交易价格
isBuyer = latest_transaction['isBuyer'] # 买卖方向
return tp_price, isBuyer该函数返回最新交易的价格和方向,用于计算下一次交易的触发价格。
订单提交功能
submit_order()函数负责向交易所提交交易订单:
def submit_order():
url = "https://api.binance.us/api/v3/order"
now = datetime.now(timezone.utc)
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
posix_timestamp_millis = (now - epoch) // timedelta(microseconds=1) // 1000
type = 'MARKET' # 市价单
if isBuyer == False: # 如果上次是卖出,这次执行买入
side = 'BUY'
quoteOrderQty = str(symbol_second_avail)
queryString = f"symbol={symbol_pair}&side={side}&type={type}"eOrderQty={quoteOrderQty}×tamp={posix_timestamp_millis}"
else: # 如果上次是买入,这次执行卖出
side = 'SELL'
quantity = str(symbol_first_avail)
queryString = f"symbol={symbol_pair}&side={side}&type={type}&quantity={quantity}×tamp={posix_timestamp_millis}"
signature = hmac.new(secretkey.encode(), queryString.encode(), hashlib.sha256).hexdigest()
url = url + f"?{queryString}&signature={signature}"
response_order = requests.post(url, headers={'X-MBX-APIKEY': apikey})
order = response_order.json()
# 处理订单响应
time.sleep(5)核心交易逻辑循环
所有功能函数在主循环中协调工作:
while True:
# 获取当前价格
cp = current_price()
# 获取账户余额
assetfree, assetfree2 = account_balance()
time.sleep(5)
# 获取最近交易记录
tp_price, isBuyer = latest_transaction()
# 设置交易参数
bsp = 0.5 # 买卖百分比阈值
delta = bsp / 100 * float(tp_price)
# 更新当前价格
cp = current_price()
# 买入逻辑
if isBuyer == False:
buyprice = float(tp_price) - delta
if float(cp) < buyprice:
symbol_second_avail = np.floor(float(assetfree2))
submit_order() # 执行买入
assetfree, assetfree2 = account_balance() # 更新账户信息
# 卖出逻辑
elif isBuyer == True:
sellprice = float(tp_price) + delta
if float(cp) > sellprice:
n_decimals = 2
symbol_first_avail = ((float(assetfree) * 10**n_decimals) // 1) / (10**n_decimals)
submit_order() # 执行卖出
assetfree, assetfree2 = account_balance() # 更新账户信息
time.sleep(60*60) # 每小时检查一次自动化部署与监控
为确保机器人持续运行,可以创建bash监控脚本:
while :
do
if ps aux | grep '[p]ython binance_bot.py'; then
echo "脚本运行中"
else
echo "重启脚本"
python binance_bot.py &> b_output.txt &
fi
sleep 30m
done该脚本每30分钟检查一次交易机器人是否正常运行,必要时自动重启。
常见问题
如何获取币安API密钥?
在币安官网账户的API管理页面可以创建API密钥对。需要启用交易权限,并设置合适的IP访问白名单以增强安全性。
交易机器人的风险有哪些?
主要风险包括市场波动风险、技术故障风险、API限制风险和安全风险。建议先使用测试网络和小额资金进行充分测试。
如何优化交易策略?
可以通过回测历史数据、调整交易阈值参数、添加止损机制和多样化交易对来优化策略性能。同时应密切关注市场流动性状况。
机器人运行需要什么样的技术环境?
需要稳定的网络连接和24小时运行的服务器。云服务器或本地设备均可,但需确保网络延迟较低且运行环境安全可靠。
如何处理API速率限制?
币安API有请求频率限制,需要在代码中添加适当的延时机制,避免频繁请求导致API访问被临时限制。
市价单和限价单哪种更适合?
市价单保证成交但不保证价格,限价单保证价格但不保证成交。机器人可根据策略需求选择订单类型,高频策略通常使用市价单。
总结
本文详细介绍了使用Python构建币安量化交易机器人的完整流程,从API连接到核心交易逻辑的实现。开发者可以根据自身需求调整交易策略和风险参数,构建符合个人投资风格的自动化交易系统。
需要注意的是,自动化交易虽然能消除情绪干扰,但仍需持续监控和优化。建议始终遵循风险管理原则,不过度依赖单一策略,并定期评估系统性能。