关键词:Binance Python、历史数据、比特币分析、K线数据、API 教程、加密货币量化、DataFrame、Python-binance
加密量化第一步:拿到高质量的历史行情。本文手把手演示如何利用官方 Binance API 与 Python,在 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 密钥
这一步涉及账户安全,请务必遵循最佳实践。
- 登录 Binance 账户 → 账户中心 → API 管理。
- 点击 创建 API → 选择 “系统生成”。
- 为密钥写清晰标签,例如
historical-data。 - 启用 两步验证,并按照提示完成短信或谷歌验证。
- 复制
API Key与Secret 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)
)Client.KLINE_INTERVAL_1MINUTE可替换为5m、1h、1d等周期。- API 内部已自动分段循环,无需手写分页。理论上可一次性拿回完整三个月的分钟级数据。
- 若数据量巨大,可再加
limit=1000手动限速,降低瞬时请求压力。
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 Time、Close Time 转为 datetime:
df['Open Time'] = pd.to_datetime(df['Open Time'], unit='ms')7. 验证与存储:三步搞定
df.info()查看总记录数与内存占用。df.tail()检查尾部样本。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:原始数据均来自撮合引擎;若想剔除极端波动,可在 Volume 或 Number of Trades 列设定过滤器,如 df = df[df['Volume'] > 0]。
Q6:想看其他交易所数据是否有统一接口?
A6:CCXT 是跨交易所神器,支持 100+ 平台,一行代码即可切换数据源;未来教程将展开讲解。
小结
- 只用到 三个核心函数:
Client()、get_historical_klines()、Pandas 类型转换。 - 整个过程 端到端,没有商业插件、无需额外订阅。
- 拿到干净的历史数据后,你就能快速开展 因子回测、机器学习特征工程、高频交易信号挖掘 等下一步工作。
现在行动,把脚本跑起来,亲手验证数据完整度与准确性,才算真正踏出了量化交易的第一步。