爲什麼貝葉斯是量化工作者最常用的工具

▌淺談貝葉斯

 

不論是學習概率統計還是機器學習的過程中,貝葉斯總是是繞不過去的一道坎,大部分人在學習的時候都是在強行地背公式和套用方法,沒有真正去理解其牛逼的思想內涵。我看了一下 Chalmers 一些涉及到貝葉斯統計的課程,content 裏的第一條都是 Philosophy of Bayesian statistics。

 

▌歷史背景

 

什麼事都要從頭說起,貝葉斯全名爲托馬斯·貝葉斯(Thomas Bayes,1701-1761),是一位與牛頓同時代的牧師,是一位業餘數學家,平時就思考些有關上帝的事情,當然,統計學家都認爲概率這個東西就是上帝在擲骰子。當時貝葉斯發現了古典統計學當中的一些缺點,從而提出了自己的“貝葉斯統計學”,但貝葉斯統計當中由於引入了一個主觀因素(先驗概率,下文會介紹),一點都不被當時的人認可。直到20世紀中期,也就是快200年後了,統計學家在古典統計學中遇到了瓶頸,伴隨着計算機技術的發展,當統計學家使用貝葉斯統計理論時發現能解決很多之前不能解決的問題,從而貝葉斯統計學一下子火了起來,兩個統計學派從此爭論不休。

 

▌什麼是概率?

 

什麼是概率這個問題似乎人人都覺得自己知道,卻有很難說明白。比如說我問你 擲一枚硬幣爲正面的概率爲多少?,大部分人第一反應就是50%的機率爲正。不好意思,首先這個答案就不正確,只有當材質均勻時硬幣爲正面的機率纔是50%(所以不要覺得打麻將的時候那個骰子每面的機率是相等的,萬一被做了手腳呢)。好,那現在假設硬幣的材質是均勻的,那麼爲什麼正面的機率就是50%呢?有人會說是因爲我擲了1000次硬幣,大概有492次是正面,508次是反面,所以近似認爲是50%,說得很好(擲了1000次我也是服你)。


擲硬幣的例子說明了古典統計學的思想,就是概率是基於大量實驗的,也就是 大數定理。那麼現在再問你,有些事件,例如:明天下雨的概率是30%;A地會發生地震的概率是 5%;一個人得心臟病的概率是 40%…… 這些概率怎麼解釋呢?難道是A地真的 100 次的機會里,地震了 5 次嗎?肯定不是這樣,所以古典統計學就無法解釋了。再回到擲硬幣的例子中,如果你沒有機會擲 1000 次這麼多次,而是隻擲了 3 次,可這 3 次又都是正面,那該怎麼辦?難道這個正面的概率就是 100% 了嗎?這也是古典統計學的弊端。

 

舉個例子:生病的機率

 

一種癌症,得了這個癌症的人被檢測出爲陽性的機率爲 90%,未得這種癌症的人被檢測出陰性的機率爲 90%,而人羣中得這種癌症的機率爲 1%,一個人被檢測出陽性,問這個人得癌症的機率爲多少?


猛地一看,被檢查出陽性,而且得癌症的話陽性的概率是 90%,那想必這個人應該是難以倖免了。那我們接下來就算算看。

 

我們用 A表示事件 “測出爲陽性”, 用 B1 表示“得癌症”, B2 表示“未得癌症”。根據題目,我們知道如下信息:

那麼我們現在想得到的是已知爲陽性的情況下,得癌症的機率 P(B1,A) :

P(B1,A) 表示的是聯合概率,得癌症且檢測出陽性的概率是人羣中得癌症的概率乘上得癌症時測出是陽性的機率,是 0.009。同理可得得癌症且檢測出陽性的概率:

