在整理数字货币数据时,我逐渐发现一个规律: 只要数据能稳定、持续地被程序访问,后面的分析和策略反而会简单很多。
相比在网页上手动下载行情文件,我更习惯用接口把历史和实时数据直接拉到本地,统一处理。
加密货币历史数据下载
做回测时,最常用的是分钟线和小时线数据。 通过 HTTP 接口一次性拉取历史 K 线,可以避免反复拼接不同来源的数据。
import requests
import pandas as pd
url = "https://api.alltick.co/v1/crypto/ohlc"
params = {
"symbol": "BTCUSDT",
"interval": "1h",
"limit": 5000
}
resp = requests.get(url, params=params)
data = resp.json()["data"]
df = pd.DataFrame(data)
df["time"] = pd.to_datetime(df["time"], unit="ms")
print(df.head())
这种方式适合批量下载加密货币历史数据,整理成统一格式后,后续处理会轻松很多。
加密货币实时行情数据下载
如果需要实时观察价格变化,WebSocket 推送比轮询接口更合适。 行情到达后可以直接进入计算逻辑,不需要额外的中转步骤。
import websocket
import json
def on_message(ws, message):
msg = json.loads(message)
print("最新价格:", msg["price"], "时间:", msg["time"])
ws = websocket.WebSocketApp(
"wss://api.alltick.co/v1/crypto/realtime",
on_message=on_message
)
ws.run_forever()
在本地跑一段时间后,就可以持续拿到最新行情,用来做监控或数据记录。
加密货币数据集的整理方式
当历史数据和实时行情都能稳定获取后,我通常会把它们统一存成表结构,按币种和周期拆分。 例如同时拉取 BTC、ETH 等多个交易对的数据:
symbols = ["BTCUSDT", "ETHUSDT", "LTCUSDT"]
for symbol in symbols:
r = requests.get(
"https://api.alltick.co/v1/crypto/ohlc",
params={"symbol": symbol, "interval": "1d", "limit": 1000}
)
df = pd.DataFrame(r.json()["data"])
df["time"] = pd.to_datetime(df["time"], unit="ms")
print(symbol, df.tail(2))
这种方式可以逐步构建自己的加密货币数据集,同时覆盖多个主流币种。
同一套接口处理历史与实时
实际使用中,用同一套接口同时拉取历史和实时数据,会减少很多适配成本。 我目前在用的一种方式,是在获取加密货币行情时使用过 AllTick API,它与常见的数据接口一样,都是按交易对返回 K 线和实时价格,可以直接接入现有的数据处理流程。
整个过程不需要额外调整策略逻辑,只是把数据源换成更稳定的接口形式。