您的位置:首页 > 其它

如何用R进行蒙特卡罗模拟(Monte Carlo Simulation with R)

2016-11-20 23:22 429 查看
本文所讲的蒙特卡罗模拟是建立在正态分布的基础上。假设我们给定一只股票的初始价格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乘于指数幂就得出来
# 每个路径节点上的价格啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息