這個概率是什麼意思呢?其實是指如果人羣中有 1000 個人,檢測出陽性並且得癌症的人有 9 個,檢測出陽性但未得癌症的人有 99 個。可以看出,檢測出陽性並不可怕,不得癌症的是絕大多數的,這跟我們一開始的直覺判斷是不同的!可直到現在,我們並沒有得到所謂的“在檢測出陽性的前提下得癌症的 概率 ”,怎麼得到呢?很簡單,就是看被測出爲陽性的這 108(9+99) 人裏,9 人和 99 人分別佔的比例就是我們要的,也就是說我們只需要添加一個歸一化因子(normalization)就可以了。所以陽性得癌症的概率P(B1|A) 爲:

陽性未得癌症的概率 P(B2|A) 爲:

這裏 P(B1|A) ,P(B2|A) 中間多了這一豎線||成爲了條件概率,而這個概率就是貝葉斯統計中的後驗概率!而人羣中患癌症與否的概率 P(B1),P(B2) 就是先驗概率!我們知道了先驗概率,根據觀測值(observation),也可稱爲 test evidence:是否爲陽性,來判斷得癌症的後驗概率,這就是基本的貝葉斯思想,我們現在就能得出本題的後驗概率的公式爲:

由此就能得到如下的貝葉斯公式的一般形式。

 

▌‍‍貝葉斯公式

 

我們把上面例題中的 A 變成樣本(sample) x , 把B 變成參數(parameter) θ, 我們便得到我們的貝葉斯公式:

可以看出上面這個例子中,B 事件的分佈是離散的,所以在分母用的是求和符號 ∑ 。那如果我們的參數 θ 的分佈是連續的呢?沒錯,那就要用積分,於是我們終於得到了真正的貝葉斯公式 :

其中 π 指的是參數的概率分佈,π(θ) 指的是先驗概率,π(θ|x) 指的是後驗概率,f(x|θ)指的是我們觀測到的樣本的分佈,也就是似然函數(likelihood),記住豎線 |左邊的纔是我們需要的。其中積分求的區間指的是參數 θ 所有可能取到的值的域,所以可以看出後驗概率 π(θ|x) 是在知道 x 的前提下在域內的一個關於θ 的概率密度分佈,每一個θ 都有一個對應的可能性(也就是概率)。

 

▌理解貝葉斯公式

 

這個公式應該在概率論書中就有提到,反正當時我也只是死記硬背住,然後遇到題目就套用。甚至在 Chalmers 學了一門統計推斷的課講了貝葉斯,大部分時間我還是在套用公式,直到後來結合了一些專門講解貝葉斯的課程和資料纔有了一些真正的理解。要想理解這個公式,首先要知道這個豎線 | 的兩側一會是 x|θ ,一會是 θ|x 到底指的是什麼,或者說似然函數和參數概率分佈到底指的是什麼。

 

▌似然函數

 

首先來看似然函數 f(x|θ),似然函數聽起來很陌生,其實就是我們在概率論當中看到的各種概率分佈 f(x),那爲什麼後面要加個參數|θ 呢?我們知道,擲硬幣這個事件是服從伯努利分佈的 Ber(p) , n次的伯努利實驗就是我們熟知的二項分佈 Bin(n,p), 這裏的p就是一個參數,原來我們在做實驗之前,這個參數就已經存在了(可以理解爲上帝已經定好了),我們抽樣出很多的樣本 x 是爲了找出這個參數,我們上面所說的擲硬幣的例子,由於我們擲了 1000 次有 492 次是正面,根據求期望的公式 n⋅p=μ (492就是我們的期望)可以得出參數 p 爲 

所以我們才認爲正面的概率是近似 50% 的。

現在我們知道了,其實我們觀測到樣本 x 的分佈是在以某個參數 θ 爲前提下得出來的,所以我們記爲 f(x|θ),只是我們並不知道這個參數是多少。所以參數估計成爲了統計學裏很大的一個課題,古典統計學中常用的方法有兩種:矩方法(momnet)和最大似然估計(maximum likelihood estimate, mle) ,我們常用的像上面擲硬幣例子中求均值的方法,本質就是矩估計方法,這是基於大數定理的。而統計學中更廣泛的是使用最大似然估計的方法,原理其實很簡單,在這簡單說一下:假設我們有 n 個樣本 x1,x2,x3,…,xn,它們每一個變量都對應一個似然函數:

