繁体   English   中英

getSplits (quantmod) 导入的矩阵基于符号以不同的方式成形

[英]Matrix imported by getSplits (quantmod) is shaped in different way based on symbols

我正在尝试导入股票数据(拆分),但遇到了问题。 如果所有符号都包含拆分,则没有问题。 然而,当其中一个没有分裂时,矩阵的形状就不同而且是错误的。

以下是我使用的代码:

library(quantmod)

Tick <- c("AA","ARGO")

split_test <- Reduce(merge, lapply(Tick, function(x) {
  tryCatch({
    getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo")
  }, error = function(e) {}
  )
}))

结果很好:

               AA.spl         ARGO.spl
2016-05-27     N/A            0.9091
2016-10-06     3.000            N/A
2016-11-01     0.801            N/A 

问题是,如果 Tick 包含没有 split 的“A”,结果就会大不相同并且是错误的:

Tick <- c("A","AA","ARGO")

     x     AA.spl         ARGO.spl
1    N/A    3.000         0.9091
2    N/A    0.801         0.9091

日期不再显示,并且值也是错误的(重复相同的数字)。 即使股票没有拆分,我如何获得第一个结果? 如果可能,我希望“A”仅显示为 N/As,例如:

             A.spl       AA.spl         ARGO.spl
2016-05-27   N/A          N/A            0.9091
2016-10-06   N/A         3.000            N/A
2016-11-01   N/A         0.801            N/A 

获得红利

Tick <- c("A","AA","AADR","AAN","AAP","AAT")

Test <-
  lapply(Tick,
         function(x) {
           try(getDividends(x, from= "2016-01-04", to="2016-03-15", src="yahoo"),
               silent = TRUE)
         })
names(Test) <- Tick

# convert NA to xts object with date < 1900
Test <-
  lapply(Test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
Test <- Reduce(merge, Test)["1900/"]

getSplits()只为“A”返回NA ,而不是 xts 对象。 并且“A”是您的Tick向量中的第一个,因此不会调用 xts 对象的merge()方法(因为 S3 方法调度的工作方式)。

您可以使用cbind()而不是merge()因为cbind()方法调度工作不同。 但我不建议使用该解决方案,因为您不太可能记住这两个函数之间的细微差别。

相反,我会在合并之前预处理您的拆分列表。

split_test <-
  lapply(Tick,
         function(x) {
           try(getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo"),
               silent = TRUE)
         })
names(split_test) <- Tick

# convert NA to xts object with date < 1900
split_test <-
  lapply(split_test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
split_test <- Reduce(merge, split_test)["1900/"]
# set names
names(split_test) <- Tick

split_test
##               AA  A      ARGO
## 2016-05-27    NA NA 0.9090909
## 2016-10-06 3.000 NA        NA
## 2016-11-01 0.801 NA        NA

对于列表中的元素的代码检查是只NA ,并替换NA与XTS对象,该对象具有日期将是容易在输出以识别1900之前的日期索引。

然后我们像您一样使用Reduce()将所有列表元素合并在一起。 我们将名称设置为您的Tick向量,因此没有任何数据的列具有正确的代码名称。


更新getDividends() ,因为它在没有股息时返回一个零宽度的 xts 对象,而不是像getSplits()那样的 NA 。 我们可以对使用 NA 调整 xts 对象的函数添加另一个检查。

让我们把它移到一个函数中,因为你在不止一个地方需要它。 我们可以在if语句中添加另一个条件。

fill_missing <-
function(x)
{
    y <- x
    if (identical(x, NA) || length(x) < 1) {
        y <- xts(NA, .Date(-4e4))
    }
    y
}

现在在您的lapply()调用中使用此函数并执行相同的Reduce()调用。 然后,如果需要,您可以再次设置名称。

Test <- lapply(Test, fill_missing)
out <- Reduce(merge, Test)["1900/"]
out <- out[,Tick]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM