1

我有一个数据集,我想在其中计算 6 个月的股票回报率tq_get(参见下面的示例)

数据集调用top

ticker 6month
AKO.A
BIG
BGFV

功能

library(tidyverse)
library(dplyr)
library(tidyquant)
library(riingo)

calculate <- function (x) {
  (tq_get(x, get = "tiingo", from = yesterday, to = yesterday)$adjusted/tq_get(x, get = "tiingo", from = before, to = before)$adjusted)-1
}

top[2] <- lapply(top[1], function(x) calculate(x))

不幸的是,对于某些代码,不存在任何值,这会在简单使用时导致错误消息,lapply或者mutate因为结果向量比现有数据集更小(更少行)。解决try_catch没有奏效。

如果代码可用,我现在想通过检查is_supported_ticker()包提供的方法来解决问题riingo

calculate <- function (x) {
  if (is_supported_ticker(x, type = "tiingo") == TRUE) {
  (tq_get(x, get = "tiingo", from = yesterday, to = yesterday)$adjusted/tq_get(x, get = "tiingo", from = before, to = before)$adjusted)-1
  }
  else {
    NA
  }
}

top[2] <- lapply(top[1], function(x) calculate(x))

但现在我收到错误消息x ticker must be length 1, but is actually length 3

我假设这是基于这样一个事实,即我的数据集的整个第一列被用作输入is_supported_ticker()而不是逐行。我该如何解决这个问题?

4

1 回答 1

1

浏览文档,它似乎tq_get支持多个符号,一次只能if_supported_ticker使用一个。因此,您可能应该检查所有代码以查看它们是否受支持,然后tq_get在所有受支持的代码上使用一次。像这样的东西(未经测试,因为我没有任何这些包):

calculate <- function (x) {
  supported = sapply(x, is_supported_ticker, type = "tiingo")
  result = rep(NA, length(x))
  result[supported] = 
    (
      tq_get(x[supported], get = "tiingo", from = yesterday, to = yesterday)$adjusted / 
      tq_get(x[supported], get = "tiingo", from = before, to = before)$adjusted
    ) - 1
  return(result)
}

它让我担心,before并且yesterday不是函数参数——它们只是假设在全球环境中。我建议将它们作为参数传递给calculate(),如下所示:

calculate <- function (x, before, yesterday) {
  supported = sapply(x, is_supported_ticker, type = "tiingo")
  result = rep(NA, length(x))
  result[supported] = 
    (
      tq_get(x[supported], get = "tiingo", from = yesterday, to = yesterday)$adjusted / 
      tq_get(x[supported], get = "tiingo", from = before, to = before)$adjusted
    ) - 1
  return(result)
}

# then calling it
calculate(top$ticker, before = <...>, yesterday = <...>)

before通过这种方式,您可以即时传递值yesterday。如果它们是全局环境中的对象,您可以简单地使用calculate(top$ticker, before, yesterday),但它可以让您自由地改变这些参数,而无需在全局环境中重新定义这些名称。

于 2021-01-12T20:47:26.247 回答