我們現在把這些似然函數乘起來:

我們只要找到令 lik(θ)  這個函數最大的 θ 值,便是我們想要的參數值(具體計算參考[2]中p184)。

 

▌後驗分佈(Posterior distribution)

 

現在到了貝葉斯的時間了。以前我們想知道一個參數,要通過大量的觀測值才能得出,而且是隻能得出一個參數值。而現在運用了貝葉斯統計思想,這個後驗概率分佈 π(θ|x) 其實是一系列參數值 θ 的概率分佈,再說簡單點就是我們得到了許多個參數 θ 及其對應的可能性,我們只需要從中選取我們想要的值就可以了:有時我們想要概率最大的那個參數,那這就是 後驗衆數估計(posterior mode estimator);有時我們想知道參數分佈的中位數,那這就是後驗中位數估計(posterior median estimator);有時我們想知道的是這個參數分佈的均值,那就是後驗期望估計。這三種估計沒有誰好誰壞,只是提供了三種方法得出參數,看需要來選擇。現在這樣看來得到的參數是不是更具有說服力?

 

▌置信區間和可信區間

 

在這裏我想提一下置信區間(confidence interval, CI) 和可信區間(credibility interval,CI),我覺得這是剛學貝葉斯時候非常容易弄混的概念。

再舉個例子:一個班級男生的身高可能服從某種正態分佈 N(μ,σ2),然後我們把全班男生的身高給記錄下來,用高中就學過的求均值和方差的公式就可以算出來這兩個參數,要知道我們真正想知道的是這個參數 μ,σ2,當然樣本越多,得出的結果就接近真實值(其實並沒有人知道什麼是真實值,可能只有上帝知道)。等我們算出了均值和方差,我們這時候一般會構建一個95%或者90%的置信區間,這個置信區間是對於樣本 x 來說的,我只算出了一個 μ 和 一個 σ 參數值的情況下,95% 的置信區間意味着在這個區間裏的樣本是可以相信是服從以 μ,σ 爲參數的正態分佈的,一定要記住置信區間的概念中是指一個參數值的情況下!

而我們也會對我們得到的後驗概率分佈構造一個 90% 或 95% 的區間,稱之爲可信區間。這個可信區間是對於參數 θ 來說的,我們的到了 很多的參數值,取其中概率更大一些的90%或95%,便成了可信區間。

 

▌先驗分佈(Prior distribution)

 

說完了後驗分佈,現在就來說說先驗分佈。先驗分佈就是你在取得實驗觀測值以前對一個參數概率分佈的主觀判斷,這也就是爲什麼貝葉斯統計學一直不被認可的原因,統計學或者數學都是客觀的,怎麼能加入主觀因素呢?但事實證明這樣的效果會非常好!

再拿擲硬幣的例子來看(怎麼老是拿這個舉例,是有多愛錢。。。),在扔之前你會有判斷正面的概率是50%,這就是所謂的先驗概率,但如果是在打賭,爲了讓自己的描述準確點,我們可能會說正面的概率爲 0.5 的可能性最大,0.45 的機率小點,0.4 的機率再小點,0.1 的機率幾乎沒有等等,這就形成了一個先驗概率分佈。

那麼現在又有新的問題了,如果我告訴你這個硬幣的材質是不均勻的,那正面的可能性是多少呢?這就讓人犯糊塗了,我們想有主觀判斷也無從下手,於是我們就想說那就先認爲 0~1 之間每一種的可能性都是相同的吧,也就是設置成 0~1 之間的均勻分佈Uni(0,1) 作爲先驗分佈吧,這就是貝葉斯統計學當中的無信息先驗(noninformative prior)!那麼下面我們就通過不斷擲硬幣來看看,這個概率到是多少,貝葉斯過程如下:

