當前位置:
首頁 > 最新 > 三萬字長文:從入門到精通,手把手教你在金融領域玩轉machine learning(上)

三萬字長文:從入門到精通,手把手教你在金融領域玩轉machine learning(上)

文 | 高能物理PHD潮汐智咖江海

來源 | 江海@知乎專欄

吶,當你們看到這麼搞個大新聞的題目的時候肯定內心的活動是這樣的。

但是我保證你們看完之後一定會變成 :

學習宏觀和machine learning之後發現這兩個真是天生一對,這也是我為什麼想要寫這篇文章。

接觸金融的這兩三年發現大家都喜歡吐槽宏觀報告,報告里一條條理由說的都對很有道理令人信服,但結論總是變成了random walk甚至反向指標。

我也一直覺得這個現象挺有意思,後來學了machine learning之後從統計的角度想了想可能是這個原因:

宏觀系統本身非常複雜,變數因子多,即使邏輯線以線性關係為主,但因子和因子之間互相還有correlation和dependence使其結構更加複雜,況且還有人這個非理性的參與者randomly影響,摻入了很多有內部結構的噪音。最重要的是因子的權重還是不斷動態變化的,即使報告里說的理由都是對的,但是如果並不是當下主要的driver因子,那結論也會是錯的。

大家都喜歡說趨勢和周期,但到底是個什麼沒人說得清楚。

我現在理解的趨勢只是一種市場運動的表象結果,深層原因是在趨勢背後的driver是各個不同因子的相互作用(說起來有點像我們高能物理里基本粒子之間的對撞interaction呢~)。長的趨勢有長的因子,短的趨勢有短因子。周期則是一個框架將無數因子進行分類和重組,長周期將長期的因子給於動態權重互相作用在一起組成長周期的系統,中短周期亦如是,然後在不同的時間跨度上共同描述我們的整個經濟機器的運行。宏觀是勢,微觀是機。

而且對於不同市場,因子也會不一樣。譬如國內股市散戶多,所以非常容易產生一些很神奇的事情,前幾天看了一篇文章就說比如股票分拆都可以算一個很強的因子,因為分拆之後價格變低而國內散戶多,大家都覺得低的價格會漲起來。這是很沒有根據的,公司的價值怎麼可能因為拆股了就市值翻了幾番,但是就是發生了。就是因為國內都是炒預期,並且大部分人由於不專業都是跟隨其他人,自然而然預期就很容易就成型,並硬生生產生了自我實現的趨勢。但是這個趨勢只是空中樓閣,並非真實存在的基本面變化。

這可能也是為什麼國內市場的波動大,波動大並非因為市場經常有分歧,反而是因為市場太容易形成趨勢,並且這個趨勢很容易就被證偽而戛然而止,所以形成的趨勢非常脆弱,一旦不能繼續維持之後就會反彈式向反方向運動,即強化版的反身性。

好的trader本身就一直在市場裡面,即使對長的宏觀因子不甚了解,但像A股這樣抓住短期市場情緒的driver因子也夠收益了。既能做好交易又能動態抓住長遠宏觀因子從而抓住大趨勢的人就簡直是鳳毛麟角了,一般也都直接去買方當大佬自己賺錢了。

當然,也不是說報告就不用看了,其實看報告是一個不斷豐富自己factor pool的過程,但是怎麼判斷其權重就得從平時對金融系統的觀察和思考裡面來了。

市場中每時每刻都有不同的聲音,大部分時候其實大家說的都有道理,並且都可以在教科書和歷史中找到對應,而最大的問題並非是判斷誰對誰錯,而是判斷當下甚至未來給予每個factor的權重是多少,和歷史的最大不同也並非是共有的ingredient不同,而是其配比不同,並且這個配比是動態變化的。我覺得這也是一個trader或者投資經理水平高低的決定性因素了。

分析師(特別是買方!)如果想要以後有更廣闊的空間不僅需要了解所有影響的因子,更需要掌握每個時段各個因子的權重,想要做好portfolio還是得對因子和市場同時都理解很深刻才行。

引用馬克思的一句話,"發展的觀點看問題,善抓主要矛盾」。

也正是因為金融市場因子繁多並且動態的特性,machine leaning作為一個分析工具更有用武之地,因為各種統計方法可以幫助我們篩選出因子,並且能給出這些因子的權重,幫助基金經理和fund做出更合理的決定。

並且我已經看到了一個趨勢,那就是隨著數據越來越多,machine learning之類工具的運用也越來越多,信息的處理速度也越來越快,之前可能需要花很長時間和人力去收集和分析出來的東西,也許現在就只是建個模run幾個參數就可以得到。

這樣的話市場的反應速度也會越來越快,以前傳統的方式因為結論總是滯後就越來越沒有價值,畢竟策略的時效性在金融市場是很重要的。對於個人而言,如果自己沒有相應對數據進行處理的能力(這裡不單單包括machine learning),那麼相對其他人的edge就會越來越被限制,直到被市場淘汰。

那也許就有人會問,以後是不是金融領域就全部招程序員和data scientist,不需要基金經理了呢?其實也不是,因為金融的核心還是對市場的intuition,處理數據的技術只是作為增加攻擊力的武器,如果僅僅單純依靠武器很容易傷到自己。想舞倚天劍屠龍刀,那也得有張無忌的內功才行對吧~

所以我覺得以後對portfolio manager的要求會越來越高,首先最重要的是具有傳統金融市場的intuition,同時還需要掌握怎樣用技術處理數據得到自己想要的信息(當然這部分其實也可以交給下面的quant去做,但至少需要了解大概是怎麼回事,也就是這篇文章科普的目的了)。

