呂逸鵬,林旭東
(華南農(nóng)業(yè)大學(xué)數(shù)學(xué)與信息學(xué)院,廣東廣州 510642)
豬肉是我國居民餐桌上的主要肉食來源,2006 年我國豬肉產(chǎn)量已達5 197.2 萬t[1]。受“非洲豬瘟”影響,2019 年12 月我國豬肉月均價格相比于2019 年1 月上漲了172.42%。據(jù)學(xué)者統(tǒng)計,不僅玉米價格、仔豬價格、“豬周期”、存欄量等因素會影響生豬價格[2-5],疫情也會長期影響生豬價格[6]。如果可以預(yù)測未來生豬價格,那么企業(yè)可以在未來價格過低時減少生豬存欄量,降低虧損,在未來價格處于較高區(qū)間時提前擴大生產(chǎn),創(chuàng)造更多盈利。
目前眾多學(xué)者常采用價格分解、經(jīng)驗?zāi)B(tài)分解、反向傳播神經(jīng)網(wǎng)絡(luò)(BPNN)、支持向量機(SVM)、灰度模型、ARIMA 模型和向量自回歸模型等深度學(xué)習(xí)和機器學(xué)習(xí)算法進行生豬價格預(yù)測、風(fēng)險預(yù)警、走勢分析和波動分析等研究[7-14]。較為典型的方法是使用經(jīng)驗?zāi)B(tài)分解將價格序列分解成不同頻率,再逐個使用SVM 或神經(jīng)網(wǎng)絡(luò)算法分別進行預(yù)測[15]。另一種是使用多元回歸的方法,研究影響豬肉價格的因素,再用BP 神經(jīng)網(wǎng)絡(luò)進行預(yù)測[16]。有學(xué)者使用SVM_AdaBoost 組合模型預(yù)測股票漲跌,這對本文的漲跌分類起到了啟示作用[17]。本文在研究和預(yù)測生豬價格時發(fā)現(xiàn),不同樣本類型的預(yù)測誤差是不一致的,如果將樣本分成上漲樣本和下跌樣本,再分別進行預(yù)測,可以提高模型的效果,降低預(yù)測的誤差。于是本文提出了一種基于分類模型的預(yù)測方法,利用單類樣本預(yù)測誤差更低這一特點,將所有樣本分為下月上漲和下跌2 類,在進行生豬價格預(yù)測前,先根據(jù)日度價格數(shù)據(jù)計算出需要用于漲跌分類的各項特征,研究并提出了使用BP 神經(jīng)網(wǎng)絡(luò)和Xgboost 組合的分類模型,最后根據(jù)分類結(jié)果使用不同的多元回歸模型得到生豬價格的預(yù)測值,以期為生豬企業(yè)的布局與調(diào)整提供參考。
1.1 數(shù)據(jù)來源和預(yù)處理 本文用于生豬價格預(yù)測的數(shù)據(jù)是由中國南方某養(yǎng)殖企業(yè)提供的從2000 年7 月1 日—2015 年11 月30 日每天的銷售額和銷售總重量。據(jù)此計算出每月的月初價格、最大值、最小值、月末價格和月平均價格,共計185 條數(shù)據(jù),在此基礎(chǔ)上畫出K 線圖,如圖1 所示。本文根據(jù)K 線圖進行上漲和下跌樣本的標注,并定義將下月價格上漲的樣本歸類為漲樣本,下月價格下跌的樣本歸類為跌樣本。
圖1 生豬月度價格數(shù)據(jù)K 線圖
1.2 用于漲跌分類的特征因子 樣本的分類預(yù)測是整個模型的核心部分,預(yù)測樣本類型的準確度直接關(guān)系到下一步生豬價格預(yù)測的誤差。本文通過對比股票的漲跌相關(guān)的特點,定義了以下因素作為分類模型的候選輸入特征:PMi 為第i 個月的月均價格(i=1,2,3,...,184),PD(i,j)為第i 月第j 天的日價格(j=1,2,...,30),PDi 為第i 個月最后一天的日價格,PM(max)、PM(min)為近18 個月里的最大值與最小值,PD(max)、PD(min)為近30 d 內(nèi)最大值與最小值。于是第i 個月有以下指標:
其中,MD9 表示的是前8 個月和當月的MK18 的分子之和,再除以前8 個月和當月的MK18 分母之和。DD15i中n 的值為第i 個月的天數(shù),例如當i=2 時,n=28。其中的指示價值在于當MK18 值處于MD9 值上方時,價格一般為上漲趨勢,反之則為下跌,于是就有:
另外,本文還定義了以5 d 為單位的五日均值,1個月取6 個值,體現(xiàn)了第i 個月價格數(shù)據(jù)的滑動特征,以第1 個5 d 均值A(chǔ)VG1 為例,計算如下:
再加入月初價格和月末價格,就得到全部14 項輸入特征,但只需選擇其中較為重要的某些特征。本文特征因子篩選是根據(jù)Xgboost 模型中的每個因子得分的高低進行選擇。此算法源自陳天奇博士論文[18],在創(chuàng)建決策樹時,模型能根據(jù)創(chuàng)建時所用到的數(shù)據(jù)集中的因子,通過每個因子在分裂點改進性能的多少來計算因子的得分。將14 項特征因子輸入Xgboost 模型中,得到的因子重要程度得分如圖2 所示,根據(jù)Xgboost 模型的結(jié)果,選擇了MK18、AVG1、MD9、MKD、DK30、DD15、DKD、AVG2 作為分類模型的輸入特征,進行生豬價格漲跌分類。
圖2 各因子重要程度得分
1.3 多種分類算法結(jié)構(gòu)設(shè)計 本文從常用的分類算法模型中挑選了在同一樣本集中不同類別的分類正確率差異較大的3 種算法進行漲跌分類,即SVM 模型、Xgboost模型和BP 神經(jīng)網(wǎng)絡(luò)模型。SVM 分類算法是一種尋找怎樣劃分超平面可以使得樣本劃分的間隔最大的方法,本文使用高斯核函數(shù)對兩類樣本進行軟間隔分類,懲罰系數(shù)C 為1.0。
Xgboost 算法采用一種類似貪婪的算法構(gòu)建每一棵決策樹,當構(gòu)建一顆決策樹的時候,首先需要滿足新樹構(gòu)造后會使整個模型的熵在當前狀態(tài)下最低,然后還要滿足用戶設(shè)定的閾值才能構(gòu)建,而每棵樹的葉子節(jié)點是該節(jié)點所對應(yīng)的分數(shù),模型的輸出結(jié)果是所有葉子節(jié)點的得分值之和。本文使用1.2 中篩選出的8 個特征因子作為模型的輸入,其他參數(shù)采用交叉驗證法,調(diào)整至最優(yōu)狀態(tài)。
BP 神經(jīng)網(wǎng)絡(luò)模型是通過一種有監(jiān)督的學(xué)習(xí)方式,訓(xùn)練樣本通過輸入層進入網(wǎng)絡(luò),與網(wǎng)絡(luò)中的權(quán)值進行運算,通過激活函數(shù)進入下一層,直到通過最后一層的激活函數(shù),此時的輸出才是網(wǎng)絡(luò)的結(jié)果??紤]到輸入特征維度為8,需將樣本分為2 類,且樣本數(shù)據(jù)不到兩百條,所以在網(wǎng)絡(luò)結(jié)構(gòu)和輸出層神經(jīng)元數(shù)量的選擇上,本文進行了多次嘗試。最后確定網(wǎng)絡(luò)為單隱層結(jié)構(gòu),其輸入層為8 個神經(jīng)元,隱層為10 個神經(jīng)元,輸出層為2 個神經(jīng)元,并引入動量因子對網(wǎng)絡(luò)的反向傳播過程進行優(yōu)化。首先向輸入層輸入8 維的特征向量,與隱層的權(quán)值矩陣相乘通過sigmoid 激活函數(shù)得到隱層的輸出值,再與輸出層的權(quán)值矩陣相乘通過sigmoid 激活函數(shù)得到2 個輸出,此時輸出層的誤差為E_output,隱層誤差為E_hidden。
其中,pk為輸出層第k 個神經(jīng)元的輸出值,aj為隱層第j 個神經(jīng)元的輸出值,W(j,k)為隱層第j 個神經(jīng)元對應(yīng)第k 個輸出層神經(jīng)元的權(quán)值。更新網(wǎng)絡(luò)權(quán)值時,按照0.1的學(xué)習(xí)率α和0.01 的動量系數(shù)β更新各層權(quán)值。
其中,W(i,j)為輸入層第i 個神經(jīng)元對應(yīng)第j 個隱層神經(jīng)元的權(quán)值,M1 和M2 的初值為全零矩陣,在權(quán)值更新時按照(10)和(11)同步更新。模型通過反復(fù)訓(xùn)練,最終確定下來的權(quán)值參數(shù)可以使得下次輸入樣本時能得到較高的準確率。本文最終使用的網(wǎng)絡(luò)結(jié)構(gòu)如圖3 所示。
圖3 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
經(jīng)多次實驗發(fā)現(xiàn),在輸入值一致的前提下,各算法模型分類成漲時的正確率與分類成跌時的正確率并不一致。于是本文提出了對2 個算法是漲跌分類正確率最高的那一類結(jié)果進行融合的模型組合方式。本文將單模型在漲和跌上的分類正確率作為實驗對照組,分別使用BPNN_SVM、BPNN_Xgboost 和Xgboost_SVM 3 種組合進行漲跌分類,2 種模型進行組合時先假設(shè)算法A 分類為跌的正確率大于分類為漲時的正確率,且綜合正確率大于算法B。如果算法B 分類為漲的正確率大于分類為跌的正確率,則組合后的分類結(jié)果為當算法B 分類為漲時該樣本為漲,其他樣本的結(jié)果與算法A 的分類結(jié)果一致;若算法B 分類為跌的正確率大于分類為漲時的正確率,則組合后的分類結(jié)果僅在2 個算法同時分類為漲時才為漲,其中任意一個算法分類為跌都是跌。
1.4 模型評價標準及實驗參數(shù) 本文將數(shù)據(jù)集分成訓(xùn)練集和測試集2 個部分,其中訓(xùn)練集為122 條數(shù)據(jù),測試集為37 條數(shù)據(jù)。本文對使用相同輸入的BP 神經(jīng)網(wǎng)絡(luò)模型和SVM 模型以及Xgboost 模型進行比較,再將其兩兩組合,選出綜合分類正確率最高的模型,并根據(jù)分類結(jié)果使用不同參數(shù)的多元回歸模型預(yù)測每月的價格。通過實驗摸索,最終確定以每月的月初價格、月末價格、最小值、最大值和月平均價格作為回歸模型的自變量,設(shè)計了回歸模型。再將先分類漲跌再進行預(yù)測的方法和不分類直接預(yù)測的方法進行對比實驗,以平均絕對百分比誤差(MAPE)作為模型的評價標準。
2.1 相同參數(shù)下各分類模型對比 由表1 可知,BP 神經(jīng)網(wǎng)絡(luò)和Xgboost 模型分類為跌的正確率相對較高,但是綜合正確率仍然只有90%左右。按照1.3 中兩兩組合的方式對各算法模型進行結(jié)合,結(jié)果如表2 所示,使用BP_Xgboost 算法的模型分類正確率不僅高于其余2 組,而且較單一模型而言,準確度也有提升。本文將各模型分類的具體值逐個比較后發(fā)現(xiàn),雖然BPNN 和Xgboost單模型分類成跌的正確率已經(jīng)很高,但這只能說明模型分類為跌時的可信度更高,但仍然存在跌樣本預(yù)測成漲的情況。采用以上組合模式,本質(zhì)上是使用BPNN 的結(jié)果對Xgboost 進行優(yōu)化。還可以將這種組合模式推廣到任意兩種算法的組合上。假設(shè)現(xiàn)有兩種算法,其中算法A 的綜合正確率大于算法B,如果考慮存在一種極端情況,即算法B 預(yù)測為漲的正確率是100%,但綜合正確率只有90%。意味著當算法B 預(yù)測結(jié)果為漲,則該樣本一定為漲,但存在漲樣本被預(yù)測成跌的情況,所以綜合正確率僅為90%。那么,從理論上講,在算法A的預(yù)測結(jié)果中,用算法B 預(yù)測為漲的結(jié)果覆蓋原算法A的結(jié)果。即可達到將算法A 中可能將漲樣本預(yù)測為跌的情況糾正過來,從而達到提高預(yù)測正確率的效果。
表1 各算法在不同分類上的正確率
2.2 先分類再預(yù)測與直接預(yù)測的方法對比 圖4 展示了2 種方法對生豬價格的預(yù)測效果。2 種方法的預(yù)測值在數(shù)值上雖然只有細微的差別,但從圖5 中發(fā)現(xiàn),先分類再預(yù)測的MAPE 比直接預(yù)測的MAPE 要低,而且圖中大部分節(jié)點的預(yù)測誤差都優(yōu)于直接分類的結(jié)果。
表2 各類算法兩兩組合的分類正確率
2.3 2019 年生豬全國參考價預(yù)測 本文從行情寶(http://hqb.nxin.com)上獲取了2019 年1 月—2019 年12 月的全國生豬參考價格的日度數(shù)據(jù),整理后得到11 個樣本。由于數(shù)據(jù)量太小,且大部分是上漲數(shù)據(jù),于是本文將整理后的樣本作為測試數(shù)據(jù),輸入2.2 中的上漲模型中。直接使用上漲模型的回歸參數(shù),得到了2019 年2 月—2019 年12 月的預(yù)測值,與真實值的對比結(jié)果如圖6 所示。在除去4 個月價格上漲幅度超過15%的異常情況后,模型預(yù)測得到的MAPE 為2.37%。模型的預(yù)測誤差在3%以內(nèi),說明模型可以適應(yīng)當前的市場環(huán)境,可用于一般情況的價格預(yù)測,在一定程度上能指導(dǎo)企業(yè)的生產(chǎn)活動。
本文提出了一種基于分類模型的生豬價格預(yù)測方法。在樣本分類階段,本文使用的BP 神經(jīng)網(wǎng)絡(luò)模型和Xgboost 模型兩者都在分類為跌樣本時有較高正確率,將兩者進行組合后整體的正確率提高,說明通過融合2個模型分類正確率最高的那一類的結(jié)果,可以提高組合模型的分類正確率。先分類再預(yù)測方法得到的MAPE為2.64%,而直接預(yù)測方法的MAPE 為2.90%,說明先將樣本進行漲跌分類,再對其進行預(yù)測,可以降低預(yù)測的誤差。從2019 年的預(yù)測結(jié)果來看,除去大幅上漲的異常情況,MAPE 在3%以內(nèi),說明本文所使用的方法可以適應(yīng)當前的市場環(huán)境。
但是生豬預(yù)測仍然存在一些問題,即預(yù)測誤差較大的節(jié)點往往是生豬價格發(fā)生轉(zhuǎn)折的附近。一般來說,價格預(yù)測在拐點處的誤差會相對較高,因為價格慣性會讓模型誤以為保持上次預(yù)測的趨勢,從而造成相反的結(jié)果,因此未來研究方向是如何確定價格序列中的拐點,進一步降低誤差。
圖5 2 種預(yù)測方式的MAPE 比較
圖6 全國生豬價格預(yù)測