從圖中我們可以看出,0 次試驗的時候就是我們的先驗假設——均勻分佈,然後擲了第一次是正面,於是概率分佈傾向於 1,第二次又是正,概率是 1的可能性更大了,但注意:這時候在 0.5 的概率還是有的,只不過概率很小,在 0.2 的概率變得更小。第三次是反面,於是概率分佈被修正了一下,從爲1的概率最大變成了 2/3 左右最大(3次試驗,2 次正 1 次反當然概率是2/3的概率最大)。再下面就是進行更多次的試驗,後驗概率不斷根據觀測值在改變,當次數很大的時候,結果趨向於 0.5 (哈哈,結果這還是一枚普通的硬幣,不過這個事件告訴我們,直覺是不可靠的,一定親自實驗纔行~)。

有的人會說,這還不是在大量數據下得到了正面概率爲 0.5 嘛,有什麼好稀奇的?注意了!畫重點了!(敲黑板) 記住,不要和一個統計學家或者數學家打賭!跑題了,跑題了。。。說回來,我們上面就說到了古典概率學的弊端就是如果擲了 2 次都是正面,那我們就會認爲正面的概率是 1,而在貝葉斯統計學中,如果我們擲了 2 次都是正面,只能說明正面是1的可能性最大,但還是有可能爲 0.5, 0.6, 0.7 等等的,這就是對古典統計學的一種完善和補充,於是我們也就是解釋了,我們所謂的地震的概率爲 5%;生病的概率爲 10% 等等這些概率的意義了,這就是貝葉斯統計學的哲學思想。

 

▌共軛先驗(Conjugate prior)

 

共軛先驗應該是每一個貝葉斯統計初學者最頭疼的問題,我覺得沒有“之一”。這是一個非常大的理論體系,我試着用一些簡單的語言進行描述,關鍵是去理解其思想。

繼續拿擲硬幣的例子,這是一個二項試驗 Bin(n,p),所以其似然函數爲:

在我們不知道情況時就先假設其先驗分佈爲均勻分佈 Uni(0,1),即:

那現在根據貝葉斯公式求後驗概率分佈:

我們得到結果爲:

這麼一大串是什麼呢?其實就是大名鼎鼎的貝塔分佈(Beta distribution)。 簡寫就是 Be(x+1,n−x+1)。 比如我擲了10 次(n=10),5次正(x=5),5 次反,那麼結果就是 Be(6,6), 這個分佈的均值就是

很符合我們想要的結果。

現在可以說明,我們把主觀揣測的先驗概率定爲均勻分佈是合理的,因爲我們在對一件事物沒有了解的時候,先認爲每種可能性都一樣是非常說得通的。有人會認爲,既然無信息先驗是說得通的,而且貝葉斯公式會根據我們的觀測值不斷更新後驗概率,那是不是我們隨便給一個先驗概率都可以呢?當然……不行!!這個先驗概率是不能瞎猜的,是需要根據一些前人的經驗和常識來判斷的。比如我隨便猜先驗爲一個分段函數:

 

 

靠,是不是很變態的一個函數…就是假設一個極端的情況,如果你把這個情況代入貝葉斯公式,結果是不會好的(當然我也不知道該怎麼計算)。

這個例子中,我看到了可能的後驗分佈是 Beta 分佈,看起來感覺有點像正態分佈啊,那我們用正態分佈作爲先驗分佈可以嗎?這個是可以的(所以要學會觀察)。可如果我們把先驗分佈爲正態分佈代入到貝葉斯公式,那計算會非常非常麻煩,雖然結果可能是合理的。那怎麼辦?不用擔心,因爲我們有共軛先驗分佈!

繼續拿上面這個例子,如果我們把先驗分佈 π(θ) 設爲貝塔分佈 Beta(a,b),結果是什麼呢?我就不寫具體的計算過程啦,直接給結果:

