測:線性回歸與MLP的實證對比)
簡介在金融時間序列預(yù)測中多元線性回歸與多層感知機MLP是兩類代表性的建模方法。線性回歸以可解釋性和高效性見長而MLP通過非線性激活函數(shù)具備逼近復(fù)雜映射的能力。在量化交易與風(fēng)險管理場景下如何選擇更合適的模型取決于數(shù)據(jù)中信號的本質(zhì)。黃金期貨價格受宏觀因子驅(qū)動但日頻收益率信噪比極低其可預(yù)測模式可能以線性關(guān)系為主。本文以上海期貨交易所滬金主力合約為樣本系統(tǒng)梳理數(shù)據(jù)清洗、平穩(wěn)性檢驗、格蘭杰因果檢驗等流程并設(shè)計公平的滾動回測評估。實證結(jié)果顯示兩個模型預(yù)測精度幾乎持平線性回歸在計算成本和解釋性上更優(yōu)。該結(jié)論為金融時序建模中模型選型提供了參考也揭示了復(fù)雜模型并非必然優(yōu)于簡單基線這一核心觀點。 做黃金期貨價格預(yù)測研究時多元線性回歸和多層感知機MLP這兩個模型經(jīng)常被拿來放在天平兩端。這次項目我?guī)е暗降渍l更適合預(yù)測滬金價格”這個疑問把一整條量化研究流程跑了一遍數(shù)據(jù)清洗、平穩(wěn)性檢驗、格蘭杰因果檢驗、兩套模型訓(xùn)練、滾動回測驗證。結(jié)論不是簡單的誰贏誰輸而是這兩個模型在黃金期貨這個高噪音、弱信號的市場里各自的邊界在哪里。這篇文章我不想只堆結(jié)論我會把整個實驗設(shè)計的邏輯、為什么選這些方法、每一步踩過的坑、以及最終如何公平比較預(yù)測準(zhǔn)確性都攤開來講。適合正在做金融時間序列預(yù)測相關(guān)課題的研究生、剛?cè)腴T量化交易的開發(fā)人員以及所有想搞清楚“線性模型和神經(jīng)網(wǎng)絡(luò)在金融預(yù)測中到底誰更靠譜”的讀者。1. 為什么拿線性回歸和MLP硬碰硬——黃金期貨預(yù)測的建模動機與數(shù)據(jù)底座1.1 黃金期貨的可預(yù)測性從哪里來先說一個很多初學(xué)者容易搞混的事情黃金期貨價格預(yù)測和股票價格預(yù)測看起來都是價格序列但背后的驅(qū)動邏輯差別非常大。黃金是一個具有“避險抗通脹美元計價”三重屬性的品種它的價格變動受到美元指數(shù)、美債實際利率、地緣風(fēng)險事件、全球央行購金行為等多重因素影響。這意味著它不像某些小盤股那樣容易受到資金操縱也不像加密貨幣那樣完全脫離基本面。理論上它的價格波動中有一部分是可以通過宏觀因子解釋的這正是建模的空間所在。但話說回來這個“可解釋的部分”有多大我在這項研究里做了大量特征工程后發(fā)現(xiàn)即使把所有能想到的宏觀變量都放進(jìn)去模型能解釋的日頻收益率方差也相當(dāng)有限。這個現(xiàn)象背后是黃金市場已經(jīng)是一個高度有效的全球定價市場價格在被發(fā)現(xiàn)的那一刻就已經(jīng)反映了大部分公開信息。所以我們做預(yù)測本質(zhì)上是在捕捉“信息反映的滯后性”和“非理性情緒產(chǎn)生的慣性”而不是試圖發(fā)明一套能精準(zhǔn)預(yù)知明天的公式。1.2 為什么選擇這兩個模型做對比很多人在做類似研究時會一上來就上LSTM、Transformer覺得結(jié)構(gòu)越復(fù)雜越好。但我這次刻意選擇了“最樸素”的多元線性回歸和“最經(jīng)典”的多層感知機神經(jīng)網(wǎng)絡(luò)原因有三點。第一這兩個模型在理論上代表了兩類完全不同的學(xué)習(xí)范式。線性回歸假設(shè)因變量與自變量之間是線性疊加關(guān)系每個特征對目標(biāo)的影響是獨立的、可加性的而MLP通過隱藏層的非線性激活函數(shù)理論上可以逼近任意連續(xù)函數(shù)能夠捕捉特征之間的交互作用和非線性關(guān)系。把這兩個模型放在同一批數(shù)據(jù)上訓(xùn)練本質(zhì)上是在回答一個問題黃金期貨收益率的變化規(guī)律到底是被線性關(guān)系主導(dǎo)還是存在明顯的非線性結(jié)構(gòu)第二從工程角度看這兩個模型都足夠透明、穩(wěn)定、可復(fù)現(xiàn)。線性回歸有完整的統(tǒng)計推斷框架能給出每個特征的顯著性水平和置信區(qū)間MLP雖然是個“黑箱”但訓(xùn)練過程可以通過早停、正則化、多隨機種子等策略控制。對于一篇量化研究項目來說可解釋性和可復(fù)現(xiàn)性比單純的精度數(shù)字更重要。第三從對比實驗的公平性出發(fā)模型的復(fù)雜度差異要控制在“考察目標(biāo)”而不是“資源投入”上。如果我們拿線性回歸和一個調(diào)參充分的Transformer對比模型性能差距很難歸因于“線性vs非線性”而更像是“統(tǒng)計推理vs暴力擬合”的差異。所以這次實驗里的MLP沒有刻意堆參數(shù)量只使用了一個兩層隱藏層的結(jié)構(gòu)目的就是讓兩個模型站在盡量對等的條件下去比較。1.3 數(shù)據(jù)集構(gòu)成與來源本次研究的數(shù)據(jù)范圍是上海期貨交易所黃金期貨主力連續(xù)合約的日頻行情時間跨度從2010年1月到2023年12月一共約3200個交易日。原始數(shù)據(jù)包括收盤價、成交量、持倉量三個核心字段。同時我引入了四類外部宏微觀變量美元指數(shù)DXY日收益率——黃金以美元計價美元走勢是黃金價格最重要的反向指標(biāo)之一美國10年期通脹保值債券TIPS實際收益率——實際利率是黃金持有成本的關(guān)鍵變量布倫特原油期貨日收益率——原油價格反映全球通脹預(yù)期和大宗商品情緒滬金期貨持倉量變化率——反映國內(nèi)資金參與頻度和市場情緒這里有一個容易忽略的點國內(nèi)外市場的交易日歷并不完全一致。國內(nèi)黃金期貨有春節(jié)、國慶等長假美國市場也有自己的節(jié)假日如果用簡單的日期索引左連接經(jīng)常會出現(xiàn)錯位一天甚至好幾天的數(shù)據(jù)殘留代碼不報錯但實驗結(jié)果的可靠性會大打折扣。我的做法是先分別把各數(shù)據(jù)源按交易日重采樣再做“交易日歷對齊”確保每一條樣本中所有變量都對應(yīng)同一個真實交易時段。這塊處理細(xì)節(jié)會在下一節(jié)詳細(xì)展開。2. 數(shù)據(jù)清洗與特征工程時間序列建模最容易被低估的一環(huán)2.1 對齊、缺失值與異常值處理數(shù)據(jù)處理這步說難不難但一旦出問題后期所有建模工作都會建立在流沙上。我在第一次跑通流程時就遇到過一個大坑當(dāng)時直接用了Pandas的merge函數(shù)把滬金期貨和美元指數(shù)按日期左連接后來發(fā)現(xiàn)美元指數(shù)的數(shù)據(jù)源有部分日期缺失結(jié)果導(dǎo)致某幾天的特征里混入了前一天的值。這種錯位在日頻收益率這種量級的數(shù)據(jù)上不容易被肉眼察覺但模型效果會默默變差。正確的做法是先把所有數(shù)據(jù)源統(tǒng)一到同一個交易日歷上。我是這樣操作的定義“核心交易日列表”以滬金期貨的交易日為準(zhǔn)對每個外部變量先按各自交易日排序然后使用reindex到核心日歷缺失值向前填充對極端跳空缺口比如向前填充后仍無法填補的日期直接刪除不做插值檢查收益率序列的異常值把單日波動超過5個標(biāo)準(zhǔn)差的樣本單獨標(biāo)記出來確認(rèn)是否存在行情事故。另外在特征構(gòu)造上我不僅使用了原始的宏觀變量當(dāng)日值還加入了它們的滯后項lag 1、lag 2、lag 3。為什么加滯后項因為金融市場對信息的反應(yīng)往往不是瞬間完成的。美元指數(shù)當(dāng)天的變動可能不會立刻完全反映到滬金期貨價格里可能會延遲半天到一天。這些滯后項相當(dāng)于給了模型一個“消化信息的時間窗口”。2.2 為什么不能用原始價格做回歸如果你直接把黃金期貨的收盤價當(dāng)作因變量把美元指數(shù)、原油價格等當(dāng)作自變量跑一個多元線性回歸你大概率會得到一個非常“漂亮”的結(jié)果R2高達(dá)0.9以上各項系數(shù)都極其顯著。但這個結(jié)果是完全虛假的。問題出在“偽回歸”上價格序列通常是非平穩(wěn)的帶單位根兩個不相關(guān)的非平穩(wěn)序列放在一起回歸很容易被趨勢帶出虛假的顯著性關(guān)系。這就像北京和紐約的日均氣溫序列長期來看都在上升或波動但你并不能說北京氣溫是紐約氣溫的格蘭杰原因。它們之間看似相關(guān)其實只是兩個帶趨勢的序列在“各自走路”。所以在實驗中我把所有價格類的變量全部轉(zhuǎn)換成了收益率對數(shù)一階差分流量類的變量如持倉量做了變化率處理存量類的變量如實際利率則使用了一階差分。這是時間序列建模的標(biāo)準(zhǔn)預(yù)處理也是后面所有統(tǒng)計檢驗的基礎(chǔ)。2.3 特征標(biāo)準(zhǔn)化與數(shù)據(jù)泄漏防范線性回歸對特征的尺度其實不太敏感因為它自己會學(xué)習(xí)系數(shù)來適配。但神經(jīng)網(wǎng)絡(luò)完全不一樣特別是使用ReLU激活函數(shù)和Adam優(yōu)化器時如果輸入特征的量綱差異太大比如持倉量是幾十萬手收益率是0.001訓(xùn)練過程會非常不穩(wěn)定甚至出現(xiàn)梯度爆炸。我的做法是在MLP訓(xùn)練前對全部特征做Z-score標(biāo)準(zhǔn)化。但這里有一個很多初學(xué)者都會犯的錯誤標(biāo)準(zhǔn)化要在訓(xùn)練集上計算均值和標(biāo)準(zhǔn)差再用這組參數(shù)去變換驗證集和測試集而不能在整個數(shù)據(jù)集上統(tǒng)一標(biāo)準(zhǔn)化。為什么因為測試集的分布信息一旦混入訓(xùn)練過程模型就相當(dāng)于“偷看”了未來的數(shù)據(jù)分布這叫數(shù)據(jù)泄漏data leakage。在時間序列場景下數(shù)據(jù)泄漏會更加隱形因為你使用的所有統(tǒng)計量都可能攜帶未來信息。這次實驗中我把標(biāo)準(zhǔn)化器StandardScaler只fit在訓(xùn)練集上然后在驗證集和測試集上只做transform。同樣要提防的是時間序列的交叉驗證和普通交叉驗證不一樣。普通K折隨機打亂數(shù)據(jù)是線狀回歸的標(biāo)準(zhǔn)做法但時間序列如果隨機打亂訓(xùn)練集里會出現(xiàn)未來數(shù)據(jù)驗證集里會出現(xiàn)過去數(shù)據(jù)模型就是在拿未來預(yù)測過去結(jié)果會虛高得離譜。這個問題我會在后面評估章節(jié)詳細(xì)展開。3. 平穩(wěn)性檢驗與格蘭杰因果檢驗統(tǒng)計流程如何決定模型上限3.1 平穩(wěn)性檢驗——線性模型的“合法地基”在做任何時間序列回歸之前必須驗證序列的平穩(wěn)性。平穩(wěn)性簡單說就是序列的均值、方差在時間上保持穩(wěn)定未來的波動規(guī)律和過去一致。如果序列帶趨勢或者方差隨時間變化回歸結(jié)果就缺少統(tǒng)計推斷的有效性基礎(chǔ)。我使用的是ADF檢驗Augmented Dickey-Fuller Test原假設(shè)是“序列存在單位根即非平穩(wěn)”。檢驗結(jié)果如下表變量ADF統(tǒng)計量P值結(jié)論滬金期貨收盤價-1.870.35非平穩(wěn)滬金期貨日收益率-31.020.000平穩(wěn)美元指數(shù)日收益率-28.440.000平穩(wěn)布倫特原油日收益率-30.100.000平穩(wěn)10年期TIPS實際收益率-2.310.17非平穩(wěn)TIPS實際收益率一階差分-26.900.000平穩(wěn)這個表說明了為什么不能直接拿價格建模價格序列的ADF統(tǒng)計量只有-1.87遠(yuǎn)不能拒絕單位根假設(shè)而非平穩(wěn)序列之間的回歸會產(chǎn)生偽回歸。而TIPS實際收益率作為存量變量也是非平穩(wěn)的所以我對它做了一階差分。最終模型所用變量全部在1%顯著性水平下平穩(wěn)。這里有一個小建議ADF檢驗的滯后階數(shù)不要隨便填。statsmodels里的adfuller函數(shù)有一個autolag參數(shù)我設(shè)置為AIC讓程序根據(jù)信息準(zhǔn)則自動選擇最優(yōu)滯后階數(shù)這樣更客觀。3.2 格蘭杰因果檢驗——變量的預(yù)測力有多少平穩(wěn)性檢驗通過之后下一步是回答一個問題外部變量美元指數(shù)、原油、實際利率等對滬金期貨收益率到底有沒有預(yù)測能力格蘭杰因果檢驗Granger Causality Test是這個問題最常用的統(tǒng)計工具。它的核心思想是如果加入X的歷史值后對Y的預(yù)測效果顯著優(yōu)于僅用Y自身歷史值做預(yù)測那么稱X是Y的格蘭杰原因。注意格蘭杰因果檢驗并不等同于真正的因果性。它只是說“X的過去信息對Y的未來走勢有一定的增量預(yù)測力”。這有點像天氣預(yù)報里的“云層厚度”和“降雨”的關(guān)系云層厚不一定導(dǎo)致降雨但云層厚度信息確實能提升降雨預(yù)測的準(zhǔn)確率這就足夠作為建模時選入特征的理由了。本次實驗中我用美元指數(shù)日收益率、原油日收益率、TIPS實際收益率差分分別對滬金期貨日收益率做格蘭杰因果檢驗滯后期從1到5分別嘗試最終根據(jù)AIC選擇最優(yōu)滯后階數(shù)。結(jié)果如下美元指數(shù)日收益率在滯后1期時對滬金收益率的格蘭杰因果檢驗P值為0.013在5%水平下顯著說明美元指數(shù)當(dāng)天的變動確實會“帶動”次日黃金價格的走勢布倫特原油日收益率在滯后1期和2期下P值在0.05附近波動邊際顯著說明大宗商品情緒有一定溢出效應(yīng)TIPS實際收益率差分在多數(shù)滯后期下不顯著和理論預(yù)期有出入我猜測是因為實際利率是慢變量對黃金的影響更多體現(xiàn)在月頻低頻維度而非日頻。這里我要提醒一句格蘭杰因果檢驗的結(jié)果會受到滯后階數(shù)選擇的影響。同一個變量滯后1期時顯著滯后3期時可能就不顯著了。所以研究者不能只看一個滯后階數(shù)的結(jié)果就下結(jié)論最好做一個敏感性分析把滯后1到5期的結(jié)果都列出來看看顯著性是否一致。這既是對自己結(jié)論負(fù)責(zé)也是給審稿人看的嚴(yán)謹(jǐn)性。3.3 相關(guān)系數(shù)分析與多重共線性排查在把變量放入線性回歸之前我還檢查了各特征之間的相關(guān)系數(shù)矩陣。為什么因為如果兩個變量高度相關(guān)比如美元指數(shù)和原油在某些時段負(fù)相關(guān)放進(jìn)同一個線性回歸里會導(dǎo)致多重共線性單個系數(shù)的標(biāo)準(zhǔn)誤會變大顯著性結(jié)果不穩(wěn)定。我用的判斷標(biāo)準(zhǔn)是方差膨脹因子VIFVariance Inflation Factor。一般來說VIF超過5就應(yīng)該引起注意超過10就需要考慮去除變量或做降維。本次實驗里所有特征的VIF都小于3這讓我對后續(xù)線性回歸的系數(shù)解釋比較有信心。順帶一提VIF是對線性回歸而言的MLP并沒有這個假設(shè)約束。所以同一個特征集放進(jìn)MLP時多重共線性不會影響訓(xùn)練過程但會影響特征重要性的解讀。也就是說神經(jīng)網(wǎng)絡(luò)可以從高相關(guān)變量中提取共同信號但很難告訴我們“到底是哪個變量起作用”。4. 多元線性回歸實現(xiàn)用可解釋性換精度的基線模型4.1 模型設(shè)定與公式多元線性回歸是我這場對比實驗的“地基模型”。說它“地”不是說它低端而是因為它具備了兩個核心優(yōu)勢一是計算開銷極小幾乎瞬間出結(jié)果二是每個特征都有明確的系數(shù)、標(biāo)準(zhǔn)誤和置信區(qū)間解釋性強。我的模型設(shè)定如下au_ret_t β0 β1*usd_ret_t-1 β2*brent_ret_t-1 β3*d_tips_t-1 β4*oi_change_t-1 β5*au_ret_t-1 ε_t其中au_ret_t滬金期貨第t日的收益率目標(biāo)變量usd_ret_t-1美元指數(shù)第t-1日的收益率brent_ret_t-1布倫特原油第t-1日的收益率d_tips_t-1TIPS實際收益率在第t-1日的一階差分oi_change_t-1滬金持倉量在第t-1日的變化率au_ret_t-1滬金期貨收益率滯后一階用于捕獲價格慣性之所以全部使用滯后特征是為了保證模型在預(yù)測時只使用第t日之前的數(shù)據(jù)不會觸犯時間穿越的禁忌。這在實際量化策略中也是鐵律你預(yù)測未來的依據(jù)只能是過去的已知信息。4.2 statsmodels實現(xiàn)與結(jié)果解讀用Python實現(xiàn)這個模型非常直接import statsmodels.api as sm import pandas as pd feature_cols [usd_ret_lag1, brent_ret_lag1, d_tips_lag1, oi_change_lag1, au_ret_lag1] X data[feature_cols].copy() y data[au_ret] # 添加常數(shù)項 X sm.add_constant(X) model sm.OLS(y, X).fit() print(model.summary())運行之后幾個關(guān)鍵輸出項需要重點關(guān)注R2本次實驗中全樣本擬合的R2在0.03到0.06之間波動。這個數(shù)字乍看很低但在金融時間序列預(yù)測里非常正常。日頻收益率的可預(yù)測部分本來就極弱大多數(shù)時候市場已經(jīng)把信息消化完了。F統(tǒng)計量雖然R2低但F統(tǒng)計量的P值小于0.001說明整個模型的解釋力在統(tǒng)計上是顯著的而不是純噪音。系數(shù)符號美元指數(shù)收益率的系數(shù)為負(fù)符合邏輯——美元走強黃金價格承壓持倉量變化率系數(shù)為正說明資金流入對黃金價格有正向推動。AIC/BIC這兩個信息準(zhǔn)則用于模型比較值越小說明擬合越好且不大可能過擬合。這里我要特別提醒statsmodels的OLS輸出里有一個Durbin-Watson統(tǒng)計量。它衡量的是殘差的自相關(guān)程度理想值接近2。如果DW值遠(yuǎn)小于2比如1.2說明殘差存在正自相關(guān)這意味著標(biāo)準(zhǔn)誤被低估系數(shù)的顯著性可能被高估。我在第一次擬合時DW值大約是1.89處于合理區(qū)間于是放心繼續(xù)。4.3 線性回歸的局限與改進(jìn)嘗試盡管線性回歸給出了“顯著的F檢驗”和“符合邏輯的系數(shù)符號”但它的預(yù)測能力在測試集上依然有限。這讓我不得不追問是特征不夠還是線性假設(shè)本身鎖死了上限為了回答這個問題我用兩種方式做了驗證。第一種是在線性模型中加入更多非線性特征比如美元指數(shù)的平方項、美元指數(shù)與原油的交互項發(fā)現(xiàn)R2幾乎不變第二種是把目標(biāo)變量換成周頻收益率R2上升到0.1左右說明低頻預(yù)測的確定性更強。這給我的啟示是黃金日頻收益率的“信號”本來就非常微弱線性模型能夠捕捉到的就是這么多的線性傳導(dǎo)關(guān)系。如果MLP在測試集上的表現(xiàn)比線性回歸好那么改善部分大概率來自非線性關(guān)系如果MLP也沒有顯著提升那就可以判斷這個市場環(huán)境中非線性結(jié)構(gòu)并不占主導(dǎo)。5. 多層感知機實現(xiàn)神經(jīng)網(wǎng)絡(luò)在金融時序上的優(yōu)與坑5.1 為什么用MLP而不用LSTM或Transformer在部署模型之前你可以會問既然都上神經(jīng)網(wǎng)絡(luò)了為什么不直接用LSTM這類項目如果發(fā)論文多半會用LSTM一類更“高級”的模型。我的回應(yīng)是要看你做這項研究的目的是什么。如果目的是“刷一個最高的預(yù)測準(zhǔn)確率”那確實可以嘗試LSTM、GRU、甚至CNN-LSTM混合結(jié)構(gòu)但如果目的是回答“線性模型是否已經(jīng)足夠”這個研究問題MLP這種純粹的非線性映射器是最合適的對照。MLP不依賴數(shù)據(jù)的時序結(jié)構(gòu)先驗。它把每條樣本當(dāng)作獨立輸入用全連接層去學(xué)習(xí)特征之間的非線性組合。如果MLP和線性回歸表現(xiàn)相近說明“非線性組合”這一能力對黃金期貨預(yù)測并無顯著增益如果MLP明顯更好說明特征間確實存在線性回歸無法表達(dá)的模式。這個歸因在LSTM上就很難做因為LSTM的性能提升可能來自時序建模能力而不是非線性表達(dá)能力。5.2 網(wǎng)絡(luò)結(jié)構(gòu)與輸入特征設(shè)計MLP的輸入特征和線性回歸保持完全一致仍然是滯后一期的美元指數(shù)收益率、原油收益率、TIPS差分、持倉量變化率和黃金自身滯后收益率。為了讓MLP的輸入更豐富一些我額外把滯后2期和3期的特征也加入了輸入矩陣形成94維特征向量5個原始特征共3個滯后階共15維同時我加入了一些窗口類特征滾動均值和滾動波動率。網(wǎng)絡(luò)結(jié)構(gòu)設(shè)為一個兩層隱藏層MLP輸入層15維滯后窗口特征隱藏層164個神經(jīng)元ReLU激活加Dropout(0.1)隱藏層232個神經(jīng)元ReLU激活輸出層1個神經(jīng)元無激活函數(shù)線性回歸頭代碼實現(xiàn)如下import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.callbacks import EarlyStopping tf.random.set_seed(42) model Sequential() model.add(Dense(64, activationrelu, input_dimX_train_std.shape[1])) model.add(Dropout(0.1)) model.add(Dense(32, activationrelu)) model.add(Dense(1, activationlinear)) model.compile(optimizeradam, lossmse, metrics[mae]) early_stop EarlyStopping( monitorval_loss, patience20, restore_best_weightsTrue ) history model.fit( X_train_std, y_train, epochs100, batch_size32, validation_split0.1, callbacks[early_stop], verbose0 )為什么選擇64-32這樣的結(jié)構(gòu)而不是更大的網(wǎng)絡(luò)因為在數(shù)據(jù)量只有幾千條的情況下過大的網(wǎng)絡(luò)會迅速進(jìn)入過擬合狀態(tài)。金融數(shù)據(jù)的信噪比極低噪聲會先于信號被網(wǎng)絡(luò)記住。64-32對于15維輸入來說已經(jīng)足夠表達(dá)多數(shù)非線性函數(shù)繼續(xù)加寬加深度只會讓驗證損失回升得更早。5.3 訓(xùn)練過程中最關(guān)鍵的三個陷阱陷阱一特征標(biāo)準(zhǔn)化必須以訓(xùn)練集為準(zhǔn)。我在第2章已經(jīng)提過但這里再強調(diào)一次因為它的影響在神經(jīng)網(wǎng)絡(luò)中比線性回歸大得多。我用訓(xùn)練集統(tǒng)計量標(biāo)準(zhǔn)化訓(xùn)練集、驗證集、測試集代碼里體現(xiàn)為from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_std scaler.fit_transform(X_train) X_val_std scaler.transform(X_val) X_test_std scaler.transform(X_test)陷阱二隨機種子不固定結(jié)果不可復(fù)現(xiàn)。神經(jīng)網(wǎng)絡(luò)初始化權(quán)重是隨機的每次運行結(jié)果都會有些許差異。在金融數(shù)據(jù)這種信號極弱的場景下兩次運行的測試集MAE可能在0.0085到0.0092之間飄動。所以我在項目里固定了三個層面的隨機種子Python的random.seed、NumPy的np.random.seed、TensorFlow的tf.random.set_seed。我還把同一次實驗重復(fù)跑了5次不同隨機種子最后取平均值作為模型的最終表現(xiàn)這樣能有效排除“某一次運氣好”的偶然性。陷阱三早停時機的選擇。我設(shè)置了patience20意思是驗證損失連續(xù)20個epoch沒有提升就停止。金融數(shù)據(jù)很容易出現(xiàn)“驗證損失先降后升”的過程早停太早模型欠擬合早停太晚模型過擬合。我在實驗中還加了一條額外規(guī)則restore_best_weightsTrue確保返回的是驗證損失最低那一輪的模型權(quán)重而不是最后一輪的權(quán)重。5.4 訓(xùn)練結(jié)果MLP到底贏了沒有從訓(xùn)練曲線看訓(xùn)練損失在前10輪快速下降驗證損失在20輪左右達(dá)到最低點之后開始振蕩上升。這是典型的過擬合信號早停機制在第43輪左右觸發(fā)。測試集上的表現(xiàn)呢這里有幾個數(shù)字指標(biāo)多元線性回歸MLP5次隨機種子均值MAE0.00860.0087RMSE0.01210.0123測試集R20.0340.028方向準(zhǔn)確率53.1%52.6%這個結(jié)果讓我有些意外但也在意料之中。MLP的表現(xiàn)不僅沒有優(yōu)于線性回歸反而在MAE和方向準(zhǔn)確率上略遜一籌。從統(tǒng)計角度說這個差距非常小幾乎可以看作是兩個模型打平。進(jìn)一步看兩模型在特征重要性上的行為有本質(zhì)差異線性回歸明確指出美元指數(shù)和原油是主要驅(qū)動因子而MLP則把權(quán)重分散到了大量節(jié)點上很難提取出單一主導(dǎo)特征。這引出了一個更深層的結(jié)論在日頻黃金期貨收益率這個預(yù)測任務(wù)上線性關(guān)系已經(jīng)捕獲了絕大部分可學(xué)習(xí)信號剩下的是無法被現(xiàn)有特征集解釋的純粹市場噪音。神經(jīng)網(wǎng)絡(luò)沒有“魔法”它只能從數(shù)據(jù)中學(xué)到確實存在的模式。如果數(shù)據(jù)本身沒有強烈的非線性結(jié)構(gòu)MLP的復(fù)雜結(jié)構(gòu)反而容易在噪聲中浪費時間。6. 評估體系設(shè)計預(yù)測對比中的公平性與魯棒性6.1 為什么不能只用R2判斷模型好壞很多同學(xué)做模型對比時習(xí)慣只盯著R2看。R2高就好R2低就不好。在金融時間序列里這是一件很危險的事。因為R2衡量的是“模型解釋的方差占總方差的比例”而日頻收益率的方差絕大多數(shù)來自不可預(yù)測的隨機沖擊。即使你的模型完美捕捉到了所有可預(yù)測部分R2可能也只有0.05。這時候你更需要用一組有多維度的指標(biāo)來評估模型。我在本次實驗中同時記錄了四類指標(biāo)MAE平均絕對誤差直觀衡量預(yù)測值與真實值的平均偏離程度單位與收益率一致RMSE均方根誤差對大誤差更敏感如果RMSE明顯大于MAE說明誤差分布有長尾模型在大行情階段容易失準(zhǔn)方向準(zhǔn)確率DA預(yù)測收益率方向與實際方向一致的比例。這個指標(biāo)對交易策略尤其重要因為很多策略本質(zhì)上是做方向判斷的勝率與盈虧比結(jié)合的日度策略模擬雖然不屬于標(biāo)準(zhǔn)回歸評估指標(biāo)但在量化應(yīng)用場景下用預(yù)測信號生成一個簡單的“做多做空”策略計算累計收益曲線能直觀看出模型是否有實際價值。6.2 時間序列交叉驗證的最佳實踐除非你想得到一份“看起來特別厲害但根本不可靠”的結(jié)果否則千萬不要在時間序列上用train_test_split(random_state42)這樣隨機打亂的劃分方式。時間序列數(shù)據(jù)的核心特征是有序性未來信息不能參與過去的決策。我使用的是“滾動窗口擴展驗證法”Expanding Window Validation具體流程如下將數(shù)據(jù)集按時間升序排列設(shè)定初始訓(xùn)練窗口長度為1000個交易日每次擴展訓(xùn)練窗口100個交易日滾動預(yù)測未來5個交易日保存每一天的預(yù)測值最后統(tǒng)一計算全部預(yù)測期的指標(biāo)。這種設(shè)計下模型永遠(yuǎn)不會看到它需要預(yù)測的那個時點的任何信息。實際回測區(qū)間覆蓋了2018年至2023年包含了幾輪美聯(lián)儲加息周期、2020年全球流動性恐慌、2022年俄烏沖突、2023年銀行業(yè)危機等不同市場環(huán)境。時間序列交叉驗證的好處就是如果模型在多種市場狀態(tài)下都能維持相對穩(wěn)定的預(yù)測誤差那么結(jié)論的魯棒性會高很多。6.3 模型對比的公平性超參數(shù)與計算資源為了讓MLP和線性回歸的對比盡量公平我在MLP中只使用了最基礎(chǔ)的調(diào)參手段隱藏層數(shù)量和單元數(shù)固定優(yōu)化器用Adam學(xué)習(xí)率使用默認(rèn)值0.001。很多人會問為什么不給MLP也做一下GridSearch網(wǎng)格搜索超參數(shù)這樣MLP的結(jié)果可能更強也更公平。我的回答是在量化研究里“公平”和“合理”是兩回事。我們不是在比拼“誰調(diào)參調(diào)得更猛”而是對比“同等工作量下誰的自然表現(xiàn)更好”。線性回歸沒有超參數(shù)網(wǎng)格搜索對線性模型只影響特征選擇不影響模型結(jié)構(gòu)如果給MLP一整套網(wǎng)格搜索等于人為給MLP增加投入這種對比偏離了模型本身能力的比較。更實際的原因還有一點在真實交易系統(tǒng)中同樣一份特征數(shù)據(jù)和每日更新機制線性回歸從訓(xùn)練到預(yù)測只需要毫秒級而MLP需要更多的時間和算力。如果兩者預(yù)測精度沒有顯著差異那么在實盤場景下我會無條件選擇線性回歸——因為省時間、省算力、好解釋、易監(jiān)管。這個思路對從業(yè)者來說非常有參考價值。6.4 結(jié)果解讀方向正確比絕對精度重要綜合各輪滾動驗證的預(yù)測結(jié)果我發(fā)現(xiàn)一個被很多人忽略的現(xiàn)象預(yù)測絕對誤差和方向準(zhǔn)確率之間并沒有強相關(guān)。某些時段比如2020年3月全球流動性危機模型誤差極大但方向判斷反而是對的另一些時段比如長期橫盤震蕩期誤差不大方向準(zhǔn)確率卻徘徊在50%附近跟拋硬幣沒有區(qū)別。這說明黃金期貨市場的“可預(yù)測信號”是存在但稀薄的。對交易而言一個60%方向準(zhǔn)確率但平均收益幅度很小的信號可能不如一個50%方向準(zhǔn)確率但在大行情中能有效捕捉方向轉(zhuǎn)變的信號更有價值。這也是為什么評估模型時我強烈建議大家引入策略模擬環(huán)節(jié)用信號構(gòu)建一個最簡單的等權(quán)重多空策略看看累計收益曲線和夏普比率這樣才能真正判斷模型預(yù)測結(jié)果是否“有用”。7. 實操踩坑記錄與延伸思考7.1 數(shù)據(jù)對齊錯位最隱蔽的“時間穿越”我在第2章提到了交易日歷對齊的問題這里展開講一個具體踩坑過程。最開始我用的是公共數(shù)據(jù)源直接下載的CSV文件美元指數(shù)和滬金期貨的數(shù)據(jù)日期看起來都一樣于是直接按日期merge。后來在檢查特征相關(guān)性時發(fā)現(xiàn)美元指數(shù)當(dāng)日收益率與滬金期貨當(dāng)日收益率的相關(guān)系數(shù)異常地低幾乎為0而理論上兩者當(dāng)日走勢應(yīng)該高度負(fù)相關(guān)。這讓我起了疑心。追查后發(fā)現(xiàn)美元指數(shù)的數(shù)據(jù)源有一個“時區(qū)標(biāo)簽”問題它記錄的日期是美東日期而滬金期貨記錄的是北京時間。當(dāng)北京時間上午9點開盤時美東時間是前一天晚上20點——美元指數(shù)當(dāng)天的大部分交易時段美東時間白天還沒有發(fā)生。這就導(dǎo)致如果直接用日歷日對齊模型會在北京時間當(dāng)天上午用到美東時間當(dāng)天晚上的數(shù)據(jù)產(chǎn)生嚴(yán)重的前視偏差。解決方法是用美東日期作為美元指數(shù)的“信息到達(dá)日”然后手動偏移一天再對齊滬金期貨。也就是說美元指數(shù)T日的數(shù)據(jù)在T1日的滬金期貨預(yù)測中才能使用。這個調(diào)整對模型預(yù)測結(jié)果產(chǎn)生了顯著影響——調(diào)整后美元指數(shù)變量的滯后一期系數(shù)從微弱的負(fù)值變成了更強的負(fù)值模型效果反而更真實了。7.2 偽回歸的誘惑R2高不代表模型好另一個讓人印象深刻的坑是我在一次探索性實驗中嘗試用原始價格做回歸時R2居然達(dá)到了0.96。當(dāng)時第一反應(yīng)是“發(fā)現(xiàn)了一個超強模型”但冷靜下來用ADF去檢驗殘差發(fā)現(xiàn)殘差本身就是非平穩(wěn)的。這意味著什么意味著回歸結(jié)果完全不可靠R2只不過是在描述兩個帶趨勢序列的“虛假同步運動”。這種情況下就算模型的預(yù)測曲線和真實價格曲線畫在一起非常貼近也毫無意義。因為它的“預(yù)測”本質(zhì)上是用未來的趨勢信息拼湊出來的。后來我把實驗全部改為收益率預(yù)測R2驟降到0.03左右這才是真實世界的映射。這個教訓(xùn)讓我在以后看到任何金融模型“高R2”的報告時第一件事就是檢查它預(yù)測的是原始價格還是收益率。7.3 隨機因素對結(jié)果的影響MLP跑三遍三個答案我在實驗穩(wěn)定性測試中發(fā)現(xiàn)同一個MLP結(jié)構(gòu)、同一份數(shù)據(jù)只改變隨機種子測試集MAE的最大值與最小值之間相差約8%。8%這個波動幅度已經(jīng)超過了線性回歸與MLP之間的性能差距如果不做多隨機種子平均就會得出一個完全相反的結(jié)論你可能會因為某一次運氣好的隨機種子宣稱MLP優(yōu)于線性回歸換了另一個隨機種子結(jié)論立刻反轉(zhuǎn)。所以我強烈建議所有涉及神經(jīng)網(wǎng)絡(luò)的金融實證研究至少要跑5個以上不同隨機種子報告均值和標(biāo)準(zhǔn)差。如果一個模型性能的波動幅度大于它與對比模型的實際差距那“差異”就是統(tǒng)計噪音而不是真實優(yōu)勢。7.4 對后續(xù)研究的延伸思考這次實驗以“線性回歸vs MLP”為核心在日頻收益率的預(yù)測難度下兩者基本打平。但如果你想把這項研究繼續(xù)往前推進(jìn)有幾個方向值得嘗試第一更換目標(biāo)變量。黃金價格的波動率比如已實現(xiàn)波動率比收益率更容易被模型捕捉。MLP在波動率預(yù)測上可能更容易發(fā)揮非線性優(yōu)勢因為波動率本身就具有集群性和非線性特征。第二增加特征維度。當(dāng)前特征集中沒有期貨期限結(jié)構(gòu)數(shù)據(jù)、沒有市場情緒指標(biāo)、沒有人民幣匯率因素。滬金期貨以人民幣計價美元兌人民幣匯率的變化會直接影響滬金價格的定價。加入這些維度可以提高模型捕捉真實驅(qū)動因子的能力。第三分市場狀態(tài)建模。本次實驗結(jié)果在2020年流動性危機期間出現(xiàn)了明顯的誤差尖峰說明單一靜態(tài)模型很難覆蓋所有市場狀態(tài)??梢試L試用馬爾可夫區(qū)制轉(zhuǎn)換模型或簡單的高波動/低波動過濾規(guī)則對樣本分層在每一層里分別訓(xùn)練和預(yù)測。第四用更強的基準(zhǔn)模型復(fù)盤。如果未來想做更復(fù)雜的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)對比我建議把LSTM、Transformer加進(jìn)來和MLP放一起但一定要控制變量同樣的數(shù)據(jù)清洗、同樣的滾動驗證方式、同樣的隨機種子管理。只有這樣才能準(zhǔn)確歸因不同結(jié)構(gòu)帶來的性能差異。回到本文最核心的問題——在中國黃金期貨價格預(yù)測這個場景下多元線性回歸和多層感知機哪一個更準(zhǔn)我的答案是它們在統(tǒng)計意義上幾乎打平線性回歸以微弱優(yōu)勢勝出且計算開銷和可解釋性遠(yuǎn)超MLP。這個結(jié)論不代表神經(jīng)網(wǎng)絡(luò)沒有價值而是說明在所有模型都使用相同特征的情況下黃金期貨日頻收益率中的非線性關(guān)系并沒有想象中那么強。如果讓我給后來者一句建議那就是任何模型對比實驗先不要假設(shè)復(fù)雜模型一定更好先保證數(shù)據(jù)干凈、檢驗規(guī)范、評估公平再去爭論模型高下。黃金市場的噪音足夠大模型能不能贏很多時候取決于你給它多少可以被學(xué)習(xí)的信號而不是它有多少參數(shù)。本文還有配套的精品資源點擊獲取