用 Python 玩转 Binance:10 分钟打造一个交易所自动化助手

·

想用 Python 快速对接全球领先的 加密货币交易所 Binance,却苦于没有官方文档参考?这份实战指南用完全异步的 python-binance 库,手把手带你完成 行情查询、充值地址生成、资产余额读取、交易与法币流水 等高频场景。1080+ 字干货,满足 2025 年的开发者需求。

环境准备:一条命令搞定依赖

pip install python-binance
若项目还在测试阶段,可先阅读 流畅上手异步交易接口的关键技巧 预热思路,再回到本文实战不掉坑 🚀

基础概念速览

关键词含义
symbol交易对,例:BTCUSDT 中 BTC 为基础资产,USDT 为计价资产
ticker该交易对的实时价格快照,包括最新价、24h 涨跌幅等
deposit address你的专属充值地址,可在链上互转
API Key/Secret通过 Binance API 管理 申请,务必设置最小权限
transactionType=0法币购买数字资产;=1 代表卖出为法币

获取所有交易对 list of symbols

代码面前无废话。先拉取完整符号表,为后续环节铺垫。

import asyncio
from binance import AsyncClient

async def list_symbols():
    client = await AsyncClient.create()
    info = await client.get_exchange_info()
    print(f'# of symbols: {len(info["symbols"])}')
    for s in info['symbols']:
        print(f'{s["symbol"]}: base {s["baseAsset"]}, quote {s["quoteAsset"]}')
    await client.close_connection()

asyncio.run(list_symbols())

运行结果(节选):

# of symbols: 2183
BTCUSDT: base BTC, quote USDT
ETHUSDT: base ETH, quote USDT
BNBUSDT: base BNB, quote USDT

实时行情询问器 — ticker

两种接口:

import asyncio, json
from binance import AsyncClient

async def print_tick():
    client = await AsyncClient.create()
    full = await client.get_ticker(symbol='LTCBUSD')
    snap = await client.get_symbol_ticker(symbol='LTCBUSD')
    print(json.dumps(full, indent=2))
    print('---- latest ----')
    print(json.dumps(snap, indent=2))
    await client.close_connection()

asyncio.run(print_tick())

在终端里即可实时跟踪 LTC/BUSD 的价、量、深度三要素。

专属充值地址:一步搞定

注意:以下脚本需要设置环境变量 BINANCE_API_KEYBINANCE_SECRET_KEY

import asyncio, os
from binance import AsyncClient

async def show_addresses():
    client = await AsyncClient.create(os.getenv('BINANCE_API_KEY'),
                                      os.getenv('BINANCE_SECRET_KEY'))
    for coin in ['BTC', 'LTC', 'DOGE']:
        print(await client.get_deposit_address(coin=coin))
    await client.close_connection()

asyncio.run(show_addresses())

一句话获得链上地址,再也不用手动复制粘贴。

余额 & 提现记录:资产一目了然

通过同样的 crypto balance 接口,可分别读取 可用余额、锁定余额;再通过 withdraw_history 弄清最近 90 天资金流向。

async def my_assets():
    client = await AsyncClient.create(os.getenv('BINANCE_API_KEY'),
                                      os.getenv('BINANCE_SECRET_KEY'))
    ltc_balance = await client.get_asset_balance(asset='LTC')
    print(f'💰 余额:{ltc_balance["free"]} 可用,{ltc_balance["locked"]} 锁定')

    wd = await client.get_withdraw_history()
    for w in wd:
        print(f'提现 {w["amount"]} {w["coin"]} 手续费 {w["transactionFee"]} 完成时间 {w["completeTime"]}')
    await client.close_connection()

asyncio.run(my_assets())

交易回显:个人订单可视化

rich 打印美观的彩色表格,一行不漏展示 我的交易记录

pip install rich
import asyncio, os
from datetime import datetime
from rich.table import Table
from rich.console import Console
from binance import AsyncClient

async def pretty_trades():
    client = await AsyncClient.create(os.getenv('BINANCE_API_KEY'),
                                      os.getenv('BINANCE_SECRET_KEY'))
    rows = await client.get_my_trades(symbol='SHIBBUSD')
    table = Table(title='SHIBA 交易流水')
    table.add_column('成交日期')
    table.add_column('成交价', justify='right')
    table.add_column('数量', justify='right')
    table.add_column('交易额', justify='right')
    table.add_column('手续费', justify='right')
    for r in rows:
        trade_time = datetime.utcfromtimestamp(r['time']/1000.0)
        table.add_row(trade_time.strftime('%Y-%m-%d'), r['price'],
                      r['qty'], r['quoteQty'], f"{r['commission']} {r['commissionAsset']}")
    Console().print(table)
    await client.close_connection()

asyncio.run(pretty_trades())

法币通道:接入历史买币记录

法币支付历史 拉成表格,方便做回测或税务申报。

from binance.helpers import date_to_milliseconds

async def fiat_payments():
    client = await AsyncClient.create(os.getenv('BINANCE_API_KEY'),
                                      os.getenv('BINANCE_SECRET_KEY'))
    begin = '2023-01-01'
    end = '2023-03-31'
    history = await client.get_fiat_payments_history(
        transactionType=0,
        beginTime=date_to_milliseconds(begin),
        endTime=date_to_milliseconds(end)
    )
    table = Table(title='法币买入明细')
    table.add_column('日期')
    table.add_column('法币金额')
    table.add_column('法币币种')
    table.add_column('获得币种')
    table.add_column('买入单价')
    table.add_column('手续费')
    for row in history['data']:
        d = datetime.utcfromtimestamp(row['createTime']/1000.0)
        table.add_row(d.strftime('%Y-%m-%d'), str(row['sourceAmount']),
                      row['fiatCurrency'], row['cryptoCurrency'],
                      str(row['price']), str(row['totalFee']))
    Console().print(table)
    await client.close_connection()

asyncio.run(fiat_payments())

易犯坑汇总 & 安全锦囊

  1. 公钥私钥千万别写进源码,用环境变量或者专门的 密钥管理服务
  2. API 权限选 只读(读取信息) 或最小必要集,降低风险面。
  3. 请求频繁会触发 限速,善用官方 x-mbx-used-weight 响应头。
  4. 生产部署务必启用 IP 白名单双重验证

常见问题与解答

Q1:我只想获取 BTC 最新价格,需要登录 API 吗?
不需要。get_symbol_ticker(symbol='BTCUSDT') 是公开接口,无 API Key 亦可。

Q2:异步写法会不会比同步慢?
恰恰相反。异步可以一次性并发十几个请求,练熟 asyncio.gather,效率爆炸提。

Q3:对公链充值地址格式不熟,如何确认打错链?
get_deposit_address 返回本身就包含 network 字段,与 Coin 地址一一对应即可。

Q4:提现记录为何才 90 天?
官方默认窗口。想拉更长历史,可循环分页或使用 历史数据下载中心

Q5:法币充值接口不报手续费?
在参数里加上 transactFeeFlag=True 即可获得。

Q6:初学者如何快速测试行情订阅?
WebSocket 边读边写。点赞收藏,后续专门出一篇深度教程 🤫


到此,你已经拥有 Python 自动化炒币 所需的完整工具箱。 👉 点击继续探索高频交易策略的另一扇大门