有什麼好的模型可以做高精度的時間序列預測呢?
ARIMA
個人在倫敦就是天天干這個的。通過機器學習(machine learning)做價格預測。
希望能提供一些最基礎的建議(不好意思中文不是母語,很多中文術語不太清楚,所以要用一些英文)
1)首先盡量簡化數據,讓每一個輸入都有很規範的格式。每一個輸入源必須是mean 0,variance 1。假如說不能直接用價格;要用價格的差距。這樣才可以客觀比較每個輸入的作用。而且很多模型本來就有這個要求。
2)先排除那些沒有用的輸入。這很簡單。把數據重新re-sample,得到兩個對應的time series,A和B。算兩個time series的correlation。當然這個值越大越好。但是還有更有用的技巧:給其中的一列A添加offset。試著用各個offset再得出correlation。你會發這個offset過小過大,correlation就越小了。但是中間有一個達到最高值的offset。那就是A領先與B的平均時間。這offset小於零,說明A可以預測B。大於零說明這數據根本沒什麼預測能力,反而B更能預測A。通過這個可以篩選掉好多東西。
3)現在你得到一套最具有預測能力的輸入。但他們的weighting還不知道。首先肯定要去試著用最簡單的linear model。如果你的linear model沒用,那更高級的模型肯定也沒用了,應該放棄。這linear演算法的目標就是簡單地得出一列weightings對吧。在某個時刻,這一列數字乘與『現在』的value必須和未來的value有很大的correlation。所以選擇一個心目中最合適的offset(假如一秒或一小時);然後直接算各個因素的correlation。拼成一列weightings。就這麼簡單。也可以試著不同offset,看看這模型最好能預算多久以後的value。這東西就叫linear regression。
4)在linear regression得到成果以後,再想像更複雜的模型。建議先從一個維度升級到兩個維度。得到一個矩陣的weightings。說實話這應該已經夠的了。不過如果必要追求再複雜一點的話,那真的建議decision tree。decision tree也可以理解成heirarchical model(層次模型?)。比如這個情況:你發現A或B越高能預測到C要漲,但好像A和B都太高的話,C反而要跌。所以必須有層次的。這decision tree裡面最推薦用random forest。這樣能夠在複雜程度與預測準確度之間達到最平衡的效果。
5)再高級一點就是通過完全自由連接的graph,比如neural network。但是肯定先從簡單的開始。如果直接用graph,因為connections太多太密集太複雜,很多循環之類的,導致人家很難以理解裡面信息運轉的道理。最好從linear到2D開始,這樣每一步都更加理解數據之間的關係,更好去設計適合的結構。
6)其他的一些想法:不一定要只根據時間去預測。你所根據的時間線只需要是一個越來越大的某個東西。也可以是市場的買賣量之類的。因為買賣總量和時間一樣的,只往前不往後。這樣的話你不在預測多少時間以後的value而在預測多少買賣增加以後的value了。一般都比較合適。
還有一點就是:你的那個數據似乎是波浪類型的。這就沒有符合第一點。應該轉換成更基本的輸入和輸出;例如分成wavelength和amplitude兩個預測對象。
做過各種數據的預測,發現用一般的機器學習(SVR, randomForest, lasso,xgboost等等)都有這樣的特點,乍一看擬合效果和預測效果都不錯,pmse也很小。
但如果把預測圖畫出來仔細看相位的話,會發現很多時候你的預測結果其實只是真實值平移了一個時間單位。數據的頻率越高,這個類似平移的延遲效應越明顯,特別是金融數據,哪怕加入了其它外生特徵。
看過很多機器學習與時間序列相關論文,都在誇自己的模型多牛逼多厲害,都把預測誤差弄得很小很小,卻很少論文真的把預測值和真實值的圖仔細分析一遍。只要稍微注意看一眼,就會發現預測值真的很像是把前一天的真實值往後平移了一下而已……
個人理解是這些模型都認為對明天最好的預測就是今天的數值,E(Xn|X_n-1,...)=X_n-1…
所以,評價一個時間序列預測模型的好壞,只看平均預測誤差的都是耍流氓……個人感覺機器學習在時間序列上的效果有時候還不如傳統的狀態空間模型……
扯遠了。在問有什麼模型能夠預測之前,記得先做隨機性檢驗呀,多個相互延遲的序列的相關性呀之類的,不然人家本來就沒啥規律,或者說你找來的特徵根本沒啥影響,硬要上模型,結果弄了半天的feature engineering發現啥效果都沒有,然後繼續去試其它模型,簡直是在浪費生命hhh……
考慮周期(如加入季節因素,正餘弦項等)分組,分層,變係數,local model with kernel,有時候會有奇效。對於純粹時間序列預測,目前最理想的方法應該就是RNN及其變體了。標準的RNN要達到好的效果會比較難訓練,目前它的帶記憶的變體,比如LSTM(long-short term memory)和GRU(gated recurrent unit)都非常熱門。進一步的,這些模型還可以和其它神經網路模型組合,比如在LSTM下面堆疊若干層的CNN等等,這樣基本上就是目前深度學習(deep learning)中常見的處理時間序列最好的模型了。當然這也要配置和訓練得當才能得到好的效果(包括數據預處理、恰當的參數等)。建議可以少用一些數據,用Theano ( Welcome — Theano 0.8.0 documentation ) 之類的容易上手的工具包先試試看。
「時間序列預測」本身包含了多種類型的問題,而這些問題存在不同特徵的數據。進行時間序列預測時,首先考慮的並不是選擇模型,而是分析目標問題:
首先,你要有一個概率空間的概念, 思考這個時間序列是否是可以重複的。
一個時間序列,往往是外界給與的另一個時間導致的一個東西, 而這樣一個東西, 可以隨外界的變化而確定, 但也可以由於更複雜的原因是不確定的。
時間序列這一刻的狀態如果只和上一刻相關, 則可以說它是沒有複雜記憶的(馬爾科夫過程),反之, 時間序列此刻的狀態如果不僅和上一刻相關, 還和上刻,上上刻相關, 那就不具有馬氏性,而是複雜歷史依賴。
其次,你要考慮系統是線性還是非線性。
如果影響時間序列變化的因素之間相互獨立, 則它們總的效果可以分解為單個因素的影響的疊加,我們稱之為線性,對於線性系統我們有一套現成工具解決。 反之如果影響它的因子不能被單獨拆分, 則是非線性的。一旦具有非線性, 則問題變得極為複雜,各種類型的相變, 混沌應運而生。
再次,問題有多少維度?需要 升維還是降維?
時間序列往往一個隨時間變化的高維向量, 首先你要看看你的序列是多少維度的, 然後你要做一個物理學家最常面臨的決策: 是否降維? 有時候降維之後問題變得無比簡單(PCA分析), 但有時候恰好相反, 把一個低維度的東西投影到高維度才是最簡單的(神經網路)。
如果這些都給定了, 如何預測一個時間序列的走勢?
好了, 這才是核心, 如果你了解了時間序列的上述特性, 你可以試著使用一系列工具, 比如對於線性的問題, 線性回歸這類非常一般的方法有時候都會得到不錯的解決。 如果不具備複雜的記憶, 則隱變數馬爾科夫過程HMM就可以很好的解決這個問題。 如果恰好所有的都被否定了, 則你要考慮祭出神經網路大法碰碰運氣。
那麼有沒有可能一切都試過了還是不能預測?
這裡複雜科學就會碰上用場, 因為你完全可能發現所有的預測方法都失控, 而真相就是問題本身包含不可預測性。
比如說股市,從剛才的三個指標看, 股市是一個典型的具有巨大隨機性, 複雜歷史依賴,與非線性的時間序列 ,任何用簡單因素預測股市的方法都是扯,即使一些最複雜的工具比如神經網路也很難取得特別好的突破。
這是為什麼?
因為股市這個系統其實處於物理里所說的某種臨界態上, 首先動力學高度混沌, 收到微小因素影響就會與原有預測分道揚鑣,第二它具有反身性, 即你的預測會反饋到未來里,使得最終結果更加撲朔迷離。 第三股票經常受到突發事件影響, 而如911這樣的大新聞從根本上說是不可預測的黑天鵝事件。
那麼是不是那些研究股市的人都是瞎的? 也不是,股市這個東西呢,你要是想賺的多, 只需要把預測的正確率提高1個百分點, 而不是要準確預測, 1個百分點對於大的機構來說, 就可能是無窮大的收入增長。 而複雜的模型,還是有可能把正確率提升1個百分點以上的 ,否則quant幹什麼吃呢?
不過,有些初看覺得特別有規律的東西,也不是完全可預測的。
本文節選自預測類問題與時間序列 - 混沌巡洋艦 - 知乎專欄
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。作為一個搞system identification的人來回答一下. 我覺得可以根據系統的性質簡單分成兩種情況:
(1) 物理系統, 或者你知道系統有特定的結構. 比如你要用time series model去fit一個物理系統. 如果你能從first principle推導出系統的動力學方程, 那就直接做參數推斷. 一般來說, 加入這些knowledge是精度最高的. 不過需要花時間去推導dynamic equation
(2) 複雜系統, 難以獲得精確模型(金融市場, 化工管道....). 這個時候, 我們只能依賴data driven model去capture system的dynamics. 這裡又能分成線性模型和非線性模型:
(a) ARMA, ARIMA, ARMAX這些模型能較好得捕捉線性系統的dynamics, 是有很好的理論依據的. 就算是非線性系統, 也可以分段fit這些線性模型(相當於在特定時間對系統做線性化). 通常也能獲得比較好的結果. 這類模型應該是現實裡面用得最多的.
(b) 至於非線性模型, 大家想到的應該就是RNN, 是表達能力很強的一個模型. 但是RNN的training比較困難, 同時RNN的參數選擇(layer, activation function, hidden neuron, learning rate)都難以優化. 也有的人在線性模型上加上一些非線性項(polynomial....)來提高線性模型在非線性區間的表現
單純說高精度很難確定怎麼選擇模型, 不過我應該會按first principle model -&> 線性模型 -&>非線性模型這個順序去嘗試. 只要模型達到我的預測/控制要求, 就不會再加複雜度
最後, 關於machine learning在time series model上的應用, 我目前看到有兩個做法感覺還算合理: 一個是做ensemble learning, 把不同的模型ensemble起來降低variance. 我的朋友嘗試過, 說能有提高. 第二是金融那邊, 對參數加入Prior, 然後用MCMC來推斷模型參數. 這種方法可以結合你對系統的理解. 至於更fancy的模型,比如manifold learning啥的, 還沒搞懂, 也不好評論......高級指數平滑方法可以研究一下,ets模型等等,這方面只有英文材料,你得去google搜一下。
從純時間序列的角度上來說的話,GARCH模型不錯。金融時間序列方差是變化的(違背了同方差的假設)。GARCH模型允許方差隨時間變化,效果一般比ARMA ARIMA AR之類的好。比較好用的模型是EGARCH。然後就時間序列來說,這些比較算中等的吧。
比如你要考慮不同市場不同股票之間的聯繫(存在covariance),那你可以用multivariate GARCH類的模型,這類模型是矩陣回歸,並且允許存在協方差。
有興趣的話去買本漢密爾頓的時間序列看吧,中文版100來塊。Recurrent Neural Network (迴流神經網路,有的譯做遞歸神經網路,應該是誤譯,因為recurrent不是recursive,而且網路結構也確實不是遞歸而是迴流的)
RNN可以通過t個歷史記錄預測t+1,最簡單的RNN叫做Elman Network。Elman Network的預測能力不強但是有利於搞清楚RNN基本結構。
現實中的RNN因為層次較深,比較難優化,單純的BPTT(back-propagation through time)容易出現問題。最近二階優化方法在這方面有很大的改進。
參看:Recurrent neural network
做統計的愛用nn或者svm 從個人喜好上來說 我覺得所有的ts model都是dynamic state space model的一種 沒什麼比practicle filter來得更好的方法了
嘗試過基於回歸方法的非線性建模,類似於時間序列預測。模型輸入是歷史輸入、歷史輸出和當前輸入。
回歸方法就不說了有很多。
想說的就是當時看論文時,有個人給出的實際實驗結果,預測精度非常高,看起來很完美,我就納悶。
測試模型時,有兩種方法,基於樣本的單步預測,基於模擬的多步預測。
第一種方法,把採樣到的當前輸入、歷史輸入和歷史輸出作為模型輸入,預測下一時刻輸出。
第二種方法,只給初始狀態和每個時刻的輸入,而歷史輸出來自於模型自身在過去時刻的預測,這樣就形成了遞歸,可以進行多步預測。
這兩種方法用來測試模型區別很大。我懷疑那篇論文里用的就是第一種方法,就像高票答案里說的那樣,只要把上一時刻狀態基礎上微小變化一下,精度就能很高。
就實際用過的模型中:移動平均分解法,指數平滑法(HoltWinters),局部加權回歸法(LOESS),自回歸整合移動平均(ARIMA)
局部加權回歸效果挺好,參考鏈接:簡易時間序列分析的方法總結(R實現)哈哈,運動參照系。
預測模型有很多種,例如Keven Howe所提到的這些都是非常主流的方法。但是如果問到「什麼好的模型可以做高精度的時間序列預測」,那就得具體問題具體分析:短期或是長期預測?商品銷量或是光伏發電功率預測?等等。沒有最好的模型,只有最適合的模型。至於哪一種模型能針對特定預測問題達到最高的精度,需要通過實驗來證明。另外提高預測精度,除了要選用合適的模型外,還需要要準確充足的歷史數據,對影響因子的分析等。
(第一個回答,水平有限,疏漏和不當之處,懇請批評指正。)
Inductive Process Model
需要看應用在什麼樣的情景下。如果是deterministic的模型,可以參看Inductive Process Modelhttp://cll.stanford.edu/~langley/papers/process.mlj.pdf
提供一個新思路,我用LSTM學習正弦信號,預測效果非常好,不過對於波動較大的信號效果一般,以下是結果:
http://www.fuzihao.org/blog/2016/02/29/Predict-Time-Sequence-with-LSTM/
神經網路的效果比arima好,親測。
我也涉及一點點時序預測,在我知識所及範圍內說一下吧。如之前某位仁兄所說,如果知道系統的動力學模型的話(一般是一系列微分方程組,用泰勒展開離散化)就好辦了,只需要用觀測到的時序數據做模型參數估計就行。 這種情況下預測是最好的,可以做long-term prediction. 什麼KF, EKF, UKF, Particle filter隨便用。根據經驗,還是EKF最好用,particle filter最差,估計一個參數還行,估計兩個或三個參數就不好,參數收斂不到真值,而且如果迭代次數很多,會出現嚴重粒子貧化問題。
如果沒有動力學方程,就只能基於數據做data-driven的預測。之前看過一些neural network做時序預測的代碼以及論文,感覺他們說的prediction就是往前一步預測,或者很短時間段的short-term prediction。預測的時間段一長就完全崩潰 (也許我學識淺薄,感覺所謂data-driven prognosis都是忽悠,但是看上去都很高大上)。嘗試過Gaussian process regression(GPR)建時序模型,但是GPR模型在有數據的地方做內插值(interpolation) 還比較好,在沒有數據做的「未來」時刻(extrapolation)預測的方差很大,也只能short-term prediction, 比如下面這張圖,在觀測數據(藍色點)附近,預測平滑方差較小,但是在沒有觀測點的「未來時刻」(綠色點),估計方差就很大,而且離數據越遠,方差越大。就好比今天陰天,推測明天也陰天,但是十天後啥天氣呢?誰也說不準了。
其他的時序預測模型ARMA, ARIMA還不會,打算學習。
ARMA、ARIMA、神經網路預測、SVM預測、灰色預測、模糊預測、組合預測法等等。
不如題主仔細描述下什麼樣的時間序列數據?然後再邀請人來回答。
在這裡說下理由:
1. 時序數據不一定是有規律的,舉個常見例子是彩票號碼,所以題主描述是什麼樣的時序數據的時候就會首先理解到自己的數據是否有規律
2. 時序數據一般只是一個表象,也就是有很多隱含狀態,這種情況下所謂的預測背後的實質是擬合隱狀態變化,這些狀態可能很多,最好能有先驗知識拿到這些狀態的規律
3. 學術中可以扔很複雜的模型進去,但是目前沒發現過適應性非常好的,一般只能處理一小類問題,工程中不太建議用複雜模型
綜上,第一步人工經驗發現數據的規律比直接找模型靠譜
前一段時間看了一點點這些方面的書,
目前主要傳統的方法有ARIMA,以及一些EWMA什麼的。還有一些非主流方法亞洲的學者(大陸人台灣人)研究的比較多,比如fuzzy time series和grey system(華科的一個教授教鄧聚龍主要研究這個)精確度比傳統方法要高一點。另外,還有artificial neural network等AI方法,可以達到更高的精度。
推薦閱讀:
※機器學習中的Bias(偏差),Error(誤差),和Variance(方差)有什麼區別和聯繫?
※如何迅速成長成為一名數據分析師?
※如何在業餘時學數據分析?
※用於數據挖掘的分類演算法有哪些,各有何優劣?