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()
只是 returns NA
表示“A”,不是 xts 对象。并且“A”在您的 Tick
向量中位于第一个,因此不会调用 xts 对象的 merge()
方法(因为 S3 方法调度的工作方式)。
您可以使用 cbind()
而不是 merge()
,因为 cbind()
的方法调度工作方式不同。但我不会建议该解决方案,因为您不太可能记得这两个函数之间的细微差别。
相反,我会pre-process你合并前的拆分列表。
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
替换为日期索引早于 1900 的 xts 对象。该日期在输出中很容易识别.
然后我们像您一样使用 Reduce()
将所有列表元素合并在一起。我们将名称设置为您的 Tick
向量,因此没有任何数据的列具有正确的代码名称。
更新 getDividends()
,因为它 returns 一个 zero-width 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]
我正在尝试导入股票数据(拆分),但遇到了问题。 如果所有符号都包含拆分,则没有问题。然而,当其中之一没有分裂时,矩阵的形状不同且错误。
以下是我使用的代码:
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()
只是 returns NA
表示“A”,不是 xts 对象。并且“A”在您的 Tick
向量中位于第一个,因此不会调用 xts 对象的 merge()
方法(因为 S3 方法调度的工作方式)。
您可以使用 cbind()
而不是 merge()
,因为 cbind()
的方法调度工作方式不同。但我不会建议该解决方案,因为您不太可能记得这两个函数之间的细微差别。
相反,我会pre-process你合并前的拆分列表。
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
替换为日期索引早于 1900 的 xts 对象。该日期在输出中很容易识别.
然后我们像您一样使用 Reduce()
将所有列表元素合并在一起。我们将名称设置为您的 Tick
向量,因此没有任何数据的列具有正确的代码名称。
更新 getDividends()
,因为它 returns 一个 zero-width 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]