1. 程式人生 > >如何用R進行蒙特卡羅模擬(Monte Carlo Simulation with R)

如何用R進行蒙特卡羅模擬(Monte Carlo Simulation with R)

本文所講的蒙特卡羅模擬是建立在正態分佈的基礎上。假設我們給定一隻股票的初始價格P0, 並且從歷史日度資料估計出該股票的每日期望回報率為

mean.logret, 標準差為sd.logret. ( 在估計這兩個重要引數時,可以先求歷史收盤價的對數,然後求差分,即可獲得daily log return。接著求平均,標準差

就不再贅述)。

接下來我們要預測未來20天的股票價格走勢,蒙特卡羅模擬的精神就是假定接下來每天的收益率 r ~ N( mean.logret, sd.logret ^2) . 即遵循

均值為mean.logret, 標準差為sd.logret 的正態分佈(雖然這個假設有點扯淡,遇上股災等極端情況更是毫無預測能力。但這麼假設還是比較能接受的

,畢竟正態分佈還是能夠科學地簡化很多問題嘛。突然想起前幾日前一位副教授在課上吐槽到,nearly 90% of papers published are pointless??.

表示懷疑。。好像跑題了,額)

接下來進入程式碼部分:

# applying Monte Carlo method to simulate the price paths
# generate a 20*200000 matrix with each element following iid N(mean.logret, sd.logret^2)
P0 <- 93.07 ;mean.logret <- 0.004; sd.logret <- 0.005;  steps <- 20; paths <- 200000  
# 給定初始價格,對數期望收益率,對數收益率的標準差,模擬步數(即想要預測的天數),和模擬次數:200000次
# current price; expected log return; volatility of log return; steps of each simulation; number of simulations
set.seed(1024) # To make pseudo-random generated variables would be able to replicate later
# set.seed函式是為了在每次執行程式碼時模擬出來的結果是一樣一樣滴。當然括號裡面的數字你可以隨便給
rand.ret <- rnorm(steps*paths, mean.logret, sd.logret) # 先生成20*200000個正態分佈的隨機數
ret.matrix <- matrix(rand.ret, steps, paths)
# 將上面生成的隨機數重排成20行,200000列的矩陣,這樣每一列就是一次模擬,稱之為一個path
tree <- P0 * exp(apply(ret.matrix, 2, cumsum)) 
# 這邊運用到apply函式,具體用法可以百度下。簡單說就是對每一列運用cumsum這個函式,2代表按列運用,如果是1就代表按行應# 用。因為我們模擬的是對數收益率,所以用到累加函式。這樣出來的東西還是個20*200000的矩陣。然後用P0乘於指數冪就得出來
# 每個路徑節點上的價格啦。