第一章:数据准备与清洗——量化分析的基石
做量化投资这些年,我踩过最大的坑,就是数据问题。你想想看,策略再牛,模型再炫,数据是脏的,结果全是扯淡。所以第一章,咱们先把地基打牢。
1.1 数据源选择:选对工具,事半功倍
我个人习惯把数据源分成三类:金融终端、开源库、商业平台。各有各的脾气。
| 数据源 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| Wind | 数据全、更新快、机构标配 | 贵、接口复杂、本地部署 | 机构实盘、高频研究 |
| Tushare | 免费、社区活跃、文档清晰 | 有调用限制、稳定性一般 | 个人研究、策略回测 |
| 聚宽 | 一站式平台、数据+回测+交易 | 数据深度有限、定制化弱 | 快速原型、入门学习 |
我的建议:刚开始做研究,用Tushare就够了。等策略跑通了,再上Wind做精细验证。别一上来就买几万块的终端,没必要。
1.2 股票池构建:选对样本,才有意义
股票池决定了你的研究范围。全A股、沪深300、中证500,差别大了去了。
- 全A股:样本多,但噪音也大。小市值股票流动性差,容易出假信号。
- 沪深300:大盘蓝筹,流动性好,适合做低频因子。
- 中证500:中盘成长股,弹性大,适合做动量类因子。
我在项目中遇到过一个问题:用全A股做因子测试,结果发现收益全来自那些市值不到10亿的股票。换到沪深300上,因子直接失效。所以,选股票池一定要跟你的策略风格匹配。
避坑指南:我曾经用全A股跑了一个价值因子,效果特别好。结果一查,全是ST股和微盘股贡献的收益。后来我加了市值和价格过滤,才把噪音去掉。
1.3 数据清洗流程:脏数据是量化的大敌
数据清洗,说白了就是「去伪存真」。我一般分三步走:缺失值、异常值、复权处理。
1.3.1 缺失值处理
股票停牌、数据源漏传,都会产生缺失值。常见的处理方式有三种:
- 向前填充:用上一个交易日的数据补。适合价格类数据。
- 插值法:线性插值或样条插值。适合财务指标。
- 直接删除:缺失太多就扔掉。别心疼。
# 向前填充示例(Python)
import pandas as pd
df['close'].fillna(method='ffill', inplace=True)
注意:千万别用均值填充金融时间序列。你想想看,股票价格是随机游走的,用均值填进去,等于凭空造数据,回测结果全是假的。
1.3.2 异常值处理
异常值通常来自数据录入错误或极端行情。我常用的方法是MAD(中位数绝对偏差)法。
def mad_outlier_detection(series, threshold=5):
median = series.median()
mad = (series - median).abs().median()
return (series - median).abs() > threshold * mad
嗯,这里要注意:阈值设多少合适?我一般设5倍MAD。太严会把正常波动砍掉,太松又漏掉异常。
1.3.3 复权处理
复权是个大坑。很多新手直接用后复权数据做回测,结果发现策略收益高得离谱。为什么?因为后复权价格包含了分红和送股,但实际交易中你拿不到那个价格。
我个人习惯用前复权做回测,用后复权做长期趋势分析。千万别混用。
# 前复权计算(简化版)
adj_factor = df['adj_factor'] # 复权因子
df['close_adj'] = df['close'] * adj_factor / adj_factor.iloc[-1]
1.4 数据对齐与频率统一
不同数据源的频率不一样。日频、分钟频、Tick级数据,对齐起来很麻烦。我一般遵循一个原则:低频对齐高频,高频降采样。
- 日频数据:直接用日期索引对齐。
- 分钟数据:用时间戳对齐,注意时区问题。
- 财务数据:按季度对齐到交易日。
一个小技巧:用pandas的reindex方法,可以快速对齐不同频率的数据。记得先排序,再对齐。
# 数据对齐示例
df_daily = df_daily.reindex(df_minute.index, method='ffill')
知识体系总览
下面这张图,是我做数据准备时的核心流程。你可以把它当成一个检查清单。
这张图把整个流程串起来了。从数据源开始,到股票池,再到清洗和对齐,最后输出干净数据。每一步都不能跳过。
核心要点:数据准备占整个因子研究工作量的60%以上。别嫌麻烦,这一步做扎实了,后面的分析才有意义。