3、数据获取基础:认识金融数据(OHLCV),使用ccxt获取交易所行情数据,数据清洗与预处理

做量化交易,第一件事是什么?

不是写策略,不是回测,而是——拿到干净的数据。

我见过太多人,策略写得花里胡哨,结果数据源就有问题。跑出来的曲线漂亮得不行,实盘一上去就崩。说白了,数据是地基,地基不稳,楼盖得再高也得塌。

3.1 认识OHLCV:金融数据的“通用语言”

如果你打开任何一个交易所的K线图,看到的无非就是这几样:

  • O - Open(开盘价):这一根K线开始时的价格
  • H - High(最高价):这一根K线内的最高成交价
  • L - Low(最低价):这一根K线内的最低成交价
  • C - Close(收盘价):这一根K线结束时的价格
  • V - Volume(成交量):这一根K线内的成交数量

嗯,就这么简单。但简单不代表不重要。

我个人习惯把OHLCV看作是金融数据的“原子单位”。任何技术指标,均线、MACD、RSI,底层都是拿这五个字段算出来的。你想想看,如果连原始数据都拿不对,后面算出来的指标能靠谱吗?

核心要点:OHLCV是时间序列数据。每一行代表一个时间切片(比如1分钟、1小时、1天)。时间戳 + 这五个字段,构成了最基础的行情数据。

3.2 使用ccxt获取交易所行情数据

ccxt这个库,我愿称之为“量化交易者的瑞士军刀”。它统一了上百家交易所的API接口。你不需要去记币安的API怎么调,也不用管OKX的签名算法怎么写。ccxt全给你封装好了。

安装很简单:

pip install ccxt

然后我们来拿数据。以币安为例,获取BTC/USDT的1小时K线:

import ccxt
import pandas as pd

# 初始化交易所
exchange = ccxt.binance()

# 获取K线数据
# 参数:交易对,时间周期,起始时间(毫秒时间戳),获取条数
ohlcv = exchange.fetch_ohlcv('BTC/USDT', '1h', limit=100)

# 转成DataFrame
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])

# 时间戳转成可读时间
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

print(df.head())

跑一下,你就能看到最近100个小时的BTC行情了。

小提示:fetch_ohlcv的limit参数,不同交易所上限不一样。币安最多能拿1000根。如果你要拿历史数据,需要循环请求,每次往前推时间。

我曾经在做一个跨交易所套利项目时,需要同时拉5家交易所的数据。如果没有ccxt,光对接API就得写一周。用ccxt,一下午就搞定了。这就是工具的力量。

3.3 数据清洗与预处理:别让脏数据毁了你的策略

数据拿到手,别急着用。先看看有没有坑。

我遇到过最典型的问题:交易所偶尔会返回空值。比如网络波动,某一根K线没拿到。如果你不处理,策略直接报错。

常见的清洗步骤:

  1. 检查缺失值:看看有没有NaN
  2. 检查重复值:有时候网络重试会导致重复数据
  3. 检查异常值:比如成交量突然为0,或者价格出现离谱的跳变
  4. 排序:确保时间戳是从早到晚排列的

代码示例:

# 1. 检查缺失值
print(df.isnull().sum())

# 2. 删除缺失值(或者用前值填充)
df = df.dropna()

# 3. 检查重复值
print(df.duplicated(subset=['timestamp']).sum())

# 4. 删除重复值
df = df.drop_duplicates(subset=['timestamp'])

# 5. 按时间排序
df = df.sort_values('timestamp')

# 6. 重置索引
df = df.reset_index(drop=True)

print(f"清洗后数据量: {len(df)} 条")

警告:千万不要直接删除缺失值就完事了。有时候缺失是因为交易所那根K线确实没有交易(比如流动性极差的币种)。这种情况下,用前一根K线的价格填充可能更合理。具体怎么处理,取决于你的策略逻辑。

还有一个坑:不同交易所的时间戳精度不一样。有的用毫秒,有的用秒。我建议统一转成毫秒时间戳,避免后续对齐数据时出问题。

3.4 本章知识体系总览

下面这张图,是我自己画的知识结构。你可以把它当作一个检查清单:学完这一章,你至少应该能看懂这张图里的每一个环节。

数据获取基础:知识体系 数据来源 OHLCV 数据结构 ccxt 获取行情 数据清洗与预处理 初始化交易所 fetch_ohlcv() 请求 检查缺失/重复值 排序 & 时间戳统一

总结一下:这一章我们干了三件事——认识了OHLCV是什么,学会了用ccxt从交易所拉数据,以及怎么把脏数据洗干净。这三步走完,你手里就有了一份可以用于策略开发的“干净”行情数据。

嗯,数据获取这块,其实没什么高深的技术。但细节决定成败。我见过有人因为时间戳没对齐,回测时信号全部偏移了一根K线,结果亏了几十万。所以,别嫌麻烦,每一步都检查一遍。

公众号:蓝海资料掘金营,微信deep3321