R:创建一个动态的xts对象列表

4

我试图通过循环遍历一个字符串向量(每个字符串都是一个经济学“标记”),并使用quantmod包中的getSymbols函数为每个字符串创建一个xts对象(每个字符串的长度各不相同)。然后,我想将每个xts对象作为数据框中的一个数据点。我还计划在数据框中添加一些相关数据(例如每个xts对象的最大日期和我在其他地方指定的“标题”等),但这部分内容我可以自己处理。

仅仅尝试创建一个xts对象列表就让我抓狂了。当我尝试像下面这样做时,我总是得到一个字符串列表:

test <- list()

for (i in 1:length(fredTickers))
{# import Data from FRED database
    # this creates a list of strings, I'm hoping for list of xts objects...
    test[i] <- getSymbols(fredTickers[i],src="FRED")
    # xts objects are created for each, but not assigned to the list
}

# this creates an xts object named EVANQ. 
# The test2 object is just a string with value "EVANQ".
test2 <- getSymbols("EVANQ",src="FRED")

处理这些xts对象让我头疼不已。我尝试了很多技巧。

感谢您的帮助。

2个回答

8
文档中多次指出,默认情况下,对象被分配给全局环境,不会显式返回。指定 `auto.assign=FALSE` 来做相反的操作。同时请注意'['和'[['之间的区别。
tickers <- c("F", "YHOO")
test <- list()

for (i in 1:length(tickers)) {
  test[[i]] <- getSymbols(tickers[i], src="yahoo", auto.assign=FALSE, return.class="xts")
}

head(test[[1]])
           F.Open F.High F.Low F.Close F.Volume F.Adjusted
2007-01-03   7.56   7.67  7.44    7.51 78652200       7.18
2007-01-04   7.56   7.72  7.43    7.70 63454900       7.36
2007-01-05   7.72   7.75  7.57    7.62 40562100       7.29
2007-01-08   7.63   7.75  7.62    7.73 48938500       7.39
2007-01-09   7.75   7.86  7.73    7.79 56732200       7.45
2007-01-10   7.79   7.79  7.67    7.73 42397100       7.39

class(test[[1]])
[1] "xts" "zoo"

-1

很遗憾,在 R 中不能使用字符串来表示矩阵。矩阵数据结构是同质的,所以整个数据必须是相同的类。您需要使用数据框架来完成这个任务,并且您很幸运。您可以尝试使用 tidyquant 包来处理多个资产。它不需要使用 for 循环,因此可以节省大量代码。 tq_get() 函数负责获取股票价格。以下是一个快速的股票价格示例。您可以使用 FRED 符号执行相同的操作(请参见下文)。

获取股票价格:

library(tidyquant)

# Get some stock prices for multiple stocks
c("FB", "GOOG", "AMZN", "NFLX") %>%
    tq_get(get = "stock.prices", 
           from = "2013-01-01",
           to   = "2016-12-31")
#> # A tibble: 4,032 × 8
#>    symbol       date  open  high   low close    volume adjusted
#>     <chr>     <date> <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>
#> 1      FB 2013-01-02 27.44 28.18 27.42 28.00  69846400    28.00
#> 2      FB 2013-01-03 27.88 28.47 27.59 27.77  63140600    27.77
#> 3      FB 2013-01-04 28.01 28.93 27.83 28.76  72715400    28.76
#> 4      FB 2013-01-07 28.69 29.79 28.65 29.42  83781800    29.42
#> 5      FB 2013-01-08 29.51 29.60 28.86 29.06  45871300    29.06
#> 6      FB 2013-01-09 29.67 30.60 29.49 30.59 104787700    30.59
#> 7      FB 2013-01-10 30.60 31.45 30.28 31.30  95316400    31.30
#> 8      FB 2013-01-11 31.28 31.96 31.10 31.72  89598000    31.72
#> 9      FB 2013-01-14 32.08 32.21 30.62 30.95  98892800    30.95
#> 10     FB 2013-01-15 30.64 31.71 29.88 30.10 173242600    30.10
#> # ... with 4,022 more rows

获取FRED数据:

library(tidyquant)

# Get some economic data for multiple FRED codes
c("CPIAUCSL", "A191RL1Q225SBEA", "IC4WSA") %>%
    tq_get(get = "economic.data")
#> # A tibble: 691 × 3
#>      symbol       date   price
#>       <chr>     <date>   <dbl>
#> 1  CPIAUCSL 2007-01-01 203.437
#> 2  CPIAUCSL 2007-02-01 204.226
#> 3  CPIAUCSL 2007-03-01 205.288
#> 4  CPIAUCSL 2007-04-01 205.904
#> 5  CPIAUCSL 2007-05-01 206.755
#> 6  CPIAUCSL 2007-06-01 207.234
#> 7  CPIAUCSL 2007-07-01 207.603
#> 8  CPIAUCSL 2007-08-01 207.667
#> 9  CPIAUCSL 2007-09-01 208.547
#> 10 CPIAUCSL 2007-10-01 209.190
#> # ... with 681 more rows

有很多选项可供选择。我把它们称为“获取器”,你可以从大部分quantmod数据源中选择。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接