ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

时间序列预处理全流程指南:平稳性检验、数据变换与季节性分解实战

时间序列预处理全流程指南:平稳性检验、数据变换与季节性分解实战 1. 为什么说预处理比建模还重要拿到一份时间序列数据很多人第一反应就是赶紧套个ARIMA、跑个Prophet恨不得马上把预测结果甩到领导桌上。我早年也干过这种事结果模型倒是跑通了就是预测结果离谱得不好意思见人。后来踩的坑多了才明白时间序列分析真正的分水岭不在模型选得多花哨而在预处理做得够不够扎实。预处理在我看来就干三件事判断数据是不是能用来建模、把数据收拾成能建模的样子、搞清楚数据里到底藏着什么规律。这三件事没做明白后面一切分析都是空中楼阁。比如一个带明显趋势的序列你不做处理直接建模模型很可能把趋势当成了随机波动的一部分预测结果自然是飘的。又比如序列里藏着季节性周期你没识别出来模型的残差里就会残留明显的周期信号诊断图一眼假。这篇内容我就结合自己实际分析中的经验把时间序列预处理的完整流程拆开揉碎讲一遍包括平稳性检验、纯随机性检验、数据变换、缺失值处理、季节性分解这些核心环节。每个环节我都会讲清楚为什么做、怎么做、结果怎么解读最后再附上实操中的坑和排查思路。不管你是刚接触时间序列的学生还是在业务里做预测分析的从业者这套流程应该都能直接用得上。2. 平稳性检验判断数据能不能直接建模的硬门槛2.1 平稳性到底是什么我用人话解释一下很多人一看到平稳性三个字就头大觉得是个特别抽象的概念。我用一个生活化的例子来解释想象你站在河边看水面如果河水水位整体稳定只是水面有轻微的波纹起伏那这个水位序列就是平稳的。但如果这时候上游放水了水位在持续上涨或者每日涨落规律明显受潮汐影响那这个序列就带趋势、带周期性不是平稳的。统计学上的平稳性分为严平稳和宽平稳。严平稳要求序列的统计性质在任何时间平移下都不变这个条件太苛刻实际应用中基本用不到。我们常说的平稳指的是宽平稳它有三个条件均值恒定、方差恒定、协方差只与时间间隔有关而与具体时间点无关。说白了就是序列在统计意义上长得差不多没有明显的趋势漂移、没有周期性波动、波动的幅度也没有明显的增大或缩小。为什么平稳性这么重要因为绝大多数经典时间序列模型AR、MA、ARIMA这些都建立在平稳序列的前提上。这些模型的本质是用过去的规律来预测未来的变化如果序列本身不平稳过去的规律在未来可能就失效了模型的预测自然不靠谱。这就好比你根据一个人过去三天的心情来预测他明天的状态前提是他生活规律基本稳定如果这人正赶上项目上线连续加班情绪波动剧烈你再按老规律预测大概率要翻车。2.2 两种主流的平稳性检验方法ADF检验和KPSS检验判断序列是否平稳光靠眼睛看图只是一个辅助手段必须要有统计检验来支撑结论。目前应用最广的是ADF检验Augmented Dickey-Fuller Test和KPSS检验Kwiatkowski-Phillips-Schmidt-Shin Test。ADF检验的原假设是序列存在单位根也就是序列不平稳。检验结果p值小于0.05时拒绝原假设说明序列平稳。KPSS检验则正好相反它的原假设是序列平稳p值小于0.05时拒绝原假设说明序列不平稳。这两个检验放在一起使用有个妙处如果ADF说平稳、KPSS也说不拒绝平稳那基本可以放心序列是平稳的如果ADF说不平稳、KPSS说不平稳那也很明确真正需要警惕的是结论互相矛盾的情况这通常意味着序列可能只有趋势没有单位根或者存在结构性突变等复杂情况需要进一步诊断。在Python里跑这两个检验非常方便statsmodels库直接封装好了接口。我自己常用的做法是把检验结果汇总成一个函数一次性输出检验统计量、p值和结论省得每次重复写代码。下面是我常用的一个示例import numpy as np import pandas as pd from statsmodels.tsa.stattools import adfuller, kpss def stationarity_test(series, nameseries): # ADF检验 adf_stat, adf_p, _, _, adf_crit, _ adfuller(series, autolagAIC) # KPSS检验 kpss_stat, kpss_p, _, kpss_crit kpss(series, regressionc, nlagsauto) result { name: name, adf_stat: round(adf_stat, 4), adf_pvalue: round(adf_p, 4), adf_is_stationary: adf_p 0.05, kpss_stat: round(kpss_stat, 4), kpss_pvalue: round(kpss_p, 4), kpss_is_stationary: kpss_p 0.05 } return result # 假设有一个序列data调用方式如下 # result stationarity_test(data[value], namesales) # print(result)ADF检验里有个参数autolagAIC它的作用是自动选择最优滞后阶数让检验的残差满足白噪声假设。这个参数我是强烈建议保留默认值的手动指定滞后阶数容易选错影响检验功效。2.3 非平稳序列怎么办差分运算的玩法与注意事项如果检验下来序列不平稳最常见的处理手段就是差分。一阶差分的含义是计算相邻两个时间点的差值它能够有效消除线性趋势。如果一阶差分后仍然不平稳就再做二阶差分。理论上差分阶数越多序列越可能平稳但千万不要盲目追求高阶差分因为每差分一次信息量就会损失一部分而且过度差分会让序列变得过度平滑反而掩盖了真实的数据生成过程。我在实际业务里见过不少分析师一上来就对序列做二阶差分结果模型预测结果波动特别大残差诊断也一团糟。后来检查发现序列本身只有个弱趋势一阶差分就足够了。这里有个实际操作的判断方法差分后比较AIC或者BIC值同时观察差分后序列的自相关图。如果自相关图在低阶滞后处就截尾说明差分阶数是合适的如果自相关系数衰减很慢甚至出现负相关突出可能就是差分过头了。除了普通差分还有季节性差分。当序列存在明显的季节性周期时比如月度数据的年度周期、周度数据的周内周期需要在普通差分的基础上再做一次周期步长的差分。举个例子月度销售数据按年循环做季节性差分就是当月数据减去上年同月数据这会直接把季节性规律抹掉。很多时候你需要同时做普通差分和季节性差分才能让序列彻底平稳下来。这就是SARIMA模型里那个p,d,q和P,D,Q中d和D的意义所在。操作层面有一个细节必须提醒差分后的序列长度会减少差分一阶少一个观测值季节性差分则少一个周期长度。这在后续建模时需要注意时间索引的对应关系预测时要还原差分才能得到原始量纲的预测值。3. 纯随机性检验警惕拿白噪声序列硬做模型3.1 为什么要先检验纯随机性我有个习惯拿到任何时间序列第一件事先看它是不是白噪声。所谓白噪声就是序列在不同时刻的取值之间没有相关性纯粹是随机波动。如果检验下来序列就是白噪声那后面的建模工作可以立即喊停——对白噪声序列做任何预测模型都是徒劳的因为这组数据里压根没有可被挖掘的规律。这就好比你去分析一枚均匀硬币抛掷的结果序列不管用什么先进模型都不可能准确预测下一次是正面还是反面因为每次抛掷都是独立事件。纯随机性检验的意义还在于它是很多模型诊断环节的基础。比如建模完成后我们对残差序列做纯随机性检验如果残差序列不是白噪声说明模型没把信息提取干净需要增加参数或换模型结构。可以说纯随机性检验在整个时间序列分析流程中是个贯穿始终的工具。3.2 Ljung-Box检验实操解读目前最常用的纯随机性检验是Ljung-Box Q检验。它的原假设是序列在滞后1到m阶上都不存在自相关也就是说序列是纯随机序列。p值小于0.05时拒绝原假设认为序列存在相关性可以继续建模p值大于0.05时不能拒绝原假设序列大概率是白噪声。实际操作中有两个地方容易出问题。第一是滞后阶数m怎么选。m选太小可能漏掉较长滞后处的相关性m选太大又会稀释检验的灵敏度。我的经验是m选min(10, n/5)左右比较合理其中n是序列长度。第二是p值的解读要结合自相关图一起看一个常见情况是Ljung-Box检验显示p值略大于0.05看起来像白噪声但自相关图里有个别滞后明显超出置信区间。这时候我倾向于不急着下结论可以变换一下滞后阶数再检验一次或者用BIC准则比较一下有模型和无模型哪个更优。from statsmodels.stats.diagnostic import acorr_ljungbox # 假设已经准备好了序列数据data # 对前10阶滞后期进行Ljung-Box检验 lb_test acorr_ljungbox(data[value], lags10, return_dfTrue) print(lb_test) # 输出结果会包含lb_stat检验统计量和lb_pvaluep值 # 如果lb_pvalue全部大于0.05说明序列在各滞后期上都没有显著自相关这段代码会输出10个滞后期对应的检验统计量和p值。如果数据量比较大也可以只关注某个特定滞后比如季节性周期长度的结果。比如月度数据可以检查lags12处的p值判断是否存在年度季节性相关。4. 数据清洗与变换把数据收拾到能建模的状态4.1 缺失值与异常值的处理策略时间序列中的缺失值处理比普通横截面数据更讲究。因为时间序列本身有先后顺序不能随便用全局均值去填补那会破坏序列的时序结构。我常用的方法有这几种线性插值、前向填充、后向填充、以及基于季节性规律的插补。线性插值适用于缺失区间较短的情形它的逻辑是用缺失值前后两个观测值连一条直线取中间点的值。这个方法在数据波动较小时效果不错遇到剧烈波动时表现一般。前向填充就是用上一个观测值填充缺失值在业务指标里很常见比如某天没记录就用前一天的值顶上。不过如果缺失区间较长前向填充会让序列出现一段平台期歪曲真实变化。对于带有明显季节性的序列我会优先考虑同周期均值插补。比如月度数据中3月缺失就用其他年份3月份的均值来填补。这个逻辑很直观既然序列每年都有相似的季节形态那用同期的典型值来替代缺失值是合理的。当然这在3月数据本身含有异常年份时会有偏差需要结合业务判断。异常值的处理逻辑和缺失值略有不同。我不建议直接用均值或中位数替换异常值因为异常值本身就是有价值的信息——它可能代表某个促销活动的冲击、系统故障、甚至是数据记录错误。正确做法是先识别、再判断、后处理。识别可以用3倍标准差法或者IQR四分位距法判断则需要结合业务背景。如果确认是系统故障导致的错误记录可以考虑剔除后插补如果是真实的业务冲击保留并记录这个信息反而对建模有效可以让模型学到突发事件的影响。4.2 为什么要做对数变换和其他数据变换时间序列分析中很多模型假设方差恒定但现实中的很多数据并不满足这一点。典型的就是销售额、流量这类数据往往波动幅度和数值水平成正比——平时销售额在100万上下波动日波动可能在正负5万双十一冲到5000万时一天的波动可能就是正负200万。这种异方差性会让模型对小波动和大波动的处理失衡。对数变换是处理这类问题的利器。取对数之后原本乘性的变化变成加性的变化大数值区间的波动被压缩方差趋于稳定。我通常会在做平稳性检验之前就对原始序列先取对数再判断平稳性。一个经验口诀是如果序列的波动幅度随均值水平变化先做对数变换如果序列的值域跨度超过一个数量级先做对数变换如果数据包含0或负值不能直接取对数可以用log(1x)或者Yeo-Johnson变换。代码示例import numpy as np # 对序列取对数 data[log_value] np.log(data[value]) # 对数据取log(1x)处理0值和负值 data[log1p_value] np.log1p(data[value]) # Yeo-Johnson变换处理更一般的分布形态 from sklearn.preprocessing import PowerTransformer pt PowerTransformer(methodyeo-johnson) data[yj_value] pt.fit_transform(data[[value]])变换之后要记得预测结果是在变换空间上的最后要取指数还原到原始量纲。这个还原步骤看起来简单实际操作中却有不少细节要注意特别是预测区间置信区间的还原不是简单地取指数就完事还需要做偏差修正否则预测区间的估计会偏低。这个坑我踩过不止一次后面在常见问题里细说。4.3 数据重采样与时间索引规范化预处理中还有个容易被忽略但极其重要的环节时间索引的处理。很多脏数据的问题就出在时间格式不规范、频率不统一、甚至时间戳重复。我的习惯是拿到数据第一步就检查时间索引把它转成pandas的DatetimeIndex然后显式指定频率。# 转换为时间索引并指定频率 data[date] pd.to_datetime(data[date]) data data.set_index(date).sort_index() # 检查时间频率是否均匀 freq pd.infer_freq(data.index) print(f推断的频率为: {freq}) # 如果推断不出频率或者数据有缺失时间点需要重采样 data data.asfreq(D) # 按天重采样缺失日期会变成NaN # 也可以按业务需要聚合到周、月等更低频率 # data_weekly data.resample(W).sum() # data_monthly data.resample(M).mean()时间索引规范化做完之后你才能准确判断序列是否存在周末效应或者节假日效应这类周期性规律也才能正确计算滞后期数。很多新手建模时奇怪为什么残差总有周期性仔细排查发现是时间索引里藏着不少重复的或者乱序的时间戳数据压根没对齐。5. 季节性分解与趋势提取看清时间序列的三层结构5.1 加法模型和乘法模型怎么选时间序列的三个核心组成是趋势项、季节项和残差项。经典分解方式有两种加法模型Y T S R乘法模型Y T * S * R。什么时候用加法什么时候用乘法我的判断标准是看季节波动的幅度是否随趋势水平变化。如果每年夏季的销量波动都稳定在一个固定区间不受整体销量水平影响用加法模型如果夏季销量高时波动大、冬季销量低时波动小波动幅度和趋势水平成正比用乘法模型。乘法模型可以通过取对数转化为加法模型所以实践中很多人习惯对所有序列都先取对数再用加法分解这样操作上更统一。如果你已经打算建模时用对数变换那分解时直接用加法模型就好不需要再纠结乘除问题。5.2 statsmodels 分解实操与结果解读statsmodels的seasonal_decompose是执行分解最方便的工具代码非常简单from statsmodels.tsa.seasonal import seasonal_decompose # 假设data是按月度采样的序列 result seasonal_decompose(data[value], modeladditive, period12) # 提取分解出的三个部分 trend result.trend seasonal result.seasonal residual result.resid # 查看分解结果的统计信息 print(result.trend.describe()) print(result.resid.describe())period参数表示季节周期的长度月度数据填12季度数据填4周数据填7。填写正确是分解效果的关键填错周期会把季节项完全拆错。分解完成后残差项是我们最需要关注的对象——如果残差项在某个滞后期上仍有显著的自相关说明分解模型没把规律提取干净。除了seasonal_decompose还有一个更稳健的方法叫STLSeasonal-Trend decomposition using Loess它对异常值更鲁棒适合噪声较大的数据。statsmodels中同样有实现from statsmodels.tsa.seasonal import STL res STL(data[value], period12, robustTrue).fit() trend_stl res.trend seasonal_stl res.seasonal resid_stl res.residrobustTrue这个参数很关键它让分解过程对异常值不那么敏感。如果序列里有不少毛刺或者异常点用robustTrue能明显改善分解质量。5.3 分解完成之后干什么分解不是目的目的是通过分解搞清楚序列的结构指导后续的建模选择。我的习惯是分解后做这几件事第一观察趋势项的形状。如果趋势项近似直线上升说明序列有稳定的线性趋势后续建模可能需要差分或者加趋势项如果趋势项有明显的结构性拐点比如某个月份突然上升后持续走高要考虑是不是业务有重大变化可能需要加干预变量。第二观察季节项的形态。季节项在每个周期内的波形是否稳定如果季节项的幅度逐年变化说明季节性不是固定的可能需要用季节性更强的模型或者考虑对季节项建模而不是简单差分。第三检查残差项。残差应是基本平稳的白噪声序列对残差做ADF检验和Ljung-Box检验如果残差平稳且没有明显自相关说明分解已经把序列中的规律提取干净了反之残差里还有结构说明模型还没有完全捕捉数据特征后续模型的误差项可能不是白噪声。这些分解结果也可以直接作为后续建模的输入。比如你可以把趋势项用一个线性模型去拟合季节项用虚拟变量或傅里叶项去拟合残差项再来一个简单的AR模型这种分而治之的思路经常比直接上复杂模型效果更好而且每部分都可以用业务逻辑来解释和业务方沟通起来更顺畅。6. 一整套预处理流程怎么串起来完整实操案例6.1 案例背景和数据说明为了把前面讲的这些环节串起来我用一个模拟的月度销售额数据走一遍完整流程。数据结构很简单两列一列是时间2020年1月到2023年12月共48个月的月度数据一列是销售额量级在几十万到几百万之间。这个数据构造时带有明显的上升趋势、年度季节性波动以及少量噪声和缺失值。这个案例代表了很多业务场景中真实的销售数据形态处理思路可以直接迁移到流量数据、库存数据、用户活跃度数据等各类指标上。6.2 逐步骤执行过程和中间结果第一步读取数据后先做时间索引转换和可视化。画时序图是必做动作不是可选项。时序图能一目了然看出数据有没有趋势、有没有周期性、波动幅度是不是恒定的。我当时的图显示销售额整体向上爬升每年年底有一个波峰波动幅度在高位时明显更大——说明方差随均值变化这暗示后面应用对数变换。第二步对原始序列取对数然后画图观察。取对数后的序列波动幅度变得均匀了趋势和季节性形态依然清晰这是个好的预处理起点。第三步对取对数后的序列做ADF和KPSS检验。结果显示ADF检验的p值大于0.05不能拒绝单位根原假设说明序列不平稳KPSS检验的p值小于0.05也拒绝平稳原假设。两个检验结论一致序列确实不平稳。第四步对取对数后的序列做一阶差分再次做平稳性检验。ADF检验的p值小于0.05拒绝单位根假设KPSS检验p值大于0.05不能拒绝平稳假设。两个检验结论一致表明差分后的序列是平稳的。第五步做季节性分解。对差分后的序列或者直接用对数序列做STL分解观察季节项和趋势项。分解结果显示季节项非常稳定周期为12个月残差项基本围绕零波动。对残差项做Ljung-Box检验p值大于0.05无法拒绝白噪声假设说明分解已经把规律提取得比较干净了。第六步在预处理完成后序列被收拾成一个平稳的、无周期规律的残差序列这时候才可以放心地进入模型选择和参数估计阶段。在后面使用ARIMA或者SARIMA建模时预处理环节产出的序列是否平稳差分阶数取多少季节周期多长这些结论直接成为模型参数指定的依据。6.3 代码汇总一整套流程直接抄作业import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller, kpss from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.seasonal import STL, seasonal_decompose from statsmodels.stats.diagnostic import acorr_ljungbox from scipy import stats # 1. 数据读取与时间索引规范化 # df pd.read_csv(sales.csv) # df[date] pd.to_datetime(df[date]) # df df.set_index(date).sort_index() # 2. 对数变换 # df[log_sales] np.log(df[sales]) # 3. 平稳性检验 # result_adf adfuller(df[log_sales]) # result_kpss kpss(df[log_sales], regressionc) # 4. 一阶差分与季节性差分 # df[log_sales_diff] df[log_sales].diff().dropna() # df[log_sales_seasonal_diff] df[log_sales].diff(12).dropna() # 月度数据的年度差分 # df[log_sales_full_diff] df[log_sales].diff().diff(12).dropna() # 5. 差分后再次平稳性检验 # result_adf_diff adfuller(df[log_sales_diff].dropna()) # result_kpss_diff kpss(df[log_sales_diff].dropna(), regressionc) # 6. 季节性分解 # stl_res STL(df[log_sales], period12, robustTrue).fit() # df[trend] stl_res.trend # df[seasonal] stl_res.seasonal # df[resid] stl_res.resid # 7. 残差白噪声检验 # lb_test_resid acorr_ljungbox(df[resid].dropna(), lags10, return_dfTrue) # 8. 可视化时序图、差分后时序图、ACF/PACF图 # fig, axes plt.subplots(3, 1, figsize(12, 10)) # df[log_sales].plot(axaxes[0], titleLog Sales) # df[log_sales_diff].plot(axaxes[1], titleLog Sales First Diff) # df[log_sales_full_diff].plot(axaxes[2], titleLog Sales Full Diff) # plt.tight_layout() # plt.show() # 9. 自相关和偏自相关图 # plot_acf(df[log_sales_diff].dropna(), lags24) # plot_pacf(df[log_sales_diff].dropna(), lags24) # plt.show()这段代码基本上覆盖了时间序列预处理的所有核心环节直接改成你的列名和数据路径就能跑起来。画ACF和PACF图这个步骤我放在最后但特别强调一下ACF图能帮你判断差分后的序列还存在什么短期相关结构是后续识别ARIMA模型阶数的重要依据。比如一阶差分后的ACF图如果显示一阶截尾说明可以尝试MA(1)PACF图如果显示一阶截尾则可以考虑AR(1)。7. 常见问题与排查技巧实录7.1 平稳性检验结果互相矛盾怎么办ADF检验说平稳KPSS检验说非平稳或者反过来这种矛盾情况我遇到好多次。处理思路要根据具体情况来。如果ADF说平稳、KPSS说非平稳常见原因有两个一是序列存在结构突变比如政策变化导致均值水平跃迁二是序列中存在长记忆效应或者弱单位根。这时候可以画图看看是否有明显的断裂也可以做Chow检验或者Bai-Perron检验去检测结构突变点。发现突变点后可以对突变点前后分段建模或者在模型中增加干预变量。如果ADF说非平稳、KPSS说平稳这种情况通常是样本量太小导致检验功效不足或者是序列里存在确定性的趋势项。确定性的趋势项可以通过回归去掉趋势后再检验。一个非常实用的经验是当两个检验矛盾时宁可保守一点把序列当作非平稳来处理做差分不要冒险用非平稳的序列直接建模。因为差分虽然可能略微过度但至少不会导致伪回归这种更严重的问题。7.2 对数变换还原预测值时发现预测区间不对前面提到过这个问题这里展开说说。假设你对原始序列取了对数模型预测得到的是对数空间上的均值和置信区间。还原预测值时用exp可以还原均值但直接对置信区间上下界取exp是有偏差的。原因是exp是个非线性函数对数空间上对称的置信区间还原到原始空间之后不再对称。正确的做法需要对预测分布做偏差修正。如果假设对数空间上预测值服从正态分布均值为mu方差为sigma^2那么原始空间上的期望值大约是exp(mu sigma^2 / 2)。这意味着如果直接用exp(mu)作为还原后的点预测实际上系统性地低估了真实均值。预测区间的还原更复杂一些比较稳妥的办法是用分位数的方法在对数空间算出预测分布的分位数比如2.5%和97.5%然后对这些分位数做exp变换得到的区间在原始空间中的覆盖率才接近真实水平。如果你只是想要一个大致可用的结果用exp直接还原也不算大错但如果你做的是对精度要求较高的业务决策这一点偏差修正值得认真处理。7.3 分解后残差仍然有明显的季节模式STL或seasonal_decompose分解完检查残差的自相关图发现还有明显的周期尖峰这说明分解没有把季节性完全提取干净。排查思路一般有两个方向。第一个方向是周期长度设置错了。比如月度数据实际是季度周期的话却填了period12季节项根本捕捉不到真实的周期残差自然带着周期信号。确认周期长度的方法可以先画出不同滞后期上的自相关图看看在哪些滞后期出现尖峰。如果月度数据在lags3处出现尖峰说明周期大概是3个月在lags12处出现尖峰说明年度周期。第二个方向是季节性本身在变化。固定周期的分解方法假设季节模式在每年都一样但业务上经常会遇到季节形态逐年变化的情况。比如新市场开拓后淡旺季的规律变了或者受外部因素影响某些年份的旺季提前了。这种情况下固定周期的分解方法效果有限要考虑动态季节模型或者用TBATS这类能处理时变季节性的模型。7.4 缺失值处理时容易忽略的边界问题很多人在做缺失值插补时容易忽略时间序列的边界——也就是序列开头和结尾的缺失值。线性插值依赖前后两个观测值如果缺失值在序列开头前面没有值可用插值结果就是NaN。这种情况下可以用后向填充补头或者用第一个非缺失值前后的趋势外推。序列结尾的缺失值更需要警惕因为它直接影响后续模型的预测基准。比如你要预测未来三个月的销售而最近一个月的值刚好缺失那预测结果就少了一个关键基准。处理建议是在预处理阶段就尽量把边界缺失值补充完整可以用最后一段可用数据的趋势外推或者结合同期的季节性均值来填补。等模型建完再发现这个问题处理起来麻烦很多。7.5 差分过头了怎么判断判别差分是否过度的实用方法是看自相关图。如果一阶差分后序列的ACF图在滞后1处出现显著的负相关尖峰而其他滞后处基本不显著这往往是差分过度的信号。此时可以试试把差分去掉用带漂移项的水平序列建模或者试试分数差分fractional differencing。分数差分在金融时间序列中应用较多适合处理那些既非标准平稳又非标准单位根的长记忆序列。另外有个直观的判定参考差分阶数每增加一次序列的方差通常会略微增加。你可以比较原始序列、一阶差分序列、二阶差分序列的标准差。如果二阶差分的标准差明显大于一阶差分说明二阶差分已经过度了信息被过度抹平后又引入了更多噪声。这套预处理流程我前前后后用了很多年每次遇到新数据集都会严格执行一遍从来没有后悔过。它可能不会帮你省去模型调参的工作量但能帮你避开绝大多数的低级错误。时间序列分析最大的风险从来不是模型不够高级而是数据本身在欺骗你——趋势、季节、噪声、异常搅在一起不预处理就直接建模等于蒙着眼睛开车。处理好数据模型自然会给面子。
返回列表