在投資理財領域蒙特卡羅方法是如何運用的?


蒙特卡羅作為基礎演算法之一可以運用到的地方多了去了,只要可以用得上隨機模擬(即用隨機模擬引入不確定性)的地方基本都有它的用處。在公司金融領域,由於投資項目的現金流有不確定性,可以在現金流不確定的部分用蒙特卡洛模擬然後計算NPV;在投資組合管理領域,可以蒙特卡洛模擬不同的影響因子的變化然後觀測它們的變化以及協同變化對投資組合內標的資產的價值變化的影響;在個人理財計劃領域,你可以模擬自己未來收入的不確定性、保險金的不確定性、理財產品收益的不確定性,分析不同情況下你的預算是怎樣的,然後進行理財規劃。

你在製作投資策略的時候,是否會用到機器學習呢?參考Alpha Go他們用的蒙特卡羅搜索樹,在他們的網站和stack overflow都有介紹,下面先談談另一個方面。

淺談它在衍生品定價中的作用。例如期權:風險中性概率測度下,期權的價格是其期望價值的折現。一句話概括:蒙特卡羅演算法通過大量隨機生成資產價格路徑,模擬資產未來價格中不確定的因素,估計資產期望收益率。 這種模擬定價方法比較適用於價格由資產價格路徑決定的衍生品,而對於那種需要在某個點做選擇的期權(例如指狀期權,障礙期權)用蒙特卡羅定價並不理想。

也有用這個模擬方法算VaR的,或者用來估計各種風險,但是這裡就要小心了:大量蒙特卡羅模擬的路徑將會趨於正態分布,當你想要預估風險時你關心的是尾部風險,此時正態分布所估計出來的尾部與金融資產回報真實分布(後尾,左偏)將會嚴重背離。

理論:參見問題 隨機過程、機器學習和蒙特卡洛在金融應用中都有哪些關係? - 蒙特卡洛方法 里 @IIIIIIIIIIII 的回答

首先對資產回報率的運動建模,根據不同資產的特性,用隨機偏微分方程表示其分布所服從的隨機過程。如果該偏微分方程系統有解析解,那麼用解析解;如果沒有,或者解析解中所需要的輸入變數太多是未知的,那你可能需要在模擬的路徑上再進行模擬(simulation on simulation),這將引入非常大的模擬誤差(simulation error).

拿一個最常見的Black Scholes模型來模擬股票價格舉例(同樣你可以用模擬利率走向的Vasicek,CIR模型來實現下),它是有解析解的,你可以直接用解析解,這裡只是舉例

Black Scholes模型是模擬股票價格變化率,假設它滿足以下公式

等式右邊的不確定因素為布朗運動增量dW_t ,用可以用從一個正態分布中隨機取樣來模擬。

寫一個簡單的實現該演算法的Matlab函數定價歐式看漲期權

輸入股票價格,行權價格,無風險利率(常用三個月國債),期權到期期限,波動率,還有你要用的蒙特卡羅隨機抽樣次數

function [Price , VarPrice , CI] = BlsMC (S0 ,K,r,T,sigma ,N )

mt = (r - 0.5*sigma ^2)* T;

sigt = sigma * sqrt (T);

Veps = randn (N ,1);

St = S0*exp(mt+sigt*Veps );

Discounted_Payoff = exp(-r*T)* max(0, St -K);

[Price , VarPrice , CI] = normfit(Discounted_Payoff );

然後你可以和Black Scholes的解析解比較一下,相差不會很大,我自己隨手代入幾個數字,得到的價格誤差在10e-2數量級

這裡只是舉個例子,在沒有解析解的情況下使用蒙特卡羅模擬定價的思想類似。

操作:

實際操作中,有一些值得探討的技術細節:

I.取樣數量

II.其他誤差削減技術

I.取樣數量

關於取樣數量,知乎上也有探討過,蒙特卡洛抽樣的次數該如何確定? - 自然科學 這個問題因為是標了物理、自然科學的標籤所以熱度比較低,但是大多數答案會偏題到我將要說道的第二點——其他誤差削減技術——上,我先補充一下基礎部分。

從同一個分布中抽取的一系列獨立樣本X_i中,樣本均值是對分布均值的一個無偏估計。此估計量的誤差的期望為

這裡n就是抽樣數量。那簡單粗暴地說,就是抽樣越多越好?但是實際操作中,增加抽樣數量能減少誤差的程度是有限的,達到一個程度之後你再增加取樣數量,誤差也不會再減小了,再增加取樣數量只是多此一舉(所增加的計算成本你不考慮嗎?)。這也是我為何要在下一個部分寫其他抽樣誤差減少錯誤。

