怎麽用 Excel 做蒙特卡洛模擬
下面是在Excel中模擬壹只股票價格的例子。假設股票價格的對數收益率服從正態分布,均值為0,每日變動標準差為0.1,模擬股票價格1年的路徑,過程如下:用到兩個內置函數,即用rand()來產生0到1之間的隨機數,然後用norminv()來獲得服從既定分布的隨機數,即收益率樣本=norminv(rand(), 0, 0.1)。假定股票價格的初始值是100元,那麽模擬的價格就是 S=100 * exp(cumsum(收益率樣本))。其中的cumsum()不是Excel的內置函數,其意思就是收益率樣本的累積,每個時刻的值都是當前樣本及此前所有樣本的和,如,收益率樣本從單元格C3開始,當前計算C15對應的模擬價格,則模擬價格計算公式是:100 * exp(sum($C$3:C15))。由此可以得到股票價格的壹條模擬路徑。其他非正態分布也可以通過類似方式得到分布的抽樣,即分布函數的逆函數,這些函數Excel都內置了。所以,做蒙特卡洛模擬的時候,關鍵是先確定所需模擬的分布,然後進行抽樣,然後應用層面的各種公式就可以在抽樣的基礎上進行計算了。--------以下是補充的--------根據上面提到的思路,其實可以很便捷地為期權做定價。下面就用蒙特卡洛方法為壹個普通的歐式看漲期權定價(蒙特卡洛在為普通期權plain vanilla option定價時不占優勢,因為相對於解析法而言計算量很大。但是,如果要給結構比較復雜的奇異期權定價時,可能蒙特卡洛法就比較實用,有時可能成為唯壹的方法)。1)假設這個期權是歐式看漲期權,行權價格為50元,標的股票當前的價格也是50元,期權剩余時間是1天。2)假設標的股票的價格服從對數正態分布,即股票的每日收益率服從正態分布,均值為0,每日標準差為1%。根據分布假設,首先用rand()函數產生在0到1之間的均勻分布樣本。為了提高精確度,這裏抽樣的數量為1000個(其實1000個是很少的了,通常需要10萬個甚至50萬個,但是在Excel表格中操作這麽多數字,不方便,這是Excel的不足之處)。下壹步,用norminv(probability, mean, std)函數來獲得股票收益率分布的1000個抽樣,其中的probability參數由rand()產生的抽樣逐個代入,mean=0.0, std = 0.01。註意這裏抽樣得到的日度收益率。也就是說,這個樣本對應的下壹個交易日股票價格的收益率分布。下壹步,股票價格=50×exp(收益率樣本),得到股票價格分布的抽樣,有1000個樣本。根據我做的實驗,這1000個樣本的分布圖形(histogram)跟對數正態分布是比較接近的,如下圖所示:圖的橫軸是股票價格,縱軸是樣本中出現的頻率。得到了股票價格未來壹天分布的樣本之後,就可以以此樣本來計算期權的價格了。歐式看漲期權的定義為:C=max(S-K,0)所以,根據這個計算公式可以計算出在到期那天在特定的價格下期權的價值。在Excel中,相當於 期權價值=max(股票價格樣本 - 50,0)。由此就可以得到了該期權未來1天價值的樣本。然後,將未來價值貼現回來(用無風險利率貼現,假設無風險利率為0.05,則貼現公式是=exp(-0.05/360)×期權價值,得到期權價格的1000個樣本。最後,對期權價格的1000個樣本求平均,Excel函數average(期權價格樣本),就可以得到期權的價格了。我這裏算出來的是:0.2015元。而根據Black-Scholes期權定價公式算出來的理論價格則是0.2103元。二者比較接近,但是還是有差距。而且,每次刷新Excel表格,就重新做壹次模擬,得到的模擬價格變動比較大,有時是0.2043元,有時是0.1989元。由於這個抽樣的數量比較小(1000個樣本),所以估算的結果受到樣本的影響會比較大。如果把抽樣數量提高100倍甚至500倍,那麽樣本變動的影響可能會小壹個或者兩個數量級。但是計算量就大了,如果計算機性能不夠高,那麽利用Excel來做的話,比較困難。這就是我的工作臺:------ 再來壹個 --------看到有人提到利用蒙特卡洛方法來估計圓周率Pi,挺有意思,也簡單,所以就在Excel中做了壹個實驗。基本原理在於在直角坐標系中的第壹個象限中的壹個單位圓,如下圖所示:在這個面積為1的正方形中,有四分之壹的圓,圓的半徑與正方向的邊長都是1。那麽根據圓的面積公式,這個圖形中陰影部分的面積應該是 Pi/4。下面開始進入蒙特卡洛的解法。即,如果我們對這個正方形平面中的點進行均勻地抽樣,隨著抽樣點的增多,那麽落入陰影內的點的數量與總抽樣數量的比,應該基本上等於陰影的面積Pi/4與整個正方形面積1的比,即Pi/4。用數學表示,就是陰影內的樣本點數量 ÷ 總數量 = Pi/4所以,Pi = 4 × 陰影內的樣本點數量 ÷ 總數量。下面就在Excel中進行實驗。用rand()函數生成2000個隨機數,作為隨機樣本點的X軸坐標,再用rand()函數生成2000個隨機數,作為隨機樣本點的Y軸坐標。如此就得到了2000個隨機樣本點,這些點的X軸坐標和Y軸坐標都大於零且小於1,所以是在前面所說的正方形之中的點。下壹步,判斷樣本點是否處於陰影之內,由於這個陰影就是單位圓在直角坐標系第壹想象的四分之壹,所以圓陰影內的點都符合如下不等式:翻譯到Excel中,就是用IF函數來判斷,例如:IF(A2^2 + B2^2 <=1, 1, 0)即,如果樣本點在陰影中,得到1,否則得到0。這樣就把樣本點區分開來了。最後,把所有得到的1和0加總,就知道所有樣本點中處於陰影中樣本點的數量了。最後根據Pi = 4 × 陰影內的樣本點數量 ÷ 總數量就可以算出Pi來了。我這個試驗中算出來的 Pi=3.142。以下是樣本點的散點圖:由於樣本數量有限,所以計算出來的Pi的精度並不高。以下是工作界面,挺簡單的。來源:知乎