據(jù)預測全流程復盤)
做時序預測的人應該都見過這種場面把美股日線數(shù)據(jù)原樣丟給LSTM訓練集上的loss曲線漂亮得可以當教科書配圖準確率一度逼近90%可一換到測試集就原形畢露甚至趕不上“昨天漲了今天接著猜漲”的無腦策略。我一開始以為是模型結(jié)構(gòu)配錯了層數(shù)、hidden size、dropout輪著調(diào)了小一個月后來才意識到問題大頭根本不在神經(jīng)網(wǎng)絡(luò)而在數(shù)據(jù)準備和特征構(gòu)造上。這篇文章是我基于雅虎財經(jīng)數(shù)據(jù)接口做美股歷史數(shù)據(jù)預測的全流程復盤核心就圍繞兩個關(guān)鍵詞時序特征處理和LSTM。我會把從原始K線到模型輸入特征、再到標簽設(shè)計和最終回測評估的每個環(huán)節(jié)都拆開細講該給代碼給代碼該給坑位給坑位。適合正在入門金融時序預測的人也適合那些跑通了demo但結(jié)果不穩(wěn)定、想知道自己哪里做錯的朋友。1. 項目定位預測漲跌方向比預測具體價格更有意義1.1 為什么我選了雅虎財經(jīng)數(shù)據(jù)接口做實驗場做美股歷史數(shù)據(jù)研究數(shù)據(jù)源是第一道關(guān)卡。雅虎財經(jīng)的數(shù)據(jù)接口幾乎算是個人研究者的默認選擇免費、日頻覆蓋時間夠長、字段完整Open、High、Low、Close、Volume一應俱全還自帶復權(quán)后的調(diào)整價格。用Python生態(tài)里的開源封裝庫拉數(shù)據(jù)幾行代碼就能把十幾年的歷史數(shù)據(jù)整理成DataFrame比自己去爬行情網(wǎng)站或者申請商業(yè)數(shù)據(jù)要省太多事。當然免費的代價是偶爾會有接口限流和延遲但作為構(gòu)建預測模型的原料它的結(jié)構(gòu)和穩(wěn)定性完全夠用。更重要的是日線級別的數(shù)據(jù)天然適合LSTM這類序列模型來實驗——樣本量不會少到?jīng)]法訓練又保留了明顯的時序依賴結(jié)構(gòu)。我在這類項目里養(yǎng)成的習慣是先用雅虎數(shù)據(jù)把整個特征工程和模型框架跑通確認信號有效之后再考慮要不要換更高頻或者更干凈的數(shù)據(jù)源。1.2 LSTM在這個項目里的真實定位很多人一聽到“用LSTM做股票預測”第一反應就是“AI要跑贏市場了”。這個預期必須先校準。金融時序數(shù)據(jù)是出了名的低信噪比有效信號可能就藏在幾個百分點的統(tǒng)計優(yōu)勢里任何模型都不可能穩(wěn)定地“預測明天漲還是跌”到很高的準確率。LSTM在這里的角色不是點石成金的神器而是一個比傳統(tǒng)時序模型更能吸收多特征、更能捕捉長期依賴的特征抽取器。舉個例子ARIMA這類線性模型的強項是單變量時間序列的自回歸關(guān)系面對多變量交叉作用和突變型的非線性模式非常吃力。LSTM通過門控機制選擇性地記住和遺忘信息可以把過去十幾天甚至幾十天的波動狀態(tài)、動量變化揉進當前預測里這是它比傳統(tǒng)模型更適配這個場景的核心原因。所以整條技術(shù)路線可以表述為用特征工程把原始價格數(shù)據(jù)變成有金融含義的輸入再用LSTM去挖掘其中跨時間的非線性規(guī)律最后以方向預測的勝率作為真實評價標準。1.3 項目完整流程速覽整個項目大致分成六個環(huán)節(jié)環(huán)環(huán)相扣任何一環(huán)偷懶都會在最終結(jié)果上現(xiàn)形數(shù)據(jù)獲取與清洗拉取日線數(shù)據(jù)處理復權(quán)、時區(qū)、缺失值。特征構(gòu)造從原始價格轉(zhuǎn)向收益率、滾動統(tǒng)計、技術(shù)指標、相對強弱等特征。標簽設(shè)計定義未來N日的漲跌方向標簽。訓練集/驗證集/測試集切分嚴格按時間順序禁止隨機打亂。LSTM模型搭建窗口樣本生成、歸一化、網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計和訓練。評測與回測方向準確率、AUC、模擬持倉策略并重點排查預測滯后問題。下面按這個順序把每個環(huán)節(jié)里我實際踩過的坑和有效做法一一說出來。2. 拉數(shù)據(jù)與清洗復權(quán)、時區(qū)和停牌才是第一道坎2.1 字段里最容易被忽略的是復權(quán)價格用雅虎財經(jīng)的數(shù)據(jù)接口拉數(shù)據(jù)時最基礎(chǔ)的代碼長這樣import yfinance as yf df yf.download( XXX, # 這里填股票代碼 start2015-01-01, end2025-01-01, auto_adjustTrue, ) print(df.columns)很多人拿到數(shù)據(jù)以后只看Close列忽略了一個致命細節(jié)當上市公司分紅或者拆股時股價會出現(xiàn)一個不自然的跳空缺口。如果沒有做復權(quán)處理模型會把這個因為分紅引起的價格跳空當成一次真實的暴跌或者暴漲特征序列里就會長出一堆假信號。常見的做法是打開自動復權(quán)參數(shù)這樣拿到的Close實際上是“后復權(quán)/前復權(quán)處理過的價格”或者單獨使用數(shù)據(jù)里的復權(quán)收盤價列。我強烈建議在任何歷史回測里面都使用復權(quán)價格否則股息除權(quán)日前后模型的預測錯誤率會高得離譜而且這類錯誤往往很隱蔽因為累計收益曲線看起來只是多了一兩次小回撤。2.2 時區(qū)問題別讓“今天”的數(shù)據(jù)跑進昨天的窗口美股交易是美東時區(qū)北京時間跟它有12到13個小時的時差。雅虎財經(jīng)返回的日線數(shù)據(jù)默認是美東日歷日對齊的也就是說每個交易日只產(chǎn)出一根K線這一根K線代表的是美東當天完整交易時段。這里有個隱藏的坑如果你習慣在盤前用“當天”數(shù)據(jù)做預測拿到的可能是一個未收盤的不完整序列而如果你把它當成已收盤數(shù)據(jù)來訓練特征窗口和標簽之間就等于混入了未來信息。從實踐角度最穩(wěn)妥的做法是訓練和預測統(tǒng)一使用“收盤后”的數(shù)據(jù)時間戳并且明確把特征序列截斷在交易日T標簽對應TN的未來收益。不要使用盤中實時數(shù)據(jù)去套用收盤模型也不要因為時差把當前這根不完整的K線納入特征。這個問題在構(gòu)建任何真實策略時都很致命但在不少教程里都被一筆帶過。2.3 停牌、長假和缺失值的處理方案美股雖然交易日密集但依然有假日休市和各種突發(fā)停牌。如果直接用數(shù)據(jù)接口返回的結(jié)果可能某一天就是憑空消失的而不是空值。這會帶來兩個問題一是LSTM的樣本必須是連續(xù)時間步中間缺一天序列結(jié)構(gòu)就斷了二是如果使用重采樣把非交易日強行補進去等于塞入大量無意義的填充數(shù)據(jù)。我習慣的做法是這樣的先拉取目標時段的完整交易日列表用這個列表去做數(shù)據(jù)對齊缺失的交易日直接剔除保留連續(xù)的交易日序列如果數(shù)據(jù)里出現(xiàn)NaN再細分處理缺失場景推薦處理方式原因單日停牌導致個別字段缺失前向填充并增加一個“是否缺失”標記特征保持序列連續(xù)同時讓模型知道當天沒有成交連續(xù)多日無交易數(shù)據(jù)剔除或單獨標記不做后向填充后向填充等于偷看未來信息指標計算時產(chǎn)生的開頭缺失直接刪除這些不完整窗口窗口數(shù)量足夠不值得冒險補值補上“是否缺失”這個標記特征是我覺得很有用的小技巧。這樣一來LSTM能主動學習“某天沒有交易”這個事件本身的影響力而不是單純把它當成一個噪聲。3. 特征構(gòu)造把K線變成LSTM真正看得懂的信號3.1 第一層從原始價格到收益率序列原始價格序列有一個天然缺陷非平穩(wěn)。十年前某股票的價格是5美元現(xiàn)在是200美元模型如果直接在價格數(shù)字上學規(guī)律就需要同時適應完全不同的數(shù)值量級還得額外處理長期通脹和公司成長帶來的漂移。一個更自然的選擇是把價格轉(zhuǎn)換成收益率序列也就是每天的變化比例或者取對數(shù)差。收益序列在統(tǒng)計性質(zhì)上平穩(wěn)得多也更加接近金融資產(chǎn)交易的本質(zhì)——我們賺的本來就不是“價格數(shù)字”而是“價格變化”。我實際使用的收益率有兩類單日收益率ret_1 close.pct_change()描述隔夜到當日的邊際變化。多周期動量ret_5 close.pct_change(5)、ret_20 close.pct_change(20)分別代表一周和一個月區(qū)間的累計漲跌幅。多周期收益率的意義在于給模型提供了不同時間尺度的“動量狀態(tài)”日線級別的短期趨勢往往噪聲大而20日收益能反映更穩(wěn)定的中期方向。LSTM雖然有記憶能力但讓模型自己從原始價格里硬學出“20日動量”這個概念需要相當多的數(shù)據(jù)和參數(shù)直接作為特征喂進去等于把人類已有的金融常識預置給模型訓練負擔小得多效果也更穩(wěn)。3.2 第二層滾動統(tǒng)計特征與技術(shù)指標第二層特征是我花時間最多的地方也是這個項目里“時序特征處理”的核心部分。光有收益率還不夠市場狀態(tài)不僅體現(xiàn)在漲跌幅本身還體現(xiàn)在波動率、價格所處區(qū)間、短期動能是否衰竭這些維度。我常用的是下面這幾類滾動波動率rolling_std ret_1.rolling(20).std()。金融數(shù)據(jù)有明顯的波動聚集現(xiàn)象高波動后面往往還是高波動低波動后面往往還是低波動。這個特征對判斷“當前市場是否處于劇烈分化期”非常有效。均線偏離度(close - close.rolling(20).mean()) / close.rolling(20).mean()。價格偏離中期均線的程度可以近似表示短期情緒是不是過熱或者過度悲觀。布林帶位置把價格在布林帶中的相對位置算出來即(close - 下軌) / (上軌 - 下軌)。這個指標本質(zhì)上是把波動率和趨勢融合在一起數(shù)值在0到1之間可以直觀表達“價格處在統(tǒng)計區(qū)間的什么位置”。RSI類動能指標經(jīng)典的相對強弱指標可以自己用滾動平均實現(xiàn)用來刻畫一段時間內(nèi)上漲力量和下跌力量的對比。我通常取14日窗口。這些特征不需要引入額外的金融數(shù)據(jù)庫純pandas就能算完。關(guān)鍵是理解它們背后的直覺LSTM本質(zhì)上是一個函數(shù)逼近器你喂給它的特征里如果已經(jīng)包含了“波動率聚集”“價格偏離均值”這些被市場反復驗證的規(guī)律它學起來會比從零開始摸索高效得多。3.3 第三層相對強弱與周期編碼這個項目里還有一個很容易被忽略的維度個股和市場整體的關(guān)系。在系統(tǒng)性行情里大盤漲的時候很多股票跟著漲大盤跌的時候再好的個股也難獨善其身。所以我會把標的的收益率和同期大盤指數(shù)的收益率放在一起構(gòu)造一個相對收益特征相對收益ret_1 - 大盤ret_1。這個特征過濾掉市場整體的beta成分留下股票自己跑贏或跑輸大盤的部分。它對捕捉個股的alpha很有幫助。除此之外還有日歷效應。雖然很多人覺得“星期一效應”已經(jīng)消失了但作為特征星期幾和月份這些信息幾乎沒有成本。我推薦用周期性編碼而不是直接填整數(shù)比如把星期幾映射成兩個周期函數(shù)sin(2 * pi * weekday / 7)和cos(2 * pi * weekday / 7)。這樣設(shè)計的原因很簡單星期一是1星期日是0如果用整數(shù)編碼模型會莫名其妙學到“數(shù)字越大越怎么樣”的無意義順序而用sin/cos編碼星期一和星期日之間的距離在數(shù)值上又很接近符合“周末相鄰”的真實含義。3.4 特征工程的減法原則與泄漏邊界我見過不少項目把特征堆到三四十個結(jié)果訓練集表現(xiàn)尚可測試集直接崩盤。核心原因之一就是特征太多、太冗余LSTM的參數(shù)量會被迫膨脹過擬合風險急速上升。以日線級別的單標的預測來說我個人經(jīng)驗是15到20個特征已經(jīng)非常充裕關(guān)鍵是特征之間的互補性和信息增量而不是數(shù)量。還有一個所有做時序特征的人都必須警惕的雷區(qū)滾動特征計算時的未來信息泄漏。比如要計算當天的20日均線只能用截止到當天收盤的數(shù)據(jù)也就是必須用rolling(20).mean().shift(0)——這個沒問題但如果操作不當用了包含未來幾天數(shù)據(jù)的窗口去算指標模型就等于在訓練時偷看了“未來的收盤價”測試時自然被打回原形。注意凡是涉及滾動窗口的特征一定要在心里畫一條時間軸反復確認“當前時刻T這個特征值是否只依賴T以及T以前的真實數(shù)據(jù)”。別讓任何未來數(shù)據(jù)偷偷爬進你的訓練特征。4. 標簽設(shè)計與數(shù)據(jù)切分時序泄漏比模型錯誤更容易毀掉結(jié)果4.1 回歸連續(xù)價格還是分類漲跌方向剛開始做這個項目時我試過直接預測“下一天的收盤價”損失函數(shù)用MSE。結(jié)果是訓練過程看起來很順暢預測曲線跟真實價格曲線簡直貼在一起準確率感人。但我后來意識到這完全是錯覺價格序列的自相關(guān)極強模型只要把預測值做到“非常接近昨天的價格”MSE就已經(jīng)很小了。這本質(zhì)上是在做一個復制昨天的任務而不是在預測未來。這也是我后來轉(zhuǎn)而做“方向分類”的根本原因。更合理的標簽不是連續(xù)價格而是未來h個交易日后的漲跌方向df[label] (df[close].shift(-h) df[close]).astype(int)h 1代表預測明天漲不漲h 5代表預測未來一周的方向是否向上。二分類是最簡潔的設(shè)計也可以擴展成三分類或五分類大漲、小漲、橫盤、小跌、大跌但類別越多樣本平衡和模型收斂就越難。我的建議是先從二分類入手把整個流程跑通再逐步增加標簽粒度。4.2 訓練集/驗證集/測試集必須按時間順序切分做過普通機器學習的人一開始很可能會習慣性調(diào)用隨機切分函數(shù)這是時序預測項目里最毒的一個錯誤。隨機切分會把2021年的樣本和2023年的樣本混在一起訓練和驗證造成一種“模型見過未來”的幻覺評估結(jié)果嚴重虛高。正確的做法是完全按時間順序切分前70%作為訓練集中間15%作為驗證集用來調(diào)超參數(shù)和做早停最后15%作為測試集只允許最后評估一次。更嚴格一點可以采用walk-forward驗證把窗口往前滾動重復“訓練一段→驗證預測下一段→把驗證段納入訓練”的過程。這樣能更真實地模擬模型在實戰(zhàn)中的更新節(jié)奏。對于起步項目簡單的時間比例切分已經(jīng)能避免大部分自欺欺人的評估。4.3 三個最容易忽略的泄漏源數(shù)據(jù)泄漏在時序項目里是無孔不入的我至少真實翻車過三次總結(jié)下來最常見的三個來源第一歸一化在完整數(shù)據(jù)集上fit。合理的做法是只用訓練集的統(tǒng)計量擬合標準化器然后對驗證集和測試集只做transform。如果對整個數(shù)據(jù)集求最小值和最大值再做歸一化測試集的數(shù)值范圍信息就提前混進了訓練過程。第二特征里混入了未來數(shù)據(jù)。前面提到滾動窗口計算時如果沒用對偏移量“未來幾天的價格”就會進到當天的特征里。這個坑往往非常隱蔽因為你只看單行數(shù)據(jù)根本發(fā)現(xiàn)不了必須寫代碼去抽樣核查特征和時間標簽的對應關(guān)系。第三缺失值填充用了后向填充。例如某一天停牌為了“讓序列連續(xù)”而用后一天的價格來填空這就是實打?qū)嵉奈磥頂?shù)據(jù)泄漏。正確的做法是用前向填充或者干脆刪除該樣本。這三件事每一項都是“看起來沒什么大不了實際上能把結(jié)果從50%抬到60%甚至更高”的隱患。評估模型之前先把它們?nèi)颗挪楦蓛簟?. LSTM模型搭建窗口、門控和訓練配置的組合邏輯5.1 為什么LSTM在這里確實能學到東西回到最核心的問題特征和標簽都準備好了為什么用LSTM而不是普通全連接神經(jīng)網(wǎng)絡(luò)答案在于金融時序的“狀態(tài)依賴”特性。今天的市場行為往往跟過去幾個星期甚至幾個月的上下文有關(guān)——比如一個連續(xù)上漲后突然放量下跌的形態(tài)和一個長期橫盤后的放量突破背后代表的狀態(tài)完全不同。如果只看今天的特征向量MLP根本區(qū)分不了這兩種情況。LSTM的核心是引入了細胞狀態(tài)和三個門控遺忘門、輸入門、輸出門。它可以在長序列中決定哪些舊信息需要保留哪些新信息需要寫入。這就意味著模型有機會自己學會“注意過去的波動率狀態(tài)”“記住過去一段時間的動量”而不是把每個時間步孤立地看待。從工程角度說LSTM在具有長期依賴的多維時間序列上確實比MLP和普通RNN都更可靠。5.2 樣本窗口與三維輸入的數(shù)據(jù)結(jié)構(gòu)LSTM的輸入是三維張量(樣本數(shù)量, 時間步數(shù), 特征數(shù)量)。也就是說模型不只看“今天”的特征還要看過去連續(xù)T天的特征組合。這個T就是滑動窗口長度。窗口長度的選擇需要平衡兩個方向太短的窗口比如5天學不到中期背景太長的窗口比如120天一方面會讓樣本數(shù)量大幅減少另一方面會把太遙遠的、跟當前關(guān)系不大的噪聲也裝進來。以日線數(shù)據(jù)為例我實際操作下來感覺30到60個交易日是比較合理的區(qū)間既能覆蓋一個半月的市場背景又不至于讓序列過于笨重。構(gòu)造樣本的典型代碼這樣寫import numpy as np def make_sequences(features, labels, window40): X, y [], [] for i in range(len(features) - window): X.append(features[i : i window]) y.append(labels[i window]) return np.array(X), np.array(y)注意這里的對齊邏輯第i個樣本的輸入是i到i window - 1的數(shù)據(jù)對應的標簽是i window那一天的未來漲跌方向。這種錯位是刻意為之的保證模型在預測時“看不到”自己需要預測的那一天。5.3 歸一化、網(wǎng)絡(luò)結(jié)構(gòu)與損失函數(shù)的選擇特征進入LSTM之前必須先做歸一化否則不同特征之間的數(shù)值尺度差異比如價格是幾百收益率只有0.01會讓門控計算失衡。我通常對每個特征列分別做MinMax歸一化而且嚴格限定在訓練集上擬合。網(wǎng)絡(luò)結(jié)構(gòu)方面我踩過很多次坑之后形成了一個感覺比較穩(wěn)的模板import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size64, num_layers2, dropout0.2): super().__init__() self.lstm nn.LSTM( input_sizeinput_size, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue, dropoutdropout, ) self.classifier nn.Sequential( nn.Linear(hidden_size, 32), nn.ReLU(), nn.Dropout(dropout), nn.Linear(32, 1), ) def forward(self, x): out, _ self.lstm(x) out out[:, -1, :] # 取最后一個時間步的輸出 return self.classifier(out)這是一個兩層的LSTM加一個輕量分類頭。hidden_size取64在日線場景下通常是夠用的增大到128未必帶來收益反而會明顯拖慢訓練并增加過擬合風險。最后一層用sigmoid輸出配合二元交叉熵損失。優(yōu)化器用Adam初始學習率1e-3附近比較合適。5.4 訓練時容易遇到的三個實際問題訓練LSTM的過程里面有幾個小問題幾乎人人都會遇到提前說清楚能省很多精神內(nèi)耗。一是隨機種子問題。同一個模型配置不同隨機種子跑出來的準確率可能波動兩三個百分點。這不是代碼寫錯了是深度學習在小數(shù)據(jù)集上的正?,F(xiàn)象。應對方式是固定所有隨機種子同時對一個配置跑3到5個不同種子取平均結(jié)果再下結(jié)論。二是類別不平衡問題。雖然漲跌天數(shù)通常接近五五開但特定行情階段可能出現(xiàn)明顯的偏斜。如果發(fā)現(xiàn)訓練集里上漲樣本占60%以上可以在損失函數(shù)里給少數(shù)類加上比重大于1的權(quán)重或者用分層抽樣來構(gòu)造訓練批次。三是loss在初期紋絲不動的情況。如果訓練了十幾個epochloss曲線幾乎水平先不要急著加大學習率。先檢查數(shù)據(jù)是不是有問題比如標簽列是不是全是同一個值、特征是不是全為NaN、歸一化是不是做反了。這些基礎(chǔ)問題排查完再考慮調(diào)整模型結(jié)構(gòu)。6. 評測與回測別讓LSTM的“滯后抄作業(yè)”騙了你6.1 預測滯后現(xiàn)象的識別與根因用LSTM做股票方向預測時最容易出現(xiàn)的一種“虛假成功”就是預測結(jié)果比真實漲跌滯后一拍。舉個例子假如把模型預測的概率值和真實累計收益畫在一起很多人會看到兩條曲線形狀高度類似只是預測曲線整體晚了一兩天。這時候如果只看相關(guān)性會覺得模型很厲害但實際上模型學到的是“今天的漲跌和明天的漲跌高度相關(guān)”這個簡單的慣性規(guī)律本質(zhì)上只是在復制當天的收益方向。怎么識別這個問題一個簡單有效的辦法是看模型在“反轉(zhuǎn)日”的表現(xiàn)假如今天是上漲日模型給出的明天上漲概率是多少假如今天是下跌日模型給出的明天上漲概率又是多少。如果模型對這兩類情況的預測幾乎完全相反而且準確率主要來自順延行情基本可以斷定它陷入了滯后抄作業(yè)。緩解滯后現(xiàn)象的思路有三個一是把預測標簽改為未來5日方向強迫模型不能只靠今天推斷明天二是在特征中增加更多與當日收益方向正交的信息比如量價關(guān)系、波動率變化三是增大dropout降低模型對單日自相關(guān)模式的依賴。從我的經(jīng)驗看改標簽周期效果最明顯代價是訓練難度上升。6.2 用方向準確率、AUC和策略回測一起評估模型的最終價值不應該是“圖好看”而應該是能不能在實際策略里產(chǎn)生正收益。我建立了一套三層評估體系第一層看分類指標。方向準確率超過55%在日線預測模型里已經(jīng)算可圈可點同時要關(guān)注AUCAUC能更好地衡量模型在不同閾值下的區(qū)分能力。第二層看預測概率的累計分布模型給出的上漲概率如果集中在0.4到0.6之間說明模型整體很猶豫信號價值有限如果能相對分散說明模型在不同市場狀態(tài)下有區(qū)分度。第三層也是最關(guān)鍵的一層做策略回測。一個最簡單的回測方案是這樣當預測上漲概率超過0.55時持有多頭倉位當?shù)陀?.45時空倉或做空每天根據(jù)信號調(diào)倉。計算累計收益時要考慮手續(xù)費和滑點# signal: 1做多, -1做空, 0空倉 strategy_daily_return signal.shift(1) * asset_daily_return strategy_equity (1 strategy_daily_return.fillna(0)).cumprod() benchmark_equity (1 asset_daily_return.fillna(0)).cumprod()信號用shift(1)是因為當天的預測信號最早也只能在下一個交易日執(zhí)行這個處理能避免前視偏差。對比策略凈值和“買入持有”基準的差距才能真正說明模型預測有沒有轉(zhuǎn)化為賺錢能力。6.3 我實測下來最值得優(yōu)化的三個方向做完整個項目之后如果讓我重新做一遍我會把時間優(yōu)先投入這三個方向第一從單標的預測轉(zhuǎn)向多標的聯(lián)合訓練。把同一時間段內(nèi)多只股票的數(shù)據(jù)放在一起訓練能顯著提升模型的泛化能力。不同股票之間共享的交易模式和波動特征相當于天然的“數(shù)據(jù)增強”而且模型還能學到一些跨標的的相對現(xiàn)象。第二不要迷信LSTM本身把特征驗證放在調(diào)參之前。每新增一個特征先在同樣的模型配置下回測對比如果策略收益沒有提升就果斷拿掉。這個流程比盲目堆疊網(wǎng)絡(luò)層數(shù)有意義得多。第三多試幾個標簽周期和閾值策略。預測未來1日、5日、10日的信號規(guī)律往往完全不同不要默認某一種就一定更好。用回測結(jié)果反推標簽設(shè)計是金融時序預測里非常實用的一招。做了一圈實驗下來我最大的感受是在這個項目里數(shù)據(jù)意識和時序敬畏感比任何花哨的模型結(jié)構(gòu)都重要。只要訓練特征里混入了一點點未來信息再好的模型也會給你一個漂亮的假象而只有老老實實地把特征、標簽、切分和評估每一環(huán)都做好LSTM的價值才真正顯現(xiàn)出來。順帶分享一個我自己的小習慣每次跑完一組實驗我都會寫一行代碼把預測結(jié)果畫成散點圖標出連續(xù)三日以上的預測正確區(qū)間——圖上看一眼模型是不是只會順著昨天的方向說廢話比看一百行指標報表都直觀。這個技巧看著簡單真的能幫你避開很多自我感動。