那麼如何找到這個臨界點呢?有時候,你並不需要找到這個臨界點,你只需要把誤差控制在自己能容忍的範圍內。

假設你想控制的是取樣的絕對值誤差,也就是讓

在大量取樣的前提下,由中心極限定理,最後取出的樣本會近似正態分布,於是均值估計的置信區間為

1-alpha 為置信程度。

做一些簡單的公式推導,可以得到你可以容忍的誤差與取樣的樣本方差之間的關係:

你就一直不停變換取樣的樣本數量,直到滿足以上臨界條件。

II.其他減少抽樣誤差的方法

(i)對偶採樣(Antithetic Sampling)

就是把一個一個地採樣變成一對一對地採樣。單個樣本點由X_i變成

依舊讓X(i)和X(j)獨立,但是一對樣本X_1^{(i)}X_2^{(i)}可以不互相獨立,於是樣本方差變成

那我們讓X_1^{(i)}X_2^{(i)}相關係數等於-1不就得到了零誤差么!好激動

但是沒那麼簡單。讓我們回到一開始的問題。你最終想要模擬的是資產價格,現在模擬dW_t只是資產價格變化量公式中的一部分。例如在Black Scholes模型中那樣,資產價格和這個隨機增量dW_t之間的關係是非線性的。如果在一些更複雜的模型(SVJ之類)中它們之間的關係還不是單調的,這個方法就沒什麼效果了。如果拿Black Scholes模型來舉例,所能減少的誤差率十分有限,是10e-3數量級的。

實驗:在蝶式期權定價中用蒙特卡羅模擬得到的誤差率和蒙特卡羅對偶採樣模擬得到的誤差率相比,後者並沒有減小,有時反而可能會更大。

(ii)公共隨機數(common random numbers)

為什麼我們能用蒙特卡羅模擬未知資產價格?因為我們用dW_t來模擬未知的資產價格中的不確定因素。

回到例子,假設我們現在用蒙特卡羅模擬求一個歐式看漲期權的vega(dP_c/d{sigma })

(注意P_c的值是關於dW_t的一個函數)

frac{dP_c}{dsigma}=frac{P_c(sigma+delta sigma,dW_t)-P_c(sigma,dW_t)}{delta sigma}

delta sigma很小時我們怎麼得知P_c是由於模型中dWt的變化還是參數sigma 的變化呢?

同樣,當我們想比較兩個投資組合資產收益時,也面臨著要模擬兩個隨機變數的差值這個問題。

構造一個隨機變數Z=X_1-X_2,這裡E(X_1)
e E(X_2),因為它倆來自不同的分布(也許只有一個參數不同,例如上文中波動率變了一點點),然後用蒙特卡羅隨機抽樣對Z進行模擬。

這個方法和上一個對偶抽樣工作原理一樣,就是讓X_1,X_2相關,因為

所以在應用的時候所需要滿足的條件也和對偶採樣一樣。

(iii)控制變數(Control Variate)

以上兩種方法都是在我們對需要蒙特卡羅模擬的變數一無所知的情況下採用的。但是當我們對整個模擬系統中的信息稍有了解(比如知道所要模擬的變數與另一個已知變數相關),我們就可以利用已知的信息進行更精確的模擬。

控制變數相當於把隨機模擬修正引導到一條正道上,例如我們在模擬X可能的取值的時候我們知道它和另一個隨機變數Y之間的協方差,然後我們對X與Y之間進行假設

X_c=X+c(Y-
u )

c是可以選擇的參數。怎麼選擇c可以讓方差減小呢?

寫出Var(X_c)的公式,然後對c求一階導數(假設存在一階導數,如果條件不滿足那就別用這個方法了),找到導數等於零的點

c^*=-frac{Cov(X,Y)}{Var(Y)}

從這裡可以看出控制變數的意義:當隨機取樣取來的X偏大了,就往小的方向拽樣本, 反之亦然。c的符號取決於X與Y之間相關係數的符號。

注意,此處我們並不知道隨機變數Y的方差,甚至會連X,Y的協方差都不知道。

可以用另一個蒙特卡洛來估計Y的方差以及X,Y之間的協方差,這個叫pilot simulation。但是這樣的話就會產生新的問題,也就是X_c的期望值是樣本均值的有偏估計,因為你的c和X_c之間存在相關關係。除非用一些統計工具來消除它們之間的這種相關關係,否則這種隨機取樣就是不可取的了。在期權定價中,可以使用標的資產作為控制變數,一般我們可以通過建模得到標的資產價格的方差以及它和期權價格的協方差,這樣不用進行多一個pilot simulation,可以減少一些simulation error。