有沒有看到,依然是貝塔分佈,結果只是把之前的 1 換成了 a 和 b(聰明的你可能已經發現,其實我們所說的均勻分佈 Uni(0,1) 等價於 Beta(1,1),兩者是一樣的)。

由此我們便可以稱二項分佈的共軛先驗分佈爲貝塔分佈!注意!接着畫重點!:共軛先驗這個概念必須是基於似然函數來討論的,否則沒有意義!好,那現在有了共軛先驗,然後呢?作用呢?這應該是很多初學者的疑問。

現在我們來看,如果你知道了一個觀測樣本的似然函數是二項分佈的,那我們把先驗分佈直接設爲 Beta(a,b) ,於是我們就不用計算複雜的含有積分的貝葉斯公式便可得到後驗分佈 Beta (x+a,n−x+b) 了!!!只需要記住試驗次數n,和試驗成功事件次數x就可以了!互爲共軛的分佈還有一些,但都很複雜,用到的情況也很少,推導過程也極其複雜,有興趣的可以自行搜索。我說的這個情況是最常見的!

注意一下,很多資料裏會提到一個概念叫僞計數(pseudo count),這裏的僞計數值得就是a,b對後驗概率分佈的影響,我們會發現如果我們取 Beta(1,1) ,這個先驗概率對結果的影響會很小,可如果我們設爲 Beta(100,100),那麼我們做 10 次試驗就算是全是正面的,後驗分佈都沒什麼變化。

 

▌樸素貝葉斯分類器(Naive Bayes classifier)和scikit-learn的簡單使用

 

在機器學習中你應該會看到有一個章節是講樸素貝葉斯分類器的(把naive翻譯成樸素我也是服了啊,以後我們可以“誇”某某人好樸素啊)。具體的數學原理在周志華老師的西瓜書《機器學習》的第7章有詳細解釋,其實就是利用了基本的貝葉斯理論,跟上面說的差不多,只不過更加說明的怎樣去實踐到機器學習中。下面就直接簡單說一下Python中有個機器學習庫 scikit-learn 中樸素貝葉斯分類器的簡單實用。例子參考的是 scikit-learn 官網的GaussianNB 頁面。

直接看代碼:

import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB #導入GaussianNB
clf = GaussianNB() #設置clf爲高斯樸素貝葉斯分類器
clf.fit(X, Y) #訓練數據
print(clf.predict([[-1, 0]])) #預測數據[-1,0]屬於哪一類

輸出結果爲: [1]。 這裏面我們可以看到有 X,Y 兩個變量,X是我們要訓練的數據特徵,而Y給的是對應數據的標籤,分成 [1],[2] 兩類。用 clf.fit 訓練好了之後,用 clf.predict 預測新數據[-1,0],結果是被分爲第一類,說明結果是令人滿意的。

 

MCMC(Markov chain Monte Carlo)

 

你以爲說到這貝葉斯的事情就結束了?那你真的就是太 naive 了。貝葉斯公式裏的 θ 只是一個參數,有沒有想過有兩個參數怎麼辦?還能怎麼辦,分佈的積分改成雙重積分唄。可以可以,那如果有 3個、5個、10 個參數呢?還有十重積分嘛?很顯然積分這個工具只適合我們在一維和二維的情況下進行計算,三維以上的效果就已經不好了;其實不僅僅在於多維情況,就算是在一維情況很多積分也很難用數值方法計算出來,那該怎麼辦?於是便有了 MCMC 方法,全稱是馬爾科夫鏈蒙特卡洛方法。大家別指望在下文裏看到詳細的計算過程和推導,我還是按照我的理解,簡單地從原理出發進行描述,讓大家有一個感性的認識。

 

第二個MC:蒙特卡洛方法

 

雖然蒙特卡洛方法是 MCMC 中的第二個 MC,但先解釋蒙特卡洛方法會更加容易理解。蒙特卡洛方法也稱蒙特卡洛抽樣方法,其基本思想是通過大量取樣來近似得到想要的答案。有一個經典的試驗就是計算圓周率,在一個邊上爲1的正方形中畫一個內切圓,圓的面積就是 π,圓面積比上整體的正方形面積也是 ππ, 現在在正方形內產生大量隨機數,最後我們只需要計算在圓內點的個數比上總體點的個數,便近似得到了圓周率 π 的值(這些統計學家是真聰明啊。。。)。

