一、Python量化交易入门:用Pandas做数据清洗与复权处理
一、这篇解决什么问题做量化研究,最枯燥、最不能省的一步是数据清洗。股票分红、送股、配股会让价格出现向下的跳空,看起来像暴跌,实际只是除权。停牌日数据缺失,直接参与计算会污染因子。异常值不处理,模型会学到错误规律。本文把 A 股数据最常见的四类问题——复权、停牌、缺失值、异常值——的处理方法整理清楚,每条给出代码实现。读完你可以得到:一份清洗干净的日频数据一份数据质量报告一个可复用的清洗脚本二、复权:最重要的一件事2.1 什么是复权股票分红、送股、配股后,股价会向下调整。如果不处理,价格曲线会出现一个向下的跳空,看起来像暴跌,实际只是除权。举个例子:某股票前一日收盘 10 元,每 10 股派 5 元现金。除息日理论开盘价变成 9.5 元。如果你用不复权数据算收益率,会得到 -5% 的假信号。2.2 三种复权方式类型含义适用场景不复权原始成交价看真实成交价格、算手续费前复权以当前价格为基准,调整历史价格回测首选后复权以上市首日为基准,调整后续价格长期收益分析为什么回测用前复权:前复权保持了最新价格和真实价格一致,同时消除了除权跳空,收益率计算连续。2.3 代码示例importakshareasak# 前复权df_qfq=ak.stock_zh_a_hist(symbol="600519",period="daily",start_date="20200101",end_date="20241231",adjust="qfq")# 后复权df_hfq=ak.stock_zh_a_hist(symbol="600519",period="daily",start_date="20200101",end_date="20241231",adjust="hfq")# 不复权df_raw=ak.stock_zh_a_hist(symbol="600519",period="daily",start_date="20200101",end_date="20241231",adjust="")2.4 复权的坑不同数据源的复权算法可能不同,同一只股票在两个平台的前复权价格可能有细微差异。回测时固定用一个数据源。前复权价格会随最新价格变化,今天下载的前复权数据和一个月后下载的,历史价格可能不一样。所以要么每次重新下载全量,要么存原始数据自己算复权。成交量不需要复权,只有价格需要。三、停牌处理3.1 停牌的表现停牌期间,数据源可能:直接没有该日期的记录有记录但成交量为 0有记录且价格等于停牌前价格3.2 处理原则回测时:停牌日不能交易,买入信号遇到停牌应顺延到复牌日停牌日不应参与因子计算(否则 rolling 窗口会被污染)持仓股票停牌期间,仓位保持不变# 标记停牌:成交量为0df['is_suspended']=(df['volume']==0)# 停牌日不生成信号df.loc[df['is_suspended'],'signal']=np.nan df['signal']=df['signal'].ffill()3.3 长期停牌的处理如果一只股票停牌超过一定天数(比如 20 个交易日),建议直接从股票池剔除,因为复牌后往往有大幅补涨或补跌,会干扰策略。四、缺失值处理4.1 缺失值的来源新股上市初期,均线等指标算不出来停牌日数据源本身的问题多数据源合并时的对齐问题4.2 处理方式对比