好了,講了這麼多,其實就是圍繞一個主題:這篇文章很重要!哈哈。

還有一件事,上次寫Macro入門的時候好多人吐槽中英文夾雜的問題。

說實話...我是故意的。

很多時候用中文很難準確表達一個英文的意思,硬翻譯過來反而讓理解更加困擾,至少不是那麼直觀。就拿物理來說,本科時候都是翻譯過來的中文教材,很多詞本來在英文裡面是非常易懂的,但翻譯成中文之後就完全搞不懂了。金融和統計也一樣,我希望盡量保留原汁原味的知識和這個英文單詞的語境。

而且英文這個東西的重要性我也不需要再複述,特別是現在競爭壓力最大金融和科技行業本身就是發源於英語國家,想要在激烈競爭中不落後與人,從英文學習到一手的信息是很重要的。如果永遠都只讀別人翻譯成中文的東西(還得依仗別人的心情和信達雅的文學程度),無端的增加了自己的學習難度,並且由於獲得的信息一直都是滯後的永遠都會處於信息上的劣勢。

鋪墊完背景,接下來就進入正題咯~

(本文分為三部分 )

一. 金融和統計背景介紹

二. machine learning各個方法和在trading上的應用

2.1 Supervised Learning: Regressions

2.2 Non-Parametric Regression: K-Nearest Neighbor and LOESS

2.3 Tree Based Method ( Random Forest 和 Extreme Gradient Boosting )

2.4 Classification ( Logistic Regression 和 Support Vector Machine )

2.5 Unsupervised Learning ( Principal Component Analysis 和 期權科普 )

三. 隨便結個尾

首先聲明,修鍊此功的基本功如下,如果不具備這些基礎強行練功而走火入魔的話,我敬你是條漢子~

1.數學

2.數學

3.牢記第一,第二條

一. 金融和統計背景介紹

吶,首先的首先,在用machine learning建模的時候一定要分清楚X和Y。

大部分時候我們利用統計方法要做的事情就是,利用Xi去預測Y。也就是屬於supervised情況(既有X又有Y)。

這裡Y一般是漲跌幅或者漲跌的方向,Xi一般就是對Y起影響作用的因子。

最重要的是我們要先弄清楚我們的Xi是什麼,我們要預測的Y又是什麼。至於Xi是linear還是quadratic,都僅僅是模型處理的細節。

還有另一部分時候,我們想要了解的是Xi與Xi之間的關係,所以用到的就是unsupervised方法(因為這裡沒有Y)。

這篇文章里金融上的實例都是用的JPMorgan近期一個非常火的報告,《Machine Learning and Alternative Data Approach to Investing》,至少大家會信服一點吧...

我選了幾張圖介紹當下Big Data和金融方面的背景:

具體金融上的大概分類:

金融市場不同sharp ratio程度的因子對應的應用方式:

上面這張圖其實挺重要的,潛台詞其實說的就是怎麼判斷單個因子的好壞,和怎麼用這個因子。

市場上大部分為人們所知的因子都不能成為可以獨立運行的策略(也就是圖中的not viable as StandAlone Sharp, but viable in a portfolio context for quants),因為知道的人越多就越不可能成為可以獨立運行的策略,但是能加入策略的因子都是有足夠大的sharp ratio,然後利用machine learning的方式(也許是unsupervised的主成分分析的方式)組合起來變成一個更strong的策略。

大概有幾步, 首先需要得到可靠處理好的data(比如直接從交易所拿到的量價數據etc和做數據清洗之類),

第二步從數據中利用machine learning得到sharp rato足夠大的的單個因子或者策略Xi,然後把這些因子組合起來形成策略池。

第三步就是給這些選出來的因子分配動態的權重組合成一個portfolio,可以是簡單的線性分配weights,也可以是高維甚至多重嵌套(這裡更複雜的combine因子可能就不能用簡單的線性supervised和unsupervised模型給weights去操作,我猜可能需要其他的方法)。

最後一步就是看這些合成起來的總因子的回測表現,算出來總的sharp ratio。

至於給權重的辦法, 大概的傳統辦法就是投資組合,Markowitz Mean-Variance Model和經過改進更為主觀也更flexible的Black-Litterman model。

還有的就是動態的投資組合方式,具體我也還在努力啃active portfolio management那本聖經...也許到時候會寫寫這方面(如果到時我還活著…)。 至於machine learning來進行動態給權重,我也不甚了解…希望有熱心的讀者可以指導哈!

下面這張圖就是不同machine learning方法處理不同問題的分類:

下圖是big data應用在金融上的標準化工作流程~

金融想要解決的問題和其對應的machine learning方法:

我們可以看到右邊有很多的統計方法,每一個都得了解背後的機理,所以這真是一個長期的學習過程呢。

接下來在介紹具體的machine learning方法和應用之前,需要介紹統計領域一個最最重要的概念,那就是bias和variance和trade-off,換句話說也就是overfitting的問題。

我們用統計方法的一般流程是,首先我們將的dataset分成兩部分,一部分是training sample,是用來確定(train) model的;另一部分是test sample(或者validation sample),是用來看這個model效果的。

在各個統計方法裡面,很難找到一個方法是好到完全dominate其他所有的方法,一般都是各有利弊,主要的原因就是因為我們有bias和variance和trade off。

