微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

由getSplitsquantmod导入的矩阵根据符号的形状不同

如何解决由getSplitsquantmod导入的矩阵根据符号的形状不同

我正在尝试导入库存数据(拆分),但是我遇到了问题。 如果所有符号都包含拆分,则没有问题。但是,当其中一个没有分裂时,矩阵的形状将以不同的方式出现并且是错误的。

以下是我使用的代码

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包含未拆分的“ 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 / A:

             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 

getDividends

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

Test <-
  lapply(Tick,function(x) {
           try(getDividends(x,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()仅返回NA作为“ A”,而不是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的列表元素,并用日期索引早于1900的xts对象替换NA。该日期将易于在输出中识别。 / p>

然后,像您一样,我们使用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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。