数据准备与预处理:数据清洗、缺失值处理、异常值检测、数据标准化与归一化
做量化交易的朋友,尤其是搞LLM信号生成的,都知道一句话:垃圾进,垃圾出。模型再牛,喂进去的数据是脏的,出来的信号也是废的。我刚开始做量化那会儿,就吃过这个亏——拿了一堆没清洗的历史数据直接训练,结果模型在回测里跑得飞起,实盘一上就崩。后来才发现,数据里藏着好几个异常点,模型全学到歪路子上去了。
所以今天咱们就聊聊,数据准备这一步到底该怎么搞。说白了,就是四个环节:清洗、补缺、揪异常、归一化。每一步都有坑,我一个个说。
核心观点:数据预处理不是体力活,是决定模型上限的关键一步。你花80%的时间做数据,模型只用20%的时间就能出好结果。反过来,数据糊弄过去,模型再调参也是白搭。
1. 数据清洗:把脏东西筛出去
数据清洗,说白了就是去掉那些明显不合理的数据。比如股票价格出现负数、成交量突然变成0、时间戳错乱等等。这些数据在真实市场里根本不可能存在,留着只会污染模型。
我个人习惯,拿到数据先做三件事:
- 检查数据类型:确保价格、成交量是数值型,时间戳是datetime格式。我遇到过好几次,CSV里价格字段被读成了字符串,结果一算涨跌幅全报错。
- 去重:同一个时间点的数据出现两次,这很常见。尤其是从多个数据源合并时,重复数据会悄悄溜进来。
- 过滤无效记录:比如停牌期间的数据、节假日的数据,这些要么是空值,要么是重复的收盘价,留着没意义。
我的小技巧:清洗时别一股脑全删。先备份原始数据,万一删错了还能找回。我曾经手滑删了一整天的分钟级数据,后来花了半天重新下载,教训深刻。
2. 缺失值处理:补还是不补?这是个问题
金融数据里,缺失值太常见了。比如某只股票某天没交易,或者数据源漏了一条记录。面对缺失值,你有三条路:
- 直接删除:如果缺失比例很小(比如不到1%),删掉最省事。但要注意,别把连续的时间序列搞断了。
- 向前填充:用上一个有效值填充。这在金融数据里很常用,比如停牌期间的价格,用停牌前最后一笔数据填充,逻辑上说得通。
- 插值法:用前后数据做线性插值。适合缺失值不多、且数据本身比较平滑的情况。
我一般怎么选?看场景。如果是日线数据,缺失值少,我直接删。如果是分钟级高频数据,缺失值多,我会用向前填充。为什么?因为高频数据里,价格变化是连续的,向前填充比插值更贴近真实交易逻辑。
注意:千万别用均值填充金融数据!比如某天股价缺失,你用过去30天的均价去填,这会把模型搞疯的。因为股价本身有趋势和波动,均值填充会抹掉这些特征,模型学到的全是假规律。
3. 异常值检测:揪出那些“离谱”的数据点
异常值,就是那些明显偏离正常范围的数据。比如某只股票平时波动1%,突然某天涨了50%,这要么是数据错误,要么是极端事件。对于LLM信号生成来说,异常值会严重干扰模型对正常模式的识别。
我常用的方法有两种:
- 3σ原则:假设数据服从正态分布,超过均值±3倍标准差的数据视为异常。简单粗暴,适合快速筛查。
- IQR方法:用四分位数间距(Q3 - Q1)来界定异常。低于Q1 - 1.5×IQR或高于Q3 + 1.5×IQR的数据,视为异常。这个方法对非正态分布的数据更鲁棒。
举个例子,某只股票的日收益率数据,用IQR方法检测,发现有一天收益率是-15%。正常波动范围在±5%以内,这个-15%明显异常。我查了一下,那天是公司发布了重大利空公告,属于真实事件。这种情况下,我不会直接删除,而是单独标记出来,让模型知道这是个特殊样本。
避坑指南:我曾经把所有异常值都删了,结果模型在极端行情下完全失效。后来才明白,异常值不一定是错误,也可能是市场极端情况的信号。处理异常值,要区分是数据错误还是真实事件。数据错误就删,真实事件就保留并标记。
4. 数据标准化与归一化:让所有特征站在同一起跑线
这一步,说白了就是把不同量纲的数据拉到同一个尺度上。比如股价是几百块,成交量是几百万手,MACD指标是零点几。如果不做归一化,模型会天然更关注数值大的特征,忽略数值小的特征。
常用的方法有两种:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Min-Max归一化 | (x - min) / (max - min) | 数据有明确边界,比如价格在0-100之间 |
| Z-score标准化 | (x - mean) / std | 数据分布近似正态,或者有异常值 |
我个人习惯,对于LLM信号生成,优先用Z-score标准化。为什么?因为金融数据经常有极端值,Min-Max归一化会把极端值压缩到0或1附近,导致正常数据之间的差异被抹平。而Z-score标准化对异常值不那么敏感,能保留数据的相对关系。
举个例子,某只股票的价格序列,用Min-Max归一化后,大部分数据集中在0.4-0.6之间,模型很难区分细微的价格变化。换成Z-score标准化后,数据分布更均匀,模型能学到更精细的模式。
重要提醒:标准化和归一化的参数(均值、标准差、最小值、最大值),一定要用训练集的数据计算,然后应用到验证集和测试集。千万别用全部数据计算,否则会造成数据泄露,模型在回测里表现虚高,实盘就露馅。
知识体系总览
下面这张图,把数据预处理的四个环节串起来了。你可以把它当作一个检查清单,每次做数据准备时对照着来。
嗯,数据预处理这块,说白了就是给模型喂好料。你想想看,模型就像个孩子,你给他吃干净有营养的食物,他才能健康成长。你给他吃垃圾食品,他迟早要出问题。所以,别嫌这一步麻烦,它值得你花时间。
最后说一句:数据预处理没有银弹。每个数据集都有自己的特点,你需要根据实际情况灵活选择方法。我的建议是,先跑一遍完整的流程,看看数据长什么样,再决定怎么处理。别一上来就套公式,那样容易翻车。