为什么要预处理
我们从网站上爬取的每日股票数据,包含开盘价,收盘价,最高价,最低价;这些都是在当前的实际价格。但我们关心的是一段时间内的涨跌幅,比如,从2020-08-01到2020-09-01这段时间内的股票涨跌情况,并用作预测模型训练时候的目标变量。这里就存在一个问题,假如在这段时间内,由于新增股份,派发股份等导致股票的除权;如果我们将除权前和除权后的股价一视同仁,那么计算出来的涨跌幅并不能反映收益的涨跌,因而是不准确的。所以,正如一些股票软件(如同花顺)上面显示一段时间内股价变动(日/周/月K线图)的时候,一般采用的是向前复权或者向后复权的方式展示;我们在建立股票预测模型的时候,也需要进行向前或者向后的复权,以便能准确反映收益的变动。
另外,我们在对A股股票进行分析的时候,我们希望针对特定类型的股票进行分析,而不是所有的股票统一分析。例如,我们希望分析市值在300亿到1000亿之间的股票在一段时间内的股价变动情况(统计值),又例如,我们希望分析特定行业(如材料化学)的股票在一段时间的股价变动情况。
再有就是,我们希望比较不同特征的股票的走势。例如,在季度财报公布后,我们比较同比增长为正的股票和同比增长为负的股票在一段时间的走势,是否有正相关性。例如,对于每支股票,我们取出过去180天的平均/中位价格,并且根据当前价格是否出去过去中位价格之上或者之下划为两类股票,比较位于中位价格之上和位于中位价格之下的股票的未来走势的比较。
以上两种情况,都涉及到股票的过滤筛选。
复权的预处理
我们先讨论复权的预处理。
一个除权的例子
举例说明,中国石油(601857)在2021-09-16 派发红利,每10股派发1.304元红利,其价格变动如下(取自history data table, 见“数据的爬取”):
在未发生除权的情况下,对于特定一只股票,每个交易日的last_close_price等于上个交易日的close_price(停盘期间除外)。但除权发生的时候,这两个值会不一致。
两者之间的倍数即为复权系数。我们可以简单验证一下: