如何用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乘于指数幂就得出来
# 每个路径节点上的价格啦。
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乘于指数幂就得出来
# 每个路径节点上的价格啦。
相关文章推荐
- Monte Carlo Simulation technique
- Monte Carlo Method for simulation
- Monte Carlo Simulation technique
- Monte Carlo Simulation
- Monte Carlo Simulation technique
- Monte Carlo Simulation technique
- monte carlo simulation
- learn-with-open-source 如何进行开源社区的学习系列经典文章
- 蒙特卡洛模拟(Monte Carlo simulation)
- Logical calculation with tableaux (如何使用tableaux进行逻辑计算)
- 【原创】多台电脑如何公用一个键盘鼠标进行操作 - Mouse with Borders 软件
- How to: Shellcode to reverse bind a shell with netcat(如何使用netcat进行shellcode反向链接)
- 如何在linux下进行ADSL拨号
- (转)如何有效的利用数据字典进行查询
- 如何进行顾客满意监视分析
- JAVA中如何用TRANSACTION来对数据库进行一系列的操作
- 如何在Struts中进行分页处理
- 如何自动对文章内容进行分类?