如何解决由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 举报,一经查实,本站将立刻删除。