教你Machine Learning玩轉金融入門notes
但是我保證你們看完之後一定會變成
而且對於不同市場,因子也會不一樣。譬如國內股市散戶多,所以非常容易產生一些很神奇的事情,前幾天看了一篇文章就說比如股票分拆都可以算一個很強的因子,因為分拆之後價格變低而國內散戶多,大家都覺得低的價格會漲起來。這是很沒有根據的,公司的價值怎麼可能因為拆股了就市值翻了幾番,但是就是發生了。就是因為國內都是炒預期,並且大部分人由於不專業都是跟隨其他人,自然而然預期就很容易就成型,並硬生生產生了自我實現的趨勢。但是這個趨勢只是空中樓閣,並非真實存在的基本面變化。
這可能也是為什麼國內市場的波動大,波動大並非因為市場經常有分歧,反而是因為市場太容易形成趨勢,並且這個趨勢很容易就被證偽而戛然而止,所以形成的趨勢非常脆弱,一旦不能繼續維持之後就會反彈式向反方向運動,即強化版的反身性。好的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)。大概的傳統辦法就是投資組合,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。2.4 Classification
接下來我們要介紹的就是Classification了。classification跟regression的區別就是Y的類型不同,regression是Y的具體數值的預測,比如漲跌幅度,而classification是對於單純分類的預測,比如Y的漲(Y值取1)或者跌(Y值取0)。但是classification裡面有一個地方不好處理,那就是如果想要預測的Y不僅僅只有兩個分類怎麼辦,比如當Y有三個值甚至更多。因為如果大於兩個值的話就不能簡單將Y設置為0,1,2,但是Y的這三個分類值在實際的意義上不一定是等距的,如果我們將其設置成0,1,2的話是默認這三個分類之間的距離相等,但在實際過程中Y不同分類結果之間的距離很難用數字去衡量。為了簡化,此處只考慮Y有兩類: 是(Y=1)或否(Y=0)的情況。logistic regression而classification裡面最出名的一個方法就是logistic regression。這裡不要被regression的名字所誤導,之所以取的是regression的名字是因為用的是類似regression的方法,但是由於這裡Y是離散的(不是具體連續的數值,而是比如說二選一,漲或者跌),所以對於Y的處理上有一些變化。下面就是logistic regression的公式推導: 是不是看一圈之後懵逼了~這裡用的是maximum likelihood function的推導,因為涉及到了矩陣運算,所以這裡為了讓讀者更輕鬆一點暫時省去~我來用另一種不是那麼準確但是更容易接受的方法解釋一下,舉個例子就明白了。先上一張圖, 我們現在呢,手上有信用卡的數據,知道每一個人有沒有違約還有他們信用卡欠款的數目,想要研究的問題呢就是違約概率(Y)和信用卡欠款數目(X)之間的關係。因為這裡一個人是不是違約只有是或者否兩種結果,不可能存在第三種情況,所以正好適合我們這裡分類classification的問題。左邊的圖呢,那一條藍線就是直接用linear regression來fit Y和X的結果。公式如下: 也就是基於一個人的信用卡欠款X,我們想要預測的這個人違約的概率p(X)。這裡由於是用的regression,所以p(X)是一個連續的數值。我們從上圖中可以看到明顯這個model對於實際非常不符合。一個是可以看到預測非常不準,即使我們將縱軸probability of Default>0.5看做是,probability of Default<0.5看做否,這個fitting的結果在balance的整個橫軸跨度內基本上都是屬於否這一類。但實際上從圖中我們可以看到當balance這個橫軸數值在2000左右的時候,其縱軸probability of Default大部分其實是1,也就是會違約。另一個問題就是由於linear model是一條線,所以這條線對於橫軸balance上的某些點,會使得縱軸probability of Default甚至有小於0和大於1的情況。我們這裡討論的是概率,只會屬於0和1之間,所以小於0和大於1的預測在這裡明顯是不對的。所以為了解決這兩個問題,我們可以想辦法把左邊圖的那條linear曲線做一定的變換mapping到另一種形式,使得其只屬於0到1這個區間。我們需要經過兩個步驟:首先呢,我們要想辦法把linear function的??0+??1·X的值(負無窮到正無窮),變成全部是正數,也就是從0到正無窮。有些讀者肯定想到了,那就是利用指數函數exponential function。將其變為e^(??0+??1·X),這樣所有的結果都會是0到正無窮。但是這樣還不夠,因為我們想要的是將其壓縮在0到1之間。所以我們可以同時對上面linear model的右邊p(X)進行如下操作: 這樣就保證了p(X)只會屬於0到1這個區間。如果對於這個推導過程不熟悉的,可以自行任意帶入負無窮到正無窮間的值取代上述方程中??0+??1·X的位置,檢查概率p(X)是否都是落在0到1這個區間。如果發現不是,那麼恭喜你,你顛覆了數學,我請你吃飯,管飽~至於為什麼叫logistic regression,看下面這個式子就明白了(完全等同於上一個式子): 然後我們可以看到數學中標準的logistic function的形式是這樣: 它的圖形是長這樣: 是不是發現正好符合我們想要的需求呢,隨著橫坐標X的變化,Y永遠都被限制在0和1之間。並且我們把標準的logistic function中的x換成我們的linear function裡面的??0+??1·X之後,就完全是我們推導出來的結果。一顆賽艇!所以這裡這個方法是把linear function的內容??0+??1·X嵌入到了標準logistic function裡面,自然這個方法就叫logistic regression了。經過上面的介紹和推導,我們用logistic regression的時候呢也只會關注這個最終形式: 我們輸入進去的數據是因子X和相應的Y(也就是是1或者否0),fitting的結果得到的是??0和??1。這樣利用這個model,如果有任何的X,我們就可以預測出p(X)的值。如果當概率p(X)>0.5的時候我們就說Y屬於」是",當概率p(X)<0.5的時候我們就說Y屬於」否」。至於怎麼得到最合適的??0和??1,其實就是上面那個看得懵逼的maximum likelihood的推導圖。如果大家還有印象的話,前面linear regression確定參數時候用的是least square approach得到linear model的各個係數??0,??1,??2…,其本質上是maximum likelihood的一種特殊情況。區別就是least square approach比較好理解和表示,而變成non-linear model的情況需要變換成較為抽象的矩陣運算,也就是maximum likelihood的推導。接下來我們看一個金融中實際應用的例子:這裡JP Morgan用到的是期權(後面我會詳細介紹期權是一個什麼東西和volatility surface,如果想先弄清楚可以先跳到最後的科普期權部分),內容是對於某個股票一直sell 1M ATM(At The Money)的call,並且不斷rolling到下一個月。因為是sell option,所以可以一直收取premium拿到期。至於為什麼是ATM的call,因為在at-the-money的時候,時間價值是最juicy的,也就是自己overwrite的時候可以收的premium會最大。如下圖我們可以看到100% at-the-money的時候是最大化收益的。除之此外,我們還可以看到一個有意思的現象,整體來說102%的收益比98%的低,105%的比95%的低,原因是volatility surface其中一個維度的volatility skew現象導致在相同程度的moneyness情況下,ITM會比OTM的implied volatility更大。還有一個現象就是102%的比98%波動更大,105%的比95%波動更大,原因是ITM的已經包含了intrinsic value增加了緩衝區,但trade-off就是雖然ITM的會風險更小但是upside potential也會受到限制(我們可以看到102%和105%一開始其實是比98%和95%收益更高的,但當掉下去的時候也掉的更多,所以OTM的波動更大)。 但是JPMorgan取的是1M的rolling,事實上tenor最小的weekly maturity會效果最好(如下圖),不知道為什麼不用。具體的解釋是跟volatility surface的另一個維度term structure有關了,最後期權科普部分會詳細介紹。 雖然有那麼多好處,但由於是單邊賣期權,所以存在的風險就是股票的價格會往反方向走。比如說這裡如果股票價格一直猛漲的話,還這麼賣期權會死的很慘。所以風險就在於預測這個股票的表現強弱。當然這裡衡量股票強弱並不是直接預測股票的價格,而是JPM自己通過各個factor綜合構造的一個分數。如下: 左邊的圖就是這個「call OW策略」 VS sp500大盤的ETF(spy)的表現。有些人可能會問了,這策略表現這麼差,有啥用?股票不一定都會瘋漲嘛,總會有不同sector輪轉的時候。而且要知道現在美股是超級大長牛,但是股票不會漲上天對吧,總會有經濟周期超過均衡太多而掉下來的時候。所以如果我們能用這個策略無縫切換的話那不是就都可以抓住了么?(當然,比較困難...)右邊的圖就是形容JMP是怎麼給股票打分來決定其表現好壞的。我們可以看到一共分為4大塊兒,Value,Momentum/Technical,Growth和Quality,分別在這個股票的得分裡面有不同的權重。每一塊兒呢又是由其下面的小factor通過不同的權重構成。比如對於每一個股票我們有這些10個小factors的數值,按照他們自己的權重可以算出這4個大的factor的數值,然後再按照這些大的factor的權重算出來一個最終的得分作為衡量股票表現強弱的標準。應該是得分越高,這個股票的表現越好。但由於我們的策略是不希望股票的表現過於強勢,所以當股票表現差的時候會trigger我們的策略(否則就單純long?或者加入其它的策略也可以)。OK,現在開始解釋怎麼用logistic regression來做這件事。我們首先需要弄清楚我們的Y和Xi分別是什麼。這裡對於Y呢,我們想要預測的是「call OW策略」是否優於單純做多這個股票的概率,所以也就是當樣本數據中「call OW策略」的收益高於單純做多的時候Y的取值是1,低於單純做多的時候Y的取值就是0。對於Xi,這裡每個股票的這10個小的factor作為不同的因子Xi。對於樣本數據,由於金融的數據不是很多,所以想要減少model的對於數據本身的依賴程度variance,我們可以用前面bootstrap的方法來抽樣得到很多個不同的sample dataset,每一個sample dataset都用logistic regression來擬合,自然每一個sample dataset我們都可以得到一個logistic regression的方程,也就是每一個sample dataset我們都可以得到一套這10個因子的係數,即他們每個因子分別對每一個logistic regression預測概率的貢獻程度(感覺自己好啰嗦,這樣的解釋比較白話了吧...)。最終的結果就是對這些不同sample dataset擬合的model的結果取平均值。(如果對研究某一個係數感興趣就是將這個係數取平均值,如果是對最終的預測概率Y感興趣就用每一個sample dataset的預測概率Y取平均值,實際上也就是取感興趣東西的distribution的mean)對於係數的理解可以參照linear regression,係數的正負就是這個因子對於預測結果的影響方向,係數的絕對值大小就是其影響的大小。bootstrap其實是為了多次重複試驗獲取Y或各個因子前面係數的distribution(或者quantile,因為distribution本身就含有quantile的信息),也可以用來降低variance。因為是很多次重複試驗的平均值,因為bootstrap之後獲得分布的均值會比用全sample僅做一次regression的結果的variance更小。簡單來說,就是做無數次實驗,然後每一次實驗都得到一個結果,將這些結果全部扔進histogram裡面,就變成了這個想要觀察結果的分布圖(這個結果可以是Y,也可以是各個因子前面的係數,下面Figure 57裡面10個因子的係數應該就是取平均值之後的結果)。下圖結果的意思是我們需要避免3M Realized Volatility這個因子高的股票,但是Earnings Certainty和12M Price Momentum這兩個因子是對股票有利的。然後通過logistic regression,我們就通過這10個Xi和其係數可以預測出來「call OW策略」的收益優於單純做多這個股票的概率。並且可以自己自行定義,當概率超過某一個值(不一定是50%,可以更嚴格比如80%,90%都可以,其實這個也可以用統計的方法來求得最優的一個benchmark)的時候trigger這個「call OW策略」,如果小於這個概率值的話就單純做多這個股票。 上圖裡面我其實有一個疑惑的地方,就是這個地方的score quantile(Model score from logistic regression)應該跟前面提到的10個factor的Q-score是不一樣的。因為上面右圖中隨著這個score的增大,「call OW策略」優於單純做多這個股票的概率越大,也表示著預測的股票的表現會隨著這個score的增大而越來越差才對。但實際上Q-Score的值越高,預測的收益率就越高。Q-Score裡面也有我們用到的這10個相同的因子(因為這10個因子就是從Q-Score的model裡面來的),所以我們可以像前面Figure 56里表示的那樣根據權重算出來那4個大的factor,再把這些大的factor結合起來變成一個綜合的分數來衡量這個股票的強弱程度。但這裡似乎沒有用到這個方法來衡量股票的強弱。我稍微搜了一下JPMorgan以前的報告,Q-score具體是長這個樣子: The higher the Q-Score the higher the one month expected return。 這裡明顯和Figure 57右圖不符合。所以現在的問題就變成了Figure 57右圖中的橫軸"call OW score"是怎麼計算的。但我也不知道...感興趣的讀者可以自行研究...可能在文章給的JPMorgan Market的link里,但如果沒有access的就看不到那個報告了。這大概就是怎麼運用logistic regression來處理是和否的問題。當然,任何模型都有其適用範圍,logistic regression也不例外。logistic regression的缺點就是當處理很多個變數Xi的時候,不能很好的解決Xi之間相關性的問題,這個需要很注意。 Support Vector Machine接下來我們可以看看另一個classification的方法,就是很著名的Support Vector Machine(SVM)。首先我們可以看一張圖: 這張圖表示的東西呢,就是我們有一堆觀察點,每一個觀察點都有Y和X1,X2的值。這裡Y呢因為是classification,所以只有兩個值,一個藍色(我們分配的值給+1),一個是紅色(我們分配的值是-1)。X1的值就是橫軸,X2的值就是豎軸。所以每一個觀察的點都有Y,X1,X2這三個屬性,畫在X1和X2的平面上面,Y的值用顏色來表示。我們想要做的事情呢,就是用一條線把這些點區分開來(譬如圖上的三條黑線都可以把藍色的點和紅色的點分開了)。由於這是二維平面上面的一條線,所以其表示的方程就是:??0+??1·X1+??2·X2 = 0 這一條線確定之後,係數??0,??1,??2也就確定了,以為其只是用來確定這一條線的係數,並且在這條線上面的點的坐標(X1, X2)都滿足這個方程。所以利用這樣一條線,我們就可以用來區分這一條線兩邊的點了。當一個點的坐標(X1, X2)滿足 ??0+??1·X1+??2·X2 > 0 的時候 ,就處於這條線的上方,也就是藍色(Y=+1)。反之,如果滿足 ??0+??1·X1+??2·X2 < 0 的時候,這個點就在這條線的下方,也就是紅色(Y=-1)。這樣我們就將這兩種情況合併成一個式子來表示這條線兩邊所有點需要滿足的條件:Y·(??0+??1·X1+??2·X2) > 0但是這裡就出現了一個問題,圖中有三條線,這三條線都可以將藍色和紅色的點分開,那我們怎麼對比這三條線的好壞呢~這個問題也很好解決,那就是我們希望這兩邊所有的點離這條線的距離儘可能的遠,因為這樣就說明這兩邊的點被這條線區分的最開,區分的結果自然也就更加可信,也就是使兩邊的點到這條線的垂直距離儘可能的大。為了使得他們分得更開,我們可以將大於0這個條件更加嚴格一點,使得Y·(??0+??1·X1+??2·X2) > M,M是某一個正值,這樣也就給兩邊都增加了緩衝區,使得兩邊的點距離這條線的距離全部都大於M,並且我們希望這個M的值越大越好。(因為M的值越大,說明兩邊離這條線的距離最近的點越遠,也就保證了其他所有點都會離得更遠)數學上的表達式是這樣(這裡i是指的每一個點,係數??的和被標準化為1,這樣normalize之後可以和M值作對比): 然後就變成了如下這張圖,中間那條黑色的實線就是之前M=0的情況,而兩條虛線就是方程加上某個正數M之後的效果((其實就是對中間這條黑線分別上下平移距離M)。還需要注意的是,這裡M並不是我們人為給的一個值,而是上面的數學式對所有的點經過一定的optimization之後得到的結果,各個Xi係數??的值也是一樣經過optimization之後的結果。 但是,不要以為這樣就可以解決問題了,因為實際情況並非這麼完美。很可能會產生如下的情況,藍色和紅色的點都混雜在一起,就無法再用一條直線完全將這些點都分開。 那我們怎麼辦呢?這裡我們就要進入真正的Support Vector Machine的內容了。但具體應該怎麼做呢?也許就有人會想到,那如果我把M的值變成負數會怎麼樣?這個其實也就是下面要說的,我們可以在上面的數學式子裡面加入一定的錯誤率(也就是那些錯誤被線分類的點,反應在式子裡面就是M加上一個負數),也就是允許這條線兩邊的藍色區域允許有紅色的點,紅色區域允許有藍色的點,但是需要將這些錯誤率保持在自己能接受的一定的大小之內,畢竟我們希望其錯誤率越小越好(最理想的情況就是這條線兩邊的點完全沒有錯誤率,也就是最開始完全分開的情況,但是現實中基本上不存在),所以可以將其作為一個penalty ?加入上面數學的表達式中。並且我們可以把這個penalty變得更加有效,使得其跟緩衝區結合起來。我們可以看如下的圖, 上面的左圖中,和前面一樣,我們可以看到中間的那條實線代表的是M=0,虛線代表的是藍色和紅色兩邊的緩衝區。這樣所有的點就被劃分在了4個區域裡面:藍色一邊: 在緩衝區內,在緩衝區外紅色一邊: 在緩衝區內,在緩衝區外這樣我們就可以給予不同區域的點不同的penalty的值?。因為這實際上和前面一樣,都是optimization的問題,所以我們需要先給?在不同區域內不同的loop範圍求得其最佳值。當藍色的點在藍色這一邊的緩衝區之外,或者紅色的點在紅色這一邊的緩衝區之外的時候,我們將?的值設置為0(因為這是最理想的情況,沒有penalty)。當藍色的點在藍色這一邊的緩衝區之內,或者紅色的點在紅色這一邊的緩衝區之內的時候,我們將?的值設置為0<?<1(因為在緩衝區內的話就開始有一定的分類錯誤風險,我們設立緩衝區的目的就是為了使得所有的點分的越開)當藍色的點在紅色那一邊的時候,或者紅色的點在藍色那一邊的時候,我們將?的值設置為1<?(這裡因為已經形成了錯誤的分類,所以將?的值設置的更大一點,並且在錯誤的一端錯的越遠這個penalty的值就越大,對整體分類效率的負面影響也就越大)所以我們就有下面的數學表示: 這裡中間那一條分類線其實和M還有penalty ?無關,因為其本身就是當M=0時候的結果。這裡變化的只是最優緩衝區的確定,並且這是整體所有點都考慮進來之後的最優緩衝區。這裡?就是上面說的的penalty。第三個式子右邊的M·(1-?)表示的是加入?這個penalty之後改良過的每一個點距離中間那條線的「距離」,在不同的區域內的時候由於?的值不一樣,分類越錯誤,M·(1-?)的值也就越小,錯誤分類的時候其值甚至是負數。但我們是想要其越大,因為其代表了所有點距離中間這條線的」距離",所以我們需要將整體的?之和控制在一定的範圍之內。這裡的C就是我們自己設置用來控制所有在緩衝區甚至錯誤分類的點的?總和。我們想要整體的(潛在錯誤:緩衝區內 和實際錯誤: 在另一個相反區域內)錯誤率越小,也就是想要C的值越小。當我們設置C為0的時候,也就是讓所有的?都是0,也就是一開始最理想的情況,0容忍率。當C設置的越大,也就表示我們對於錯誤的容忍程度越來越大。同樣,我們希望的是通過這個數學式的optimization得到所有點共享的一個M值(因為存在有錯誤分類的情況,所有這裡的M就不是前面理想情況下距離中間那條線最近的那個點的距離了,而是一個真正使得整個分類最優化的緩衝區域,我們稱作Margin)和Xi的??值,還有每一個點分別的?值。?進行optimization逼近的時候的跨度取決於這個點在哪個區域,實際上也是取決於M的取值,因為M代表的就是margin的範圍大小。我們自然是希望M的值越大越好,因為其代表的是分類的有效程度,又不能變得很大,因為加入?之後,當M越大的時候包括進margin的點就越多,也使得?不為0的點就越多,這樣分類的效率就越被侵蝕。所以這其實是一個M值和被包括進margin區域的點的?(還有本身就是錯誤分類的點的?)總和C之間的一個平衡。我們還可以從上面的式子看出來一個現象,那就是只有在緩衝區內和錯誤分類的點才會對M的值(或者說優化的緩衝區大小)產生影響。這些點其實就是被稱作support vector,他們的作用就是確定最優的緩衝區,我猜名字的來由也就是他們是用來support將兩邊區分開來的區域。因為其實我們只需要保證這些點同時距離中間那條分類的直線最遠即可,其他在緩衝區之外的點都比這些點離中間的分類線更遠,所以也同時保證了緩衝區外的點都更能被分類。這裡我們也可以想到,由於在緩衝區外面的點的penalty ?為0,所以對於緩衝區的大小其實沒有影響,有影響的僅僅只是?不等於0的緩衝區內和錯誤分類的點(當然這裡有一個feedback loop,因為只有確定了緩衝區M的值之後才能知道哪些點在緩衝區外面,所以整體才是屬於全局優化的問題)。緩衝區的重要意義在於,在緩衝區之外的點,我們可以非常確信是這一邊的分類,所以我們是希望緩衝區外面的點越多越好,我們對於所有點的整體判斷成功率就越高。所以當我們將我們對於錯誤的容忍程度C的值降低的時候,緩衝區的大小也在收縮。如下圖我們可以看到隨著C的值減小,緩衝區的寬度也在一直變窄: 這裡我們給予的參數C做的事情其實就是統計模型中最核心的bias和variance的tradeoff。當C很小的時候,我們對錯誤分類的容忍程度小(當設置C=0的時候,其實是零容忍),緩衝區會很窄M的值很小,很少的點會在緩衝區內或者被錯誤分類(即緩衝區被很少的點所決定),這樣其實是使得整體的分類效果更好(bias很小),但犧牲的就是model的靈活性,也就是variance很大,對於out-of-sample的數據的分類效率會很低。直觀的理解上來說,如果我們將緩衝區內的點稍微變一下,對於緩衝區的影響是非常大的,也就說明這個緩衝區對於數據的依賴是非常大的。同理,當C很大的時候,錯誤的容忍程度大,緩衝區會很寬M的值很大,然後幾乎所有的點都被包括進了緩衝區,所以整體的分類效果會很差(bias大),但是對於數據的依賴性降低(variance小)。這裡的直觀理解也類似,如果我們改變一些緩衝區內點的值,對緩衝區的影響非常小,因為緩衝區取決於其他更多的點,也就是對於數據的改變不是那麼敏感。這兩種情況我們都不希望發生,我們需要在bias和variance之間找一個平衡點,所以我們就需要用前面介紹的cross-validation的方式來確定最優的C的值。OK,經過上面的過程,基於我們所有的數據,還有設置合適的C值,就可以得到中間那條分類線和緩衝區了,然後就可以根據他們對於out-sample的點的X1,X2的值進行Y的分類預測。實際情況其實還經常會更加複雜。上面講的SVM是僅僅針對linear的情況(也就是直線就可以幫助進行分類)。但如果是如下的情況呢?很明顯這樣線性的預測就不再適用了。 這裡我們就需要將線性的空間拓展或者經過映射變成高維非線性的空間(圖中的例子是2維,因為只有X1和X2這2個變數,為了得到non-linear的關係,我們需要將X1和X2進行升維,譬如簡單的加入另外的因子X1和X2的平方值,開方值,log值等等形式,複雜的就是直接將每一對觀察值本身作為因子或者說kernel,將直線變成曲線甚至是圓等等形式),如下圖所示: 我們可以看到,這樣non-linear的SVM分類方式對於上圖更為合適,在實際操作中kernel的具體形式可以自行在R中選擇(具體選擇哪一種更合適可能就取決於自己對於想要處理的dataset性質的了解了)。 上面就是具體kernel來升維的數學推導過程,感興趣的童鞋可以仔細推敲。如果不感興趣的,也可以裝作懂了的樣子,繼續往下看其具體在外匯option上應用的例子了~ 這裡的主角是外匯期權,1M ATM EURUSD options,我們來看看Y和變數Xi分別是什麼。這裡的Y是由rolling這個期權的long position產生的PnL(profit and loss)決定的,並且是分類的類型。當PnL<-20 bps的時候,Y的分類是」vol sell」,這裡vol的意思是波動率volatility,後面的期權部分會詳細介紹。當PnL>20 bps的時候,Y的分類是」vol buy"當-20<PnL<20 bps的時候,Y的分類是」neutral"這裡的Xi呢,是由如下377個不同的指標構成(由於這些指標的scale不一樣,所以依然需要對其normalization處理): 然後對於數據呢,我們是取的過去10年daily的數據,一共是2609個點。為了防止overfitting,我們用Principle Component Analysis(PCA,後面也會詳細介紹)來對Xi進行降維(因為這裡的Xi有370個,過於多了),我們通過PCA選取最重要的60個,90個,180個變數Zi(這裡的Zi是由全部的Xi線性合成的大因子,被稱作主成分因子)。如下圖: PCA呢,是一種對變數Xi非常多的情況進行降維的方式,下面unsupervised的統計方法裡面我們會細緻講這個方法是具體怎麼降維的。主要的思路就是將所有的Xi線性組合成若干個主成分因子Zi,使得其能最大程度的代表所有的信息。上圖表示的就是這些最主要貢獻的Xi積累起來對於Y的解釋程度,也就是這些選中的Xi所包含的信息能涵蓋Y的多少信息。橫坐標就是由PCA選出來的主成分因子的數目,縱坐標就是對Y的解釋程度。例如在圖裡我們可以看到,當我們選擇前60個最大貢獻主成分因子的時候,可以解釋86.1%的Y;當增加到前90個因子的時候,可以解釋91.9%;當選取前180個因子的時候,可以解釋98.6%,相當於我們用了180個主成分因子就代表了原始370個因子的91.9%的信息,使得計算和model複雜程度都大大減少。有些盆友可能會覺得有疑惑,前面的linear regression的lasso方法似乎也可以用來降維,為什麼這裡要用PCA這個方法呢。我覺得有兩個原因:lasso方法需要利用連續的Y的值去做regression才能進行降維,而這裡Y是分類不是數值,並且PCA的方法僅僅只需要Xi本身的信息就可以直接對Xi進行線性組合來降維。第二個原因是這裡的因子數目太多,有370個,如果用lasso的linear regression直接做回歸會使得模型不穩定和過擬合。對於數據,我們將其分成兩部分,前8年的數據作為training sample,後2年的數據作為test sample,並且對於training sample用了10-fold cross-validation的方式去train model。10-fold cross-validation其實是k-fold cross-validation中k=10的情況,其內容是將training sample隨機均分成10組。然後每次選出一組作為validation set(其實也就是用來做test sample),這一組選出來之後剩下的數據全部作為training set來train模型,模型確定之後再應用在那選出的一組上求得MSE(可以當做test error)。這是一次實驗。接著按照同樣的方式將這10組的每一組都作為validation set進行同樣的步驟,每一組都可以求得一個MSE的值。然後最終的結果就是將這10組MSE的值取平均,得到這個model最終的MSE。但是這裡為什麼要用10-fold cross-validation我比較疑惑。或者說這裡的10-fold cross-validation是用來得到10個Y的預測,然後平均一下得到最終的Y?不太確定10-fold cross-validation是不是可以直接用來對Y求平均值。一般10-fold cross-validation只是用來求得平均的MSE,或者說根據某一個變化的參數畫出來最小MSE時候(一般由於這個參數是penalty因子,代表的是bias和variance之間的tradeoff,自然MSE的圖會是U型)這個最優參數的位置。然後得到如下的結果: 我們可以看到KNN,SVC(也就是SVM,kernel是三階的polynomial方程)還有SVC(kernel是線性的方程)這三種model表現最好。預測的結果跟現實的結果對比如下圖: 我們可以看到SVM的方法預測準確率還是比較高的(也就是一般預測的都是對的),但是抓住機會的次數(或者說預測trigger開倉的次數)不多。所以策略的話可以著重利用高準確率這方面,或者重倉。上面我們了解了兩種處理classification問題的方法,一個是logistic regression,一個是SVM。他們的比較是當分類的點非常分散的時候SVM的表現更好(圖上的表現就是相同類別的點會聚集在一起,並且不同類別的點盡量分開),當各個類的點混雜在一起的時候logistic regression更加合適(高度混雜在一起的時候SVM就無能為力了)。SVM可以看作是一種空間上的mapping,所以當不同類的點被糅雜在一起而不是分團聚集在一起的時候(聚集在一起不一定是指在linear情況的在線的同一邊,也可以是聚集成圓等等形狀,通過mapping到另一個合適的更高維空間依然可以轉化成linear的情況來進行處理,繼而再mapping回去降維),會難以找到一個合適的映射空間處理問題。2.5 Unsupervised Learning(包括期權相關科普)
Principal Component AnalysisUnsupervised方法和Supervised的區別呢,就是在應用的過程中有沒有涉及到Y。如果有Y,那就是supervised,更進一步如果Y的取值是連續的數值,比如漲跌幅度,那就是quantitative,比如regression的方法;如果Y的取值是discrete分立的類,那麼就是qualitative,比如classification的方法。如果沒有Y,那就是屬於Unsupervised方法。因為沒有Y,所以Unsupervised的方法僅僅操作因子Xi本身。這裡unsupervised由於沒有Y,所以並不像supervised一樣是用於預測某個值或者某個類,而是主要是用於研究Xi之間的關係。所以Unsupervised方法有一個好處就是可以作為應用supervised方法之前對數據本身的預處理,數據本身的信息對於後期我們選擇supervised方法進行預測Y有很大的幫助。所以unsupervised方法又起到exploratory data analysis的作用。但是我們也要知道unsupervised方法有一個問題,正因為沒有Y,所以我們沒有辦法像supervised方法那樣驗證我們的結果是否正確。相對於supervised方法,unsupervised方法還有一個好處就是可以處理當因子Xi非常多(比如成百上千個)但是數據量又不是那麼多的時候的情況。如果直接用傳統的regression方法就會造成模型很不穩定,所以可以先利用unsupervised裡面的Principal Component Analysis(PCA)方法將Xi進行降維,下面將會介紹到。好了,大概unsupervised方法的背景就介紹到這,現在介紹一下其具體內容。Unsupervised裡面分為兩塊兒,一塊兒是Factor Analysis,另一塊兒是clustering。首先呢,我們介紹Factor Analysis這一塊兒,其中比較重要的Principal Component Analysis(PCA)方法。為了更好的理解PCA的應用,首先簡單介紹一下PCA的原理。從名字Principal Component Analysis我們就可以大概看出來這個方法想幹嘛,中文翻譯過來叫做主成分分析。自然,其想要研究的就是主要的成分,換句話說,就是用最少的變數描述最多的信息這裡和前面lasso的方法有點不一樣,lasso是直接把因子Xi前面的係數變為0,也就是直接把這個因子剔除的方式來給因子Xi降維,而PCA是將很多的因子Xi進行線性組合,變成若干幾個Zi來代表盡量多的信息。(這裡一定要注意,PCA並不是像lasso一樣將Xi的係數變為0的方式來降維,而是通過找到能最大代表數據信息的Zi,每一個Zi都含有所有Xi的信息,只不過他們前面的係數不一樣)因為如果當因子非常多(有些fund的strategy pool里有上百萬個因子)的時候,我們可以通過PCA將這些因子構造成若干個主因子來進行操作。並且在統計界有一個恐怖的傳說,叫做"curse of dimensionality」。因為因子Xi是我們人為主觀判斷可能會跟Y有關係才加上去的,那麼有些人會想,因子的數目不就越多越好?畢竟最怕的就是在預測Y的時候沒有將真正有貢獻的因子考慮進來,前提錯了的話後面不管怎麼弄fancy的model都是錯的,所以那如果把能想到的因子全部都加進去這樣不就萬事大吉了么,一個都不能少!這樣的想法是沒錯,漏掉重要的因子很可能會對Y的預測效果產生巨大的影響。但是凡事都是一個平衡,如果在模型裡面因子加入了太多的話,即使把真的有貢獻的因子加了進去,也會淹沒在茫茫的因子中(因為加入的沒有貢獻的因子更多,並且由於每一個因子都有一定的權重會一起影響這個model,相對來看,有貢獻的因子對於模型的解釋能力其實是被稀釋了)。用統計的黑話來說就是,加入好的因子雖然會使得模型整體的bias下降(畢竟因子的信息更全面了),但是損失的是整個模型的variance會變大,也就是增加了其對於數據本身的依賴性,導致overfitting。特別是當因子的數目甚至大於我們數據點的數目的時候,那基本上無解了~(no kidding,是方程真的木有唯一解了…) 所以這裡對於Xi降維的重要性就體現出來了,一個就是像lasso做的只留下幾個能產生最多貢獻的因子,另一個就是將所有因子線性組合成若干個可以代表這些因子信息的大因子,雖然這樣同時也扔掉了沒有被包括進來的因子可能包含的真實的有效信息,但由於減少不那麼重要的因子數目,降低整個模型的variance,雖然會一定程度上犧牲模型的bias,但是總體來看效率還是提高了。這樣,通過PCA的降維方式,我們就更清楚數據信息背後的結構和主要的貢獻來源,使得後續supervised方法的fitting更加有效率。除此之外,PCA還能將這些主要的因子線性組合起來,變成若干個大的因子(實際上這些大因子就叫做Principal Components,主成分),用這些大因子代替之前的單個小因子Xi來盡量解釋最多的Xi的信息。因為同樣對於高維(Xi非常多)的情況,還有一個問題就是當因子數目多了之後,因子之間的相關性問題會變得非常嚴重(我們可以想像因子足夠多的時候,他們之間的信息很難會是完全exclusive的,特別是像金融市場,不同因子之間基本上都會有一定的相關性)。一個解決辦法就是將這些相關聯的因子結合起來變成一個因子,也就是這裡PCA可以做的事情。並且PCA可以保證這些得到的大因子之間是線性不相關的,也就是在方向上是垂直的。PCA通過正交變換將一組可能存在相關性的變數(若干Xi)轉換為一組線性不相關的變數(變成Xi的線性組合Zi),除去對結果影響不大的特徵,轉換後的這組變數叫主成分。好了,接下來就是數學上的解釋了。為了避免公式的推導,直接用上圖吧。祭出遇到PCA必拿出來的一張圖: 這裡的橫軸和縱軸分別是X1和X2兩個變數,然後所有的點都畫在這樣一個二維的平面內。現在呢,我們想要用一個變數去盡量包括這些點最多的信息,PCA也就是做這件事,圖中的綠色哪條線就是PCA的結果。怎麼解釋呢?可以這麼看,一個理解是最小二乘法,也就是這些點距離這條直線的距離最短,就像regression一樣,最理想的情況就是這些點全部都在這條線上,自然這條線就能完全描述這些點的信息。另一個理解就是最大方差理論,盡量使這些點在這條線或者說這個方向上的variance最大,也就是讓這些點向這條直線做投影,要盡量使得這些點的投影距離最遠。為啥要最遠呢?因為最遠可以表示有更豐富的信息落在這一條線上面,這些點的區分度也越大。舉個例子,「舉個例子,比如現在有10個人的數據,每條數據有兩個維:出生地,性別,10個人的出生地各不相同,5男5女。從感覺上看,哪一維所包含的信息量大一些?是不是出生地呢?如果我一說出生地,是不是馬上就可以找到那個人了呢?因此出生地各不相同嘛,而性別呢?因此性別只有2種,因此會有大量重複的值,也就是很多人的值都是一樣的,這個屬性對於人的刻畫效果不好,比如你找一個性別是男的人,可以找到5個,這5個人從性別這一維上看,是完全一樣的,無法區分。從PCA的角度來看,出生地這個維的方差就要比性別這個維的方差要大,而方差大就說明包含的信息比較豐富,不單一,這樣的特徵是我們希望留下的,因此就這個例子來看,PCA更傾向於保留出生地這個特徵。那麼是不是簡單的就把需要保留的特徵留下來,不需要保留的特徵去掉就行了呢?比如說剛才那個人的數據的例子,是不是直接把性別這個特徵去掉就完了?遠遠不止那麼簡單,PCA是把原特徵映射到一個低維空間上,使得特徵在這個低維空間中的方差最大,如果是直接去掉特徵維的話,那麼剩下的特徵不一定是低維空間中方差最大的。這裡要注意一個問題,繼續剛才那個人的數據的例子,有2維,性別和出生地,如果用PCA把它降成1維,那麼這一維是什麼?這是沒有定義的,也就是說,這一維既不是性別,也不是出生地,它已經沒有定義了,我們只知道它是1維選擇出來的特徵而已,但這並不影響我們對特徵的使用。」說了這麼多,現在我們大概知道PCA是在干一件什麼事情了,就是通過線性組合高維空間中Xi的方式構造出若干個Zi來對數據進行降維,並且找到盡量能代表所有點信息的幾個主方向(也就是幾個構造的大因子,一般第一個大因子包含的信息最多,然後信息度濃度次遞減)。好了,接下來說PCA的具體應用。這裡PCA是應用在期權的implied volatility surface上面。首先我們來看一張implied volatility surface的美圖: 什麼?又一臉懵逼? 看來這裡需要稍微介紹一下期權才行呢...首先,能讀到這兒的我充分相信大家的實力,就直接上傳說中的BS公式了(摘選自wiki)。 期權定價的核心幾乎就是這兩個公式,Call的定價和put-call parity的問題。我們看第一個式子Call的定價C(St, t),我們可以看到這個式子中有5個參數。對於固定某個時間T,我們知道這個call的strike price執行價格K,也知道這個call的maturity到期時間(T-t),也知道risk free rate無風險利率r,正態分布N(·)的形式自然也都知道,剩下的就是volatility ??不知道,所以現在我們就得到了一個volatility的方程來表示Call的價格C(St, t)。volatility是一個什麼東西呢?volatility是波動率,也就是期權underlying的標的價格的標準差。你如果問我標準差怎麼算,我只能說去Google一下,計算講的太細節估計都看睡著了...所以假如我們知道volatility呢,我們就可以知道這個Call的理論價格,也就可以衡量當市場上Call的實際價格是高還是低,高了呢我們就可以賣,低了呢我們就可以買。可惜天上不會掉餡餅,因為我們不知道volatility...接下來還得知道BS公式的假設前提: 我們就可以看出BS模型的一個弊病了,那就是它假設underlying標的價格的波動率volatility是一個常數,跟strike price還有maturity沒有半毛錢關係。這明顯是不符合實際情況的,因為市場會對對於不同的strike price和maturity有不同的預期和偏好,導致市場對於未來波動率的預期也會不一樣。但是!我們雖然不能用波動率來算出來期權的理論價格,可是我們可以反過來呀~我們有期權的市場價格,還有BS公式裡面其他一系列的變數,比如strike price K,期權的maturity(T-t),也知道risk free rate r等等,就可以反過來求出來理論上的波動率。這樣我們就可以知道市場對於未來的underlying標的的波動率預期了。具體怎麼算出來的,簡單一點說就是當其他變數已知也就是固定的時候,期權的價格和波動率是一個單調遞增的關係(如果對Greek有了解的,其實就是因為期權價格對波動率求一階導的Vega是正值),所以不斷試??的值就可以最終match到當下的期權價格上面,自然也就是對應的波動率的解了。看到這兒,很多人心裡是不是在想,「尼瑪,這貨說了這麼多,implied volatility到底有啥用?」首先呢,implied volatility對於期權玩家的重要性不言而喻。假設市場的每個參與者都使用BS模型定價,由於模型所需的其他輸入值比如執行價格、所剩期限、標的價格還有無風險利率都是相對固定的,人跟人對於期權價格的看法就是取決於他們對於未來這個資產的波動率了。假設有一個人巴菲特附體如有神助,對於未來資產波動率的預測百發百中如入無人之境,那麼他(她)就可以根據自己預測的期權的價格跟實際的期權價格作對比來低買高賣,賺的就是別人對波動率的預測都很弱雞。但是可惜的是,這種外星人是不可能存在的,不然早就是世界首富了。當然如果有個人弄出來一個模型可以準確預測資產未來的波動率,那也超神了。所以對於我們一般戰鬥力只有5的地球人怎麼辦呢?我們可以反其道而行之,利用將已經是事實的市場的期權價格代入BS公式中算出來大家對於未來波動率的預期,也就是隱含波動率。因為期權價格是市場上供求關係平衡下的產物,是買賣雙方博弈後的結果,所以隱含波動率反映的是未來市場對標的產品波動率的看法。但是,算出來有什麼用呢?我們除了隱含波動率,還有一個波動率叫做歷史波動率。這個東西其實算出來也挺簡單的,只要我們有underlying標的的價格變化歷史數據,就可以用統計的公式算出來標準差,也就是波動率。而且我們發現一件什麼事情呢,那就是歷史的年化波動率是處於一個區間,會有回歸均值的一個特性(做swing交易的同學應該最熟悉了),並且離開越遠回歸的速度就越快。比如說有一個股票,歷史波動率都是在10%到30%之間,這樣我們就可以知道從現在期權市場價格算出來的隱含波動率在歷史上是處於高還是低的位置,同樣可以做到低隱含波動率的時候買期權高隱含波動率的時候賣期權。但這裡有一個問題就是歷史波動率的區間,不代表就真的不會飛出區間去,當發生重大事件或者傳說中的黑天鵝的時候隱含波動率也會變很極端,比如Black Monday的時候飛到了150%,08年金融危機的時候也飛到了80%。 當然,做均值回歸有點投機的感覺。有的同學可能覺得太low,我可是做價值投資的,只是想利用期權對沖一下風險。同樣,隱含波動率也很有用的!因為當確認了自己想投資的標的方向之後,可以把隱含波動率跟歷史波動率作對比,權衡一下此時買入期權是不是划得來。也可以對不同strike price和maturity的期權進行橫向比較,畢竟都是針對同一個資產,自然希望在滿足了自己的需求買(賣)的情況下期權的價格越低(高)越好咯。除此之外,對於直接交易underlying標的的交易員,我們也可以利用期權來幫助自己對標的的未來走勢做出一定的判斷。比如我們可以根據市場上對於同一個標的的所有不同strike price和maturity的期權價格,算出來每一個strike price和maturity對應的隱含波動率,其實也就是市場對於這個標的未來波動預期。然後將這個算出來的隱含波動率代入比如說隱含波動率二叉樹模型,再算出來市場對於標的未來走勢的預期,因為期權的價格本身就是已經是集中了市場上所有的有效信息,所以隱含波動率其實也包括了所有的博弈信息,利用其推導出來的未來走勢就可以幫助我們對直接trade標的有一個大概的方向和市場預判。好了,對於基本的期權概念應該有一個大概的sense了,接下來我們就來詳細解釋一下之前那張volatility surface的圖。 (此圖是在之前讀伽瑪交易員一篇文章存下來,08年危機時候的volatility surface,感謝之~)期權交易員對volatility surface都會非常熟悉,因為這一定程度上就是自己根據市場情況做trade和進行風險對沖的基礎。
volatility surface呢,是一個三維圖,Z軸是隱含波動率,X和Y軸分別是moneyness和term(也許不同的軟體會有不同的名字,這裡借鑒Bloomberg的表示)。moneyness的意思就是期權strike price和underlying標的的價格的ratio,這裡以call為例,分為in-the-money(strike price小於underlying標的的價格,ratio小於100%的區間),at-the-money(strike price等於underlying標的的價格,也就是圖中的ratio等於100%的位置)還有out-of-the-money(strike price大於underlying標的的價格,ratio大於100%的區間)這三種狀態。如果是put的話strike price和underlying標的價格的關係則是反過來。term的意思呢,就是不同的到期日。所以呢,我們可以把未來每一個到期日的每一個strike price和其算出來的隱含波動率畫在一張3D的圖上,這個就是volatility surface了。上圖中右上角的是volatility VS term的二維橫截面曲線,右下角是volatility VS moneyness的二維橫截面曲線。可以說volatility surface包含了絕大部分我們需要了解的volatility的信息,而上面也介紹了volatility又是期權的核心,自然volatility surface的重要性也就不言而喻了。既然volatility surface這麼重要,那麼如果我們可以預測未來的volatility surface是不是就相當於我們可以預測implied volatility進行交易了呢? 因為如果僅僅根據歷史波動率進行交易,很明顯我們丟掉了其他的很多有用的東西,僅僅只留下了波動率大小這一個信息。如果根據整個volatility surface的歷史數據進行分析,對我們的預判的幫助會更大。在知乎上面看到說成功的期權交易,是做整個曲面的變化,這涉及的是曲面的smile/skew(下面會介紹),和曲面的整體高低位置,前者貢獻利潤的10%,後者貢獻利潤的90%。好了,鋪墊了這麼多,接下來介紹利用PCA來分析volatility surface的信息。這裡選擇的underlying標的是USDJPY(美元兌日元),至於為什麼選這個,我感覺可能是想了解美日間carry trade的情況,而且日元是外匯市場非常重要的組成部分。接著我們看看具體怎麼將PCA應用在USDJPY的volatility surface上面。volatility surface是一個三維的圖像,Z軸是隱含波動率implied volatility,X和Y軸分別是moneyness和term。對於PCA我們知道它做的事情是將所有的變數Xi線性組合成幾個大的因子(主成分)Zi,所以問題就來了,我們的Xi到底哪些。這裡我們有的是implied volatility,moneyness還有term的信息。但我們並不能將他們全部作為Xi,因為雖然volatility是連續的數值,但term和moneyness的信息是固定的點。所以我感覺這裡有一個trick就是將每天的volatility的變化值作為Xi的值,而moneyness還有term的信息作為Xi的位置。估計這麼講會有點混亂,畫一張圖就清楚了。 我們這裡可以將所有的點都拉成一條線作為Xi,然後每天都有一列數據Xi。這樣處理我們就將整個volatility surface變為了一列變數Xi,因為每天都有一個volatility surface,所以每天可以作為一個observation。這樣就將volatility surface的問題轉化成了PCA的問題,我們想要找若干個由Xi線性組合成的大因子Zi,使得這些個Zi的方向最大程度的代表所有的點的信息(每天可以看做是這個Xi維空間上的一個點)。換做實際問題的解釋,這些Xi的信息其實就是每天的整個volatility surface的信息,然後找到的由Xi線性組合成的大因子Zi的volatility surface可以最大的程度代表歷史上所有天數的volatility surface的信息。報告裡面呢,選取了前三個主成分Z1,Z2和Z3,分別的圖如下: 然後PCA還有一個好處呢,就是可以算出來每一個合成的大因子(主成分)對於所有點的解釋程度(上圖右下),也就是包含了數據中多少比例的信息。具體的方法叫做「proportion of variance explained(PVE)」,做法就是算出來這個大因子的variance和數據整體的variance之間的比例。所以這裡我們就找到了前三個大因子的貢獻率分別是88%,4.8%和3.66%,下圖就是這三個主成分大因子在歷史上不同時間的解釋能力。可以看到第一個主成分的解釋能力保持恆定,並且幾乎都在80%以上。 知道了能代表所有歷史上volatility surface的這3個主成分之後我們自然能做的事情就很多了。比如依據第一個主成分來判斷delta hedge ratio(這裡delta是期權價格對於underlying標的價格的一階導,可以當做期權的價格對underlying價格變化的靈敏程度),也就是hedge delta使得整個portfolio獨立於underlying標的價格變化(但實際上delta hedge只能解決一階的hedge,二階gamma的hedge因為是非線性所以只能依靠另外的期權來進行hedge)。還可以把前幾個主成分單獨拿出來,對剩下的residual做均值0的回歸。並且從這三個主成分大因子得到的volatility surface圖中我們就可以看出來一些信息,對於固定maturity的情況下當moneyness是in-the-money的時候,implied volatility是很高的,說明了隨著in-the-money的程度市場對於USDJPY的看跌程度是越來越大的。如果對於外匯市場了解的盆友可能就知道了,這就是因為日元往往被當做避險貨幣。為了避免觀眾對外匯市場不熟悉,這裡講點日元這個特殊貨幣的背景,那就是日元具有避險功能。我大概總結了一下,僅作參考。(1) 日本的常年低息政策,我們都知道在經濟不好的情況下就會降息,如果已經是低息的話降息的空間就有限,利率降的越多貨幣越弱勢,所以日元貶值的空間有限(2) 同時也是由於日本低息的環境,所以國際環境好的時候很多人是借入日元然後買入其他高息的貨幣進行carry trader套利(就像美元QE的時候美國利息低大家會借入美元買入人民幣投資中國市場),但是一旦國際環境惡化,買入的貨幣國家會實行降息然後貶值,投資的風險喜好也變為保守,這樣套利就沒有辦法繼續維持,大家就會賣出買入的其他國家貨幣然後買回日元還掉以前介入日元的債務,這樣就進一步推高日元和日本的匯率,同時也壓低其他國家的貨幣。(3) 日本的不管政府或者民間的資本在國際環境好的時候喜歡投資海外的資產,譬如政府的養老金基金,當外部環境變差的時候,這部分資金也會賣出資產迴流日本換成日元,即使不換回日元也會買入看多日元的衍生品(期權或者期貨等)來對衝風險,都會進一步推高日元。(4) 日元的池子大,流通性好,外部環境變好之後隨時可以再賣掉(5) 大家只要一出事就做多日元已經是習慣了。。。所以形成了一個自我實現的循環。其實上述對於固定maturity的情況下volatility隨著moneyness變化的現象就是有名的「volatility smile(skew)」。具體這裡不詳細說,因為模型假設的是underlying標的的收益率並符合標準的正態分布,但實際上市場上由於不同的風險偏好產生了期權的尖峰肥尾現象,肥尾的方向也就代表了implied volatility的smile(skew)方向。產生的原因也有很多paper探討,暫時沒有一個固定的說法。也許後面有時間的話我會寫一寫期權的notes,不過看老闆push我科研的程度了...對於期權有一點需要注意或者可以利用,因為漲和跌並不是對稱的,漲的時候總是緩慢的波動率低的,跌的時候總是摧枯拉朽波動率高的,期權價格呢又跟波動率有關,所以呢我們可以利用這一點。譬如說買put,一方面如果資產真的下跌,put本身由於moneyness和intrinsic value會增值;另一方面資產下跌的時候會引起恐慌增加波動率,也會使得期權增值,所以其實兩方面的動力會一起做貢獻讓put的價格飛起來很快。還記得前段時間的50 cent先生么?大家一開始都嘲笑這哥們腦子有病每天給市場送錢,現在才發現這哥們真牛逼。其實吧,他就是利用了期權波動率不對稱這一點,瘋狂在波動率低的時候掃貨買便宜的put,一旦市場有點風吹草動導致哪怕一天的恐慌,向下的利潤是非常豐厚的,遠遠超過前期裸買put的成本投入。當然,別人是建立在對當時整個市場情緒非常敏感的正確判斷前提下才敢這麼單邊做期權,還冒著成為各國基金經理永遠嘲笑的二逼的風險,這種勇氣我還是很佩服的,實至名歸。對於不了解資本市場的同學呢,不要看了之後腦門一熱以為股神附體就all in了,成功了是big short不成功就變big idiot,老婆本都虧光了不要怪我,我代表華夏三千萬單身漢同志歡迎你的加入~PCA除了在期權上面的應用之外,最常見的做法是用來分解portfolio的risk,也就是找到不同主成分大因子的beta(就是市場係數那個beta...)進行分配風險。大概的結論如下: 具體細節參見JPM在2013年的一個報告:https://www.cmegroup.com/education/files/jpm-systematic-strategies-2013-12-11-1277971.pdf對於clustering的方法呢,也就是聚類。報告裡面講的應用細節不是很多,不知道具體金融領域是怎麼應用的,而且裡面直接進行對比的聚類方法太多,好多我也沒見過,就不贅述了...好了,主要的統計方法和應用就講完了。能讀到這兒的簡直真愛...么么噠!三. 隨便結個尾
結尾就扯點最近的感受吧。最近發現大家都越來越擔心自己的工作是不是以後會被機器人取代,特別是人類在圍棋上面被毫無懸念的橫掃之後。不學習就直接被淘汰,譬如美國的工人階層就是一個最明顯的例子,即使trump將工業的工作機會強行弄回了美國,但長久以往人類對於工人技術的需求會越來越小,最終會成為書中的歷史。但被機器人取代還是相對比較長期的趨勢,而短期更需要擔心的還是人和人之間的競爭。有沒有人想過為什麼現在社會競爭越來越激烈,我覺得可能分為兩部分,一部分是人和科技的競爭,另一部分就是人和人之間的競爭。人和人之間的競爭加劇很大一個原因就是互聯網。因為互聯網降低了獲得知識的門檻,使得任何人都可以通過互聯網低成本地習得所需的知識參與競爭,而原地不動的人自然就會被淘汰掉。在以前,一個人只能幹一類事,因為技能被自己的生活環境局限住了,只能接觸到身邊力所能及的技能知識,所以一輩子可能都只接觸到這一個技能和行業,但這種原始的環境實際上也是一種護城河,保護了自己相對他人的優勢。但是現在互聯網打破了這種隔離,把所有人都放在了同一個平面靠實力直接競爭,所有想學習的人都可以輕而易舉的學習到感興趣的領域,譬如編程和machine learning等,技能的獲得幾乎沒有成本。這樣一來,競爭的就是每個人對於知識的理解深度和自身的努力程度了,不再具有之前由於生活圈子的局限而產生的護城河,只要利用好了互聯網資源,任何人都可以將自己PK下去。這也是為什麼每個人都會焦慮,因為沒有安全感,自己在工作上不再是不可取代,世界上任何一個人都有可能取代自己,甚至比自己要求的工資便宜得多,所以給自己所在公司一個理由,why me?為什麼興趣會越來越重要?因為大批對自己領域感興趣的人可以毫無阻礙的進入自己所在的領域,還比自己更加有興趣鑽研這個領域,長期以往自己積累的優勢自然就會逐漸消失。越覺得自己工作毫無挑戰性,那說明自己工作的進入門檻越低,自己在未來競爭中的優勢越小。那怎麼辦?除了不斷學習沒其他辦法,總不能怪別人太努力吧,特別對於中國這樣一個自古就強調努力的民族。很多人不知道自己的興趣在哪兒,甚至進入社會之後依然在茫然。我覺得吧,其實想找到自己的的興趣只有唯一的一個辦法。那就是一個字,試!找不到興趣的原因無他,就是因為自己接觸的東西太少了,被自己畫的圈限制住了。只有保持好奇心不斷去嘗試沒有接觸過的東西,我們才能在對比中找到相對喜歡的東西,自己的視野也在尋找中變寬廣了。只有找到自己喜歡的東西才能真心投入時間進去,才能一直積極主動的保持競爭力。互聯網降低學習成本不可阻擋,學習資源只會越來越廉價,知識也會在競爭中不斷快速進化,不進則退也只會愈演愈烈,我們能把握住的只有不斷學習的能力,找到自己的興趣和合理的定位,利用優勢建立相應的護城河,不然最終只有被取代的命運,無論是被人還是機器人。machine learning固然重要,learning machine似乎更為重要...怎麼建立起自己的優勢呢?平時少看幾篇散亂的文章,多看幾篇系統闡述的書。學一個領域最關鍵的是建立自己的理解系統,而不是死記硬背散落的知識點。只有真的把各個點通過自己理解的邏輯連成線和網才叫真的懂了,這個才是永遠不會忘的東西,也是真正的核心競爭力,具體每個點的細節並不是那麼重要。說實話不要覺得看看別人寫的文章自己就了解很多了,其實了解的都是皮毛和結果,並不是真正的內功。想要真的形成自己的一套東西,必須扎紮實實的思考出整個框架和邏輯,廣度都是建立在一定深度之後,沒有深度作為基礎的廣度就是空中樓閣,遇到實際難題一碰就散。雖然現在崇尚學科交叉還有複合型人才,但說實話,我現在的體會是切忌把技能點加太多。我自己就走了彎路,什麼都想學,結果什麼學的都是皮毛。之前我是對於任何事情都是非常好奇,物理金融統計量化心理哲學甚至各種運動和做菜,什麼都想學並且都想做好,後來發現任何技能點都是需要長時間全身心投入才能做到極致的,而人的精力是有限的,不可能真的什麼都學會,反而會把自己僅有的時間碎片化。而我又是一個不喜歡事情只做一半的性格,結果就導致放在waiting list裡面的領域越來越多,徒然給自己壓力。對於絕大部分人來說,就像投資一樣,如果你把資金全部分散化,確實分散了風險,但永遠不可能有很好的收益。一個是深度,一個是廣度,也就是收益和風險一個硬幣的兩面性。從個人來說相當於自己把總量不變的時間分配給不同的技能,雖然確實讓自己更加有綜合能力,但同時損害的也是自己長久發展的潛力。全部分散不好,但是集中在一個技能上面同樣也會有非常大的風險,時代畢竟一直在變化,誰也保不準自己的技能在未來是不是會被淘汰。當然不排除有人的edge就是重倉,但前提是你的深度可以超過大部分跟你同台競爭的對手,如果不是,那隻能說是無謂增加了風險。很少有人既做到深入專研,又做到對領域外也了如指掌。即使在金融領域,也是在深度的基礎上不斷積累出的廣度,而不是一開始的目標就是廣度。不然只會懂得皮毛,並且三心二意。所以人最重要的就是發現自己擅長的地方,並且從自己擅長的技能裡面挑最擅長或者最喜歡的一兩個專註的去做,這樣才能扎紮實實的make a difference。這種balance的trade-off其實是生活里非常簡單的道理,但是往往最容易忽略。「吾生也有涯,而知也無涯。以有涯隨無涯,殆已!」與君共勉~ 下個月要做美國高能物理年會的報告,也還有好多quant的書和報告都沒來得及看,所以寫的略潦草請見諒哈~這只是我自己統計和金融學習過程中的一個總結,如果還能幫助到同樣對machine leanring應用在金融上面感興趣的童鞋那就最好咯,還是那句話,知識是少有的越分享越多的東西,希望大家也都樂於分享,對自己也是一個總結夯實的過程。想要一起討論的童鞋也非常歡迎呀,我的微信號是693960928~最後附上一句話,「讓你遇到麻煩的不是未知,而是你確信的事並非如你所想 」 — 馬克吐溫送給處在正開始深刻變革的歷史轉折點的我們。參考文獻與推薦書籍:1.《Machine Learning and Alternative Data Approach to Investing》JP Morgan2.《Systematic Strategies Across Asset Classes》JP Morgan3. 《Momentum Strategies Across Asset Classes》JP Morgan4.《An Introduction toStatistical Learning》5.《The Elements of Statistical Learning》6.《Active Portfolio Management》7. 《Quantitative Equity Portfolio》8. 若干知乎問答9. 裂牆感謝身邊給予極大幫助的盆友們!10. 還有我自己...嘚瑟一個,哈哈推薦閱讀:
※「規模經濟」與「範圍經濟」能否分別理解為「垂直兼并」和「平行兼并」的原因?
※有哪些有趣又實用的社會學、經濟學、政治學或你專業內的的概念與名詞解釋你樂意給大家分享與科普?
※請問實體經濟與虛擬經濟的不同?
※如何看待中國富豪的原罪?
※無政府資本主義如何有效監管?