掌握数字货币历史数据:3 大 API 实战源码解析

·

关键词:数字货币、历史行情、Binance API、CoinGecko API、CryptoCompare API、量化回测
版本要求:Python3.7+、pandas≥1.3

获取可靠的历史行情数据是量化交易与基本面研究的第一步。本文聚焦全球最热门的 3 个数字货币历史数据 API,并给出可直接运行的 Python 源码,帮助你 10 分钟内拉起 1 分钟级全套数据,轻松启动策略回测。


Binance API:深度最全、直接对接交易所订单簿

Binance 每分钟返回 1000 条 K 线,精度足以满足回测、机器学习以及高频策略的需求。以下代码无需注册即可运行。

快速抓取 BTC/USDT 1 分钟线

import requests, time, pandas as pd

def get_binance_klines(symbol='BTCUSDT', interval='1m', limit=1000):
    """一键获取数字货币历史行情"""
    url = f'https://api.binance.com/api/v3/klines'
    params = {'symbol': symbol, 'interval': interval, 'limit': limit}
    data = requests.get(url, params=params).json()

    cols = ['OpenTime', 'Open', 'High', 'Low', 'Close', 'Volume',
            'CloseTime', 'QuoteVol', 'Trades', 'TakerBuyBaseVol',
            'TakerBuyQuoteVol', 'Ignore']
    df = pd.DataFrame(data, columns=cols)
    # 将毫秒时间戳转为标准时间格式
    df['OpenTime'] = pd.to_datetime(df['OpenTime'], unit='ms')
    numeric_cols = [c for c in cols if c not in ['OpenTime', 'CloseTime']]
    df[numeric_cols] = df[numeric_cols].astype(float)
    return df

df = get_binance_klines(limit=1500)    # 最近 1500×1min = 约 24h
print(df.head())

运行效果(截取):

             OpenTime     Open     High  ...  TakerBuyBaseVol  TakerBuyQuoteVol
0 2024-05-10 03:36:00  59932.8  60021.4 ...          767.432          4.602e+07
1 2024-05-10 03:37:00  60016.5  60028.1 ...          595.293          3.565e+07

将 DataFrame 转存 CSV 仅需一行,方便后续 量化回测工具 直接读取。


CoinGecko API:0 成本、免 Key、轻松上手

CoinGecko 提供 无门槛接口,支持 1 分钟、1 小时、1 天等多粒度,但数据保留期为 30 天。适合入门者或短期研究。

import requests, pandas as pd

def get_coingecko_klines(coin='bitcoin', vs_currency='usd', days=1):
    url = f'https://api.coingecko.com/api/v3/coins/{coin}/market_chart'
    params = {'vs_currency': vs_currency, 'days': days, 'interval': 'minute'}
    prices = requests.get(url, params=params).json()['prices']
    df = pd.DataFrame(prices, columns=['Timestamp', 'Price'])
    df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='ms')
    return df

df_cgk = get_coingecko_klines('ethereum', 'usd')
print(df_cgk.tail())

注意:CoinGecko 不返回成交量,如果策略需要量价配合,建议与 Binance 或 CryptoCompare 补充。


CryptoCompare API:高级聚合、低延迟

CryptoCompare 提供交易所交叉聚合的数字货币市场数据,默认返 OHLCV 五价一量。免费 Key 每日可达 100k 次调用,非常够玩。

抓取 1 分钟 ETH/USDT 历史

import requests, datetime

API_KEY = 'YOUR_KEY_HERE'
def get_cryptocompare(symbol='ETH', base='USDT', limit=2000):
    url = 'https://min-api.cryptocompare.com/data/v2/histominute'
    params = {
        'fsym': symbol,
        'tsym': base,
        'limit': limit,
        'api_key': API_KEY
    }
    raw = requests.get(url, params=params).json()
    data = raw['Data']['Data']
    df = pd.DataFrame(data)
    df['time'] = pd.to_datetime(df['time'], unit='s')
    return df

df_cc = get_cryptocompare('ETH', 'USDT')
print(df_cc[['time', 'open', 'high', 'low', 'close', 'volumefrom']].describe())

三种 API 对比速览

指标BinanceCoinGeckoCryptoCompare
是否需 Key可选不需要需要
分钟级上限1000/次1 天2000/次
返回字段12 条2 条8 条
交易所来源自有撮合多家均价聚合后数据

FAQ:常见问题 5 问 5 答

Q1:抓取大量 1 分钟数据会不会被 IP 限流?
A:Binance 对未验证 IP 的限速为 1200 req/min,合理加入 time.sleep(0.1),基本安全。CryptoCompare 则需留意 每日配额

Q2:Binance 只能拿最近 1500 分钟吗?
A:可循环调用,每次换起止时间 startTime & endTime,即可把完整历史分段拼回本地,一套脚本爬满 2017 年至今仅需数小时。

Q3:如何做数据去重与异常值清洗?
A:常见两条路子:

Q4:可以直接把数据喂给回测框架吗?
A:当然可以!Pandas 的 DataFrame 即可被 backtrader、vn.py、zipline 等框架原生识别,只需确保列名映射到 open、high、low、close、volume

Q5:如果币种不在 Binance?
A:目标币种如 SHIB、DOGE 等,可优先查 CoinGecko markets 端点,再选流动性最大的交易所重复本文流程即可。


结语:下一步策略开发

获取到历史数据只是第一步。接下来你可以:

  1. 套用 TA-Lib 计算技术指标;
  2. 切入实盘模拟盘,用 回测服务器 进行策略验证;
  3. 部署自动加仓、止盈止损脚本,实现真正自动化交易。

👉 想一站式接入实盘并做自动化策略?点这里探索高效工具!


原文代码已上传 GitHub:crypto-history-api-template。如需进一步扩展,可以阅读 量化回测实战系列相关文章。祝你在数字货币市场斩获稳健收益!