化股票調(diào)整收盤價預測:超參數(shù)搜索與源碼實踐)
簡介基于PSO-LSTM神經(jīng)網(wǎng)絡的股票調(diào)整收盤價預測Python源碼面向金融數(shù)據(jù)分析、深度學習方向的課程設計與期末大作業(yè)場景適合需要完成預測類項目但缺乏完整代碼參考的高校學生與初學者。資源利用粒子群算法優(yōu)化LSTM超參數(shù)實現(xiàn)對多只股票調(diào)整收盤價的單步預測代碼附有詳細注釋結構清晰下載后簡單配置環(huán)境即可運行。壓縮包含10個文件其中7個CSV為主要股票與指數(shù)的歷史行情數(shù)據(jù)集1個PY腳本為預測主程序另含TXT與MD說明文檔整體約490KB便于快速理解數(shù)據(jù)預處理、模型訓練與評估流程。目前已有171人學習與瀏覽項目功能完整、界面直觀既可作為課程設計或期末大作業(yè)的完整模板也可為后續(xù)擴展多步預測或引入更多優(yōu)化算法提供堅實基礎。1. PSO-LSTM預測股票調(diào)整收盤價一份能直接跑的期末大作業(yè)源碼先說結論把LSTM直接丟給股票序列十有八九預測結果和擲骰子差不多。LSTM本身是個黑匣子隱藏層數(shù)、學習率、時間步長這些超參數(shù)對結果的影響遠大于網(wǎng)絡結構本身而教科書里從不告訴你怎么選一組靠譜參數(shù)。這份源碼把粒子群優(yōu)化PSO塞進LSTM的超參數(shù)搜索里用比特幣、道瓊斯、上證指數(shù)、蘋果、黃金等多組數(shù)據(jù)集跑單維單步的MSE預測代碼注釋齊全適合做課程設計和期末大作業(yè)。我拆完最直觀的感受是不需要你有優(yōu)化算法基礎改改數(shù)據(jù)集路徑和迭代次數(shù)就能復現(xiàn)完整訓練流程。下面按原理、數(shù)據(jù)流、落地步驟、踩坑記錄、驗證技巧依次講。2. 為什么是PSO-LSTMLSTM的調(diào)參困境與粒子群尋優(yōu)思路2.1 LSTM對股票序列的短板不在結構在超參數(shù)LSTM處理時間序列的機制本身沒有問題輸入門、遺忘門、輸出門三個門控結構配合記憶單元能按時間步選擇性保留信息這比前饋神經(jīng)網(wǎng)絡和BP神經(jīng)網(wǎng)絡更適合序列數(shù)據(jù)。問題是LSTM的每個組件都帶超參數(shù)常見的就有學習率、隱藏層神經(jīng)元數(shù)量、網(wǎng)絡層數(shù)、時間步長、batch大小、dropout比例。這六個參數(shù)的組合空間是連續(xù)且高維的互相之間還有耦合關系。比如學習率從0.01改到0.001loss曲線可能從劇烈震蕩變成收斂緩慢時間步長從10改成30模型看到的“記憶長度”變了預測結果完全是另一種形態(tài)。股票調(diào)整收盤價數(shù)據(jù)本身是非平穩(wěn)、帶噪聲的時間序列疊加這種參數(shù)敏感度結果就是同一份代碼、同一份數(shù)據(jù)只改一個參數(shù)預測精度可以從均方誤差0.002惡化到0.05。這種問題在期末大作業(yè)場景里尤其致命——老師不會因為你網(wǎng)絡結構設計精巧就給分他要看到的是可復現(xiàn)的實驗結果和合理的誤差指標。所以關鍵在于把“人工試參數(shù)”變成“機器自動找參數(shù)”。2.2 PSO怎么把調(diào)參變成尋優(yōu)粒子群優(yōu)化的思路很直觀把一組超參數(shù)組合看作一個粒子粒子的位置就是參數(shù)向量速度是參數(shù)更新的方向和步長。每個粒子根據(jù)兩個記憶來更新自己自身歷史最優(yōu)位置pbest和整個群體的歷史最優(yōu)位置gbest。標準更新公式是[ v_{i,d}^{t1} \omega v_{i,d}^{t} c_1 r_1 (pbest_{i,d} - x_{i,d}^{t}) c_2 r_2 (gbest_bextvpl - x_{i,d}^{t}) ][ x_{i,d}^{t1} x_{i,d}^{t} v_{i,d}^{t1} ]其中 (\omega) 是慣性權重控制粒子對上一時刻速度的繼承程度(c_1) 是自我認知系數(shù)(c_2) 是社會認知系數(shù)(r_1)、(r_2) 是[0,1]的隨機數(shù)。當 (\omega) 較大時粒子探索性強容易跳出局部區(qū)域(\omega) 較小時粒子收斂快適合后期精細搜索。這份源碼里PSO要尋優(yōu)的參數(shù)通常是學習率、LSTM隱藏層神經(jīng)元數(shù)、時間步長、batch大小。每個粒子的“適應度”就是用它對應的參數(shù)組合訓練一次LSTM后在驗證集上得到的MSE。MSE越低粒子越優(yōu)秀。這和網(wǎng)格搜索、隨機搜索的最大區(qū)別是PSO不是盲目撒點每個粒子都在往群體最優(yōu)的方向移動同時保留自身探索能力所以在10到20次迭代內(nèi)就能逼近一個較優(yōu)區(qū)域。2.3 適應度評估的成本結構與預算控制理解了PSO之后要有一個清醒認識每次適應度評估都要訓練一次LSTM哪怕只訓練很少的epoch20個粒子、10次迭代也意味著200次訓練。這是這份源碼在真實使用中最大的成本約束。源碼里的“單維單步mse預測”就是為了控制成本——單維輸入只用收盤價單步輸出只預測下一天網(wǎng)絡規(guī)模小訓練很快所以一次完整的PSO尋優(yōu)在你的筆記本上也能跑完。常見做法是設定粒子數(shù)20到30迭代次數(shù)10到15次每次適應度評估只訓練5到10個epoch因為PSO尋優(yōu)階段只需要比較相對優(yōu)劣不需要訓練到完全收斂。找到最優(yōu)參數(shù)后再用這些參數(shù)從頭訓練一個完整的模型訓練到真正的收斂條件。這個“粗訓練選參數(shù)、精訓練出結果”的兩段式流程是這份源碼的設計精髓。# PSO適應度評估核心骨架與源碼邏輯一致 def fitness_function(params, X_train, y_train, X_val, y_val): # params [learning_rate, hidden_units, time_step, batch_size] lr, hidden, time_step, batch params # 每次評估前重建一個輕量LSTM不保留歷史狀態(tài) model build_lstm(time_steptime_step, hidden_unitshidden) model.compile(optimizerAdam(learning_ratelr), lossmse) # 只訓練少量epoch比較相對優(yōu)劣即可 model.fit(X_train, y_train, batch_sizeint(batch), epochs5, verbose0) mse model.evaluate(X_val, y_val, verbose0) return mse這段代碼的邏輯是把PSO傳來的參數(shù)向量拆包構建一個輕量級LSTM訓練5個epoch后用驗證集MSE作為粒子的適應度。注意time_step既是LSTM輸入形狀的一部分也是滑動窗口長度改它必須同步重建數(shù)據(jù)集所以真正實現(xiàn)時要放在窗口構建之后。參數(shù)說明lr建議在[0.0001, 0.01]范圍搜索用對數(shù)尺度取隨機值更合理hidden_units在[32, 128]time_step在[5, 30]batch_size在[16, 64]。這四個參數(shù)是這份源碼尋優(yōu)的核心對象。3. 源碼結構與數(shù)據(jù)流從CSV到單步MSE預測的完整路徑3.1 文件地圖每個文件是干什么的解壓后的目錄結構很清晰核心文件是一個Python腳本加一個datasets文件夾文件/目錄角色說明會議PSO-LSTM單維單步mse預測.py主腳本包含數(shù)據(jù)加載、PSO尋優(yōu)、LSTM訓練、結果評估全流程README.md使用說明和參數(shù)說明Datasets/BTC-USD.csv比特幣美元價格日線數(shù)據(jù)Datasets/DJI.csv道瓊斯工業(yè)指數(shù)日線數(shù)據(jù)Datasets/Gold_daily.csv黃金日線數(shù)據(jù)Datasets/000001.SS.csv上證指數(shù)日線數(shù)據(jù)Datasets/IXIC.csv納斯達克綜合指數(shù)日線數(shù)據(jù)Datasets/AAPL.csv蘋果公司股價日線數(shù)據(jù)Datasets/GSPC.csv標普500指數(shù)日線數(shù)據(jù)Datasets/1.txt可能是數(shù)據(jù)來源說明或備用數(shù)據(jù)這個數(shù)據(jù)集設置覆蓋了加密貨幣、股指、商品、個股目的是驗證PSO-LSTM在不同波動特征序列上的泛化表現(xiàn)。期末答辯時這一點很加分同一個模型框架在多個數(shù)據(jù)集上穩(wěn)定運行遠比在一個數(shù)據(jù)集上調(diào)出漂亮數(shù)字更有說服力。3.2 數(shù)據(jù)加載與歸一化先統(tǒng)一列名再談訓練第一步是讀取CSV。不同數(shù)據(jù)集來源不同列名可能不一樣有的叫Close有的叫Adj Close有的帶Price。源碼里用的是調(diào)整收盤價Adjusted Close這是分紅送股修正后的價格比單純收盤價更能反映真實收益變化。加載時要先打印columns確認列名再做映射。import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler def load_data(csv_path, price_colAdj Close): df pd.read_csv(csv_path) # 統(tǒng)一列名如果CSV里沒有Adj Close退回Close if price_col not in df.columns: price_col Close data df[price_col].values.astype(float) return data def normalize(data): scaler MinMaxScaler(feature_range(0, 1)) scaled scaler.fit_transform(data.reshape(-1, 1)) return scaled, scaler邏輯說明load_data做的事情是容錯讀取BTC-USD.csv和AAPL.csv這類數(shù)據(jù)通常有Adj Close列但某些黃金數(shù)據(jù)可能只有Close所以加了退化邏輯。normalize用MinMaxScaler把價格壓縮到[0,1]區(qū)間這一步不能省略——LSTM用tanh和sigmoid激活函數(shù)輸入不歸一化會導致梯度消失或梯度爆炸。參數(shù)說明feature_range(0,1)是常見設置如果你的數(shù)據(jù)有明顯離群值比如比特幣某天暴漲暴跌建議改成(-1,1)配合tanh輸出層效果更穩(wěn)定。保存好scaler對象后面預測結果還原價格要用這是新手最容易丟的。3.3 滑動窗口構建單維單步的數(shù)據(jù)樣本長什么樣單維單步預測的含義是用過去time_step天的調(diào)整收盤價預測未來1天的調(diào)整收盤價。數(shù)據(jù)集的構建方式是在時間軸上滑動取值def create_sequences(data, time_step): X, y [], [] for i in range(len(data) - time_step - 1): X.append(data[i:(i time_step), 0]) y.append(data[i time_step, 0]) return np.array(X), np.array(y) # 以time_step20為例 X, y create_sequences(scaled_data, time_step20) print(X_shape:, X.shape) # 期望輸出[樣本數(shù), 20] print(y_shape:, y.shape) # 期望輸出[樣本數(shù), 1] # LSTM要求輸入是3D: [樣本數(shù), 時間步, 特征數(shù)] X X.reshape(X.shape[0], X.shape[1], 1)邏輯說明create_sequences是在時間軸上滑窗取樣。第i個樣本的X是第i到第itime_step-1天的價格y是第itime_step天的價格。注意循環(huán)終止條件是len(data) - time_step - 1少了最后一天目的是保證y有值常見邊界錯誤是把-1漏掉。參數(shù)說明time_step是這份源碼的核心超參數(shù)之一由PSO負責搜索。它本質(zhì)是“模型記憶長度”值太小模型看不到趨勢值太大會把噪聲也學進去而且樣本數(shù)減少。AAPL這類長期趨勢數(shù)據(jù)適合20到30比特幣這類高波動數(shù)據(jù)10到15更合適。shape是深度學習框架最常見的報錯點LSTM需要[樣本數(shù), 時間步, 特征數(shù)]三維輸入這里特征數(shù)是1只用收盤價所以最后reshape成[樣本數(shù), 20, 1]。3.4 為什么要用MSE作為預測誤差源碼標題里“mse預測”指的就是用MSE均方誤差作為訓練損失和評估指標。MSE對預測值與真實值之差取平方有兩個特性一是放大大誤差的懲罰模型會優(yōu)先修正那些偏離嚴重的預測二是誤差量綱是價格的平方解釋性不如RMSE開根號后回到價格量綱。在股票預測場景里MSE是課程設計的默認選擇因為損失函數(shù)和評估指標一致訓練過程中可以直接觀察驗證集MSE來判斷模型有沒有過擬合。如果你的老師要求看到“價格誤差”可以在評估階段加一行rmse np.sqrt(mse)。但如果預測的是原始價格而非歸一化價格RMSE可能在幾十甚至上百美元答辯時要說明你的誤差是在歸一化空間內(nèi)計算的否則會被質(zhì)疑結果規(guī)模。4. 讓腳本跑起來環(huán)境配置、訓練參數(shù)與結果解讀4.1 運行環(huán)境與依賴安裝這份源碼基于深度學習框架編寫主腳本需要TensorFlow或Keras環(huán)境。我的建議是Python 3.8搭配TensorFlow 2.7穩(wěn)定性和兼容性最好。安裝命令pip install tensorflow2.7.0 pip install pandas numpy scikit-learn matplotlib如果你用的是TensorFlow 2.7以上版本keras已經(jīng)內(nèi)置在tensorflow包里不需要單獨pip安裝。但要注意numpy版本TensorFlow 2.7要求numpy版本在1.19到1.21之間直接裝最新numpy1.24會在import時報module numpy has no attribute float錯誤。跑之前先檢查一遍python -c import tensorflow as tf; print(tf.__version__) python -c import numpy; print(numpy.__version__)這是我復現(xiàn)這類源碼固定的第一步先把框架版本卡死再改業(yè)務代碼可以省掉大量底層兼容性的踩坑時間。4.2 啟動訓練一行命令跑起來的完整流程源碼結構是單腳本執(zhí)行下載后定位到目錄直接運行cd PSO-LSTM-for-Prediction-main python 會議PSO-LSTM單維單步mse預測.py腳本正常啟動后會依次做這些事情讀取默認數(shù)據(jù)集一般是AAPL.csv→ 歸一化 → 按時間步構建窗口 → 劃分訓練集和驗證集 → 初始化PSO粒子群 → 迭代尋優(yōu) → 輸出最優(yōu)參數(shù) → 用最優(yōu)參數(shù)重建LSTM并訓練 → 繪制預測對比圖。第一次跑通建議不要改任何參數(shù)用默認配置跑一遍確認環(huán)境沒問題。4.3 PSO關鍵參數(shù)對照表與調(diào)整建議參數(shù)源碼常見默認值調(diào)整方向影響粒子數(shù)n_particles20增大到30-40提升搜索覆蓋但訓練時間線性增長粒子太少容易漏掉最優(yōu)區(qū)域最大迭代次數(shù)n_iter10觀察適應度曲線若還在下降就增大到20迭代過多后期只做局部微調(diào)慣性權重 w0.5-0.9大值前期探索、小值后期收斂線性遞減效果最好固定過大收斂慢過小易早熟學習率搜索范圍[0.0001, 0.01]高波動數(shù)據(jù)往小了調(diào)學習率是LSTM最敏感的參數(shù)隱藏層神經(jīng)元數(shù)[32, 128]數(shù)據(jù)量大可放寬到[32, 256]神經(jīng)元過多過擬合過少欠擬合時間步長搜索范圍[5, 30]趨勢型數(shù)據(jù)15-30噪聲型5-15影響模型記憶長度和樣本數(shù)量batch size[16, 64]數(shù)據(jù)量小時用16影響訓練穩(wěn)定性和收斂速度調(diào)整原則先固定迭代次數(shù)和粒子數(shù)只調(diào)搜索范圍。如果你在作業(yè)里復現(xiàn)建議設置n_iter15、n_particles25這個組合在精度和耗時之間比較平衡。如果訓練一輪下來超過半小時把粒子數(shù)降回15比降低迭代次數(shù)更能節(jié)約時間。4.4 結果指標與預測圖解讀訓練結束后源碼會輸出最優(yōu)參數(shù)、訓練集MSE、驗證集MSE并繪制真實價格曲線和預測價格曲線的對比圖??催@張圖時重點關注三點第一預測曲線一般是紅色是否跟著真實曲線的整體形態(tài)走。如果形態(tài)一致、略有滯后說明模型學到了有效規(guī)律如果完全不對稱大概率是數(shù)據(jù)劃分或反歸一化出錯。第二驗證集MSE和訓練集MSE的比值。如果驗證集MSE是訓練集的10倍以上過擬合要加大dropout或減少神經(jīng)元數(shù)。第三預測曲線的末端是否發(fā)散。單步預測是滾動一步、預測一步誤差不會累計所以末端發(fā)散說明模型的最后一個時間步輸入有問題。import matplotlib.pyplot as plt # 反歸一化還原真實價格 y_true_orig scaler.inverse_transform(y_test.reshape(-1, 1)) y_pred_orig scaler.inverse_transform(y_pred.reshape(-1, 1)) plt.figure(figsize(12, 5)) plt.plot(y_true_orig, labelTrue Price, color#333333) plt.plot(y_pred_orig, labelPred Price, color#d62728, linestyle--) plt.title(Stock Adjusted Close Price Prediction (PSO-LSTM)) plt.xlabel(Time Step) plt.ylabel(Price) plt.legend() plt.grid(alpha0.3) plt.show()邏輯說明模型輸出的是歸一化空間的預測值必須用訓練時保存的scaler做inverse_transform才能還原成真實價格。這里最容易犯的錯誤是對y_test和y_pred分別fit一個新的scaler那樣還原出來的價格量級會偏離實際。參數(shù)說明figsize(12,5)適合單交易日序列展示如果你的驗證集有500個以上樣本可以適當加長寬度。顏色用深灰和深紅的對比在PPT里投影也能看清。5. 避坑與排查我在復現(xiàn)PSO-LSTM時踩過的五個坑5.1 預測曲線貼著0軸反歸一化還原后全是小數(shù)點后的小數(shù)現(xiàn)象訓練完畫圖預測值全部在0到0.05之間波動還原成真實價格后數(shù)值比實際小了上千倍。原因反歸一化時使用了錯誤的scaler。最常見的情況是對y_test自己重新fit_transform了一個新的MinMaxScaler這個scaler的min和max來自歸一化后的數(shù)據(jù)0到1之間反向還原時自然對不回去。解決全程只保留最初fit在完整訓練數(shù)據(jù)上的那個scaler對驗證集和測試集只調(diào)用transform和inverse_transform絕對不要在測試集上重新fit。# 錯誤寫法對測試集重新fit scaler_test MinMaxScaler() y_test_scaled scaler_test.fit_transform(y_test.reshape(-1, 1)) # 錯 # 正確寫法復用訓練時的scaler y_test_orig scaler.inverse_transform(y_test.reshape(-1, 1)) # 對5.2 PSO迭代沒幾次就停住所有粒子擠在一起不再更新現(xiàn)象打印每次迭代的gbest MSE發(fā)現(xiàn)前3次在下降第4次之后完全不變化并且每個粒子的參數(shù)向量幾乎一樣。原因這是粒子群優(yōu)化的經(jīng)典“早熟收斂”。慣性權重固定為常數(shù)時粒子速度逐漸衰減到接近零群體失去探索能力被一個局部最優(yōu)困住。解決把慣性權重改成線性遞減從0.9逐漸降到0.4迭代前期大權重保持探索、后期小權重加速收斂。另外給每個粒子的位置和速度加邊界約束超出范圍就隨機重置避免所有粒子收斂到同一組參數(shù)。5.3 切換數(shù)據(jù)集時報維度錯誤X_train.shape[1]不匹配現(xiàn)象用AAPL.csv跑通后把csv_path改成BTC-USD.csv訓練時報expected shape (None, 20, 1) but found (None, 15, 1)。原因不同數(shù)據(jù)集的長度不同但源碼里time_step如果在PSO搜索范圍內(nèi)數(shù)據(jù)集的構建是在PSO循環(huán)外還是循環(huán)內(nèi)有講究。如果窗口是用固定time_step構建的而PSO在改變time_step參數(shù)那每次評估都需要重新構建數(shù)據(jù)集。解決把create_sequences放進適應度函數(shù)內(nèi)部每次評估按當前粒子的time_step值重新滑窗。代價是每次評估多一次數(shù)據(jù)構建開銷但換來的是time_step真正參與尋優(yōu)。手動切換數(shù)據(jù)集時也先打印X.shape確認維度。5.4 訓練MSE在下降但預測曲線整體比真實曲線滯后一天現(xiàn)象預測曲線和真實曲線的趨勢完全一致但整體向右平移了一個時間步MSE還很小。原因單步預測任務里如果時間步長設置得太小比如time_step3模型學到的最優(yōu)策略就是“預測值約等于上一個時刻的值”因為股票價格本身有強自相關性。MSE會因為這個滯后而顯得很小但這并不是有意義的預測。解決至少把時間步長設置到10以上同時計算誤差時對比滯后0步、1步、2步的MSE如果滯后1步的MSE反而更小說明預測沒有實際價值。作業(yè)答辯時可以主動提這個問題并展示你用時間步長15以上的結果老師會認為你理解了模型的局限。5.5 TensorFlow版本兼容性安裝即報float錯誤現(xiàn)象按README裝完依賴import tensorflow時報module numpy has no attribute float。原因numpy在1.24版本移除了float別名而老版本TensorFlow2.6及以下的代碼還在用np.float。這是Python生態(tài)里典型的版本漂移問題跟你的代碼邏輯無關。解決固定版本安裝pip install numpy1.21.0 tensorflow2.7.0。如果你裝的是TensorFlow 2.10以上numpy可以用1.23.x。檢查順序是先看numpy.__version__再看tf.__version__確認這兩個版本匹配再跑腳本。6. 效果驗證與進階技巧讓預測結果更可信6.1 用滾動預測代替一次性測試集源碼默認的評估方式是把數(shù)據(jù)尾部一段作為測試集一次性輸入所有歷史時間步得到預測值。這在單步預測里其實偏樂觀。更貼近真實場景的做法是滾動預測每次只預測未來一天然后把真實觀測值加入窗口繼續(xù)預測下一天。這樣更接近實盤中的操作邏輯因為實盤里每一天都能拿到真實價格。def rolling_predict(model, initial_seq, scaler, n_steps): current_seq initial_seq.copy() preds [] for _ in range(n_steps): # 輸入形狀: [1, time_step, 1] cur_input current_seq[-time_step:].reshape(1, time_step, 1) pred model.predict(cur_input, verbose0)[0, 0] preds.append(pred) # 把預測值滾動進窗口丟掉最早一天 current_seq np.append(current_seq, pred) return scaler.inverse_transform(np.array(preds).reshape(-1, 1)).flatten()這段代碼的價值在于驗證模型的“自反饋穩(wěn)定性”。如果滾動多步后預測曲線發(fā)散成直線或指數(shù)曲線說明模型對自身輸出的誤差沒有魯棒性實際部署價值存疑。期末作業(yè)里加上這段代碼比單次預測的對比圖更有說服力。6.2 維度對齊檢查訓練前打印shape是唯一后悔藥我復現(xiàn)源碼的習慣是在任何訓練開始之前強制打印X_train、y_train、X_val、y_val的shape并且心里先算出預期值再對比。這個習慣救了我太多次print(fX_train: {X_train.shape}, y_train: {y_train.shape}) print(fX_val: {X_val.shape}, y_val: {y_val.shape}) print(ftime_step: {time_step}, hidden: {hidden_units})一旦看到y(tǒng)_train是一維而LSTM輸出是二維或者X_train少了一維當場就能定位是滑窗還是reshape的問題。等訓練跑到一半再報維度錯浪費的十分鐘足以讓你懷疑人生。6.3 怎么證明PSO真的比手動調(diào)參強作業(yè)答辯時最容易被問到的問題就是“你怎么證明PSO找的參數(shù)比你自己試的好”準備一個參數(shù)對比表就能回答固定同一個數(shù)據(jù)集和同一次數(shù)據(jù)劃分跑三組實驗。第一組用PSO找出的最優(yōu)參數(shù)第二組用隨機網(wǎng)格搜索的參數(shù)第三組用你手動估的參數(shù)每組記錄驗證集MSE和訓練耗時。三行數(shù)據(jù)擺出來PSO的優(yōu)勢和成本一目了然。另外保留PSO每一代gbest的MSE曲線畫成折線圖放進PPT展示收斂過程。如果曲線在大約第6次迭代后趨于平緩說明收斂正常如果是斷崖式下降說明初始粒子質(zhì)量太差需要擴大粒子數(shù)。我從拿到這份源碼第一次跑通到把它改成多數(shù)據(jù)集批量預測踩過最深的坑就是把scaler在測試集上重新fit畫出來的預測曲線和真實價格差了兩個數(shù)量級卻愣是查了半天沒找到原因。從那以后我每次復現(xiàn)這類預測源碼都強制走一遍流程——先打印shape再確認scaler復用最后用滾動預測驗證穩(wěn)定性三步走完才敢說這個模型真的能用來做實驗。希望幫到你。本文還有配套的精品資源點擊獲取