現在回到貝葉斯公式,我們現在有一個後驗概率 π(θ|x) ,但我們其實最想知道的是 h(θ) 的後驗期望:

怎麼又跑出來一個 h(θ) ?不要着急,如果我們令 h(θ)=θ , 那上面這個積分求得就是我們想要的後驗期望估計了!(當然 h(θ) 還可以是其他情況,會得到其他我們想要的結果,例如後驗最大估計,後驗方差等等,這裏就不贅述了) 蒙特卡洛方法指出:如果我們可以從後驗概率分佈 π(θ|x) 中抽取大量的獨立同分布(i.i.d)的觀測值 θ1,θ2,…,θm ,於是我們可以用如下公式:

在大數定理的支持下,hm 就可看作是 E[h(θ)|x] 的近似值。但是這個方法在多維和後驗分佈形式未知的情況下,很難抽樣,於是便有了第一個 MC,馬爾科夫鏈的方法。

第一個MC:馬爾科夫鏈

馬爾科夫鏈也稱之爲馬氏鏈,先來看一下數學定義:

意思就是,從 Xn,Xn−1,…,X0 到 Xn+1 的轉移概率只與 Xn+1 的前一個狀態 Xn 有關。

如果條件概率 P(Xn+1|Xn) 與 n 無關,成爲一個固定值,那麼就稱這個馬氏鏈有平穩轉移概率,記爲 pij 。並且我們稱 P=(pij) 爲馬氏鏈的轉移矩陣,且滿足條件:

怎麼一個概率變成一個矩陣了???其實這個轉移概率 pij 指的只是狀態 i 中的一個觀測值 Xn 到狀態 j 中的另一個觀測值 Xn+1 的概率,其實我們在每個狀態下許許多多的觀測值。我隨便舉一例子:

現有一個轉換矩陣:

可以看出狀態 i 中的一個觀測值轉移到下個狀態 j 的分別三個觀測值的概率和爲1。

下面就是最最重要的馬氏鏈的平穩性(也可稱之爲收斂性):

設馬爾科夫鏈有轉移概率矩陣, 一個概率分佈如果滿足 ,則稱之爲此馬爾科夫鏈的平穩分佈。(取自[1]中定義6.3.2)

可能這麼看這個定義還是有點繞,這裏的 i,j 並不是指從 i 一步就到了 j ,求和符號 ∑ 的意思就是能讓概率分佈 π(i) 經過 n 步之後成爲平穩分佈 π(j) 。我們得到的平穩分佈 π(j)=[π(1),π(2),…,π(j)] 裏面各個概率的和也爲1。

現在我們就要把這個馬爾科夫鏈和貝葉斯聯繫起來,按照我的理解,π(i) 就是我們的先驗分佈,如果我們能找到一個轉移矩陣,那麼我們就會在n步之後就會收斂到一個平穩分佈,而這個分佈就是我們要的後驗分佈。得到平穩分佈後,根據平穩性,繼續乘上這個轉移概率矩陣,平穩分佈依然不會改變,所以我們就從得到平穩分佈開始每次對其中抽樣 1 個出來,再經過 m 步之後,我們就得到了 m 個服從後驗分佈的 i.i.d 樣本,便可按照第二個 MC 蒙特卡洛方法進行計算了!

拓展閱讀:

1.一個量化策略師的自白(好文強烈推薦)

2.市面上經典的量化交易策略都在這裏了!(源碼)

3.期貨/股票數據大全查詢(歷史/實時/Tick/財務等)

4.量化交易領域最重要的10本參考書推薦!

5.如何設計量化交易策略?

6.量化交易乾貨彙總,很乾!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章