r - 尝试在 R 中进行模拟

标签 r simulation

我对 R 很陌生,所以我希望你能帮助我!
我正在尝试为我的学士论文进行模拟,我想模拟股票的演变方式。
我已经在 Excel 中完成了模拟,但问题是我无法进行那么大的模拟,因为程序崩溃了!因此我在 R 中尝试。

股票演变如下(除了 $\epsilon$ 之外的所有内容都由已知的常数组成):
$$W_{t+\Delta t} = W_t exp^{r\Delta t}(1+\pi(exp((\sigma\lambda -0.5\sigma^2)\Delta t+\sigma\epsilon_{t+\Delta t}\sqrt{\Delta t}-1))$$

这里唯一的随机变量是 $\epsilon$,它由 N(0,1) 的布朗运动表示。

我在 Excel 中所做的:

  • 制作了 100 个大小为 40 的样本。所有这些样本都是标准正态分布的:N(0,1)。
  • 然后这些结果用于计算股票如何受到这些影响(正态分布代表经济冲击)。

  • 我在 R 中的问题:

    我使用了示例函数:x <- sample(norm(0,1), 1000, T)所以我有 1000 个样本,它们是正态分布的。现在我不知道如何将这些结果放入我的股票演变公式中。任何人都可以帮忙吗?

    最佳答案

    使用 R 进行(离散)模拟

    您的问题有两个方面:概念和编码。

    让我们首先处理概念,从方程的含义开始:

    1.概念问题

    首先要注意的是,您的进化方程在时间上是连续的,因此如上所述运行模拟意味着接受问题的离散化。这是否合适取决于您的模型以及您如何获得进化方程。

    如果您确实运行了离散仿真,那么您必须做出的关键决定是您将使用的步长 $\Delta t$。您可以探索不同的步长以观察步长的影响,或者您可以继续分析并尝试推导出适当的步长。

    一旦你有了步长,你的模拟就包括拉新的冲击(标准正态分布的样本),并迭代地演化方程,直到所需的时间过去。然后您可以根据需要分析最终状态 $W_t$。 (如果您保留所有的 $W_t$,您也有系统轨迹的分布,您可以对其进行分析。)

    所以:

  • 您的 $x$ 是您冲击的抽样分布,即它们是 $\epsilon_t=0$。
  • 要模拟 $W_t$ 的演变,您需要一些初始条件 $W_0$。这是什么取决于您要建模的内容。如果您正在对以初始价格 $W_0$ 开始的单个股票的可能值进行建模,那么您的初始状态是具有恒定值的 1000 元素向量。
  • 现在评估您的方程,代入所有常数 $W_0$ 和初始冲击 $\epsilon_0 = x$ 以获得价格 $W_1$ 的分布。
  • 重复:再次采样 $x$ —— 现在是 $\epsilon_1$。插入它,给你 $W_2$ 等等。

  • 2. 模拟编码(简单示例)

    R 的有用特性之一是大多数运算符在向量上按元素工作。

    因此,您几乎可以按原样或多或少地输入方程式。

    我对方程中的参数做了一些假设,我忽略了 $\pi$ 函数——你可以稍后添加它。

    所以你最终得到的代码如下所示:
     dt <- 0.5   # step-size
     r <- 1      # parameters
     lambda <- 1
     sigma <- 1    # std deviation
     w0 <- rep(1,1000)   # presumed initial condition -- prices start at 1
    
     # Show an example iteration -- incorporate into one line for production code...
     x <- rnorm(1000,mean=0,sd=1)  # random shock
     w1 <- w0*exp(r*dt)*(1+exp((sigma*lambda-0.5*sigma^2)*dt +
               sigma*x*sqrt(dt) -1))  # evolution
    

    当你准备好让模拟运行时,然后合并最后两行,即在进化语句中包含采样语句。然后,您将获得一行代码,您可以手动运行这些代码或将其嵌入到循环中,以及您想要运行的任何其他分析。
     # General simulation step
     w <- w*exp(r*dt)*(1+exp((sigma*lambda-0.5*sigma^2)*dt +  
               sigma*rnorm(1000,mean=0,sd=1)*sqrt(dt) -1))
    

    您还可以轻松地将更改可视化并获取汇总统计信息(5 位数汇总):
     hist(w)
     summary(w)
    

    当然,您仍然需要详细了解您实际想要建模的内容以及您想要如何对其进行分析 --- 并且您已经有了 $\pi$ 函数来处理---但是这应该会让您开始使用 R 进行离散仿真。

    关于r - 尝试在 R 中进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612557/

    相关文章:

    r - 使用lapply中的特定列计算多个回归分析

    r - 从基于状态的序列创建基于转换的序列

    bandwidth - 我可以使用什么软件来模拟蜂窝连接

    performance - Kotlin 使用运行时断言进行空值检查 - 性能开销?

    python - 使用 MultibodyPlant,为什么我会得到 `SolveQuadraticForTheSmallestPositiveRoot(): condition ' Delta > 0' failed`?

    java - 如何将动态表从 Plant Simulation 传输到 Java?

    html - 使用 R 中的 getURL 从本地加载 HTML 页面

    r - 将数据框列表转换为单个数据框并更改列名

    在 Shiny 的应用程序中异步渲染绘图

    random - 并行循环和随机产生奇怪的结果