深度学习训练中噪声减小吗_【机器学习 155】DoubleEnsemble
更新:根據(jù)大家評論區(qū)和私信的反饋,我們把文章重新更新了一版在 arxiv 上。這次更新主要修改了方法部分的敘述和其他一些typos。歡迎大家圍觀~
相信關注我專欄的也有很多對于金融感興趣的同學,這里給大家?guī)硪粋€我們將要發(fā)表在 ICDM-20(CCF-B)上的一篇關于金融預測模型的文章。本文介紹了一種新的預測模型 DoubleEnsemble,該模型在我們實際的應用(不僅僅是金融方面)中有較好的效果。
原文傳送門
DoubleEnsemble: A New Ensemble Method Based on Sample Reweighting and Feature Selection for Financial Data Analysis. Chuhang Zhang, Yuanqi Li, Xi Chen, Yifei Jin, Pingzhong Tang, Jian Li. The IEEE International Conference on Data Mining (ICDM 2020).
特色
金融上的問題具有高噪聲、可預測性較弱等特點,因此很多目前在圖像、自然語言等方面效果較好的方法在金融數(shù)據(jù)的分析和預測上都很難取得令人滿意的效果。我們從機器學習的角度,提出使用集成模型方法(ensemble)解決這樣的問題。在機器學習領域,集成模型的方法具有對于噪聲穩(wěn)定、不易于過擬合、相對于基模型有更強的模型容量等特點。我們的模型是基于金融中的多因子模型,該模型比較貼近機器學習里面的有監(jiān)督學習(即,抽取大量的特征和標簽,然后擬合訓練數(shù)據(jù)集);現(xiàn)在業(yè)界很多公司都自己做了大量的因子,其中包含很有效的因子,當然也包含大量無效的因子。
我們?yōu)樯督o模型起名叫做 DoubleEnsemble 呢?把輸入數(shù)據(jù) X 看做一個矩陣,其每一行代表一個樣本,每一列代表一個特征。以往的一些集成模型方法有在這兩個維度上來采樣或者加權來構建每個子模型:比如 bagging 類方法會在構建子模型的時候隨機采樣若干“行”;而 GBDT 類模型在構建子模型的時候會隨機采樣若干“列”(比如 XGBoost 里面的 colsample_byxxx)。我們的集成模型在構建每個子模型的時候不僅給不同的“行”分配不同的權重,并且也隨機篩選出不同的“列”;并且,我們的篩選/加權是基于各個特征/樣本在訓練中的表現(xiàn)來進行的,這種方式能夠更有效地保留重要的特征/減小噪聲樣本的權重。
我們文章中的實驗包含了在股票市場上的一個日/周頻預測問題和在數(shù)字貨幣市場上的一個高頻預測問題。根據(jù)我們的回測結果,我們的模型在股票市場中年化和夏普分別能達到 51.37% 和 4.941;在數(shù)字貨幣市場中未來 20s 方向預測在平均約 30s 出一個信號的情況下,準確性能達到 62.87%。值得一提的是,我們的股票回測系統(tǒng)是經(jīng)過實盤實戰(zhàn)檢驗的,在日頻交易下能夠很好地貼近實盤結果。
內容
一、金融預測中面臨的問題
- 問題本身難預測:金融里面有一個很著名的有效市場假說,講的就是市場上的價格已經(jīng)綜合反映了各方面的信息,不可能找到一個投資策略持續(xù)地比市場平均水平表現(xiàn)得好。可以對比一下機器學習的其他領域,比如圖像和自然語言領域,人類(已經(jīng)有非常高的智能了)很快就能得到準確的結果;但在金融領域,市場上很多有經(jīng)驗的交易員仍然也較難對于金融市場有準確的預測。這暗示著金融里面的預測,本身就是比目前機器學習所面臨問題更困難的問題。不過我們相信,市場上仍然存在著系統(tǒng)性不有效定價,即仍然存在著預測和盈利的空間。
- 高噪聲、高波動:可以從兩個角度來看到噪聲問題:一方面,市場的參與者魚龍混雜,大家都有不一樣的背景,因此可能做出各種各樣的行為來影響市場;另外一方面,我們傳遞給模型的信息并十分全面,有一些隱含的能夠影響價格的信息我們并沒有囊括進來,因此在模型看來,這些隱變量所帶來的影響也是不可預測的噪聲。對于后一個方面,也應該盡量努力去把更多的因素囊括進入模型中來;在多因子模型中,這是“造因子”的工作,不在本文的討論范圍內。
- 大量可能無效的因子:多因子模型中的因子,就等價于有監(jiān)督學習模型中的特征。雖然本文不討論如何造出有效的因子,但是目前在工業(yè)界中,各個公司都有大量的因子,這都是研究員們常年累月積累下來的。因子的數(shù)量一般少則成百、多則上千。這些因子中會有大量的無效因子,盡管因子被加入因子庫的時候都有證據(jù)表明他們可能是有效的;這也意味在在市場環(huán)境發(fā)生變化的時候,它們可能又重新起到相應的效果,因此我們也不太好直接把它們刪去。
二、模型
集成模型
首先,我們的目標是訓練一個等權的集成模型
第 k 個子模型的訓練都會基于輸入數(shù)據(jù)
,標簽 ,權重 和相應篩選出來的特征 。子模型可以為深度學習模型(這里用的 MLP),也可以是決策樹模型(這里用的 GBDT/XGBoost)。每個子模型的樣本權重和特征會基于數(shù)據(jù)在前面子模型中的訓練情況,我們用訓練中的 loss curve 和總體 loss 來表征其訓練情況,其中 表示在加上第 k 個子模型后,集成模型在第 i 個樣本上的損失函數(shù)值; 表示在第 k 個子模型訓練過程中,第 i 個樣本的 loss curve (即,訓練了 T 輪)。我們的模型大致框架如下圖所示:對于第一個子模型,我們用相等權重的樣本和所有的特征;對于后續(xù)的子模型,我們會基于前一個子模型的訓練來分配新的樣本權重(sample reweighting,SR)和篩選特征(feature selection,FS)。
Sample Reweighting
樣本重賦權的方法這里用 pythonic 的偽代碼寫出來,更具體的數(shù)學定義可以參考原文。
def SR(C, L, k, alpha1=1, alpha2=1, B=10, gamma=0.9, EPS=0.1):# coefficients: alpha1, alpha2# #bins: B# self-paced factor: gamma# pandas style rank, with axis=0, ascending=True, pct=True# C.shape = (N, T)C = rank(C) # L.shape = (N, 1)L = rank(L) # h.shape = (N, 1)h = alpha1 * (-L) + alpha2 * rank(mean(C[-int(T/10):, :], axis=1) / mean(C[:int(T/10), :], axis=1))h = rank(h)# h_bin_values.shape = (B, ); h_bin_indices.shape = (N, )h_bin_values, h_bin_indices = bin(h)w = empty(shape=(N, ))for i in range(N):w[i] = 1 / ( gamma ** k * h_bin_values[h_bin_indices[i]] + EPS)return w那么為什么要這樣做呢?
大致思想是想通過對于樣本重新賦權,盡可能減小噪聲樣本的權重,并且增大比較困難樣本的權重。噪聲樣本指的是標簽比較隨機的樣本;困難的樣本指的是特別貼近決策面的樣本,如果決策面沒有擬合地特別好,這些樣本就可能被分到錯誤的類別里面,因而容易產(chǎn)生較大的損失。降低噪聲樣本權重能夠幫助提高模型穩(wěn)定性;增大困難樣本權重能夠幫助模型去學習更”深層次“的規(guī)律,從而提高整體預測正確率。但是這兩者又很難被分開(因為一般都產(chǎn)生較大的 loss);我們觀察到這兩類樣本的訓練 loss curve 有著不一樣的特征,因此設計了這樣的算法把它們區(qū)分開。它們的訓練特征可以通過下面這個例子看到。
Feature Selection
篩選特征的方法用 pythonic 偽代碼可以如下寫出,具體的準確數(shù)學表達形式請大家參考原文。
def FS(Mbar, X, y, D=5, r=[0.8, 0.7, 0.6, 0.5, 0.4]):# previous ensemble model: Mbar# training data: (X, y)# #bins: D# sample ratio for each bin: ry_pred = Mbar(X)# L.shape = (N, )L = loss(y_pred, y)g = empty(shape=(F, ))for f in range(F):# shuffle the value of the f-th column in XXf = shuffle(X, column=f)y_pred = Mbar(Xf)Lf = loss(y_pred, y)g[f] = mean(Lf - L) / std(Lf - L)# g_bin_values.shape = (D, ); g_bin_indices.shape = (F, )g_bin_values, g_bin_indices = bin(g)features = []for d in range(D):# see also docs for numpy argwhere and choiceindices = argwhere(g_bin_indices == d)nums = len(indices)features.append(choice(indices, int(nums * r[d])))return features那么為什么要這樣做呢?
這里的目標是以更高的概率篩選出來對于模型準確率貢獻較高的特征。這個目標要求我們不能只是對于每個特征來單獨衡量其有效性,而是要衡量特征對于集成模型整體的有效性;整體有效性的衡量最直接的形式是“剔除”,然而對于已經(jīng)訓練好的模型來說,沒有辦法直接把某個特征去掉(比如,深度學習模型訓練好之后就只能接收固定維度的數(shù)據(jù)輸入了,如果輸入維度減小,壓根沒辦法輸入模型)??紤]到這個問題,一個簡單的解決方法是對于要“剔除”的特征各個全部置零,但是這種操作使得模型很大程度上直接崩潰(因為訓練的時候可能壓根沒見過這個維度上為零的數(shù)據(jù),這種分布的不匹配可能使得模型直接失效)。我們這里采用了一個比較巧妙的辦法:把要“剔除”的這個特征的各個維度隨機打亂,這樣既保留了相應的分布,但是又“隱藏”了這個特征所能提供的信息量。這樣算出來的 g 反映了相應特征對于模型貢獻的顯著性,接下來我們根據(jù)其顯著性來篩選因子,即顯著性高的因子盡可能多地采樣。
同時,我們觀察到,在 SR 過程中,我們計算了 h;在 FS 過程中,我們計算了 g。接下來,我們都對其進行了離散化到不同的 bin 后再處理;實驗中我們發(fā)現(xiàn)這種方法能夠有效減小 outlier 和 noise 的不良影響。畢竟,在金融應用中,我們寫模型的時候頭腦中得時時刻刻都需要想到:要 robust 要 robust = =。
三、實驗
數(shù)字貨幣預測
- 交易所:OKEx
- 交易特征:24 小時不間斷
- 標的:ETC/BTC, ETH/BTC, GAS/BTC and LTC/BTC
- 數(shù)據(jù)頻率:每 0.3 秒一個市場快照
- 訓練數(shù)據(jù)集:10 天(約 3M 個樣本點)
- 測試數(shù)據(jù)集:訓練數(shù)據(jù)其后的 5 天
- 特征:常見的公開因子(比如 OFI、RSI 等)
- 衡量指標:ACC(precision when top 1% retrieved), AUC, F1, PCT (backtest result: average profit in one trading day)
- 手續(xù)費和滑點:千分之二(數(shù)字貨幣交易所手續(xù)費通常比股票市場更低)
股票預測
- 股票池:A 股市場
- 交易頻率:日頻和周頻
- 交易策略:每天做多前 20 支(日頻)或者 10 支(周頻)股票;這里為了貼近中國市場行情,沒有做空策略
- 持倉股票數(shù):大多是時刻持倉 20 支(日頻)或者 50 支(周頻)
- 持倉方式:等權
- 因子池:兩組不同的私有因子池,分別適用于日頻和周頻,因子數(shù)量分別為 182 和 254;因子包括價量因子和基本面因子
- 回測形式:滾動訓練,即每周使用最近 500 個交易日(兩年)的數(shù)據(jù)重新訓練模型
- 衡量指標:年化收益、夏普比率、最大回撤、信息比率
- 手續(xù)費和滑點:千分之三
在實際應用中,在除了金融以外的其他領域我們也在使用這個模型,并且也取得了不錯的效果。
總結
以上是生活随笔為你收集整理的深度学习训练中噪声减小吗_【机器学习 155】DoubleEnsemble的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邀请参加活动的邀请函_圣诞节点灯仪式活动
- 下一篇: eta 深度学习 参数_深度学习中的参数