張喬夫,何文明
(嶺南師范學院數(shù)學與統(tǒng)計學院,湛江524048)
股票價格等金融時間序列受貨幣政策、公司盈利能力、突發(fā)事件和群體博弈心理等諸多因素影響,總體近似于隨機波動,部分時間又有顯著的羊群效應。挖掘金融時間序列相似性,可在量化交易中取得超額收益[1]。
簡單移動平均(Simple Moving Average,SMA)是等權重的,周期較短時所得序列不夠光滑。指數(shù)移動平均(Exponential Moving Average,EMA)通過對時間較遠的數(shù)據(jù)賦予較小的權重,對較近的樣本賦予較大的權重,從而在平滑原始時間序列的同時保留重要信息[2]。EMA 是 MACD(Moving Average Convergence Divergence)和TRIX(Triple Exponential Moving Average)等技術指標的基礎。MACD 相關交易策略已有較多成果[3],而TRIX 的研究相對較少。TRIX 連續(xù)使用三次EMA,因此比較光滑,便于求導(價格上漲速度)。
在計算序列相似性時,經(jīng)典的Euclid 距離難以處理平移誤差。動態(tài)時間彎曲(Dynamic Time Warping,DTW)容許時間軸上的輕微扭曲,已成功應用于:手勢識別[4]和語音識別[5]等領域。DTW 可以比較非等長序列,并轉化為動態(tài)規(guī)劃問題精確求解。原始算法存在兩個問題:畸變可能較大,搜索空間大導致處理大數(shù)據(jù)時速度較慢。使用Keogh 下界[6]可以限制搜索范圍并顯著提高運算速度,此方法是精確無損的。其他加速方法還有:分片線性逼近[7]、自適應分段逼近[8]、主成分分析[9]和小波變換[10]等。其主要思想是對數(shù)據(jù)進行某種擬合,犧牲少量精度,降低運算復雜度。
本文使用了導數(shù)動態(tài)時間彎曲(Derivative Dynamic Time Warping,DDTW)[7]和 加 權 動 態(tài) 時 間 彎 曲(Weighted Dynamic Time Warping,WDTW)[11]。距離中包含導數(shù)信息,近似于要求兩個序列的導數(shù)也比較接近,因此可以減輕彎曲路徑的畸變。時間較近的數(shù)據(jù)對預測影響更大,因此對時間加權也是一種正則化方法。
K 最近鄰(k-Nearest Neighbor,KNN)是模式識別中的一種經(jīng)典算法。某些情況下,距離加權KNN 優(yōu)于等權重的KNN[12]。
本文主要內容如下:
(1)使用三重指數(shù)平滑(TRIX 周期=10)對金融時間序列進行去噪。
(2)識別平滑后序列的高低點,計算上漲(下跌)周期長度。初步選出平均盈利較高的樣本,同時大幅壓縮樣本量。
(3)計算每個樣本與高盈利樣本之間的DTW 距離。距離較近時買入,TRIX 上漲周期結束時賣出。
(4)分別對原始序列和平滑序列計算零階到二階導數(shù),根據(jù)時間先后賦予不同權重。
(5)最后比較了平滑次數(shù)、KNN 權重和樣本長度對收益的影響。
為了降低數(shù)據(jù)噪聲,首先給出EMA 和TRIX 算法,利用TRIX 識別漲跌周期。
金融時間序列中最常用的預處理方法是移動平均,但均線序列拐點較多,不利于識別周期。均線頻繁的變動方向,意味著價格沒有明顯的趨勢。此時無論做多還是做空,收益較小,甚至可能虧損。為便于機器自動識別周期,本文將使用TRIX 指標。
簡而言之,EMA 是加權平均一次,TRIX 是EMA三次再求導。文末的實驗結果將說明平滑次數(shù)越多,所得交易策略的平均收益越高。
算法1 EMA 算法
輸入:時間序列{xi},周期常數(shù)P。
輸出:指數(shù)平滑后的等長度序列{emai}。
for 0<=i emai=nan; emaP-1=mean(x0,…xP-1); for i>=P emai=a*xi+(1-a)*emai-1; 其中a=2/(P+1)。 前P-1 個EMA 值可以用簡單平均代替,此處和著名技術指標庫TA-Lib 的算法保持一致。TA-Lib 中也包含了TRIX 函數(shù),然而為了說明平滑次數(shù)的作用,本文也對TRIX 的中間狀態(tài)值進行了DTW 計算。 算法2 TRIX 算法 輸入:時間序列{xi},周期常數(shù)P。 輸出:3 個等 長 度的 平 滑 序列{ema0i},{ema1i},{ema2i}和1 個導數(shù)序列{trixi}。 {ema0i}=EMA({xi},P); {ema1i}=EMA({ema0i},P); {ema2i}=EMA({ema1i},P); for i>3*P+1 trixi=ema2i/ema2i-1-1; 如前所述,我們將識別出TRIX 序列的拐點,僅在拐點處交易。這樣可以大幅減少判斷次數(shù),減輕后面DTW 的計算負擔。 算法3 TRIX 周期交易算法 輸入:時間序列{xi},周期常數(shù)P; 輸出:標記當前點是否屬于有效局部極值,是否滿足買入賣出條件,滿足條件時記錄收益率。 計算TRIX 序列{trixi}; if(trixi-1>trixi-2and trixi-1>trixi) i-1 標記為局部高點high_loc; if(trixi-1 i-1 標記為局部低點low_loc; if(當前持股數(shù)量>0 and trixi 賣出,持股數(shù)量=0,計算本次交易盈虧; if(當前持股數(shù)量=0 and i-1 是局部低點and 2 10 < high_loc- pre_low_loc and 10 < pre_low_locpre_high_loc) 買入,持股數(shù)量=1; 其中pre_low_loc 指{low_loc}序列中l(wèi)ow_loc=(i-1)之前的那一個低點;pre_high_loc 類似。 從幾何角度理解,高低點依次出現(xiàn):pre_high_loc DTW 算法在各類文獻中已經(jīng)描述較多。相比標準流程,本文有三處簡化: (1)只計算距離,不存儲彎曲路徑; (2)限制最大彎曲,即max|i-j|<=round(0.1*數(shù)據(jù)長度); (3)只計算兩個等長度序列的DTW 距離。 簡化會帶來一些誤差(非隨機),但量化交易對精度要求不高,允許少量誤判(中長期策略的勝率一般小于70%)。下文的模擬收益也可說明簡化的合理性。因為要在收盤前1 分鐘內調用幾萬次DTW 函數(shù),簡化后的運算速度才能滿足實戰(zhàn)要求。 算法4 Weighted Derivative 距離算法 輸入:時間序列{xi},{yj}。 輸出:任意兩點xi和yj的距離。 一階差分dx={0},二階差分d2x={0}; for i>=1 dxi=xi-xi-1; for i>=1 d2xi=dxi-dxi-1; 一階差分dy 和二階差分d2y 類似可得; weight(i,j)=1 or(i+j)or sqrt(i+j); 零階距離=weight(i,j)*|xi-yj|; 一階距離=weight(i,j)*sqrt(|xi-yj|2+|dxi-dyj|2); 二階距離=weight(i,j)* sqrt(|xi- yj|2+ |dxi- dyj|2+|d2xi-d2yj|2)。 權重函數(shù)要保證i 和j 互換之后不變,即weight(i,j)=weight(j,i)。通常距離越近的數(shù)據(jù),對當前交易決策的影響越大。故選用的權重函數(shù)是單調遞增的。 文末數(shù)值實驗將分別針對原始序列、一次EMA、二次EMA、三次EMA 和TRIX 總計5 種序列計算DTW 距離。為了方便并行處理,將時間序列填充為矩陣,每行代表一個序列,最后一列表示各行對應的買點。由于金融時間序列的特殊性,序列中的值必須可在交易之前觀察到。另設一個向量存儲每行對應的收益率。 定義距離之后,就可以計算與歷史上全體高收益樣本之間的相似性。每個樣本與多個參考樣本比較,產(chǎn)生多個距離,需要合成為單一評價指標。此處采用三種方法:中位數(shù)(Median)、收益率加權平均(WKNN)和最小值(1NN)。 算法5 加權KNN 算法 輸入:時間序列矩陣X,每行對應收益率earn,KNN 的K 值。 輸出:每行序列是否值得買入。 對時間上已發(fā)生序列的收益率進行排序,取最大的K 個樣本; 計算當前序列到這K 個樣本的DTW 距離; 每個高收益樣本的修正權重=min(max(1/earn,0),1); 當前序列的綜合打分=sumK(權重*到第k 個樣本的DTW 距離); 綜合打分小于20%分位值時,買入。 第k 個樣本的收益率越高且DTW 距離越小,相似度越高,權重應該越大,故收益率取倒數(shù)。 最近十年(2009-01-01 至2019-07-09)A 股每日收盤價數(shù)據(jù)總量約為620 萬股*天。使用算法3,得到交易樣本數(shù)18055,平均收益2.02%。盈虧比約為1.9,勝率僅為40%。較低的準確率從側面說明,在金融時間序列中使用動態(tài)時間彎曲時,采用有少量誤差的簡化是可以接受的。 由于運算速度限制,后續(xù)數(shù)值實驗均在此數(shù)據(jù)集上進行。為方便比較,KNN 中的K 統(tǒng)一等于10。 實驗結論一:指數(shù)平滑次數(shù)與平均收益率正相關。原因可能是越平滑,噪聲越小,DTW 的畸變越小。 令DTW 中時間權重weight(i,j)=1,不計算DTW的導數(shù),觀察序列長度=50。表中收益率均代表18055*20%=3611 個樣本。 表1 指數(shù)平滑次數(shù)與收益率關系 實驗結論二:時間序列長度在50 附近時,平均收益率最高。 取weight(i,j)=1,不計算DTW 的導數(shù)。由表1 可知,TRIX+WKNN 收益顯著高于其他情況。故表2 僅羅列了TRIX 的表現(xiàn)。 表2 時間序列長度與收益率關系 實驗結論三:權重等于1 的短序列與權重逐漸增加的長序列相比,平均收益率類似。因為權重函數(shù)(i+j)和sqrt(i+j)在序列開頭約等于零,這一部分數(shù)據(jù)作用較小。對于一般的DTW 算法,縮短序列長度可顯著加快運算速度。此結論比較符合直覺,故不再羅列相關數(shù)據(jù)。 實驗結論四:DTW 距離中增加導數(shù)對收益貢獻不大。原因可能在于:①TRIX 自身包含了導數(shù),②本文采用簡化的DTW,嚴格限制了max|i-j| 令觀察長度=50,只考慮TRIX 的DTW 距離,可得表3。 表3 求導次數(shù)與收益率關系 本文組合了三重指數(shù)平滑、漲跌周期識別、動態(tài)時間彎曲和加權KNN 等幾種技巧,充分挖掘金融時間序列的歷史相似性,提高了平均收益率。 下一步可嘗試以下幾個改進方案: (1)使用小波變換、卡爾曼濾波等代替三重指數(shù)平滑; (2)跳過周期識別這一步,直接以歷史上全體高收益樣本作為模板來判斷是否買入,建立典型樣本庫; (3)使用深度學習模擬動態(tài)時間彎曲,加快計算速度,同時挖掘更多隱含特征; (4)金融時間序列具有多重分形特征,日線樣本與分鐘樣本具有相似性,進行跨時間尺度的距離計算; (5)增加持倉量、成交量和概念板塊等指標,使用期貨和外匯等其他市場數(shù)據(jù)驗證。2 模擬交易結果
3 結語