直觀一點理解的話,variance代表的是第一步選出來的model對於我們用的training sample的依賴性。我們自然是希望從training sample中選出的模型能很好的fit整個dataset,但比如我們重新做一次實驗,將我們的dataset分成新的training sample和test sample,如果從training sample得到的model是跟第一次得到的model完全不一樣,那麼就說明這個model並不能很好的描述我們的數據。這個對於training sample的選擇的依賴性就是variance,我們是希望它越小越好。

對於bias呢,就是我們得到model之後在test sample上面測試這個model的好壞。一般越是複雜的model,在training sample上預測的效果越好(因為overfitting),也就是bias越小。但是同時越複雜的model對於training sample數據的依賴性就越強,很可能換一個training sample就得到完全不一樣的model,這樣模型會非常不穩定,因為統計上我們是假設所有的數據是從同一個真實的模型f(x)中產生出來的,我們的任務就是從已有的數據中找到最接近這個真實的模型f(x)的模型。

所以我們希望得到bias和variance之間的平衡點,也就是希望bias和variance之和最小(MSE,Mean Squared Error就是用來estimate他們之和的一個指標)。

我們可以看一張bia和variance直觀的圖:

圖中的點是從真實的model f(x)產生出來的,我們想做的就是用不同flexibility程度的統計方法去fit這些點,看看哪種方法的擬合效果越好。

這裡左圖中黃線是linear regression模型,藍線和綠線是smoothing spline模型。

右圖是flexibility(可以看做對於data的依賴性)為橫坐標,他們各自的bias和variance之和也就是MSE為縱坐標。紅色那條線就是將模型用在test sample得到的test MSE的結果,我們可以看到是一個U型,也正是說明了bias和variance之間是有一個平衡位置使得MSE最小。linear regression模型(黃色的點)的MSE比較大,因為左圖中可以明顯看到其對這些點的線性回歸效果並不好,但是是不是最扭曲的綠線smoothing spline模型就效果最好呢,也不是,我們可以看到紅線上綠色的點的MSE大小隨著flexibility的程度又翹上去了,反而是藍色的模型在bias和variance之間取得了平衡。

至於灰線,它是training MSE,我們一般不關心,因為training set的信息只是用來獲得model的,對於衡量model的預測效果不能提供有用的信息。

所以我們可以看到並不是模型越flexible越扭曲越好,而是需要在bias和variance之間進行一個平衡。

下面還有變化了真實的model f(x)的情況下,同樣用這三種model擬合的MSE結果:

上圖是f(x)接近linear model的情況。

上圖是 f(x)為非線性model的情況。

我們可以看到如果我們的model跟真實的f(x)的形式越match,那麼擬合的效果就好越好。

接下來我們看看理論上公式是怎麼推導出bias和variance的(這塊兒內容可能需要一定統計知識,如果不感興趣的也可以跳過,但是想要真的理解這兩個東西還是得從最本質的公式入手):

我也把之前寫的推導草稿貼出來吧...

從上面的公式裡面我們可以看到看到Bias和Variance分別是代表了什麼和是怎麼算出來的,其實bias和variance都是針對training sample取的期望值。

統計從理論上的做法是假設在dataset之下有一個fundamental的真實model f(x),然後Y是由f(x)加上一個不可消除irreducible的隨機量構成,是符合正態分布的一個隨機數。然後我們是想要從data sample中找到一個model f^hat(x)使其盡量靠近真實的那個model f(x)。

上面寫的MSE其實是expected test MSE(注意我是用的箭頭,不是等號),就是在我們已有的樣本基礎上得到的我們的model f^hat(x)和真實model f(x)之間的平方差的期望值的估計。求期望呢,實際上是對f^hat(x)求期望,因為整個MSE的式子裡面唯一的變數就是我們的model f^hat(x),而f^hat(x)又是從training sample得到的,所以我們對f^hat(x)求期望實際上是對training sample的信息求期望。

bias呢,就是真實值f(x)和f^hat(x)的expectation之間的差。所以是基於數據求出來的error。如果過擬合了呢,就會使得這裡的error會非常小,也就是bias會很小。

variance呢,是我們模型f^hat(x)本身的expectation和它本身之間的差值的期望值,也就是僅僅跟我們的model選取有關,如果過擬合了training sample呢,那麼我們選取的model就會非常volatile,也就是這裡的variance會非常大。

這裡的MSE僅僅是針對x0這一個點,真正的MSE其實是應該遍歷所有的點,也就是通過無數次隨機選取training sample得到的distribution,再對這麼多training sample的distribution求期望得到的值。但在現實中我們不可能做到取無數組training set,所以我們只能用sample去estimate整個population的MSE。我們就用test sample中的所有點作為整體MSE的估計值,或者用cross-validation的方式來隨機取一定數目的training sample和test sample,並且對於這些test sample的test MSE求平均來估計整體的MSE。詳細內容可以見《the elements of statistical learning》中的5.5.2和7.3這兩節。

並且在實際中因為我們不可能知道產生這些點的真實model f(x),所以是不可能單獨觀察bias和variance的,我們能得到的只有他們的和MSE的estimate,也就是那條U型的曲線,從中我們可以找到最低點,也就是bias和variance最平衡的model。

對於U型曲線,實際上左半邊的U型是我們的model不斷逼近真實model的結果,也就是bias在一直減小並且減小的部分大於variance增加的部分,所以使得整體MSE越來越小,直到到達某一個最優點;然後當flexibility繼續增大的時候,我們的model就會開始用越來越多的parameters去擬合training sample中的irreducible error,但這些error由於是random的噪音,實際上是對我們的預測沒有任何幫助的,這也就是overfitting的來源,就使得我們選取的model非常volatile讓variance增大的部分大於bias減小的部分,也就導致了U型曲線的右半邊隨著flexibility的增加使得總體的MSE又翹上去了。

