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

本文介绍如何使用蒙特卡罗模拟预测股票价格的方法。通过设定股票的初始价格及历史日度数据估计的期望回报率和标准差,利用正态分布随机生成未来20天的股价走势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文所讲的蒙特卡罗模拟是建立在正态分布的基础上。假设我们给定一只股票的初始价格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乘于指数幂就得出来
# 每个路径节点上的价格啦。


### 使用R语言实现蒙特卡洛模拟 #### 蒙特卡洛方法简介 蒙特卡洛方法是一种基于随机抽样和统计模拟的数值计算技术。该方法广泛应用于各种领域,包括但不限于物理、金融工程以及计算机科学等领域。其核心思想在于通过大量随机试验的结果来逼近所求解问题的真实值。 对于特定应用场景下的蒙特卡洛模拟,在R语言中有多种途径可以实施: #### 圆周率π的估算实例 为了更好地理解这一概念,下面给出一段简单的R代码用来演示如何采用蒙特卡洛法估计圆周率π的值[^1]: ```r set.seed(123) # 设置种子以便结果重现 n <- 1e6 # 定义总的投点次数 x <- runif(n, min=0, max=1) y <- runif(n, min=0, max=1) inside_circle <- (x^2 + y^2 <= 1) pi_estimate <- mean(inside_circle)*4 cat("Estimated Pi:", pi_estimate, "\n") ``` 这段程序首先生成了一百万个位于单位正方形内的随机坐标(x,y),接着判断这些点是否落在以原点为中心半径为一的四分之一圆形区域内;最后根据落入此区域的比例乘以4作为对整个圆面积占比从而得出π的一个近似估值。 #### 马尔可夫链蒙特卡洛(MCMC)应用案例 当面对更复杂的概率分布时,则需要用到马尔可夫链蒙特卡洛(MCMC)。这种方法允许从难以直接采样的目标分布中抽取样本序列,并以此为基础做出关于未知参数的各种推论。在R环境中执行此类操作通常依赖于专门设计好的软件包如`MCMCpack`, `rjags` 或者 `Stan` 等工具库的支持[^2][^4]。 这里是一个简单例子说明怎样运用`MCMCpack`来进行贝叶斯线性回归建模并获取后验分布样本的过程: ```r library(MCMCpack) data(mtcars) model_formula <- mpg ~ wt + hp mcmc_samples <- MCMCregress(formula=model_formula, data=mtcars, burnin=1000, mcmc=10000, thin=1, b0=c(0,0), B0=diag(c(.001,.001))) summary(mcmc_samples) plot(mcmc_samples) ``` 上述脚本展示了如何加载数据集、定义模型公式、调用`MCMCregress()` 函数完成实际运算工作流程。最终还提供了查看摘要信息及绘制图表的方法帮助进一步探索所得结果特性。 #### 数值积分中的蒙特卡洛实践 除了以上提到的应用场景之外,蒙特卡洛方法同样适用于处理定积分等问题。具体来说就是利用均匀分布在给定区间上的伪随机数列代替传统解析手段去近似求得函数曲线下方围成图形的总面积大小[^3]。 ```r f <- function(x){return(exp(-x^2))} # 待积函数表达式 N <- 1e7 # 抽取样本数量级设定 u <- runif(N,-3,3) # 生产[-3,+3]范围内服从U(a,b)分布的一组变量集合 integral_approximation <- diff(range(u))*mean(f(u)) cat("Integral Approximation of exp(-x^2):", integral_approximation,"\n") ``` 此段代码实现了对指数衰减型高斯密度函数\( e^{-x^{2}} \)在整个实轴上进行粗略积分的操作。它先指定好被积对象的形式,再确定所需考察范围边界条件,之后借助内置命令批量制造满足要求的标准随机变元数组,进而依据平均法则算出期望输出量度。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值