使用 R 中的蒙特卡罗模拟进行风险分析
介绍
蒙特卡罗方法是一种依靠从各种分布中随机抽样来估计特定结果的概率或分布的算法。当其他方法难以或无法使用时,例如敏感性分析、期权定价、金融风险衡量和风险管理应用,这种方法很适合。
在本指南中,您将学习如何使用内置 R 函数运行蒙特卡罗模拟。您将设置模拟并绘制模拟运行结果。然后,您将生成汇总统计数据,以便更容易理解结果的分布。本指南假设您对 R 编程语言有一定程度的了解。
蒙特卡洛如何进行风险分析
蒙特卡罗方法通过反复运行基于不同输入的模拟结果的模型来执行;输入是不确定且可变的。建模不确定性的一种常见但有效的策略是从概率分布中随机抽取值。这允许您为模型创建数千个输入集。通过这种方式,您可以运行模型的数千个排列,这有几个好处:
- 您的输出是一大组结果。这意味着您拥有结果的概率,而不仅仅是单点估计。
- 蒙特卡洛生成模拟结果的分布。这使得绘制图表和交流结果变得容易。
- 通过改变输入的分布类型或属性,可以轻松改变模型的假设。
- 您可以轻松地模拟输入变量之间的相关性。
R 中的随机抽样概率分布
在 R 编程语言中,蒙特卡罗模拟变得非常简单,因为有内置函数可以从各种概率分布中随机抽样。stats 包在这些函数前面加上r来表示随机抽样。下面的代码片段演示了从这些分布中抽样的一些示例:
# sample from an uniform distribution
stats::runif(1, min = 0, max = 1)
# sample from an exponential distribution
stats::rexp(1)
# sample from a normal distribution
stats::rnorm(1)
# sample from a log normal distribution
stats::rlnorm(1)
请注意,stats ::限定命名空间用于阐明这些函数的来源。然而,这并不是绝对必要的。
将蒙特卡洛应用于风险分析
蒙特卡洛适合的一种情况是,当您需要表示受外部随机风险因素影响的一系列决策时。在下面的具体示例中,您将对资产配置问题进行建模,在该问题中,您将决定在多个离散时间段内应将多少财富分配给无风险投资或高风险投资。在此模拟中,上一期的收益将影响下一期的收益。这意味着单点模型不合适。
在这个例子中,有两个不确定性来源:
- 风险资产的回报不确定
- 每种投资类型应分配多少资金
下面的代码片段展示了一个根据不同资产配置计算回报的简单函数。
calculate_return <- function(alpha) {
risk_free_rate <- 1.03
risky_rate <- rnorm(1) * 0.05 + 1
(1 - alpha) * risk_free_rate + alpha * risky_rate
}
alpha是一个交互变量,范围是 1 和 0,它决定了在每个离散时间段内应该向每个资产类别分配多少财富。risky_free_rate是一个固定收益率,在各个时期之间不会发生变化。risky_rate是一个以1.05为中心的随机连续变量,表示不确定性。
运行和绘制模拟
现在我们已经建立了模型,可以开始运行它了。
下面的代码在十二个离散时间段内执行了 1,000 次模型运行。
install.packages('tidyverse')
library(tidyverse)
RUNS <- 1000
DECISION.STEPS <- 12
simulations <- rerun(RUNS, replicate(DECISION.STEPS, runif(1) %>% calculate_return())) %>%
set_names(paste0("sim", 1:RUNS)) %>%
map(~ accumulate(., ~ .x * .y)) %>%
map_dfr(~ tibble(value = .x, step = 1:DECISION.STEPS), .id = "simulation")
simulations %>%
ggplot(aes(x = step, y = value)) +
geom_line(aes(color = simulation)) +
theme(legend.position = "none") +
ggtitle("Simulations of returns from asset allocation")
请注意,此代码使用了 purrr 包提供的函数编程功能,您可以在探索 R 库:Purrr中阅读更多相关信息。
当您使用ggplot2绘制模拟输出时,您将看到结果的分布。在这种情况下,每条线代表基于不同输入系列的预测投资回报。
生成汇总统计数据
为了使输出数据更易于理解,您可以汇总数据。例如,您可以计算模拟运行在各个时间步骤中的最小值、最大值和平均值。为此,请运行以下代码:
summary_values <- simulations %>%
group_by(step) %>%
summarise(mean_return = mean(value), max_return = max(value), min_return = min(value)) %>%
gather("series", "value", -step)
summary_values %>%
ggplot(aes(x = step, y = value)) +
geom_line(aes(color = series)) +
ggtitle("Mean values from simulations")
改变模型假设
在上面的模型中,您使用rnorm假设风险投资的收益呈正态分布。您可以通过将此函数更改为本指南前面讨论的不同类型的分布来更改此假设。您还将无风险利率编码为1.03,将风险回报率编码为以1.05为中心。使用蒙特卡罗方法,您可以轻松更改这些变量,并查看这会对收益分布产生什么影响。
结论
本指南演示了 R 中蒙特卡罗模拟的简单使用。但是,请记住,如果输入模型有缺陷,这种模型将不会提供有用的结果。因此,分析师需要结合数学、金融和编程知识。您可以通过阅读《蒙特卡罗模拟手册:金融工程、风险管理和经济学中的应用》了解更多信息。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~