除此了bias和variance的trade-off之外,還有一個trade-off是prediction accuracy和model interpretability。有些複雜的model(比如非參或者deeplearning等等模型)預測起來奇准無比,但是理解起來會不是那麼直觀,甚至完全不知道內部發生了什麼,在應用的時候就會造成困擾,比如別人問你為什麼是這個結果的時候我們是說不出個所以然來的,無法令人信服;另一方面,像簡單的model比如線性模型就非常好解釋是怎麼預測的,每一個變數都很直觀,但是問題就是很多時候預測效果不好,特別是對非線性的問題。這個也是需要針對實際情況進行取捨。

看到這裡是不是已經一臉懵逼了呢~

不要怕!馬上就到應用部分了!

二、machine learning各個方法和在trading上的應用

這裡報告裡面只大概介紹了各個方法怎麼運用,但是對於一般沒有統計基礎的讀者來說還缺少了事前對於每個方法本身的介紹。我這裡想做的事情就是先從統計的角度介紹每一個方法,然後再解釋其在金融上面怎麼應用(大部分的書都是要麼單純關於統計的推導,要麼直接寫金融,但我覺得其合起來一次性順著看下來其實是最符合理解整個過程)。

每一個方法我都會大概的介紹其數學推導的機理和方向(為了盡量使得每一個方法簡潔易懂,所以需要犧牲一定程度的嚴謹性,希望寫的不準確的地方大家見諒),並且加上我自己的理解給出其相應在金融上具體是怎麼應用。

還得強調一下,這裡並不是說這些推導不重要所以才省去,而是極其重要以至於很難在一篇文章裡面用文字說清楚,推導的細節才是這些方法的核心和精華,所以如果不想只懂皮毛的話還是需要細心去思考每一個方法的構建過程,畢竟其應用的利弊和假設條件都隱藏在芸芸的細節之中。

首先我們需要知道一些區分統計方法的概念:

一個是parametric和non-parametric,一個是supervised和unsupervised,還有一個是regression和classification,分別是代表了問題的不同的特性或者要求。

parametric和non-parametric的區別是model中有沒有參數。

supervised和unsupervised的區別是有沒有Y,比如我們只研究Xi之間關係的話就是屬於unsupervised。

regression和classification的區別是在有Y的supervised方法下面,Y是定量的(quantitative,比如漲跌幅度)還是定性的(qualitative,比如漲跌方向)。

接下來我們就開始介紹各個不同的統計方法和其應用:

2.1 Supervised Learning: Regressions

對於supervised方法,我們最重要的就是要弄清楚我們想要predict的是什麼,我們有的因子又是什麼;也就是分別弄清楚在實際問題裡面Y是什麼和X是什麼。

Penalized Regression Techniques: Lasso, Ridge, and Elastic Net

對於處理線性的問題,我們可以用ridge還有lasso。

好處是非常易於理解背後的關係,壞處就是對於non-linear的問題fitting效果不好,弱點還有變數Xi數目比較多,或者變數之間有correlation的時候也會效果不好。但是這個是所有regression方法的基礎,所以必須掌握。

一般的形式如下:

Xi是變數,是相應變數的係數,是隨機的一個不可消除的誤差,Y是我們想要預測的目標。

比如一個具體的形式是

這裡的US growth,EM growth,US HY Bonds,US Equities,Global Equities是五個變數Xi,想要預測的Y就是Asset Price。

這裡我們可以看到US Equities和Global Equities前面的係數相對其他變數大很多,這就說明了這兩個變數對於這個Asset Price的影響最大,當然US Equities是正面的影響,Global Equities是負面的影響。

這裡我們就可以發現一個問題,那就是比如像EM growth這個變數前面的係數非常小,說明這個因子對於Asset Price的貢獻不大,所以如果依然把這個因子加入model的會就會導致過擬合,因為本來這個因子是不應該在model裡面結果我們卻放進去了,自然就導致變數更多,model更複雜增加了其對於data的dependence,也就是variance。

當變數比較少的時候我們自然可以手動把這些不需要的因子剔除掉,但是如果變數有成百上千甚至上萬的話,人工來選擇因子就會非常繁瑣,而且還容易造成錯誤。有沒有一種方法可以自動幫我們做這件事情呢?有,就是接下來我們說到的Lasso方法。

Lasso做的事情就是加入一個penalty因子,使得自動將相關性不強的因子自動篩選掉,也就是使得其前面的係數變為0。

然後還有一個方法,就是ridge。唯一不同的地方就在於ridge的penalty函數是係數的平方之和,而不是Lasso裡面係數絕對值之和。

其實他們做的事情都比較類似,都是為了減小不相關因子的係數大小。

但是這裡有一個問題,那就是如果有一個因子確實是一個非常強的因子,並且前面係數非常大。如果用Lasso和Ridge的話就會使得其前面的係數減小,那這樣的話不是underestimate這個因子的重要性了么?畢竟係數越大的,在這個penalty下面會減小的越多。

