在逛博客的时候,从AI研习社里看到了一篇文章,最新的优化深度学习交易机器人技术 ,讲到了一个常用的方式,
下图中的三个图中描述的时间序列分别是原始的价格数据,以及做了差分(比如一步的差分其实就是今天的价格和昨天的价格相减再除以昨天的价格),以及对原始数据取对数然后再差分的时间序列的图。
之所以这样处理的原因是数据不是平稳的,因此,任何机器学习模型都很难预测未来值。 最重要的是,我们的时间序列包含明显的趋势和季节性,这两者都会影响我们的算法准确预测时间序列的能力。 我们可以通过使用差分和变换技术解决该问题,从我们现有的时间序列中产生更正态的分布。
差分是从该时间步的值减去每个时间步的导数(收益率)的过程。在本文例子中,可实现消除趋势的预期结果,但是,数据仍然具有明确的季节性。 我们可以尝试通过在差分之前的每个时间步长取对数来移除它,这产生最终的平稳时间序列
df['diffed'] = df['Close'] - df['Close'].shift(1)
df['logged_and_diffed'] = np.log(df['Close']) - np.log(df['Close'].shift(1)
在文章中,当然也有提到检验时间序列平稳性的工具,那就是增广的Dickey-Fuller检验
如果这样做得到p值0.00,允许我们拒绝检验的零假设,并确认时间序列是平稳的
from statsmodels.tsa.stattools import adfuller
df['logged_and_diffed'] = np.log(df['Close']) - np.log(df['Close']).shift(1)
result = adfuller(df['logged_and_diffed'].values[1:], autolag="AIC")
print('p-value: %f' % logged_and_diffed_result[1])
我们对转换后的数据集运行Augmented Dicker-Fuller测试,以确保平稳性