【问题标题】:Calculating average daily returns with For-Loop使用 For-Loop 计算平均每日收益
【发布时间】:2020-01-22 02:12:11
【问题描述】:

我正在尝试将我的脚本放入 For-Loop 中,以计算多只股票的平均每日收益。

但是当我设置 For-Loop 时出现以下错误:

getSymbols 错误(Symbols = stock, src = "yahoo", from = "2005-01-01", : 多个符号请求必须使用 auto.assign=TRUE

所以我删除了env = NULL 并用auto.assign=TRUE 替换它,但是当我运行脚本时我得到NaN 结果。

任何建议将不胜感激。谢谢。

install.packages('quantmod')
library(quantmod)

stock <- c("AAPL") 
{
stock.xts <- getSymbols(Symbols = stock, src = "yahoo", 
                       from = "2005-01-01",
                       to = "2019-09-10", 
                       env = NULL)

stock.xts <- as.data.frame(stock.xts)

N <- nrow(stock.xts)
todays.price <- stock.xts[2 : N,4]
yesterdays.price <- stock.xts[1 : N-1,4]
stock_dailyreturn <- (todays.price - yesterdays.price)/yesterdays.price
stock.xts$daily.return <- c(NA,(todays.price - yesterdays.price)/yesterdays.price)
print(mean(stock_dailyreturn)) 
}

使用 For 循环:

stock <- c("AAPL", "MSFT", "CRM", "ORCL", "NFLX", "GOOG")

for(i in 1:length(stock)){
  stock.xts <- getSymbols(Symbols = stock, src = "yahoo", 
                          from = "2005-01-01",
                          to = "2019-09-10",
                          auto.assign = TRUE)
  stock.xts <- as.data.frame(stock.xts)

  N <- nrow(stock.xts)
  todays.price <- as.numeric(stock.xts[2 : N,4])
  yesterdays.price <- as.numeric(stock.xts[1 : N-1,4])
  stock_dailyreturn <- (todays.price - yesterdays.price)/yesterdays.price
  stock.xts$daily.return <- c(NA,(todays.price - yesterdays.price)/yesterdays.price)
  print(mean(stock.xts$daily.return))
}

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    你非常接近! 试试这个吧:

    • 更改您的 for 循环以在每次迭代中保存一个单独的值(见下面的 for 循环)

    • 更新 getSymbols 函数的使用,使其正确自动分配(否则默认为 NULL - 查看文档了解更多信息)

    • 为 getSymbols 函数使用占位符向量在其中创建对象(我暂时称其为 hello

    祝你好运!

    stock <- c("AAPL","MSFT","CRM")
    
    hello <- c()
    
    for(value in stock){
    
    stock.xts <- getSymbols(Symbols = value, src = "yahoo",
                        from = "2005-01-01",
                        to = "2019-09-10",
                        env = hello,
                        auto.assign=TRUE)
    stock.xts <- as.data.frame(stock.xts)
    
    N <- nrow(stock.xts)
    todays.price <- stock.xts[2 : N,4]
    yesterdays.price <- stock.xts[1 : N-1,4]
    stock_dailyreturn <- (todays.price - yesterdays.price)/yesterdays.price
    stock.xts$daily.return <- c(NA,(todays.price - yesterdays.price)/yesterdays.price)
    print(mean(stock_dailyreturn))
    
    }
    

    【讨论】:

      【解决方案2】:

      您的整个问题都在代码的最后一行mean(stock.xts$daily.return) 和它之前的行中。 mean 默认返回 NANaN,如果经过平均的向量包含 NAstock.xts$daily.return &lt;- c(NA, ...。这可以通过在平均值范围内设置na.rm = TRUE 来更改。

      但是,您的循环可以进一步降低复杂性。首先,您在每次迭代中都导入您的符号。这是不必要的。您也可以利用difflag 函数,使用diff(...)/lag(...) 计算您的回报。

      例如,您可以使用类似于以下示例的内容:

      library("quantmod")
      stock <- c("AAPL", "MSFT", "CRM", "ORCL", "NFLX", "GOOG")
      #Create a place to store the symbols
      stockenv <- new.env()
      stuff <- getSymbols(Symbols = stock, src = "yahoo", 
                         from = "2005-01-01",
                         to = "2019-09-10",
                         env = stockenv) #<=== note here, i import into the environment
      ls(stockenv) #<== check that all the symbols were imported into the environemnt.
      #[1] "AAPL" "CRM"  "GOOG" "MSFT" "NFLX" "ORCL"
      priceChange <- vector("list", length(ls(stockenv)))
      meanPrice <- vector("list", length(ls(stockenv)))
      #overwrite names
      names(priceChange) <- names(meanPrice) <- ls(stockenv)
      for(i in ls(stockenv)){
          priceChange[[i]] <- diff(stockenv[[i]][,4]) / lag(stockenv[[i]][,4])
          meanPrice[[i]] <- mean(priceChange[[i]], na.rm = TRUE)
      }
      simplify2array(meanPrice)
      #        AAPL          CRM         GOOG         MSFT         NFLX         ORCL 
      #0.0012548717 0.0013114559 0.0008412977 0.0005783129 0.0019348552 0.0005236143
      

      【讨论】:

        猜你喜欢
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2019-12-14
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        相关资源
        最近更新 更多