python最优解ma_AR(I)MA时间序列建模过程——步骤和
python代码
1.异常值和缺失值的处理
这绝对是数据分析时让所有⼈都头疼的问题。异常和缺失值会破坏数据的分布,并且⼲扰分析的结果,怎么处理它们是⼀门⼤学问,⽽我根本还没⼊门。
(1)异常值
提供了关于如何对时间序列数据进⾏异常值检测的⽅法,作者认为移动中位数的⽅法最好,代码如下:
from pandas import rolling_median
threshold = 3 #指的是判定⼀个点为异常的阈值df['pandas'] =
rolling_median(df['u'], window=3, center=True)
.fillna(method='bfill').fillna(method='ffill')
#df['u']是原始数据,df['pandas'] 是求移动中位数后的结果,
window指的是移动平均的窗⼝宽度difference = np.abs(df['u'] - df['pandas'])
resources文件outlier_idx = difference > threshold
rolling_median函数详细说明参见
(2)缺失值
缺失值在DataFrame中显⽰为nan,它会导致ARMA⽆法拟合,因此⼀定要进⾏处理。
a.⽤序列的均值代替,这样的好处是在计算⽅差时候不会受影响。但是连续⼏个nan即使这样替代也会在差分时候重新变成nan,从⽽影响拟合回归模型。
b.直接删除。我在很多案例上看到这样的做法,但是当⼀个序列中间的nan太多时,我⽆法确定这样的做法是否还合理。
2.平稳性检验
序列平稳性是进⾏时间序列分析的前提条件,主要是运⽤ADF检验。
from statsmodels.tsa.stattools import adfullerdef test_stationarity(timeseries):
dftest = adfuller(timeseries, autolag='AIC') return dftest[1]
#此函数返回的是p值
adfuller函数详细说明参见
3.不平稳的处理
(1)对数处理。对数处理可以减⼩数据的波动,因此⽆论第1步检验出序列是否平稳,都最好取⼀次对数。关于为什么统计、计量学家都喜欢对数的原因,知乎上也有讨论:
(2)差分。⼀般来说,⾮纯随机的时间序列经⼀阶差分或者⼆阶差分之后就会变得平稳。那差分⼏阶合理呢?我的观点是:在保证ADF检验的p<0.01的情况下,阶数越⼩越好,否则会带来样本减少、还原序列⿇烦、预测困难的问题。——这是我的直觉,还没有查阅资料求证。基于这样的想法,构造了选择差分阶数的函数:
(3)平滑法。利⽤移动平均的⽅法来处理数据,可能可以⽤来处理周期性因素,我还没实践过。
(4)分解法。将时间序列分解成长期趋势、季节趋势和随机成分,同样没实践过。
对于(3)(4),参见《》或者
4.随机性检验
只有时间序列不是⼀个⽩噪声(纯随机序列)的时候,该序列才可做分析。
from statsmodels.stats.diagnostic import acorr_ljungboxdef test_stochastic(ts):
p_value = acorr_ljungbox(ts, lags=1)[1] #lags可⾃定义
return p_value
acorr_ljungbox函数详细说明参见
5.确定ARMA的阶数
ARMA(p,q)是AR(p)和MA(q)模型的组合,关于p和q的选择,⼀种⽅法是观察⾃相关图ACF和偏相关图PACF, 另⼀种⽅法是通过借助AIC、BIC统计量⾃动确定。由于我有⼏千个时间序列需要分别预测,所以选取⾃动的⽅式,⽽BIC可以有效应对模型的过拟合,因⽽选定BIC作为判断标准。
这个函数的原理是,根据设定的maxLag,通过循环输⼊p和q值,选出拟合后BIC最⼩的p、q值。
然⽽在statsmodels包⾥还有更直接的函数:
import statsmodels.tsa.stattools as st
order = st.arma_order_select_ic(timeseries,max_ar=5,max_ma=5,ic=['aic', 'bic', 'hqic'])
order.bic_min_order
error 500timeseries是待输⼊的时间序列,是pandas.Series类型,max_ar、max_ma是p、q值的最⼤备选值。
order.bic_min_order返回以BIC准则确定的阶数,是⼀个tuple类型
6.拟合ARAM
from statsmodels.tsa.arima_model import ARMA
model = ARMA(timeseries, order=order.bic_min_order)
result_arma = model.fit(disp=-1, method='css')
对于差分后的时间序列,运⽤于ARMA时该模型就被称为ARMIA,在代码层⾯改写为model = ARIMA(timeseries, order=(p,d,q)),但是实际上,⽤差分过的序列直接进⾏ARMA建模更⽅便,之后添加⼀步还原的操作即可。
7.预测的y值还原
从前可知,放⼊模型进⾏拟合的数据是经过对数或(和)差分处理的数据,因⽽拟合得到的预测y值要经过差分和对数还原才可与原观测值⽐较。
暂时写了对数处理过的还原:
def predict_recover(ts):
ts = np.exp(ts) return ts
8.判定拟合优度
在我学习计量经济学的时候,判断⼀个模型拟合效果是⽤⼀个调整R⽅的指标,但是似乎在机器学习领域,回归时常⽤RMSE(Root Mean Squared Error,均⽅根误差),可能是因为调整R⽅衡量的预测值与均值之间的差距,⽽RMSE衡量的是每个预测值与实际值的差距。
substr函数的用法c++
train_predict = result_arma.predict()
train_predict = predict_recover(train_predict)
#还原RMSE = np.sqrt(((train_predict-timeseries)**2)
.sum()/timeseries.size)
9.预测未来的值
⽤statsmodel这个包来进⾏预测,很奇怪的是我从来没成功过,只能进⾏下⼀步(之后⼀天)的预测,多天的就⽆法做到了。这⾥提供他们的代码,供⼤家⾃⾏试验,成功的话⼀定要留⾔教我啊!跪谢。
predict_ts = result_arma.predict()
还有根据,⽤来预测的代码是:
for t in range(len(test)):
model = ARIMA(history, order=(5,1,0))
model_fit = model.fit(disp=0)
output = model_fit.forecast()
yhat = output[0]
predictions.append(yhat)
obs = test[t]
history.append(obs)
print('predicted=%f, expected=%f' % (yhat, obs))
大学python入门教程forecast⽅法详细说明参见,
此外,Stackoverflow上的⼀个解答:,⼜给了⼀个预测的写法。
10. 更⽅便的时间序列包:pyflux
好在《》提到了python的另⼀个包pyflux,它的⽂档在。这个包在macOS上安装之前需要安装XCode命令⾏⼯具:
xcode-select --install
同时它的画图需要安装⼀个seaborn的包(如果没有Anaconda则⽤pip的⽅式。《》简要介绍了seaborn,它是“在matplotlib的基础上进⾏了更⾼级的API封装”。
conda install seaborn
我⽤这个包写了⼀个简略⽽完整的ARIMA建模:
数据挖掘⼊门与实战
绿山墙的安妮好词
java程序员需要掌握的技术教你机器学习,教你数据挖掘
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论