2. 金融数据基础

做金融时序预测,第一步不是建模,而是把数据拿对、读懂、对齐。不同资产类别的数据在来源、字段结构、时间语义和获取方式上差异很大。如果一开始就把股票日线、期货分钟线和加密货币7×24小时数据混在一起处理,后续的特征工程和回测几乎必然出错。本节围绕四类主流资产,梳理数据来源、核心字段与获取方式,并给出可落地的统一处理思路。

一、核心原理:四类资产的数据差异从何而来

数据差异的根源在于交易机制不同。股票有固定开盘收盘和涨跌停;期货有合约到期、换月和保证金制度;外汇是场外市场,没有统一交易所,报价来自做市商;加密货币是7×24小时连续交易,且存在多个交易所价差。这些机制直接决定了字段含义和时间戳语义。

四类资产数据特征对比 股票 交易所集中撮合 固定交易时段 OHLCV + 复权 涨跌停限制 T+1 交割 代表来源: 交易所、Tushare AkShare、Yahoo 期货 合约到期换月 保证金与杠杆 主力/连续合约 夜盘时段 持仓量 OI 代表来源: 交易所、Wind CTP、聚宽 外汇 场外 OTC 市场 做市商双边报价 Bid / Ask / Mid 点差 Spread 近24小时交易 代表来源: OANDA、FXCM Dukascopy 加密货币 7×24 连续交易 多交易所价差 链上数据 资金费率 无涨跌停 代表来源: Binance、Coinbase Glassnode

二、方法流程:从数据源到可用数据集的四步

  1. 确定资产与频率:先明确预测目标是日频、分钟频还是Tick级。股票日频可用公开接口,期货分钟频通常需要CTP或付费数据商,加密货币可直接用交易所REST/WebSocket。
  2. 选择数据源并获取:优先使用官方或权威源。股票用交易所或Tushare,期货用交易所或Wind,外汇用OANDA,加密货币用Binance。获取方式包括REST API、WebSocket推送和本地文件下载。
  3. 字段解析与标准化:统一时间戳为UTC或交易所本地时间,统一字段命名,如将open/high/low/close/volume映射为统一列名,并补充资产类别标识。
  4. 质量校验与对齐:检查缺失值、重复时间戳、异常价格和停牌日,按交易日历对齐,生成最终建模数据集。

三、核心字段含义与获取方式

无论哪类资产,最基础的字段都是OHLCV,但每类资产都有其专属字段。下表给出四类资产的核心字段与典型获取方式。

资产类别 核心字段 字段含义 典型获取方式
股票 open/high/low/close/volume/amount 开盘、最高、最低、收盘、成交量、成交额 Tushare、AkShare、Yahoo Finance
股票 adj_factor 复权因子,用于处理分红送股 Tushare、Wind
期货 open_interest 持仓量,反映市场参与度 交易所、CTP、Wind
期货 contract_code 合约代码,如rb2405 交易所、聚宽
外汇 bid/ask/mid 买价、卖价、中间价 OANDA、Dukascopy
外汇 spread 点差,交易成本指标 OANDA、FXCM
加密货币 open/high/low/close/volume 标准K线字段 Binance REST API
加密货币 funding_rate 永续合约资金费率 Binance、Bybit

以Binance获取BTC/USDT日线为例,REST接口调用如下:

import requests
import pandas as pd

url = "https://api.binance.com/api/v3/klines"
params = {
    "symbol": "BTCUSDT",
    "interval": "1d",
    "limit": 500
}
resp = requests.get(url, params=params)
data = resp.json()

df = pd.DataFrame(data, columns=[
    "open_time", "open", "high", "low", "close", "volume",
    "close_time", "quote_volume", "trades",
    "taker_buy_base", "taker_buy_quote", "ignore"
])
df["open_time"] = pd.to_datetime(df["open_time"], unit="ms")
df[["open","high","low","close","volume"]] = df[["open","high","low","close","volume"]].astype(float)
print(df[["open_time","open","high","low","close","volume"]].head())
提示:加密货币接口通常返回毫秒时间戳,务必转换为可读时间;股票和期货数据要注意交易日历,避免把非交易日错误插值。

四、案例场景:构建多资产统一数据集

假设我们要同时预测A股、螺纹钢期货、EUR/USD和BTC/USDT。第一步,分别从Tushare、CTP、OANDA和Binance获取数据;第二步,统一时间戳为UTC,统一字段名为open/high/low/close/volume;第三步,为每行增加asset_type和symbol字段;第四步,按各自交易日历对齐,股票和期货只保留交易日,外汇和加密货币保留自然日。最终得到一张宽表或长表,供后续特征工程使用。

误区复盘:常见错误包括:把股票停牌日当作缺失值直接删除,导致时间序列断裂;把期货主力合约价格直接拼接,忽略换月跳空;把外汇的bid价当作close价;把加密货币的7×24小时数据与股票交易日直接对齐。这些都会引入前视偏差或虚假信号。正确做法是:停牌日保留并标记,期货使用复权连续合约,外汇使用mid价并记录spread,加密货币单独处理时间对齐。

数据基础打牢后,后续的特征工程和模型训练才有可靠输入。建议在项目初期就建立数据字典,记录每个字段的来源、含义、频率和缺失处理方式,避免后期反复返工。