對於這個很大係數的主要因子的問題,理論上可以證明出Lasso和Ridge並不會首先將係數大的主要因子係數變為最小,而是首先將不那麼重要的因子的係數變小。可以從主觀的感覺上面來理解,如果將主要因子的係數降低的話,會造成公式前面那個RSS這一項的值變得很大,這樣即使後面penalty會減小,但整體的和不一定會降低,反而可能會升高(畢竟penalty只是一個調節的項,RSS才是想要降低的主體)。但是如果降低的是不那麼重要的因子的係數,就會使得前面RSS的值增加不多,但是後面的penalty會降低不少,特別是penalty前面係數a足夠大的情況下。所以綜合而言,Lasso的作用是把不重要的因子剔除出去(也就是使得其前面的係數變為0)。

Lasso相對於Ridge的優勢也正在於可以將主要因子的係數直接降為0,這樣也就是一個選因子的model。

關於Lasso和Ridge之間的對比,至於為什麼Lasso可以將不重要的因子的係數降為0而Ridge不行,我們可以看下面這個圖更加直觀:

假設我們只有兩個因子X1和X2,他們分別的係數是1和2。然後上面那個橢圓就是前面那個loss function RSS畫在1和2的平面上,每一個橢圓代表的是不同的RSS的值,並且橢圓越小的時候RSS越小,也就是我們想要其越小越好。對於Lasso和Ridge,因為前面那一項RSS都是用同一套數據經過同樣的least square方法計算出來,所以橢圓的形狀對於Lasso和Ridge都是一樣的。不一樣的僅僅是第二項,也就是陰影的面積。

一方面我們想要這個橢圓越小越好,最好的情況就是直接縮小成中間的點 hat。

另一方面,我們又想要陰影部分的面積最小,因為我們所加的penalty一定程度上就代表了陰影的面積。

所以兩個方面的平衡下,我們就需要找到這個橢圓和陰影面積的切點,這樣可以使得橢圓足夠小,這個陰影的面積也足夠小。

現在我們知道了切點是我們需要找的點,這個點的坐標是(1, 2)。

我們可以看到Lasso的情況是正方形的陰影面積和橢圓相切,由於正方形是有四個突出的頂點,所以這四個頂點更容易和橢圓相切。而這四個頂點的坐標都在X或者Y的坐標軸上,也就是要麼1被留下,要麼2被留下,其實這就是為什麼可以將被去掉的因子的係數變為0(因為切點在坐標軸上)。

而Ridge的情況是,由於陰影面積是一個圓,所以並沒有突出的頂點可以更容易跟橢圓相切,故想要正好相切在坐標軸上是非常困難的,需要RSS的形狀滿足非常極端的條件才行。

所以如果想要選擇因子的時候,我們可以利用Lasso的方法來獲得足夠重要的因子。

從上面這張圖我們可以看到Lasso基本上把真實Actual的主要因子都抓住了,並且給予的係數(權重)基本上和真實值一致。而OLS,也就是最基本的least square的方法(僅僅只有Lasso的第一項)會分配權重給全部的因子,這樣就造成了overfiting。也可以看到Lasso裡面加上的penalty這一項對於篩選重要的因子的還是很有效的。

下面是penalty因子係數的大小(X軸)和得到的每個因子的係數大小(Y軸),

我們可以看到的值從小到大(X軸從右往左看)的時候,右邊的Lasso model會讓不同的因子在不同的時期消失。也就是隨著的值增大(也就是penalty的程度越來越大),不斷有因子的係數被Lasso歸0,也就是剩下的因子的重要性越來越大。最後剩下幾個影響非常大的因子。

而左邊Ridge的只能讓這些因子的係數一起變小,最左邊值也就是penalty非常大的時候,幾乎所有的因子係數都變成非常小,這樣顯然不是我們想要的結果。

Bayesian和ridge還有lasso的關係:

ridge還有lasso都可以由貝葉斯推導出來,只是需要改變貝葉斯裡面prior的distribution的形式,ridge需要在貝葉斯裡面把prior改變成laplacian,lasso需要把prior改變成gaussian。

理論上來說,這兩種prior distribution的貝葉斯得出的結果應該是和ridge和lasso的結果一致。

這裡用貝葉斯導出的原因是貝葉斯不需要複雜的計算公式,僅僅需要的到P(u|data)之後做simulation,可以直接從generate出來的sample裡面得到係數beta的均值和方差,而不需要像frequentist那樣用公式來求。(具體公式的推導在附圖中)

並且貝葉斯的方法當data足夠大的時候,prior的distribution其實重要性會越來越小(我自己也胡亂寫了傳統統計方法frequentist和下面Bayesian的證明)。不過data的size什麼才叫做足夠大,這是一個問題。

接下來我們介紹一個利用Lasso的例子,

這裡我們想要預測的Y有4個,S&P 500,10-year UST,US dollar(DXY),還有黃金gold。

並且我們選取了4個Xi,就是他們各自過去1M,3M,6M還有12M的收益。

這樣我們對每一個Y都有4個Xi作為變數。我們想要預測的Y是此種asset第二天的收益。如果是大於0就做多,小於0就做空。

比如我們現在單獨看S&P500。

我們利用的dataset是滾動的500個交易日,也就是對於S&P500有500個data值,每個data的值是一個5維空間內的一個點(Y, X1, X2, X3, X4),也就是(S&P500第二天的收益,S&P500當天之前1個月的總收益,過去3個月的總收益,過去6個月的總收益還有過去12個月的總收益)。我們想要做的就是利用一個Lasso模型去fit得到這500個點,使得其對於這500個點fitting的最好,也就是RSS+penalty的和最小。