舉例:Clique定價的例子(Clique找不到對應中文翻譯)

先放我的實驗畫圖,例子稍後補充完整。

(iv)利用已知條件(Conditioning)

這也要括弧個英文,純屬 強迫症發作。

根據已知的條件來模擬變數X.

舉例:As-you-like-it option 和 Forward Start Option 的定價

先舉個簡單例子,遠期生效的期權。假設一個看漲期權,現在是T0,它的行權價格是T1時的股價S1,到期日是T2,現在有兩個未知變數S1和S2(期權到期時的股票價格)。暴力蒙特卡羅是先隨機生成一個股價S1,然後在S1基礎上再隨機生成一個股價S2,像樹一樣

這樣你會得到一個非常紛繁複雜的最終價格。你也可以直接用蒙特卡羅搞一條股票價格路徑,但這還不是最優的辦法。

利用已知條件是說,我利用這個遠期生效期權在T1變成普通期權的這一已知條件來進行蒙特卡羅模擬。

用Matlab做個簡單實驗。

% -------------------CRUDE MONTE CARLO

% Payoff at Time T2

c_T2 = max(S2-K1,0);

% Discount the Payoff to Time T0

c_T0 = exp(-r*T2).* c_T2;

% Normfit to Calculate the Mean, Variance CI

[Price_Q1a,VarPrice_Q1a,CI_Q1a] = normfit(c_T0);

Error_Q1a = (CI_Q1a(2)-CI_Q1a(1))/Price_Q1a;

% -------------------CONDITIONAL MONTE CARLO

% Payoff at Time T1

c_T1_BS = bsmyfun(S1,K1,r,T2-T1,sigma,q);

% Discount the Payoff to Time T0

c_T0_BS = exp(-r*T1).* c_T1_BS;

% Normfit to Calculate the Mean, Variance CI

[Price_Q1b,VarPrice_Q1b,CI_Q1b] = normfit(c_T0_BS);

Error_Q1b = (CI_Q1b(2)-CI_Q1b(1))/Price_Q1b;

進行一次模擬,結果是這樣的:

CallFS_CrudeMC
= 9.3813, %這是用簡易蒙特卡羅模擬出來的期權價格

VarCMC
= 15.1340, %該方法模擬的價格方差

CICMC
=[ 9.2875, 9.4751], % 百分之九十五置信區間

Error_CMC = 0.0200 %這是置信區間的長度除以價格

條件蒙特卡羅模擬:

CallFS_CondMC
=9.3046,

VarCMC2 = 2.0005,

CICMC2 = [9.2922, 9.3170],

Error_CMC2 =0.0027

解析解公式結果:

Call_FS_ClosedForm
= 9.2970

在這個例子中可以看出利用已知條件,方差一下子從15下降到2,而且結果也更接近正確價格(解析解公式結果)了。

這個方法的普適性怎麼樣呢?很難說。你不知道你得到的已知條件是不是正確客觀的。

在用條件蒙特卡羅來模擬美式期權價格和Chooser Option價格的時候,通常是先做了正確的選擇,再進行蒙特卡羅模擬,避免了用簡易蒙特卡羅時產生的許多無效路徑(即使行權不是最優選擇了依然選擇行權)。

(v)分層抽樣(stratified sampling)

假設我們想用蒙特卡羅模擬的隨機變數X與已知分布的Y存在相關關係,

E[X|Y]=int_D{}^{} Xf_Y(y)dy

如果Y是離散隨機變數的話,我們可以通過模擬E[X|Y=y_i,iin [1,n]]然後乘以y在每個事件點的概率,求和來估計X的期望。

在分層抽樣中,Y被分離出來,其實你隨機模擬的是Y,通過Y來模擬X。

(vi)採樣重要性抽樣(importance sampling)

是對上一部分的延伸,這裡就可以講到如何用蒙特卡羅變換概率測度

重要性採樣在模擬分布尾或者極少發生的事件上比較有用。

假設現在是要通過蒙特卡羅模擬求出

E [h (X)]  =int_{}^{}  h (x) f (x) dx,假設h(x)&>0成立

f (x)是X的分布密度函數。如果我們知道另外一個密度g 滿足當g(x)=0時 f (x) = 0 ,上式可以轉化為E[h(X)]=int frac{h(x)f(x)}{g(x)} cdot g(x) dx=E_g[h(x)]

