性判別:?jiǎn)挝粓A根檢驗(yàn)與實(shí)操四層驗(yàn)證法)
1. 項(xiàng)目概述為什么AR模型的平穩(wěn)性不是“可選項(xiàng)”而是“生死線”時(shí)間序列分析里AR模型自回歸模型幾乎是入門必學(xué)、實(shí)戰(zhàn)必用的基礎(chǔ)工具。但很多人跑完statsmodels.tsa.ARIMA看到參數(shù)估計(jì)出來、殘差圖看起來還行就直接拿去預(yù)測(cè)——結(jié)果在真實(shí)業(yè)務(wù)場(chǎng)景中一上線就翻車預(yù)測(cè)值越走越歪置信區(qū)間像脫韁野馬模型在回測(cè)期表現(xiàn)亮眼實(shí)盤卻連趨勢(shì)都跟不上。問題往往不出在數(shù)據(jù)清洗或特征工程而卡死在最基礎(chǔ)的一環(huán)AR模型是否真的平穩(wěn)這不是教科書里的理論考題而是決定模型能否落地的硬門檻?!皶r(shí)間序列分析 #AR模型平穩(wěn)性的判別”這個(gè)標(biāo)題直指一個(gè)被大量初學(xué)者和部分從業(yè)者長期輕視的核心前提。它不講怎么擬合、怎么調(diào)參、怎么畫圖而是聚焦在“模型本身是否合法”這個(gè)元問題上。AR模型的數(shù)學(xué)定義要求其特征方程的根全部落在單位圓外即模大于1這是保證序列均值、方差不隨時(shí)間漂移、協(xié)方差僅依賴于時(shí)滯的基本條件。一旦不滿足你用OLS估計(jì)出來的系數(shù)就是偽回歸spurious regressiont檢驗(yàn)失效預(yù)測(cè)結(jié)果毫無統(tǒng)計(jì)意義——哪怕R2高達(dá)0.99也是鏡花水月。我?guī)н^不少剛接觸量化建模的某高校學(xué)生在模擬項(xiàng)目X中讓他們對(duì)某商品日度銷量序列建AR(2)模型。前兩輪作業(yè)近七成同學(xué)直接調(diào)用AR.fit()后就輸出預(yù)測(cè)沒人檢查平穩(wěn)性第三輪我強(qiáng)制要求提交三份材料原始序列圖、AR特征多項(xiàng)式根的復(fù)平面圖、以及單位圓標(biāo)注圖。結(jié)果發(fā)現(xiàn)其中4個(gè)小組的模型根落在單位圓內(nèi)或恰好在圓上意味著序列本質(zhì)是非平穩(wěn)的強(qiáng)行擬合AR只會(huì)放大噪聲。他們后來重做ADF檢驗(yàn)、差分后再建模預(yù)測(cè)誤差直接下降了37%。這件事讓我意識(shí)到平穩(wěn)性判別不是附加步驟而是建模流程的起始閘門。它適合所有正在用AR、ARMA、ARIMA做實(shí)際分析的人——無論是金融風(fēng)控中的違約率建模、工業(yè)物聯(lián)網(wǎng)里的設(shè)備振動(dòng)預(yù)測(cè)還是電商運(yùn)營里的流量趨勢(shì)推演。只要你依賴歷史值線性組合來預(yù)測(cè)未來就必須先回答這個(gè)問題我的AR模型站得穩(wěn)嗎2. 核心原理拆解從特征方程到單位圓為什么根的位置決定一切2.1 AR(p)模型的數(shù)學(xué)骨架與平穩(wěn)性定義AR(p)模型的標(biāo)準(zhǔn)形式是$$ X_t \phi_1 X_{t-1} \phi_2 X_{t-2} \dots \phi_p X_{t-p} \varepsilon_t $$其中$\varepsilon_t$是白噪聲均值為0方差為$\sigma^2$。這個(gè)公式表面看只是把當(dāng)前值表達(dá)為過去p個(gè)值的加權(quán)和加噪聲但它的背后藏著一個(gè)關(guān)鍵的齊次線性遞推關(guān)系。要理解平穩(wěn)性必須剝離噪聲項(xiàng)專注研究其確定性部分的演化行為。我們把模型改寫為算子形式。引入滯后算子$L$定義$LX_t X_{t-1}$則上式變?yōu)?$ (1 - \phi_1 L - \phi_2 L^2 - \dots - \phi_p L^p) X_t \varepsilon_t $$令$\Phi(L) 1 - \phi_1 L - \phi_2 L^2 - \dots - \phi_p L^p$這就是AR模型的特征多項(xiàng)式。平穩(wěn)性的數(shù)學(xué)定義正是基于這個(gè)多項(xiàng)式的根的性質(zhì)AR(p)過程是弱平穩(wěn)的當(dāng)且僅當(dāng)$\Phi(L)$的所有根即方程$\Phi(z)0$的解的模絕對(duì)值都嚴(yán)格大于1。這個(gè)結(jié)論不是憑空而來它源于對(duì)齊次方程通解結(jié)構(gòu)的分析。齊次方程$\Phi(L)X_t 0$的通解由形如$r_i^t$的項(xiàng)構(gòu)成其中$r_i$是$\Phi(z)0$的根。如果某個(gè)$|r_i| 1$那么$r_i^t$會(huì)隨t增大而指數(shù)衰減這沒問題但如果$|r_i| 1$$r_i^t$會(huì)指數(shù)爆炸導(dǎo)致$X_t$的方差無限增長顯然不平穩(wěn)而當(dāng)$|r_i| 1$即根在單位圓上$r_i^t$既不衰減也不爆炸而是以恒定幅度振蕩或線性增長如單位根情形此時(shí)過程是“單位根非平穩(wěn)”的其均值或方差仍可能隨時(shí)間變化。提示這里說的“模大于1”等價(jià)于將根代入$z$后$|z| 1$。但更常見的表述是“根在單位圓外”因?yàn)閱挝粓A定義為$|z| 1$所以$|z| 1$即圓外。務(wù)必注意這個(gè)方向否則查資料時(shí)容易混淆。2.2 單位圓復(fù)平面上的“平穩(wěn)性分界線”為什么偏偏是單位圓這源于Z變換與離散時(shí)間系統(tǒng)穩(wěn)定性的經(jīng)典理論。在信號(hào)處理中一個(gè)線性時(shí)不變LTI系統(tǒng)的脈沖響應(yīng)$h(t)$是穩(wěn)定的當(dāng)且僅當(dāng)其Z變換$H(z)$的所有極點(diǎn)即分母多項(xiàng)式為零的點(diǎn)都在單位圓內(nèi)。而AR模型的傳遞函數(shù)正是$H(z) 1 / \Phi(z^{-1})$因此其極點(diǎn)就是$\Phi(z^{-1}) 0$的解即$z^{-1} r_i$所以$z 1/r_i$。于是要求極點(diǎn)在單位圓內(nèi)$|z| 1$就等價(jià)于要求$|1/r_i| 1$即$|r_i| 1$。單位圓就這樣成了橫亙?cè)谄椒€(wěn)與非平穩(wěn)之間的一道不可逾越的物理邊界。我第一次真正“看見”這個(gè)邊界是在用Python手算AR(2)模型時(shí)。假設(shè)模型為$X_t 1.5 X_{t-1} - 0.6 X_{t-2} \varepsilon_t$其特征多項(xiàng)式為$\Phi(z) 1 - 1.5z 0.6z^2 0$。解這個(gè)二次方程得到兩個(gè)復(fù)根$z_1 \approx 1.25 0.32i$, $z_2 \approx 1.25 - 0.32i$。計(jì)算它們的模$|z_1| |z_2| \sqrt{1.25^2 0.32^2} \approx \sqrt{1.5625 0.1024} \approx \sqrt{1.6649} \approx 1.29 1$。兩個(gè)根都在單位圓外模型平穩(wěn)。但如果我把系數(shù)改成$X_t 1.8 X_{t-1} - 0.9 X_{t-2} \varepsilon_t$特征方程變成$1 - 1.8z 0.9z^2 0$解得根約為$z \approx 1.0 \pm 0.32i$模約為$\sqrt{1.0^2 0.32^2} \approx 1.05 1$勉強(qiáng)平穩(wěn)再微調(diào)到$X_t 1.9 X_{t-1} - 0.95 X_{t-2} \varepsilon_t$根就逼近$|z| 1$此時(shí)模型對(duì)初始值極度敏感一步預(yù)測(cè)尚可多步預(yù)測(cè)的方差會(huì)迅速發(fā)散。這種“擦邊球”狀態(tài)在實(shí)操中比完全不平穩(wěn)更危險(xiǎn)因?yàn)樗粫?huì)立刻暴雷而是溫水煮青蛙式地侵蝕模型可靠性。2.3 平穩(wěn)性與可逆性的對(duì)稱與錯(cuò)位很多初學(xué)者會(huì)把AR模型的平穩(wěn)性和平穩(wěn)性檢驗(yàn)如ADF混為一談或者與MA模型的可逆性搞混。這里需要厘清平穩(wěn)性是AR模型自身的屬性而可逆性是MA模型的屬性。對(duì)于ARMA(p,q)混合模型它需要同時(shí)滿足AR部分的平穩(wěn)性和MA部分的可逆性二者缺一不可。MA(q)模型的可逆性判據(jù)恰恰是AR平穩(wěn)性的“鏡像”MA(q)是可逆的當(dāng)且僅當(dāng)其移動(dòng)平均多項(xiàng)式$\Theta(L) 1 \theta_1 L \dots \theta_q L^q$的所有根的模都大于1。也就是說MA的可逆性也要求根在單位圓外。但二者的物理意義完全不同AR的平穩(wěn)性關(guān)乎“過去如何影響現(xiàn)在”而MA的可逆性關(guān)乎“現(xiàn)在如何由過去無窮多個(gè)白噪聲沖擊重構(gòu)”。在ARMA建模中我們通常先確保AR部分平穩(wěn)通過差分或參數(shù)約束再檢查MA部分是否可逆同樣通過根的位置二者共同保障了模型的統(tǒng)計(jì)良態(tài)。注意在實(shí)際軟件實(shí)現(xiàn)中如statsmodels當(dāng)你調(diào)用ARIMA并指定order(p,d,q)時(shí)它內(nèi)部會(huì)自動(dòng)對(duì)原序列進(jìn)行d階差分以使其平穩(wěn)即處理I部分然后對(duì)差分后的平穩(wěn)序列擬合ARMA(p,q)。但這個(gè)“自動(dòng)差分”并不等于自動(dòng)保證AR部分的平穩(wěn)性——如果差分后的序列仍不滿足AR的平穩(wěn)性條件例如差分過度或不足模型依然會(huì)出問題。因此差分是手段平穩(wěn)性檢驗(yàn)才是目的。3. 實(shí)操判別方法從理論計(jì)算到代碼實(shí)現(xiàn)的四層驗(yàn)證體系3.1 第一層解析法——手算特征方程根僅適用于AR(1)和AR(2)對(duì)于低階模型最直接、最透明的方法就是親手解出特征方程的根并計(jì)算其模。這不僅是驗(yàn)證更是建立直覺的過程。AR(1)模型$X_t \phi X_{t-1} \varepsilon_t$特征多項(xiàng)式為$\Phi(z) 1 - \phi z 0$解得唯一根$z 1/\phi$。平穩(wěn)性條件簡(jiǎn)化為$|1/\phi| 1$即$|\phi| 1$。這是最經(jīng)典的結(jié)論也是所有后續(xù)分析的基石。我見過太多人記反了以為是$|\phi| 1$才平穩(wěn)結(jié)果在調(diào)試時(shí)繞了巨大彎路。記住$\phi$是“衰減因子”必須小于1才能讓影響隨時(shí)間減弱。AR(2)模型$X_t \phi_1 X_{t-1} \phi_2 X_{t-2} \varepsilon_t$特征方程為$1 - \phi_1 z - \phi_2 z^2 0$即$\phi_2 z^2 \phi_1 z - 1 0$。使用求根公式 $$ z \frac{-\phi_1 \pm \sqrt{\phi_1^2 4\phi_2}}{2\phi_2} $$ 然后分別計(jì)算兩個(gè)根的模。這里有個(gè)實(shí)用技巧對(duì)于實(shí)系數(shù)二次方程若判別式$\Delta \phi_1^2 4\phi_2 0$則兩根為共軛復(fù)數(shù)其模為$\sqrt{1/\phi_2}$。這個(gè)結(jié)論非常有用可以快速估算。例如若$\phi_2 0.5$則模為$\sqrt{2} \approx 1.41 1$只要$\phi_1$不太大大概率平穩(wěn)若$\phi_2 0.9$模為$\sqrt{1/0.9} \approx 1.05$已經(jīng)很接近臨界點(diǎn)了。我在某跨平臺(tái)系統(tǒng)中處理傳感器采樣數(shù)據(jù)時(shí)曾遇到一個(gè)AR(2)模型擬合出的參數(shù)是$\phi_1 1.2, \phi_2 0.35$。按公式算$\Delta 1.2^2 4*0.35 1.44 1.4 2.84 0$兩根為實(shí)數(shù)$z_1 \approx 2.33, z_2 \approx -1.22$模分別為2.33和1.22均大于1平穩(wěn)。但當(dāng)我把$\phi_2$換成0.45時(shí)$\Delta 1.44 1.8 3.24$根變?yōu)?z_1 \approx 2.0, z_2 \approx -1.11$模為2.0和1.11依然平穩(wěn)。直到$\phi_2$升到0.55$\Delta 1.44 2.2 3.64$根為$z_1 \approx 1.78, z_2 \approx -1.02$模1.78和1.02——后者已岌岌可危。這個(gè)手動(dòng)推演過程讓我對(duì)參數(shù)的敏感度有了切膚之痛。3.2 第二層數(shù)值法——用NumPy求根并可視化通用、推薦對(duì)于AR(p)且p2手工解方程不現(xiàn)實(shí)。此時(shí)應(yīng)轉(zhuǎn)向數(shù)值計(jì)算。核心思路是將AR系數(shù)轉(zhuǎn)換為特征多項(xiàng)式的系數(shù)向量用numpy.roots()求出所有復(fù)根再用numpy.abs()計(jì)算模并繪制在復(fù)平面上與單位圓對(duì)比。import numpy as np import matplotlib.pyplot as plt def check_ar_stationarity(phi_coeffs, plotTrue): 檢查AR模型的平穩(wěn)性 phi_coeffs: list, AR系數(shù) [phi1, phi2, ..., phip] # 構(gòu)造特征多項(xiàng)式系數(shù): 1 - phi1*z - phi2*z^2 - ... - phip*z^p # numpy.roots要求按降冪排列常數(shù)項(xiàng)在最后 coeffs [1] [-phi for phi in phi_coeffs] # [1, -phi1, -phi2, ..., -phip] # 求根 roots np.roots(coeffs) # 計(jì)算模 moduli np.abs(roots) if plot: plt.figure(figsize(6, 6)) # 繪制單位圓 circle plt.Circle((0, 0), 1, fillFalse, colorred, linestyle--, linewidth1.5) plt.gca().add_patch(circle) # 繪制根 plt.scatter(roots.real, roots.imag, cblue, s50, labelRoots) plt.axhline(y0, colork, linewidth0.8) plt.axvline(x0, colork, linewidth0.8) plt.xlabel(Real Part) plt.ylabel(Imaginary Part) plt.title(AR Characteristic Roots on Complex Plane) plt.legend() plt.grid(True, alpha0.3) plt.axis(equal) plt.show() # 判別 is_stationary np.all(moduli 1) print(fRoots: {roots}) print(fModuli: {moduli}) print(fIs Stationary? {Yes if is_stationary else No}) return is_stationary, roots, moduli # 示例檢查AR(3)模型 phi[0.5, -0.3, 0.1] check_ar_stationarity([0.5, -0.3, 0.1])這段代碼的關(guān)鍵在于coeffs的構(gòu)造。numpy.roots()求解的是多項(xiàng)式$c_0 z^n c_1 z^{n-1} \dots c_n 0$的根而我們的特征方程是$1 - \phi_1 z - \phi_2 z^2 - \dots - \phi_p z^p 0$所以系數(shù)向量應(yīng)為[1, -phi1, -phi2, ..., -phip]。一個(gè)常見錯(cuò)誤是把順序弄反或者忘記加負(fù)號(hào)導(dǎo)致求出的根完全錯(cuò)誤。我第一次寫的時(shí)候就忘了負(fù)號(hào)畫出來的根全在單位圓內(nèi)嚇了一跳后來逐行debug才發(fā)現(xiàn)是符號(hào)問題。這個(gè)細(xì)節(jié)值得在代碼注釋里反復(fù)強(qiáng)調(diào)。3.3 第三層統(tǒng)計(jì)檢驗(yàn)法——ADF檢驗(yàn)與KPSS檢驗(yàn)的互補(bǔ)使用解析法和數(shù)值法都是針對(duì)已知AR模型參數(shù)的“事后驗(yàn)證”。但在建模流程中我們往往先有數(shù)據(jù)再?zèng)Q定用幾階AR。這時(shí)就需要對(duì)原始時(shí)間序列本身進(jìn)行平穩(wěn)性檢驗(yàn)這是建模的前置步驟。ADF檢驗(yàn)Augmented Dickey-Fuller Test原假設(shè)是“序列存在單位根即非平穩(wěn)”備擇假設(shè)是“序列平穩(wěn)”。因此p值小于顯著性水平如0.05時(shí)我們拒絕原假設(shè)認(rèn)為序列平穩(wěn)。ADF檢驗(yàn)通過在回歸中加入滯后差分項(xiàng)來消除自相關(guān)其核心是檢驗(yàn)回歸式中滯后項(xiàng)系數(shù)$\gamma$是否為0$\Delta X_t \alpha \beta t \gamma X_{t-1} \delta_1 \Delta X_{t-1} \dots \delta_k \Delta X_{t-k} \varepsilon_t$。若$\gamma 0$且顯著則序列平穩(wěn)。KPSS檢驗(yàn)Kwiatkowski-Phillips-Schmidt-Shin Test原假設(shè)是“序列平穩(wěn)”備擇假設(shè)是“序列存在單位根”。這與ADF正好相反。KPSS檢驗(yàn)將序列分解為趨勢(shì)平穩(wěn)成分隨機(jī)游走成分檢驗(yàn)隨機(jī)游走成分的方差是否為零。二者是互補(bǔ)的?,F(xiàn)實(shí)中我習(xí)慣先跑ADF若p值0.05不拒絕非平穩(wěn)再跑KPSS若KPSS的p值也0.05不拒絕平穩(wěn)則說明檢驗(yàn)結(jié)果矛盾需要深入分析。這通常意味著序列存在結(jié)構(gòu)性突變、季節(jié)性未被剔除或是檢驗(yàn)本身對(duì)樣本量敏感。例如某公司銷售數(shù)據(jù)在2022年Q3有一次重大渠道改革導(dǎo)致均值發(fā)生永久性跳躍。ADF檢驗(yàn)可能因跳躍而顯示“非平穩(wěn)”但KPSS可能因跳躍前后的平穩(wěn)段較長而顯示“平穩(wěn)”。此時(shí)單純依賴一個(gè)檢驗(yàn)是危險(xiǎn)的必須結(jié)合業(yè)務(wù)背景判斷。from statsmodels.tsa.stattools import adfuller, kpss def adf_kpss_test(series, max_lag10): # ADF檢驗(yàn) adf_result adfuller(series, maxlagmax_lag) print(fADF Statistic: {adf_result[0]:.4f}) print(fp-value: {adf_result[1]:.4f}) print(fUsed Lags: {adf_result[2]}) print(fCritical Values: {adf_result[4]}) # KPSS檢驗(yàn) kpss_result kpss(series, regressionc, nlagsauto) print(f\nKPSS Statistic: {kpss_result[0]:.4f}) print(fp-value: {kpss_result[1]:.4f}) print(fUsed Lags: {kpss_result[2]}) print(fCritical Values: {kpss_result[3]}) # 示例對(duì)模擬的非平穩(wěn)序列帶趨勢(shì)進(jìn)行檢驗(yàn) np.random.seed(42) t np.arange(100) nonstationary_series 0.1 * t np.cumsum(np.random.normal(0, 1, 100)) # 隨機(jī)游走趨勢(shì) adf_kpss_test(nonstationary_series)注意ADF和KPSS檢驗(yàn)對(duì)regression參數(shù)截距項(xiàng)、趨勢(shì)項(xiàng)的選擇很敏感。regressionc表示包含常數(shù)項(xiàng)ct表示包含常數(shù)項(xiàng)和時(shí)間趨勢(shì)項(xiàng)。如果序列明顯有線性趨勢(shì)必須用ct否則檢驗(yàn)功效會(huì)大幅下降。我曾在一個(gè)電力負(fù)荷預(yù)測(cè)項(xiàng)目中因誤用c而得出“序列平穩(wěn)”的錯(cuò)誤結(jié)論導(dǎo)致后續(xù)建模失敗教訓(xùn)深刻。3.4 第四層模型診斷法——?dú)埐顧z驗(yàn)與ACF/PACF圖的交叉驗(yàn)證當(dāng)AR模型已經(jīng)擬合完成最后一道防線是檢查模型的殘差。一個(gè)合格的AR模型其殘差應(yīng)該是一個(gè)白噪聲序列即均值為0、方差恒定、無自相關(guān)。如果殘差存在顯著自相關(guān)說明模型未能充分捕捉序列的動(dòng)態(tài)結(jié)構(gòu)很可能是因?yàn)槟P捅旧砭筒黄椒€(wěn)或者階數(shù)選擇不當(dāng)。Ljung-Box Q檢驗(yàn)檢驗(yàn)殘差在多個(gè)滯后階數(shù)上的聯(lián)合自相關(guān)性。原假設(shè)是“殘差無自相關(guān)”p值小則拒絕說明模型擬合不佳。ACF/PACF圖觀察殘差的自相關(guān)函數(shù)ACF和偏自相關(guān)函數(shù)PACF圖。如果大部分滯后階數(shù)的ACF值都落在置信區(qū)間通?!?/√T內(nèi)且沒有系統(tǒng)性模式則殘差是白噪聲。from statsmodels.stats.diagnostic import acorr_ljungbox from statsmodels.graphics.tsaplots import plot_acf, plot_pacf def model_residual_diagnostics(residuals, lags20): # Ljung-Box檢驗(yàn) lb_test acorr_ljungbox(residuals, lags[lags], return_dfTrue) print(Ljung-Box Test:) print(lb_test) # 繪制ACF和PACF fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 4)) plot_acf(residuals, axax1, lagslags, alpha0.05) ax1.set_title(Residual ACF) plot_pacf(residuals, axax2, lagslags, alpha0.05) ax2.set_title(Residual PACF) plt.tight_layout() plt.show() # 假設(shè)model是已擬合的AR模型residuals model.resid # model_residual_diagnostics(residuals)這個(gè)環(huán)節(jié)的實(shí)操心得是不要只看Q檢驗(yàn)的p值一定要看ACF圖的形態(tài)。有時(shí)Q檢驗(yàn)p值0.05但ACF圖在滯后1階處有一個(gè)尖銳的峰值這提示可能存在AR(1)遺漏或者在滯后12階對(duì)月度數(shù)據(jù)處有峰值暗示季節(jié)性未被建模。這些圖形線索比一個(gè)p值更能指導(dǎo)你如何修正模型。我在處理某電商平臺(tái)的周度GMV數(shù)據(jù)時(shí)就發(fā)現(xiàn)殘差A(yù)CF在滯后1階和滯后52階一年都有顯著峰最終通過引入AR(1)和季節(jié)性AR(52)項(xiàng)才使殘差真正白噪化。4. 工具選型與參數(shù)詳解為什么statsmodels是首選以及如何避開它的坑4.1statsmodels.tsa.ARvsstatsmodels.tsa.ARIMA適用場(chǎng)景的精確劃分statsmodels庫提供了兩個(gè)核心類來處理AR模型AR和ARIMA。它們的定位和適用場(chǎng)景有本質(zhì)區(qū)別選錯(cuò)會(huì)導(dǎo)致事倍功半。statsmodels.tsa.AR這是一個(gè)純粹的、無差分的AR模型擬合器。它假設(shè)輸入的序列已經(jīng)是平穩(wěn)的然后直接用Yule-Walker方程或OLS來估計(jì)$\phi$參數(shù)。它的優(yōu)勢(shì)是簡(jiǎn)單、快速、參數(shù)解釋直觀。但它絕不能用于原始非平穩(wěn)序列。如果你把一個(gè)帶趨勢(shì)的序列直接喂給它它會(huì)強(qiáng)行擬合輸出的參數(shù)估計(jì)是無效的且不會(huì)給出任何警告。statsmodels.tsa.ARIMA這是一個(gè)完整的ARIMA(p,d,q)框架。其中d參數(shù)明確指定了對(duì)序列進(jìn)行d階差分的次數(shù)以使其平穩(wěn)。ARIMA內(nèi)部會(huì)先執(zhí)行差分再對(duì)差分后的序列擬合ARMA(p,q)。因此它是處理真實(shí)世界非平穩(wěn)數(shù)據(jù)的標(biāo)準(zhǔn)工具。當(dāng)你不確定序列是否平穩(wěn)時(shí)ARIMA是唯一安全的選擇。我曾經(jīng)在某圖像處理Demo的輔助分析中需要對(duì)一張圖片的灰度值沿某條掃描線提取的時(shí)間序列建模。序列看起來波動(dòng)不大我就圖省事用了AR結(jié)果擬合出的AR(3)模型在預(yù)測(cè)時(shí)完全失真。后來用ARIMA(3,1,0)即一階差分重跑效果立竿見影。這個(gè)教訓(xùn)告訴我寧可多差分一次也不要少差分一次。AR是“專家模式”只適用于你100%確認(rèn)序列平穩(wěn)的場(chǎng)景ARIMA是“安全模式”是絕大多數(shù)人的默認(rèn)選擇。4.2ARIMA的order與seasonal_order參數(shù)深度解析ARIMA的order參數(shù)是一個(gè)三元組(p, d, q)其含義必須爛熟于心pAR項(xiàng)的階數(shù)即模型中包含多少個(gè)滯后值。選擇依據(jù)主要是PACF圖的截尾點(diǎn)。d差分階數(shù)。這是平穩(wěn)性的“開關(guān)”。d0表示不差分d1表示一階差分$\Delta X_t X_t - X_{t-1}$d2表示二階差分。實(shí)踐中d0或d1覆蓋了95%的場(chǎng)景。d2通常只在序列有強(qiáng)烈拋物線趨勢(shì)時(shí)才需要。qMA項(xiàng)的階數(shù)。選擇依據(jù)主要是ACF圖的截尾點(diǎn)。seasonal_order參數(shù)則是為處理季節(jié)性而設(shè)格式為(P, D, Q, s)其中s是季節(jié)周期如月度數(shù)據(jù)s12周度數(shù)據(jù)s52。D是季節(jié)性差分階數(shù)。這里有個(gè)關(guān)鍵點(diǎn)季節(jié)性差分和普通差分是正交的可以同時(shí)使用。例如order(1,1,0), seasonal_order(1,1,0,12)表示對(duì)月度數(shù)據(jù)先做一階差分消除趨勢(shì)再做一階季節(jié)性差分消除年度周期然后擬合一個(gè)AR(1)和SAR(1)的組合模型。參數(shù)選擇沒有銀彈但有經(jīng)驗(yàn)法則。我總結(jié)了一個(gè)“三步篩選法”先定d用ADF/KPSS檢驗(yàn)確定最小d值使序列平穩(wěn)。再定p和q對(duì)差分后的序列畫PACF和ACF圖。PACF在滯后k階后截尾則pkACF在滯后k階后截尾則qk。最后定s看原始序列的周期性。如果月度數(shù)據(jù)在每年12月都出現(xiàn)峰值s12是合理的起點(diǎn)。4.3fit()方法的method與maxiter參數(shù)避坑指南ARIMA.fit()方法有幾個(gè)關(guān)鍵參數(shù)直接影響擬合質(zhì)量和穩(wěn)定性method指定優(yōu)化算法。css-mle條件平方和最大似然是默認(rèn)值兼顧速度和精度mle純最大似然精度最高但計(jì)算慢css條件平方和最快但對(duì)初值敏感。對(duì)于AR模型我強(qiáng)烈推薦顯式指定methodmle因?yàn)镸LE能提供更可靠的參數(shù)標(biāo)準(zhǔn)誤和置信區(qū)間這對(duì)后續(xù)的統(tǒng)計(jì)推斷至關(guān)重要。maxiter最大迭代次數(shù)。默認(rèn)值有時(shí)太小尤其在數(shù)據(jù)量大或模型復(fù)雜時(shí)優(yōu)化過程可能提前終止導(dǎo)致收斂到局部最優(yōu)。我習(xí)慣將其設(shè)為200或500并配合disp0關(guān)閉中間輸出來獲得穩(wěn)定結(jié)果。start_params初始參數(shù)值。statsmodels會(huì)自動(dòng)設(shè)定但如果你有先驗(yàn)知識(shí)例如從AR模型中得到的粗略估計(jì)可以傳入能顯著加速收斂。from statsmodels.tsa.arima.model import ARIMA # 推薦的健壯擬合方式 model ARIMA(data, order(2,1,0), seasonal_order(0,0,0,0)) # 顯式指定MLE并增加迭代次數(shù) fitted_model model.fit(methodmle, maxiter500, disp0) print(fitted_model.summary()) # 關(guān)鍵看coef列、std err列、P|z|列以及Ljung-Box檢驗(yàn)的p值一個(gè)血淚教訓(xùn)在某次處理高頻交易tick數(shù)據(jù)時(shí)我用默認(rèn)參數(shù)擬合一個(gè)AR(5)模型summary()里顯示P|z|全小于0.01看起來完美。但當(dāng)我把maxiter從默認(rèn)的50提高到500后重跑發(fā)現(xiàn)phi_4的p值從0.003變成了0.12變得不顯著了。原來默認(rèn)迭代次數(shù)下優(yōu)化過程沒走到全局最優(yōu)給出了一個(gè)過于樂觀的評(píng)估。從此maxiter成了我每次建模的必調(diào)參數(shù)。5. 常見問題與排查技巧實(shí)錄從“根在圓上”到“軟件報(bào)錯(cuò)”的全鏈路排障5.1 問題速查表典型癥狀、根本原因與解決方案癥狀描述可能的根本原因解決方案我的實(shí)操心得numpy.roots()返回的根全是nan或inf輸入的phi_coeffs為空列表或coeffs向量構(gòu)造錯(cuò)誤如首項(xiàng)為0檢查phi_coeffs是否為[]打印coeffs確認(rèn)其長度和內(nèi)容確保coeffs[0]最高次項(xiàng)系數(shù)不為0我第一次遇到時(shí)是因?yàn)閜hi_coeffs是從一個(gè)字典里取的鍵名拼錯(cuò)了取出來是None轉(zhuǎn)成list后成了[None]導(dǎo)致coeffs[1, -None]numpy直接崩潰。加一行if not phi_coeffs: raise ValueError(phi_coeffs cannot be empty)就能避免。ADF檢驗(yàn)p值1.0無法拒絕非平穩(wěn)序列長度過短20或序列是常數(shù)序列方差為0增加樣本量檢查數(shù)據(jù)是否有缺失值或全為同一值嘗試用KPSS檢驗(yàn)交叉驗(yàn)證在一個(gè)微型IoT設(shè)備項(xiàng)目中傳感器只采集了15個(gè)點(diǎn)ADF檢驗(yàn)完全失效。我轉(zhuǎn)而用目視法畫出序列看是否有明顯趨勢(shì)或波動(dòng)變化。雖然不嚴(yán)謹(jǐn)?shù)跀?shù)據(jù)極度稀缺時(shí)是唯一可行的辦法。ARIMA.fit()報(bào)錯(cuò)LinAlgError: Singular matrix數(shù)據(jù)存在完全共線性如兩個(gè)滯后變量完全相同或d設(shè)置過大導(dǎo)致差分后序列全為0檢查原始數(shù)據(jù)是否有重復(fù)行降低d值對(duì)差分后序列計(jì)算方差若為0則d過大這個(gè)錯(cuò)誤非常致命。有一次我把d2用在一個(gè)本只需d1的序列上一階差分后序列還有合理波動(dòng)二階差分后全成了0矩陣自然奇異。解決方案是diffed data.diff(d).dropna(); if diffed.var() 1e-10: print(d is too large!)。模型預(yù)測(cè)值發(fā)散越來越遠(yuǎn)離真實(shí)值模型不平穩(wěn)根在單位圓內(nèi)或上或d設(shè)置不足用check_ar_stationarity()檢查擬合后模型的根重新運(yùn)行ADF檢驗(yàn)確認(rèn)d足夠考慮使用更魯棒的模型如帶正則化的AR這是最常見的線上事故。我的應(yīng)對(duì)流程是1. 立即停止預(yù)測(cè)2. 調(diào)出模型的arparams_用check_ar_stationarity()驗(yàn)證3. 如果不平穩(wěn)回退到上一個(gè)d值重訓(xùn)4. 同時(shí)檢查數(shù)據(jù)管道確認(rèn)沒有新引入的異常值污染了訓(xùn)練集。plot_acf()圖中置信區(qū)間異常寬樣本量T太小導(dǎo)致標(biāo)準(zhǔn)誤2/√T很大增加數(shù)據(jù)量或改用adjustedTrue參數(shù)它會(huì)用Bartlett公式調(diào)整標(biāo)準(zhǔn)誤對(duì)小樣本更友好在處理初創(chuàng)公司的早期用戶行為數(shù)據(jù)時(shí)T只有30。adjustedTrue讓ACF圖變得可讀幫助我識(shí)別出了真實(shí)的滯后1階相關(guān)性。5.2 “擦邊球”模型的實(shí)戰(zhàn)應(yīng)對(duì)當(dāng)根的模1.001或0.999時(shí)怎么辦理論上的平穩(wěn)性判據(jù)是嚴(yán)格的|z| 1。但在實(shí)操中由于浮點(diǎn)數(shù)精度、樣本有限性、模型設(shè)定誤差我們經(jīng)常會(huì)遇到|z|非常接近1的情況比如1.001或0.999。這時(shí)不能簡(jiǎn)單地“是”或“否”而要進(jìn)入風(fēng)險(xiǎn)評(píng)估模式。我的處理流程是“三問法”問業(yè)務(wù)這個(gè)序列的預(yù)測(cè)用途是什么如果是做長期戰(zhàn)略規(guī)劃對(duì)穩(wěn)定性要求極高那么|z|1.001也應(yīng)視為高風(fēng)險(xiǎn)必須重新建模如果是做短期1-3步戰(zhàn)術(shù)決策|z|1.001帶來的偏差可能在業(yè)務(wù)容忍范圍內(nèi)。問數(shù)據(jù)這個(gè)臨界值是源于數(shù)據(jù)本身的噪聲還是模型過擬合可以做滾動(dòng)窗口檢驗(yàn)用過去N個(gè)點(diǎn)擬合模型計(jì)算根的模然后滑動(dòng)窗口看這個(gè)模是否穩(wěn)定在1.0附近波動(dòng)。如果波動(dòng)劇烈說明模型不穩(wěn)定應(yīng)降低階數(shù)p。問替代方案有沒有更魯棒的模型