用 Python 轻松抓取 Binance 历史数据全攻略

·

关键词:Binance Python、历史数据、比特币分析、K线数据、API 教程、加密货币量化、DataFrame、Python-binance

加密量化第一步:拿到高质量的历史行情。本文手把手演示如何利用官方 Binance APIPython,在 15 分钟内把任何币对的 历史 K 线数据 拉取到本地,并整理成可直接分析的 DataFrame。无需额外订阅,零成本即可完成数据采集、清洗与后续回测。


1. 环境搭建:装好三件套

开始前,先确认本地已安装以下库:

pip install python-binance pandas

验证安装:

from binance.client import Client
import pandas as pd
import datetime

若出现 ImportError,系统会提示缺失的包名,再次 pip install 即可。


2. 获取并安全存储 API 密钥

这一步涉及账户安全,请务必遵循最佳实践。
  1. 登录 Binance 账户 → 账户中心API 管理
  2. 点击 创建 API → 选择 “系统生成”。
  3. 为密钥写清晰标签,例如 historical-data
  4. 启用 两步验证,并按照提示完成短信或谷歌验证。
  5. 复制 API KeySecret Key,并仅保存在 本地环境变量或加密文件 中,绝不要硬编码到公开仓库。
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_SECRET'
client = Client(api_key, api_secret)

3. 设定目标币对与时间窗口

BTC/USDT 为例,抓取 2024-03-15 至 2024-06-15 的每分钟 K 线。

symbol = 'BTCUSDT'
start_time = datetime.datetime(2024, 3, 15)
end_time   = datetime.datetime(2024, 6, 15)

👉 想进阶查看所有可交易币对?点此获取齐全符号列表与限制详情。


4. 单次调用亦能超 1000 条?揭秘 API 内部机制

klines = client.get_historical_klines(
    symbol=symbol,
    interval=Client.KLINE_INTERVAL_1MINUTE,
    start_str=str(start_time),
    end_str=str(end_time)
)

5. 秒变 DataFrame:一行命令完成结构化

columns = [
    'Open Time', 'Open', 'High', 'Low', 'Close', 'Volume',
    'Close Time', 'Quote Asset Volume', 'Number of Trades',
    'Taker Buy Base', 'Taker Buy Quote', 'Ignore'
]
df = pd.DataFrame(klines, columns=columns)

6. 数据类型转换一步到位

所有价格、成交量列都需转 float,否则后续联系计算会卡在类型不一致。

price_cols = ['Open', 'High', 'Low', 'Close', 'Volume',
              'Quote Asset Volume', 'Number of Trades',
              'Taker Buy Base', 'Taker Buy Quote']
df[price_cols] = df[price_cols].astype(float)

同时把 Open TimeClose Time 转为 datetime

df['Open Time'] = pd.to_datetime(df['Open Time'], unit='ms')

7. 验证与存储:三步搞定

  1. df.info() 查看总记录数与内存占用。
  2. df.tail() 检查尾部样本。
  3. df.to_csv('BTCUSDT_1m_三月份至六月份.csv', index=False) 永久本地备份。

👉 掌握更多实盘数据导出技巧,让行情研究快人一步。


8. 完整运行示例脚本

把下面代码一次性粘贴到本地 .py 文件即可运行。

from binance.client import Client
import pandas as pd
import datetime

# 1. 填入自己的密钥
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_SECRET'
client = Client(api_key, api_secret)

# 2. 设定参数
symbol = 'BTCUSDT'
start_time = datetime.datetime(2024, 3, 15)
end_time   = datetime.datetime(2024, 6, 15)

# 3. 拉取数据
klines = client.get_historical_klines(
    symbol=symbol,
    interval=Client.KLINE_INTERVAL_1MINUTE,
    start_str=str(start_time),
    end_str=str(end_time))

# 4. 构建 DataFrame 并类型转换
columns = ['Open Time', 'Open', 'High', 'Low', 'Close', 'Volume',
           'Close Time', 'Quote Asset Volume', 'Number of Trades',
           'Taker Buy Base', 'Taker Buy Quote', 'Ignore']
df = pd.DataFrame(klines, columns=columns)

price_cols = ['Open', 'High', 'Low', 'Close', 'Volume',
              'Quote Asset Volume', 'Number of Trades',
              'Taker Buy Base', 'Taker Buy Quote']
df[price_cols] = df[price_cols].astype(float)
df['Open Time'] = pd.to_datetime(df['Open Time'], unit='ms')

# 5. 保存
df.to_csv('BTCUSDT_1m_Mar-Jun2024.csv', index=False)
print('✅ 历史 K 线已保存 CSV,共', len(df), '条记录')

常见问题解答(FAQ)

Q1:Binance API 有请求频率限制吗?多久能拉一次?
A1:REST API 默认 每分钟 1200 次get_historical_klines 内部已自动限速,日常写作研究通常不会触发上限;如需批量跑多个币对,可在循环里加 time.sleep(0.1) 额外缓冲。

Q2:只能抓取三个月吗?更长历史该如何处理?
A2:官方仅保存最近两年的 1 分钟数据。更早期可通过 Binance 官方 公开数据归档(data.binance.vision) 下载 Parquet / CSV 格式快照,下载后再用 Pandas 合并即可。

Q3:如何把 1 分钟数据降采样成 5 分钟或日线?
A3:使用 Pandas 的 df.resample('5min', on='Open Time').agg({...})df.set_index('Open Time')['Close'].resample('D').last() 一行即可实现。

Q4:Secrets 放在代码里走 Git 会被扫描怎么办?
A4:推荐用 环境变量.env 配合 python-dotenv 读取;对公开仓库务必使用 .gitignore 排除敏感文件。

Q5:拉取到的数据是否包括插针价?如何过滤异常 K 线?
A5:原始数据均来自撮合引擎;若想剔除极端波动,可在 VolumeNumber of Trades 列设定过滤器,如 df = df[df['Volume'] > 0]

Q6:想看其他交易所数据是否有统一接口?
A6:CCXT 是跨交易所神器,支持 100+ 平台,一行代码即可切换数据源;未来教程将展开讲解。


小结

现在行动,把脚本跑起来,亲手验证数据完整度与准确性,才算真正踏出了量化交易的第一步。