R getSplits(quantmod)导入的矩阵根据符号以不同的方式成形
我正在尝试导入股票数据(拆分),但我遇到了一个问题。 如果所有符号都包含拆分,则没有问题。但是,当其中一个没有拆分时,矩阵以不同的方式成形,并且是错误的 以下是我使用的代码:R getSplits(quantmod)导入的矩阵根据符号以不同的方式成形,r,quantmod,R,Quantmod,我正在尝试导入股票数据(拆分),但我遇到了一个问题。 如果所有符号都包含拆分,则没有问题。但是,当其中一个没有拆分时,矩阵以不同的方式成形,并且是错误的 以下是我使用的代码: library(quantmod) Tick <- c("AA","ARGO") split_test <- Reduce(merge, lapply(Tick, function(x) { tryCatch({ getSplits(x, from= &q
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) {}
)
}))
问题是,如果勾选中包含没有拆分的“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
分红
勾选getSplits()
只返回“A”的NA
,而不是xts对象。在勾选向量中,“A”是第一个,因此不会调用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
现在在lappy()
调用中使用此函数,并执行相同的Reduce()
调用。然后,如果需要,您可以再次设置名称
Test <- lapply(Test, fill_missing)
out <- Reduce(merge, Test)["1900/"]
out <- out[,Tick]
Test我没有得到与所示相同的输出。我得到的列名为x..I..
,包含所有NA
,其他列的值不重复。真的吗?我只是又累了“不管它值多少钱,我不喜欢这种行为。对我来说,使用“零长度”xts对象更有意义。这是目前不可能的,以前也讨论过,但我还没有时间去做。哇!你救了我。非常感谢你!我试着用你写的代码来获得红利。我认为它应该和getSplits一样,但当我运行测试时,并没有股息的股票并没有显示出来。很抱歉,我的反应太慢了。我不经常检查。看我的编辑。非常感谢!很抱歉,我正在努力使用GetDistributions和getSplits。如您所知,如果某些符号无效,则会发生错误;“句柄已在其他地方使用”。我在gitHub上读了你的帖子“getSymbols.yahoo warnings#307”。你说我们应该让它跳过一个无效的符号,并成功获得下一个有效的符号。很抱歉,我不知道该怎么做。你能给我一些想法吗?
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/"]
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
fill_missing <-
function(x)
{
y <- x
if (identical(x, NA) || length(x) < 1) {
y <- xts(NA, .Date(-4e4))
}
y
}
Test <- lapply(Test, fill_missing)
out <- Reduce(merge, Test)["1900/"]
out <- out[,Tick]