這樣我們就在5維空間內找到了一條線,根據坐標(X1, X2, X3, X4)還有其係數我們就可以預測出Y,也就是在當天(接近)收盤的時候,算出來S&P500當天之前1個月的總收益,過去3個月的總收益,過去6個月的總收益還有過去12個月的總收益,也就是在5維空間裡面加入今天這個點,並且因為是rolling window,所以將最初始的第一個點(今天之前的第499天)去掉,得到空間中新的500個點,重新獲得一個新的Lasso model,並且根據這個update之後的model去預測第二天的收益。

具體應用中似乎是3個月重新renewal一次model。也就是並不是每天都會加入一個點再去除最舊的一個點,而是在三個月之內用同一套model結合這三個月每天的(X1, X2, X3, X4)去預測第二天的收益。等到了三個月之後,就一次性加入這三個月所有的點,去除掉最舊的相同數目的點,重新進行建模得到一個新的Lasso model,然後再用這個model結合接下來三個月每天的(X1, X2, X3, X4)來預測第二天的收益,一直rolling下去。

這裡需要注意的是(Y, X1, X2, X3, X4)都需要standardize(具體怎麼standardize需要弄清楚, 後面很多方法都會預先將Xi standardize),因為我們知道跨度不一樣其值也會有不同的scale。

但這裡是僅僅用了(X1, X2, X3, X4)作為變數,但實際上我們有4個不同的asset Y,S&P 500,10-year UST,US dollar(DXY),還有黃金gold, 所以可以將這4個Y的(X1, X2, X3, X4)都設置成共用的16個變數(X1, X2, X3, X4,…X16)。然後用這同一套Xi對這四種asset進行regression,每一種asset就都有一個Lasso model進行預測。

結果譬如下圖,

我們可以看到預測S&P500的lasso model用到了14個factors。並且單純做多的收益和sharp ratio都比直接買S&P500高。

同樣我們可以看到其他asset的結果。

然後同樣就像上面解釋lasso model時候看到的,我們可以調整其penalty的係數的值來看對於每個asset,其不同factor係數的變化情況,可以很清楚看到哪些factor是最重要的。

因為這裡我們有4個不同的asset,所以可以將其第二天的預測表現進行排序。前兩個做多,後兩個做空,也就是所謂的多空策略。

好了,這就是linear裡面的regression,也是最經典傳統的統計方法。

2.2 Non-Parametric Regression: K-Nearest Neighbor and LOESS

對於處理非線性的問題,一個是可以用高階的linear regression,另一個就是用非參方法KNN之類。

非參方法好處就是如果fundamental的model是非線性,效果會比較好。壞處就是如果model本身是線性的,就容易造成overfit,並且KNN對於outlier的點非常敏感。

這裡我們用KNN的方法來擇時。(也就是選擇歷史上類似宏觀情況的regime,然後平均一下收益率作為預測值)

具體是這麼工作的:

我們有7個類別的indicator,然後用這樣一個7-d的vector來表示宏觀經濟的位置regime(或者說是在7-d空間內的一個點)。

具體怎麼構建的這7個indicator可以參照如下slides:

https://www.cmegroup.com/education/files/jpm-systematic-strategies-2013-12-11-1277971.pdf

所以這7個indicator就是我們的7個Xi,構成了一個7維空間,並且由於每個月都有這7個indicator的值,所以都可以用這個空間里的一個點表示。

我們想要預測的Y就是20個risk premia的每一個。

或者可以這麼說,每一個月作為一個觀察。然後每一個觀察包含了這7個Xi和Y(20個risk premia的每一個)的值。並且我們用Xi的7維空間來區分regime。僅僅是畫點上去,而不是像之前的regression一樣想要用一條線去fit,這裡獲取Y的方法是將想要預測點周圍的K個點對應的Y取平均值。

我們將過去的10年每個月都可以畫在這7-d indicator的空間中,每一個月都可以被這個空間內的一個點所代表其宏觀情況。這樣當下這個月也可以畫在同樣一個空間里,找到其最近的K個點。當然K也可以用其他的值,這樣就是average一下附近的K個點的每一個risk premia的return,這樣我們可以得到這個點周圍附近K個點(也就是歷史上類似宏觀情況的K個月)這20個risk premia每一個的平均值,(這個地方距離是standardize之後的距離還是直接用原indicator的scale呢?),這樣就找到了歷史上最接近現在這個月宏觀經濟情況的K個月的20個risk premia每一個的平均值。

根據那個月之後的一個月的20個risk premia(此時S=20的情況下)的表現情況(如果20個risk premia是daily的數據,那麼就用average來得到一個月每天的平均值,其實也可以直接加起來看每個月的總收益?),並且將其排序,選擇其中一部分然後平均分配資金,來決定當下這個月的下個月投在這20個risk premia上的funding distribution。

這裡有一個問題就是,因為不能單純看20個risk premia的收益大小來選取(不然就全部投給預期收益最高那個risk premia了)。我猜測可能還需要看組合起來看總體的sharp ratio值。所以這樣排列下來僅僅只能找到最高收益的那個risk premia,而不是找到最好的sharp ratio。所以需要看這些20個risk premia的subset的組合情況,得到最好的sharp ratio。

但是問題在於,怎麼將這些S個risk premia策略組合在一起得到最好的sharp ratio?這個可能就需要看回測的結果了。(但是怎麼回測這20個risk premia所有subset的可能性?)

是不是還涉及到給weight的問題呢?

這裡似乎就是直接給予這些不同的risk premia策略相同的weights,也就是將funding直接均分給不同的策略。但是其實可以用machine leanring來給不同的策略分配不同的weights來改進。

