精华内容
下载资源
问答
  • r语言蒙特卡洛模拟
    2020-11-21 11:44:53

    原文链接:

    http://tecdat.cn/?p=14601​tecdat.cn

    99b057d32eb76c18aa511e2135ed8cef.png

    如何使用蒙特卡洛模拟来推导随机变量可能的分布,我们回到统计数据(无协变量)进行说明。我们假设观察值是基础随机变量,具有未知分布的随机变量。

    这里有两种策略。在经典统计中,我们使用概率定理来推导随机变量的属性在可能的情况下的分布。另一种方法是进行计算统计。

    对于评估拟合度,测试正态性不是很有用。在本文中,我想说明这一点。我们使用男生的身高数据,

    X=Davis$height[Davis$sex=="M"]

    我们可以可视化其分布(密度和累积分布)


    1. u=seq(155,205,by=.5)

    2. par(mfrow=c(1,2))

    3. hist(X,col=rgb(0,0,1,.3))

    4. lines(density(X),col="blue",lwd=2)

    5. lines(u,dnorm(u,178,6.5),col="black")

    6. Xs=sort(X)

    7. n=length(X)

    8. p=(1:n)/(n+1)

    9. plot(Xs,p,type="s",col="blue")

    10. lines(u,pnorm(u,178,6.5),col="black")

    6aa647e09989a43af109992a472bea8a.png

    它看起来像正态分布,因此我们可以在左侧添加密度高斯分布,在右侧添加cdf。我不想测试它是否是高斯分布。为了查看此分布是否相关,可以使用蒙特卡洛模拟法

    f681206052ad67dd2f533928e84857df.png

    我们可以在左侧看到很难通过密度(直方图以及核密度密度估计器)评估正态性 。人们很难想到两个密度之间的有效距离。但是,如果我们看一下右边的图,我们可以比较经验分布累积分布。如上所述,我们可以按照Cramer-von Mises 检验或 Kolmogorov-Smirnov 距离的建议计算黄色区域 。

    ff0c4043ad5e772d9927c8f579ea8f96.png

    如果我们抽取10,000个反事实样本,则可以使用测试统计量等的方法来可视化距离的分布(此处为密度),并将其与样本的观察值进行比较。测试统计量超过观察值的样本比例


    1. mean(dks)

    2. [1] 0.78248

    计算版本的值


    1. ks.test(X,"pnorm",178,6.5)

    2. One-sample Kolmogorov-Smirnov test

    3. data: X

    4. D = 0.068182, p-value = 0.8079

    5. alternative hypothesis: two-sided

    在统计数据中,要么操作抽象对象(如随机变量),要么实际上使用一些代码生成假样本以量化不确定性。后者很有趣,因为它有助于可视化复杂的量化。


    参考文献

    1.R语言泊松Poisson回归模型分析案例

    2.R语言进行数值模拟:模拟泊松回归模型

    3.r语言泊松回归分析

    4.R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化

    5.用R语言模拟混合制排队随机服务排队系统

    6.GARCH(1,1),MA以及历史模拟法的VaR比较

    7.R语言做复杂金融产品的几何布朗运动的模拟

    8.R语言进行数值模拟:模拟泊松回归模型

    9.R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions

    更多相关内容
  • R语言蒙特卡洛模拟

    万次阅读 多人点赞 2020-11-14 18:06:56
    hello,大家好,今天带给大家的是一种计算机模拟的方法——蒙特卡洛模拟(Monte Carlo)。这是一种基于概率统计...因为本人后续的学习内容要以R语言为主,因此这两个例子我都是基于R语言来实现的。 例1 蒙特卡洛模拟

    hello,大家好,今天带给大家的是一种计算机模拟的方法——蒙特卡洛模拟(Monte Carlo)。这是一种基于概率统计模型所衍生的一种计算机模拟的方法,而它的原理就是概率论中所涉及的“大数定律”,也就是在实验次数非常多时,频率会依概率收敛,即频率非常接近概率。

    蒙特卡洛模拟的基本思路可以归纳为三步:构造问题的概率模型->从已知概率分布中抽样->建立所需的统计量。后面我会用两个例子来做详细的解释。因为本人后续的学习内容要以R语言为主,因此这两个例子我都是基于R语言来实现的。

    例1 蒙特卡洛模拟求积分

    I = ∫ 0 1 ln ⁡ ( 1 + x ) 1 + x 2 d x I = \int_0^1 \frac {\ln(1+x)}{1+x^2} \mathrm{d} x I=011+x2ln(1+x)dx
    首先我们可以先画下图,看下这个所要求的积分函数是什么样子的。

    f <- function(x){
    log(1+x)/(1+x^2)
    }
    x <- seq(0,1,length=50)
    y <- f(x)
    df <- data.frame(x,y)
    ggplot(df, mapping = aes(x=x,y=y))+geom_line()
    

    在这里插入图片描述

    画完后发现,整个函数在[0,1]的区间内都是大于0的,那么我们就可以画一个边长为1含有这个函数的正方形,往该区域内投点,看看落在该函数内的点有多少个(即图中红色区域),这样我们就完成了第一步,构造问题的概率模型。

    ggplot(df, mapping = aes(x=x,y=y))+geom_line()+geom_ribbon(aes(ymin=0, ymax=y, x = x), fill="red", alpha=0.2)+geom_hline(yintercept = c(0,1))+geom_vline(xintercept = c(0,1))
    

    在这里插入图片描述

    接下来,第二步,从已知概率分布中抽样,往该区域随机投点属于均匀分布,因此我们用runif()函数即可生成n个随机点。每有一个点落在红色区域,便记为一次,记k为落在红色区域内的次数。随着投点的次数增多,我们就可以根据大数定律认为 k n = S r e d S 正 方 形 \frac kn = \frac {S_{red}}{S_{正方形}} nk=SSred,那么这个 k n \frac kn nk就是我们所需要的统计量。又因为这个正方形面积为1,所以 k n \frac kn nk就是我们要求的定积分。

    MC1 <- function(n){
        k <- 0; x <- runif(n, 0, 1); y <- runif(n, 0, 1) #从已知概率分布中抽样
        for (i in 1:n){
            if (y[i] < f(x[i]))
                k <- k+1
        }
        k/n #建立所需的统计量
    }
    

    这样我们蒙特卡洛模拟就完成了,一般来说,模拟次数越多,最后的精度就越高,因此我们就模拟100000次来跟正确答案 π 8 ln ⁡ 2 \frac \pi8 \ln 2 8πln2作比较。

    MC1(100000)
    ## [1] 0.27057
    pi/8*log(2)
    ## [1] 0.2721983
    

    从结果中我们可以看出准确度还是非常不错的。

    经过这个简单的例子,大家应该就能对蒙特卡洛模拟有个基本的印象,接下来再举一个在知乎上看到的例子(https://www.zhihu.com/question/263316961)。

    例2 蒙特卡洛模拟在项目管理中的应用

    现在有个项目,该项目共有三个WBS要素分别是设计、建造和测试,为了简单起见我们假设这三个WBS要素的预估的工期概率分布都呈标准正态分布,各自的平均工期、标准差以及最悲观、最可能和最乐观的估计工期如下表所示

    最乐观最可能最悲观平均工期标准差分布
    设计81420142正态分布
    建造142332233正态分布
    测试102234224正态分布

    现在我们要通过这些信息推断整个工期的分布参数。

    首先,我们可以先画出这三个的概率密度函数,有一个直观的感受。

    x <- seq(7,35,length = 100)
    y1 <- dnorm(x, mean = 14, sd = 2)
    y2 <- dnorm(x, mean = 23, sd = 3)
    y3 <- dnorm(x, mean = 22, sd = 4)
    data <- data.frame(x,y1,y2,y3)
    colnames(data) <- c("x","y1","y2","y3")
    ggplot(data)+geom_line(aes(x=x,y=y1), color = "red")+geom_line(aes(x=x,y=y2), color = "blue")+geom_line(aes(x=x,y=y3), color = "green")+theme_classic()
    

    在这里插入图片描述

    紧接着构建蒙特卡洛模拟

    MC2 <- function(n){
    	y1 <- rnorm(n , mean = 14, sd = 2) #从已知概率分布中抽样
    	y2 <- rnorm(n , mean = 23, sd = 3)
    	y3 <- rnorm(n , mean = 22, sd = 4)
    	y <- y1 + y2 + y3 #构造问题的概率模型
    	result <- c(mean(y),var(y)) #建立所需的统计量,即样本均值和样本方差
    	return(result)
    }
    

    我们根据正态分布的可加性,可以知道总工期的分布应该是均值为59,方差为29的正态分布。然后进行100000次模拟后,看看模拟的结果与真实结果相差多少。

    result <- MC2(100000)
    print(result)
    ## [1] 59.00243 29.11788
    x <- seq(7,80,length = 1000)
    data <- data.frame(x,y1 <- dnorm(x, mean = 14, sd = 2),dnorm(x, mean = 23, sd = 3),dnorm(x, mean = 22, sd = 4),dnorm(x, mean = result[1], sd = result[2]^0.5))
    colnames(data) <- c("x","y1","y2","y3","y")
    ggplot(data)+geom_line(aes(x=x,y=y1), color = "red")+geom_line(aes(x=x,y=y2), color = "blue")+geom_line(aes(x=x,y=y3), color = "green")+geom_line(aes(x=x,y=y))+theme_classic()
    

    在这里插入图片描述
    从结果中可以看出,精度还是非常高的。

    结语

    从以上两个例子不难看出,蒙特卡洛模拟在参数估计方面还是十分有效的,除了无偏估计以外,极大似然估计、渐近估计等也都可以用蒙特卡洛模拟进行计算。

    获得代码

    以下是我的个人公众号,本文完整代码已上传,关注公众号回复“蒙特卡洛模拟”,即可获得,谢谢大家支持。
    在这里插入图片描述

    展开全文
  • R语言学习笔记-蒙特卡洛模拟方法

    千次阅读 多人点赞 2020-10-25 15:19:18
    蒙特卡洛模拟方法=建立概率模型+计算机模拟+数理统计 实例分析 1.应用蒙特卡洛模拟方法计算Π值 1)基本原理 P=圆的面积/正方形的面积 P=Π/4 2)用计算机模拟,产生0—1之间的二维的随机数 在正方形的...

    前言

     

    二十世纪最伟大的10大算法之一,数学家冯·诺伊曼用驰名世界的赌城摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。所谓蒙特卡洛方法,简单地说就是将问题转化成一个概率问题.并用计算机模拟产生一堆随机数据,之后就是对随机数据的统计工作了! 

    蒙特卡洛模拟方法=建立概率模型+计算机模拟+数理统计

    什么是MCMC,什么时候使用它?

    Markov Chain Monte Carlo,以下简称MCMC,MCMC只是蒙特卡洛方法的一种,尽管可以将许多其他常用方法看作是MCMC的简单特例。

    实例分析

    1.应用蒙特卡洛模拟方法计算Π

    1)基本原理

    P=圆的面积/正方形的面积

    P=Π/4

    2)用计算机模拟,产生0—1之间的二维的随机数

    在正方形的内部产生10000个点,统计好多个点(红色)落在圆中,算得一个比值(相当于古典概率)

    3)对产生的随机数样本进行统计分析,算出pi值,并计算误差

    这里我们看计算公式

    P=Π/4,如果将比值乘上4,就可以得到pi值,即:

    \pi =4p

    那么问题来了,怎么让计算机知道哪些点在圆中,哪些点在圆外???

    计算该点到圆心的距离,然后与R(半径)比较大小即可。

    2.代码实现

    想对你说的话都在代码里面

    # 生成10000个点
    # 圆心
    n = 10000
    center = c(2.5,2.5)
    # 半径
    radius = 2.5
    # distance From Center
    dfc = function(a){
      sqrt(sum((center - a)^2))
      # 欧式距离计算公式
    }
    # 设生成n个点
    n = 10000
    # 生成2n个区间是[0,5]的均匀分布产生的随机数作为A矩阵的元素
    
    # A 是n行2列
    A = matrix(runif(n*2,min = 0,max = 5),nrow = n,ncol = 2,byrow = T)
    # 对矩阵的每行的元素使用求距离函数,得到向量B
    # B 是存放这点到圆心的距离,注意B是向量
    B = apply(A, 1, dfc)
    # 求向量b中的元素值(距离)小于半径的个数
    
    num = mean(B < radius)
    # 这是一个逻辑表达式的结果要么为0,要么为1
    # 所以对这个向量求均值,就得到了比例
    print(num)
    
    
    # 绘图
    # 设置背景色
    par(bg = 'beige')
    # 回值模型生成的所有点,让横纵轴不显示名称
    # asp = 1的色湖之是为了不使后面的draw.circle函数绘制元的时候出现偏差
    plot(A,col='azure3',asp=1,xlab = '',ylab = '',main = 'MC method application')
    
    # 添加四条线,勾勒出正方形
    abline(h=0,col='goldenrod4',lty = 'dotdash',lwd=3)
    abline(h=5,col='goldenrod4',lty = 'dotdash',lwd=3)
    abline(v=0,col='goldenrod4',lty = 'dotdash',lwd=3)
    abline(v=5,col='goldenrod4',lty = 'dotdash',lwd=3)
    
    
    # 绘制圆内和边缘上的点
    points(A[B<radius,],col='aquamarine3')
    #导入绘圆的包
    library(plotrix)
    draw.circle(2.5,2.5,2.5,border='coral2',lty='dashed',lwd=3)
    # 添加圆心
    points(x=2.5,y=2.5,col='brown1',pch=19,cex=1.5,lwd=1.5)
    # 美化
    points(x=2.5,y=2.5,col='olivedrab3',pch=11,cex=3,lwd=3)
    
    
    
    
    

    # 模拟多次,用循环
    # 创建向量 
    piVec = c()
    # 循环2000次
    for(i in 1:2000){
      n = i
      # i个区间是在[0,5]的均匀分布产生的随机数构成n行2列的矩阵A
      A = matrix(runif(n*2,min=0,max=5),nrow = n,ncol=2,byrow=T)
      # 求点到圆心的距离
      # B 是存放这点到圆心的距离,注意B是向量
      b = apply(A, 1, dfc)
      # 求向量b中的元素值(距离)小于半径的个数
      
      d = subset(b,b<radius)
      # 得到比例
      num = length(d)/length(b)
      piVec[i]=num*4
    }
      # 这是一个逻辑表达式的结果要么为0,要么为1
      # 所以对这个向量求均值,就得到了比例
    library(data.table)
      # 将piVec转为数据框
    Pi = data.frame(piVec)
    Pi = data.table(Pi)
      # ind列中储存的是模拟次数
    Pi[,ind:=seq(0,1999)]
      # error列是误差
    Pi[,error:=abs(pi-piVec)]
    Pi = data.frame(Pi)
      # pi数据捐给的三列分别为序号、实际值、误差
    names(Pi) = c('guess','ind','error')
      # 画出误差
    library(ggplot2)
      # x轴是模拟次数,y是误差
    ggplot(Pi,aes(x=ind,y=error))+
      geom_line(colour='#388E8E')+
      ggtitle('Error')+
      xlab('Sample Size')+
      ylab('Error')

    展开全文
  • 完全估值法,可处理非线性、大幅波动与厚尾问题;利用计算机反复生成模拟数据,计算结果更具可靠性和精确性;利用风险因子变化的历史数据信息改善和修正随机模拟模型,对风险因子未来变化的模拟更贴近现实
  • 嗯,第一个例子是怎么用蒙特卡洛模拟求pi的值;第二个是用蒙特卡洛模拟求解定积分;第三个是用蒙特卡洛模拟证券市场求解其收益;第四个是用蒙特卡洛模拟验证OLS的参数的无偏性;然后还要R是如何求导,计算导数的;R...

    嗯,第一个例子是怎么用蒙特卡洛模拟求pi的值;第二个是用蒙特卡洛模拟求解定积分;第三个是用蒙特卡洛模拟证券市场求解其收益;第四个是用蒙特卡洛模拟验证OLS的参数的无偏性;然后还要R是如何求导,计算导数的;R的点的形状的集合,以便于查看。

     

    转载于:https://www.cnblogs.com/xuanlvshu/p/6250422.html

    展开全文
  • 蒙特卡洛模拟计算风险价值VAR之R语言实现

    万次阅读 多人点赞 2018-04-08 12:46:54
    一、解析VAR 当在分析方法中计算风险价值(VAR)时,我们需要假设金融工具的返回遵循一定的概率分布。最常用的是正态分布,这也是为什么...这些R语言都可以处理。更多内容参考( Acerbi, C.; Tasche, D. ,2002 )。
  • 蒙特卡罗模拟已成为衍生证券定价和风险管理的重要工具,这些应用反过来刺激了对新的蒙特卡罗方法的研究,并重新引起了人们对某些旧有技术的兴趣。 Monte Carlo simulation has become an essential tool in the ...
  • 我们如何使用蒙特卡洛模拟来推导随机变量可能的分布,回到统计数据(无协变量)进行说明。我们假设观察值是基础随机变量,具有未知分布的随机变量。
  • R语言蒙特卡洛方法求积分

    千次阅读 2021-12-08 11:19:55
    蒙特卡洛方法(MC)
  • R语言实现 注释挺详细的,最后图是用ggplot可视化的。 n 代表蒙特卡罗模拟重复次数 a 表示不改变主意时能赢得汽车的次数 b 表示改变主意时能赢得汽车的次数 # 下面是在成功的条件下,换门还是不换们的概率 ...
  • 11随机数功能完全兼容实现各种伪随机数算法支持并行(多线程)应用程序的多个随机数流不依赖于特定的并行化技术,可以与任何线程库或MPI一起使用伪随机数可以从许多不同的分布中采样通过提供的R编程语言的绑定,...
  • 前言: 在企业风险这一章中,蒙特卡罗方法(蒙特... apply(), lapply(), sapply(), tapply() Function in R with Examples Practice 9 Calculating Confidence Intervals in R | R Practices for Learning Statistics
  • 金融资产预测 蒙特卡洛模拟     商业经营活动中经常需要预测其...本文中,我们探讨使用Python语言应用蒙特卡洛模拟来缓解前面所说的问题,并且提供公司到达其目标的似然估计。 蒙特卡洛模拟简介
  • R语言期末试题
  • 然后,基于蒙特卡罗模拟算法建立了随机过程模型,以计算股票的平均收益率与风险。通过计算得到股票位于99%置信水平下的VAR,从而对其投资风险进行评价。通过对股票编号为000001.SZ、300231.SZ、002332.SZ、2012年01...
  • R语言(二) 多种蒙特卡洛法计算一二重积分

    千次阅读 多人点赞 2020-12-05 20:35:56
    以下在R语言中,以例子进行展示不同的方法计算一重积分和二重积分 一、内置函数+平均值法 例1 计算 ∫0∞e−xsinxdx\int_0^{\infty}e^{-x}sinxdx∫0∞​e−xsinxdx #内置函数 f(x){exp(-x)*sin(x)} integrate(f,0,'...
  • 本章主要介绍蒙特卡罗方法的相关可视化,和敏感性分析。(蒙特卡罗方法的基本操作,计算在上一章) 开始前基本处理【如若不理解某项操作,请看上一章】 library(EnvStats) #rtri ...- function(cf,r)
  • 本文所讲的蒙特卡罗模拟是建立在正态分布的基础上。假设我们给定一只股票的初始价格P0, 并且从历史日度数据估计出该股票的每日期望回报率为 mean.logret, 标准差为sd.logret. ( 在估计这两个重要参数时,可以先求...
  • ##在做随机分布的模拟与现实的分布做比较,跑出来的结果显示,理论值不在理论值的置信区间内,觉得非常奇怪,想知道这个置信区间上下限是如何计算的。
  • R语言如何模拟布朗运动?
  • R语言模拟掷硬币过程

    万次阅读 2016-05-15 10:16:25
    中,使用R语言进行掷硬币的仿真实验。  //coin.R  # 掷硬币500次 N 500 flipsequence (x=c( 0 , 1 ), prob=c( 0.5 , 0.5 ),size = N, replace = TRUE ) r (flipsequence) n 1 :N runprop = r/n #...
  • 蒙特卡洛模拟的意义在于简化高维积分运算,降低涉及高维积分的算法的时间复杂性。 1.编写代码 本次例子我们利用蒙特卡洛模拟来计算π,正方形内切的圆与该正方形比值为π/4 R代码如下 #圆心坐标 center <- c(0,0)...
  • 首先用蒙特卡洛模拟股票路径(注意要先做正态检验),这个网上资源很多,不再赘述 核心是计算出每支股票路径的雪球收益,核心python代码如下: """ 计算模拟出的每支股票路径的雪球收益 参数: getin_rate : ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,213
精华内容 485
关键字:

r语言蒙特卡洛模拟

友情链接: bvqgtlv671.zip