2. 金融市场数据基础:数据源介绍与预处理

做量化投资,尤其是用深度学习挖Alpha信号,第一步不是搭模型,而是搞定数据。我见过太多人模型写得飞起,结果数据一塌糊涂,最后跑出来的结果自己都不敢信。说白了,数据质量决定了你策略的天花板。

这一章,我们就来聊聊金融数据的那些事儿。我会把我在实战中踩过的坑、积累的经验,都摊开来跟你讲。

2.1 数据源介绍:你从哪里拿数据?

金融数据源,我习惯把它们分成三个层级。每个层级的用途和成本都不一样。

日线数据

日线是最基础的数据。包含开盘价、收盘价、最高价、最低价、成交量、成交额。我个人习惯用日线做长周期策略的回测,比如持仓周期在5天以上的。数据源方面,Tushare、AkShare、Wind、聚宽都提供。免费的Tushare和AkShare足够入门,但要注意数据质量——我遇到过某免费源某天的收盘价直接是0,这种坑得自己填。

分钟线数据

分钟线用于高频或中频策略。常见的有1分钟、5分钟、30分钟、60分钟。我建议新手从30分钟或60分钟开始,因为1分钟数据的噪声太大,深度学习模型很容易学到假规律。数据源上,聚宽、米筐、Wind的分钟线质量相对可靠。免费源的话,AkShare也能拿到部分分钟线,但缺失率较高。

Level2 数据

Level2是进阶玩家的玩具。它包含逐笔成交、十档买卖盘、委托队列等。说白了,你能看到每一笔交易是怎么成交的,谁在买谁在卖。我用Level2数据做过一个资金流模型,效果还不错。但要注意,Level2数据量巨大,一天一只股票的数据可能就几十MB,存储和计算成本都不低。数据源方面,Wind、聚宽、东方财富都有提供,但需要付费。

我的建议:刚开始做深度学习挖Alpha,先用日线数据跑通流程。等模型稳定了,再逐步加入分钟线和Level2。别一上来就搞高频,容易把自己搞崩。

2.2 数据清洗与预处理:脏数据是模型的天敌

数据拿到手,第一件事不是建模,而是清洗。我见过有人直接把原始数据丢进LSTM,结果模型学到的全是停牌日的重复值。嗯,这里要注意,金融数据的清洗有它自己的特殊性。

缺失值处理

金融数据的缺失,常见原因有:停牌、未上市、退市、数据源本身漏了。处理方法我一般分三步走:

  1. 先判断缺失类型:是随机缺失还是系统性缺失?比如某只股票停牌一周,那这一周的数据就是系统性缺失,不能简单填充。
  2. 再选填充方法:
    • 前向填充(ffill):适合停牌场景,用停牌前最后一天的数据填充。
    • 线性插值:适合分钟线中偶尔的缺失,比如某分钟成交量为0。
    • 行业均值填充:适合财务指标缺失,比如市盈率。
  3. 最后标记:我习惯在特征里加一个“是否缺失”的0/1变量,让模型自己学怎么处理缺失。

避坑指南:我曾经用均值填充处理停牌数据,结果模型学到的全是假规律。后来改成前向填充+缺失标记,效果才正常。记住,金融数据的时间依赖性很强,别乱填。

异常值检测

金融数据里的异常值,常见的有:涨跌停时的价格不变、成交量异常放大、数据源错误(比如某天收盘价突然变成1000倍)。我常用的检测方法:

  • 3σ原则:超出均值±3倍标准差的值,视为异常。但要注意,金融数据往往厚尾,3σ可能误杀太多。
  • IQR方法:用四分位距,更稳健。我一般用1.5倍IQR作为阈值。
  • 业务规则:比如涨跌幅超过20%的,直接标记出来人工审核。

处理方式上,我建议不要直接删除异常值,而是先标记,再根据情况决定是修正还是剔除。比如涨跌停导致的价格不变,其实不是异常,是正常市场行为。

2.3 数据对齐与重采样:让不同频率的数据“对齐”

做多因子模型时,你可能会用到日线、分钟线、财务数据、宏观经济数据。这些数据频率不同,必须对齐到同一个时间轴上。你想想看,如果用日线的收盘价去预测下一分钟的涨跌,那时间轴就完全错位了。

数据对齐

对齐的核心原则是:避免未来信息。比如你用T日的日线数据,那只能用到T-1日及之前的信息。我见过有人不小心把T日的收盘价和T日的分钟线对齐,结果模型在回测里表现完美,实盘一塌糊涂——因为用到了未来数据。

对齐方法我推荐两种:

  • 左对齐:以时间戳左侧为准,比如用T-1日的日线数据预测T日的分钟线。
  • 右对齐:以时间戳右侧为准,适合一些滞后指标。

我个人习惯用左对齐,因为更符合因果逻辑。

重采样

重采样是把高频数据降为低频,或者把低频数据升为高频。降采样常用,比如把1分钟线合成为5分钟线。升采样很少用,因为会引入虚假信息。

降采样的方法:

字段 降采样方法
开盘价 取第一个值
收盘价 取最后一个值
最高价 取最大值
最低价 取最小值
成交量 求和

代码实现很简单,用pandas的resample函数就行:

import pandas as pd

# 假设df是1分钟数据,索引是时间
df_5min = df.resample('5min').agg({
    'open': 'first',
    'high': 'max',
    'low': 'min',
    'close': 'last',
    'volume': 'sum'
})

注意:重采样时一定要检查边界情况。比如某5分钟区间内只有3分钟有数据,那合出来的5分钟线是否可信?我一般会加一个“覆盖率”字段,记录实际数据点占理论数据点的比例,低于80%的就标记为低质量。

2.4 知识体系总览

下面这张图,是我自己梳理的本章知识结构。你可以把它当作一个检查清单,做数据预处理时对照着来。

金融市场数据预处理知识体系 数据源 数据清洗 数据对齐与重采样 日线数据 分钟线数据 Level2数据 缺失值处理 异常值检测 时间对齐 降采样/升采样 Tushare/AkShare/Wind 聚宽/米筐/Wind Wind/东方财富(付费) 前向填充/线性插值/行业均值 3σ/IQR/业务规则 左对齐/右对齐 resample/覆盖率检查 核心原则:避免未来信息,保证数据质量

这张图把数据源、清洗、对齐三个模块串起来了。你每次做数据预处理时,都可以对照着检查一遍,看看有没有遗漏。

最后说一句:数据预处理这件事,看起来琐碎,但真的值得花时间。我见过太多人因为数据问题,浪费了几周甚至几个月的建模时间。你想想看,模型再厉害,喂进去的是垃圾,出来的也只能是垃圾。所以,别急,先把数据搞干净。

专注资料整理