Python构建币安量化交易机器人的完整指南

·

本文将详细介绍如何使用Python构建一个与币安交易所交互的量化交易机器人。该机器人通过币安REST API实现自动化交易,采用循环监控策略执行买卖决策。

核心原理与技术基础

币安REST API是一种符合REST架构标准的应用程序接口,允许开发者通过HTTP请求与币安交易平台进行通信。我们使用Python的requests库发送GET和POST请求,获取账户信息并执行交易操作。

这个交易机器人的核心是一个持续运行的while True:循环,包含四个关键功能函数:current_price()(获取当前交易对价格)、account_balance()(检查账户余额)、latest_transaction()(查询最近交易记录)和submit_order()(提交交易订单)。机器人采用市价单交易模式,其逻辑流程如下:

  1. 检查账户余额,确定可用交易资产数量
  2. 查询最近交易记录,获取上次交易价格
  3. 基于最新交易价格计算下次交易的买卖价格
  4. 当当前价格达到设定条件时,提交交易订单
  5. 等待指定时间后返回第一步

风险提示:本文仅供技术学习参考,不构成任何投资建议。加密货币交易存在高风险,请在使用前充分了解相关风险,并根据自身情况谨慎决策。

环境配置与密钥管理

首先需要导入必要的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 + "&timestamp=" + 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}&quoteOrderQty={quoteOrderQty}&timestamp={posix_timestamp_millis}"
    else:  # 如果上次是买入,这次执行卖出
        side = 'SELL'
        quantity = str(symbol_first_avail)
        queryString = f"symbol={symbol_pair}&side={side}&type={type}&quantity={quantity}&timestamp={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连接到核心交易逻辑的实现。开发者可以根据自身需求调整交易策略和风险参数,构建符合个人投资风格的自动化交易系统。

需要注意的是,自动化交易虽然能消除情绪干扰,但仍需持续监控和优化。建议始终遵循风险管理原则,不过度依赖单一策略,并定期评估系统性能。