這些細節的問題我也沒有一個確定的答案,可能需要問JPM具體做這個策略的人了...

這就是具體的結果。

左邊的圖的列向量是選擇K從0到25,橫向量是選擇risk premia的個數。方框中的數值就是sharp ratio。從這張圖看來,確實是需要對所有的組合進行回測。但這裡每一行似乎僅僅區分了risk premia的個數,而不是每一個單獨不一樣的risk premia? (想要弄清楚,可能需要看看JPM的risk premia是怎麼構建的了,應該都是independent,所以並不能單純以個數來作為loop的條件?)

這裡的右圖就是單純給這S個risk premia(S=20所有都用?)平均分配資金,也就是紅線。然後就是利用這7個indicator預測的各個risk premia進行排列組合,選出sharp ratio最高的再平均分配資金。

2.3 Tree Based Methods

首先介紹tree based method的基礎,也就是regression tree。

給定很多變數Xi,它的原理就是取遍所有Xi和每一個Xi所有的值,找到一個讓全局的RSS(Residual Sum of Squares是一個指標,用來描述預測的Y和實際的Y之間的差距的平方和,也就是預測的效果好壞)最小的某一個Xi的某一個值,這裡就算是一個internal node。

這樣,Xi的這個值將所有的點分成了兩個區域,每一個區域的點所estimate的值就是這整個區域所有點的平均值。

再同樣的過程,得到一個讓這一步全局RSS最小的Xi的一個值(這裡Xi可以跟上一步的Xi是同一個變數)。

同樣的過程不斷進行下去,一直到某一個條件停止。比如RSS到達某一個值,或者某一個區域的點小於5之後,等等。

記住,這裡的RSS是全局的RSS,也就是所有區域的RSS總和,而不僅僅是所分開區域的RSS之和。

同理,這裡需要一個penalty函數。因為樹越深其實越overfit(可以想像當樹深到極致就是每個區內只有一個點),所以給目標函數RSS加上一個additional的alpha*樹的深度,使得其總和達到最小。

合適alpha值的選取就需要通過cross-validaiton來得到,同時可以得到的也有tree的深度。這樣一個model就選出來了。

regression tree應用的示意圖如下:

regression tree的好處就是非常容易理解,因為每一個node的Xi取值都一目了然。但是不好的地方就是它對於outliers非常敏感,因為outliers會極大的增加RSS這個指標,所以很容易被影響。

Random Forest:

random forest的意思就是,在上面的regression tree的基礎上,我們再利用bootstrap來產生數量為B的test datasets(也就是bagging的model)。對於每一個dataset我們可以利用一個regression tree去fit。所以對於每一個觀察,我們都可以得到B個prediction的值。接著我們就把這些值average一下,就得到了我們最終的estimate。這樣的好處就是可以降低variance,因為我們用了很多的sample一起求出的平均值,而不是像decision/regression/classification tree那樣一次性的estimate。

然後random forest又加了另外一項,也就是限制每一個node可以選取的Xi的數目。比如一共有p個Xi,但是我們可以規定每個node只能randomly選取sqrt(p)的Xi。這樣的好處就是為了防止一個factor dominates,不然就會導致這B個tree的correlation非常大,即使求平均值也起不到降低variance的作用。

具體我們可以看如下的例子:

這裡要做的事情就是利用random forest的model來選股。我們的股票池裡面有1400個股票,然後每個股票我們都有相同的14個factor,也就是有14個Xi(注意這裡的factor需要先normalize一下,也就是standardized to mean 0 and variance 1,因為各個factor的scale不一樣會導致fitting有bias),這裡的Y就是收益率。

我們利用random forest的model來預測。

首先我們利用bootstrap構造100個test datasets,然後針對每一個dataset去fit一個regression tree。並且每一個tree的每個node處,一般每次只能randomly選擇sqrt(14)=3 factors。但是這裡我們用OOB這個方式來判斷每個node處可以選擇Xi的個數(得到的是14個全部可以用),並且每個tree的深度也是由OOB這個最小值來確定。

接著我們對於每一個股票都有100個prediction的值,然後average,得到我們最終的estimate。

這裡的一個問題也是同樣,我們是不是需要將股票的收益向右位移一個單位,使得這14個risk factors Xi所對應的Y是下一個月的收益。畢竟如果放在同一個月,那就不存在預測的問題了,因為都是同時發生,而不是用一個去預測接下來即將發生的另一個。

然後利用每個node對於Xi的選擇,我們可以得到上圖,可以看出來哪個factor影響最顯著。

另一張圖就是策略的回測結果,通過對於這1400個股票的預測值進行排序,我們就可以得到每一個quantile(一共分為5個quantiles)的股票basket。

圖上表示的就是單純對於每一個quantile的basket做多(5條曲線),還有long/short的策略(也就是做多第5個最高的quantile basket,同時做空最低的那個quantile basket),其所得到的收益率是最穩定的。

因為我們可以看到benchmark的曲線在1和5之間,所以做多5,做空1的話就會使得曲線更加平滑。不然會跟大盤的相關性非常大,這也就是一種把大盤波動hedge掉僅僅只剩下1 quantile和5 quantile之間的差值的收益。

Extreme Gradient Boosting

boosting的原理就是慢慢學習,也就是先給一個不太準確的estimate,然後用真實值減去這個estimate得到residual/error,接著用regression tree去fit這個剩餘的residual error得到這個residual的estimate,再用上一層residual減去這個estimate得到下一層的residual,然後進行K次(即一共用K個tree去fit K層的residual),實質上是從一層一層的residual裡面不斷緩慢提取信息不斷加到之前的estimate上面,使得最終得到一個總的好fitting。boosting指的是一類方法,而不是一個方法。Extreme Gradient boosting是boosting中一個的方法。