轉化為在g概率測度下的期望了。frac{f(x)}{g(x)}稱為可能性比率(likelihood ratio是這樣翻譯嗎?),是用來修正概率測度的不同產生的密度不同的,你把它當成是一個投影向量吧,就是把概率密度投影到g這個空間上去的一個轉化向量。當使用隨機抽樣的時候,該比率是一個隨機向量。

講到這裡,為什麼要搞這個概率測度轉換呢?好像對方差減小並沒有什麼幫助啊。誠然,它對模擬極端狀況下的分布有幫助,但是對g的選擇要怎麼選還是個問題。

先來看看兩種測度下的方差

Var_f[h(x)]=int h^2(x)g(x)dx - mu^2

Var_g[h(x)]=int h^2(x)g(x)cdot frac{f(x)}{g(x)}dx - mu^2

可以通過選擇g(x)使 在此測度下方差為0

g^*(x)=frac{f(x)h(x)}{mu}

但是這個選擇又自我指向了,因為我們最終的目的是估計未知的mu啊。

還是先嘗試著估計一下最佳的概率測度g吧。

Delta Var=Var_f[h(x)]-Var_g[h(x)]=int h^2(x)[1-frac{f(x)}{g(x)}]f(x)dx

如果我們想要減少方差的話,我們想讓Delta Var >0並且越大越好,重要性採樣得名於此:

由於概率積分的主要貢獻來自於最大被積分式值對應點的周圍,因此本文的重要抽樣法假定重要抽樣函數的最大似然值等於最大被積分式值對應點值,就是說當積分值h^2(x)f(x)比較大的時候,我們調整它的權重,讓[1-frac{f(x)}{g(x)}]大於零,反之則小於零。

除了計算VaR之外,這個方法還可以用來估計深度虛值期權的價格。

假設一個歐式看跌期權,它標的股票價格現在是S0,在風險中性測度下,未來股價的期望是S0*exp(r*T),當這個期望價格遠大於行權價格K時,期權到期時只有很小的概率會變成實值期權。在這種情況下如果我們用普通蒙特卡羅進行模擬,許多的模擬路徑都會是無效的,因為大多數路徑終端股價是讓期權收益為零的。這種情況下可以左移股價均值(變換概率測度後相應的參數也會變)來增大期權最終回報為正數的概率。

假設我們找到一個概率測度g下回報率均值是mu_g,使得期權到期時是at the money,即St=K:

S_0e^{mu_gT}=KRightarrow  mu_g = frac{1}{T}ln(frac{K}{S_0})

在風險中性概率密度下,我們是這樣模擬St的:

S_t=S_0e^{mu T} , mu sim N((r-frac{sigma^2}{2})T,sigma sqrt{T})

所以新的分布g下

 mu_g sim N(ln(frac{K}{S_0})-frac{sigma^2}{2}T,sigma sqrt{T})

兩個正態分布pdf比率f/g比較容易算,它們方差相同的情況下得到下式

frac{f_Y}{g_Y}=e^{-[(Y-alpha)^2-(Y-eta)^2]/2sigma^2}\ alpha=(r-frac{sigma^2}{2})T,eta=ln(frac{K}{S_0})-frac{sigma^2}{2}T

這樣就很容易用Matlab代碼實現重要性採樣了

function price = blsMCIS(S0,K,r,T,sigma,NRepl)

muf= (r-0.5*sigma^2)*T);

sig=sigma*sqrt(T);

mug=log(K/S0)-0.5*sigma^2*T;

Veps=randn(NRepl,1);

Y=mug+Veps;

Likelihood_ratio=exp(0.5*((Y-mug).^2-(Y-muf).^2)/sigma^2);

Payoff=exp(-r*T)*max(0,exp(K-S0*exp(Y*T)));

[price,variance,CI]=normfit(Payoff.*Likelihood_ratio);

(vii)擬蒙特卡羅(quasi Monte Carlo)

這個已經不隨機了,和以上所有的方法都不同。

先答到這裡,晚些時候有時間的話找一些例子

參考文獻:

Monte Carlo methods for option pricing

Numerical Methods and Optimization in Finance(by Manfred Gilli; Dietmar Maringer; Enrico Schumann)


應該是基於歷史數據套用模型不斷的驗證 就是模擬試驗


推薦閱讀:

蒙特卡洛樹搜索 MCTS 入門
離散型隨機變數的模擬-逆變換法
低差異序列(一)- 常見序列的定義及性質
Q quant秘技——MC方差縮減(對偶變數篇)

TAG:投資 | 理財 | 蒙特卡洛方法 |