【问题标题】:Simulating a Random Walk with a drift (using a for loop)模拟带有漂移的随机游走(使用 for 循环)
【发布时间】:2021-06-03 14:21:40
【问题描述】:

我正在尝试使用循环构建带有漂移的随机游走过程的模拟,但是,我无法获得任何输出,而是出现长度错误(要替换的项目数不是替换长度),我无法完全理解,因为我提供的长度会随任意数量的值(N)而变化。我应该能够提供特定的值,然后模拟随机游走。这是我的代码:

random_walk <- function(prices){
  

  prices <- as.vector(prices)
  
 
  ln_prices <- log(prices)
  
  
  N <- length(prices)
  
 
  phi0 <- (ln_prices[N] - ln_prices[1]) / N
  
  
  sigma <- sd(ln_prices) / sqrt(ln_prices)
  
 
  shock <- rnorm(ln_prices, 0, sigma)
  
 
  rw1 <- c(ln_prices[1])
  
 for (i in 2:N){
  # I calculate the rw value for day t:
  # rw <- drift + shock + rw of yesterday
  rw1 <- rw1 + phi0 + shock

 }
  
}```

【问题讨论】:

  • 您的示例不可重现,因此我们无法进行任何深入的故障排除,但仅在 1 到 10 之间的随机价格向量上调用您的函数不会对我产生错误。所以请给个代表。抛出错误的示例
  • 这是我正在尝试使用的示例,我不再收到错误但没有输出,我很确定我错过了一些东西但不明白它是什么: ```价格

标签: r random-walk whitenoise drift


【解决方案1】:

你需要从这个函数中返回一些东西,你可以使用 return 或者只是在最后一行调用你想要的东西的名称

random_walk <- function(prices){
  
  
  prices <- as.vector(prices)
  
  
  ln_prices <- log(prices)
  
  
  N <- length(prices)
  
  
  phi0 <- (ln_prices[N] - ln_prices[1]) / N
  
  
  sigma <- sd(ln_prices) / sqrt(ln_prices)
  
  
  shock <- rnorm(ln_prices, 0, sigma)
  
  
  rw1 <- c(ln_prices[1])
  
  for (i in 2:N){
    # I calculate the rw value for day t:
    # rw <- drift + shock + rw of yesterday
    rw1 <- rw1 + phi0 + shock
    
  }
  return(rw1)
}  

price <- c(10,11,9,10.6,10.2,9.8,8.5,8,8.8,11)  

random_walk(prices = price)
#>  [1] 2.5747813 2.2403036 1.8345087 2.9714599 1.4440819 0.8269357 2.0922631
#>  [8] 2.0563724 1.7999183 3.1020998

reprex package (v2.0.0) 于 2021 年 6 月 3 日创建

会话信息
sessionInfo()
#> R version 4.1.0 (2021-05-18)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 21390)
#> 
#> Matrix products: default
#> 
#> locale:
#> [1] LC_COLLATE=Portuguese_Brazil.1252  LC_CTYPE=Portuguese_Brazil.1252   
#> [3] LC_MONETARY=Portuguese_Brazil.1252 LC_NUMERIC=C                      
#> [5] LC_TIME=Portuguese_Brazil.1252    
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> loaded via a namespace (and not attached):
#>  [1] ps_1.6.0          digest_0.6.27     withr_2.4.2       magrittr_2.0.1   
#>  [5] reprex_2.0.0      evaluate_0.14     highr_0.9         stringi_1.6.2    
#>  [9] rlang_0.4.11      cli_2.5.0         rstudioapi_0.13   fs_1.5.0         
#> [13] rmarkdown_2.8     tools_4.1.0       stringr_1.4.0     glue_1.4.2       
#> [17] xfun_0.23         yaml_2.2.1        compiler_4.1.0    htmltools_0.5.1.1
#> [21] knitr_1.33

【讨论】:

    【解决方案2】:

    让我试着重构一下你的代码,让它真正返回一些东西:

    
    random_walk <- function(prices){
    
      #  prices <- as.vector(prices) # You don't need this since you're already passing a vector
      
      ln_prices <- log(prices)
      
      N <- length(prices)
        
      phi0 <- (ln_prices[N] - ln_prices[1]) / N
        
      sigma <- sd(ln_prices) / sqrt(ln_prices)
        
      shock <- rnorm(ln_prices, 0, sigma)
        
      rw1 <- ln_prices[1]
      
      # This for loop is also unnecessary. You're basically adding phi0 + shock N-1 times
      #for (i in 2:N){
      #  # I calculate the rw value for day t:
      #  # rw <- drift + shock + rw of yesterday
      #  rw1 <- rw1 + phi0 + shock
      #  
      #}
      rw.N <- rw1 + (N-1) * (phi0 + shock)
      
      rw.N # Call rw.N to actually return anything  
    }
    
    

    【讨论】:

    • 只是为了理解你为什么说 for 循环是不必要的。随机游走模型是:Yt = 漂移 + Y(t-1) + 冲击。我现在意识到我的循环中缺少我的想法,即使用 rw1 的第一个值,然后使用 rw1 中的先前值由同一模型填充向量的其余部分。所以它会有类似:```rw[i]
    • 我没有评估您的模型,但此代码复制了您的示例。但我需要更多信息来修复您的代码以执行您想要的操作。因为shockdrift 本身就是N long。那么您想同时更新所有价格吗?或者目标是什么?
    • 好的,所以目标是:创建一个函数来模拟 N 个时期的股票价格,假设价格的对数表现得像一个有漂移的随机游走。我应该能够从任何股票下载股票价格信息,并让我的函数模拟它的随机游走,该随机游走必须适用于任意数量的观察。我希望这有助于解释我的目标是什么。非常感谢!
    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 2021-05-05
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多