這裡做的事情是利用XGBoost來預測9個US sector ETFs的表現,financials, energy, utilities, healthcare, industrials,technology, consumer staples, consumer discretionary and materials,對應於Y1,Y2...Y9。

首先我們有8個Xi,也就是8個宏觀的factor,

Oil, Gold, Dollar, Bonds; economic surprise index (CESIUSD), 10Y-2Y spread, IG credit (CDXHG) and HY credit spreads (CDX HY)

然後我們要做的事情就是,用這8個Xi,還有extreme gradient boosting的model去預測每一個Yi的表現。

這裡extreme gradient boosting model裡面的參數是,5-fold-cross-validation來確定tree的數目為30,也就是經過30次的從residual裡面extracting information。並且每個regression tree的深度為7,也就是每個tree被分為了7+1=8個區域。

有了這個extreme gradient boosting model不斷的iterate(30遍,每一遍的tree的深度是7)來不斷extract信息給想要估計的那個estimate函數f^hat之後,f^hat確定了下來。在同樣給定了這個想要預測的observation的8個Xi的值(也就是這個8維空間內的一個點)之後,就可以經過這個model得到我們想要的預測值Yi。

這裡應該是用的每天的漲跌幅(裡面有說rebalance daily at market close)。因為對於同一個Yi來說,比如我們預測energy這個sector ETF的漲跌幅。我們每一天都有這8個macro的factor的一個值,這樣一天在這個8維空間上來說就是一個點,252天的話就是有252個點。這樣才能開始利用boosting tree來劃分區域進行預測。甚至都不一定是daily的數據,可以是更小級別的數據,這樣點(信息)也就更多了,model的預測也更加貼近真實的model。然後利用這252個點來建立model,建立之後預測energy ETF的漲跌幅。

有一個問題就是,同樣我們這裡可能需要將energy ETF的向右位移一個單位,也就是將第二天的energy ETF作為這一天的Yi,這樣8個Xi預測出來的結果也是第二天的energy ETF的漲跌幅。(但這裡還有一個問題就是為什麼是位移一個單位,也許這些macro factor傳導給ETF是有不同時滯的,所以每個Xi甚至都需要不同的位移?)

然後根據long-short策略,每天我們可以預測出這9個ETF的漲跌幅度,將其排序,做多前三個,做空後三個,形成了一個策略。

除此之外,我感覺還可以用另一種方法。那就不用位移,直接將當天的ETF漲跌幅看做是Yi。這裡的一個assumption就是市場是有效的,macro factor的變化可以馬上傳導給ETF的價格。這樣的話我們就可以通過預測的值,看如果當天實際並沒有達到這個漲跌幅(在快收盤的時候檢查condition),我們可以進去統計套利,也就是賭其一定會往那個漲跌幅移動。

也可以將其量化變成相差多少個sigma(假設圍繞預測值是一個normal distribution,其mean就是預測的值,width可以取歷史上面的error是不是都一樣,如果是近似flat可以直接用這個constant作為error,如果不是的話可以繼續分析其error的結構),大於兩個sigma的時候進去開倉bet會繼續往預測的方向走,不一定是同方向,如果漲跌幅走過了2個sigma那就是bet其一定會reversion(後續部分請參考今日二條)

2017下半年·投資策略論壇

撲克財經,年中巨獻

詳情請查看下圖,即刻報名!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 撲克投資家 的精彩文章:

某國際大型糧油加工集團招聘研發工程師
從鋼廠、貿易商到消費終端:微觀視野下的熱軋板材市場全透視
投機鐵律:比衝進市場更重要的,是通曉什麼時候退出
全球市場「拐點」時刻!從利率、人口到信用周期,熵一董事長謝東海重磅研判
衝上雲霄看世界:這些起落瞬間的風景如此震撼,請不要擦肩而過

TAG:撲克投資家 |

您可能感興趣

S32科技金融大樓 The S32–Fintech District building
Bloom、Ripio、Libra?誰才是金融領域的顛覆性區塊鏈應用
金融人天天用的Financial Modeling其實一學就會
Sabre Partners以千萬美元投資金融科技初創公司CoinTribe
通過區塊鏈構建分散式信用數據體系,Distributed Credit Chain打造去中心化的金融生態系統
區塊鏈+金融 what are you 「能」啥嘞?
從AI+Finance到FinancedAI,氪信打造共生一體式智能金融
Circle收購Poloniex交易所,「金融巨鱷」橫空出世
Android木馬Gustuff鎖定金融與加密貨幣程序
金融科技公司AccessFintech獲摩根大通投資
Lemnisk與Infosys Finacle合作增加金融推廣商客戶轉化率
新加坡ShopBack收購Seedly,旨在擴大垂直金融產品
劍橋錄取Triple Kill!金融經濟、工程、教育學三枚Offer火熱出爐!
Facebook推出全新數字錢包Calibra,劍指基礎金融服務
Paypal以22億美元收購金融技術公司iZettle 加強與Square的競爭
Fintech也拼爹,背靠高盛的Marcus將是銀行+金融科技未來模式嗎
永明金融完成收購BentallGreenOak多數股權
PayPal計劃收購金融科技公司iZettle
出行和支付平台Grab推出金融科技平台Grab Financial
球鞋金融師-看The Shoe Surgeon如何讓球鞋升值重生