QUANTMOD 包 getSymbols(yahoo 和 alpha vantage)returns 周末数据
QUANTMOD package getSymbols (yahoo and alpha vantage) returns data for weekends
我有一个与 getSymbols (quantmod) giving wrong dates 类似的问题,但添加 TZ 无法解决。我的设置是:
R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] quantmod_0.4-13 TTR_0.23-2 xts_0.10-1 zoo_1.8-0
我的时区:
Sys.timezone()
> [1] "Australia/Sydney"
> Data <- getSymbols('BHP.AX',src="yahoo",auto.assign=FALSE, from = '2017-
10-10')
> weekdays(head(index(Data),20))
[1] "Monday" "Tuesday" "Wednesday" "Thursday" "Sunday" "Monday"
"Tuesday" "Wednesday" "Thursday" "Sunday" "Monday" "Tuesday"
"Wednesday" "Thursday" "Sunday"
[16] "Monday" "Tuesday" "Wednesday" "Thursday" "Sunday"
如您所见,数据 returns 个星期日。我还看到类似的 returns 使用 Alpha Vantage 选项 - 返回数据的尾部经常省略星期五。任何避免这种情况的提示都将不胜感激!
我不确定原因,如果不仔细检查来源,我就会猜测。而且我猜想因为澳大利亚的星期一(股票交易的地方,.AX
)通常对应于北美的星期日,加上或减去几个小时,具体取决于时区,所以数据是使用北美记录的日期。
即使我在进行数据调用之前将时区设置为美国东部标准时间,我也会返回周日到周四的日期。
Sys.timezone()
#[1] "America/New_York"
unique(weekdays(index(Data)))
# [1] "Monday" "Tuesday" "Wednesday" "Thursday" "Sunday"
但是这里有一个解决你的问题的方法:
library(lubridate)
index(Data) <- index(Data) + days(1)
unique(weekdays(index(Data)))
# [1] "Tuesday" "Wednesday" "Thursday" "Friday" "Monday"
或者不使用 lubridate
,如果您确定您的时间索引是类型 "Date" 而不是 "POSIXct",这也有效(加 1 会增加日期):
index(Data) <- index(Data) + 1
以上显示没有返回周六或周日日期,这与预期一致(股票不在周末交易)。
增加一天会产生合理的结果。查看调整后的最近日期:
tail(Data)
BHP.AX.Open BHP.AX.High BHP.AX.Low BHP.AX.Close BHP.AX.Volume BHP.AX.Adjusted
2017-12-29 29.65 29.760 29.51 29.57 4428226 29.57
2018-01-02 29.57 29.750 29.50 29.68 3252955 29.68
2018-01-03 30.24 30.350 30.17 30.18 6788783 30.18
2018-01-04 30.42 30.605 30.30 30.33 5501131 30.33
2018-01-05 30.65 30.690 30.51 30.58 5835685 30.58
2018-01-08 30.55 30.660 30.44 30.55 3274512 30.55
> unique(weekdays(index(Data)))
2017-12-29 是星期五。 2018-01-01 是 public 假期,2018-01-02 是星期二。
好的 - 感谢 FXQ 指出 tz 问题,并得到快速答复。我已经考虑并尝试使用这种丑陋的解决方法将日期解析为盎司时间。首先,将 XTS 移动到 data.table,然后:
#### re-allign to AUS dates
happyDays <- function(x) {
# find range of dates
mini <- min(x$index)
maxi <- max(x$index)+3
aus <- paste(seq.Date(mini, maxi,1), "14:55") #13:40
pb.date1 <- as.POSIXct(aus, tz="Australia/Sydney")
AUS_index <- pb.date1#[!weekdays(pb.date1) %in% c("Saturday","Sunday")]
tradeDaysUS <- format(AUS_index, tz="America/Chicago",usetz=TRUE)
US_date <- as.Date(tradeDaysUS)
dt <- data.table(AUS_index, US_date= as.Date(US_date))
#dt[,.N,by=US_date][N>1]
x$original_index <- x$index
x <- merge(x, dt, by.x="index", by.y="US_date", all.x=TRUE)
x$AUS_date <- as.Date(x$AUS_index)
x$index <- x$AUS_date
x[,weekdays:=weekdays(AUS_index)]
x
}
hilo <- happyDays(hilo)
我忍不住认为我把这个复杂化了 - 必须有一种更简单的方法来在周一至周五的一周内获取 getSymbols 的输出。我猜到了时区和时间 - 并根据原始雅虎数据检查了输出。 very.ugly。
我有一个与 getSymbols (quantmod) giving wrong dates 类似的问题,但添加 TZ 无法解决。我的设置是:
R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] quantmod_0.4-13 TTR_0.23-2 xts_0.10-1 zoo_1.8-0
我的时区:
Sys.timezone()
> [1] "Australia/Sydney"
> Data <- getSymbols('BHP.AX',src="yahoo",auto.assign=FALSE, from = '2017-
10-10')
> weekdays(head(index(Data),20))
[1] "Monday" "Tuesday" "Wednesday" "Thursday" "Sunday" "Monday"
"Tuesday" "Wednesday" "Thursday" "Sunday" "Monday" "Tuesday"
"Wednesday" "Thursday" "Sunday"
[16] "Monday" "Tuesday" "Wednesday" "Thursday" "Sunday"
如您所见,数据 returns 个星期日。我还看到类似的 returns 使用 Alpha Vantage 选项 - 返回数据的尾部经常省略星期五。任何避免这种情况的提示都将不胜感激!
我不确定原因,如果不仔细检查来源,我就会猜测。而且我猜想因为澳大利亚的星期一(股票交易的地方,.AX
)通常对应于北美的星期日,加上或减去几个小时,具体取决于时区,所以数据是使用北美记录的日期。
即使我在进行数据调用之前将时区设置为美国东部标准时间,我也会返回周日到周四的日期。
Sys.timezone()
#[1] "America/New_York"
unique(weekdays(index(Data)))
# [1] "Monday" "Tuesday" "Wednesday" "Thursday" "Sunday"
但是这里有一个解决你的问题的方法:
library(lubridate)
index(Data) <- index(Data) + days(1)
unique(weekdays(index(Data)))
# [1] "Tuesday" "Wednesday" "Thursday" "Friday" "Monday"
或者不使用 lubridate
,如果您确定您的时间索引是类型 "Date" 而不是 "POSIXct",这也有效(加 1 会增加日期):
index(Data) <- index(Data) + 1
以上显示没有返回周六或周日日期,这与预期一致(股票不在周末交易)。
增加一天会产生合理的结果。查看调整后的最近日期:
tail(Data)
BHP.AX.Open BHP.AX.High BHP.AX.Low BHP.AX.Close BHP.AX.Volume BHP.AX.Adjusted
2017-12-29 29.65 29.760 29.51 29.57 4428226 29.57
2018-01-02 29.57 29.750 29.50 29.68 3252955 29.68
2018-01-03 30.24 30.350 30.17 30.18 6788783 30.18
2018-01-04 30.42 30.605 30.30 30.33 5501131 30.33
2018-01-05 30.65 30.690 30.51 30.58 5835685 30.58
2018-01-08 30.55 30.660 30.44 30.55 3274512 30.55
> unique(weekdays(index(Data)))
2017-12-29 是星期五。 2018-01-01 是 public 假期,2018-01-02 是星期二。
好的 - 感谢 FXQ 指出 tz 问题,并得到快速答复。我已经考虑并尝试使用这种丑陋的解决方法将日期解析为盎司时间。首先,将 XTS 移动到 data.table,然后:
#### re-allign to AUS dates
happyDays <- function(x) {
# find range of dates
mini <- min(x$index)
maxi <- max(x$index)+3
aus <- paste(seq.Date(mini, maxi,1), "14:55") #13:40
pb.date1 <- as.POSIXct(aus, tz="Australia/Sydney")
AUS_index <- pb.date1#[!weekdays(pb.date1) %in% c("Saturday","Sunday")]
tradeDaysUS <- format(AUS_index, tz="America/Chicago",usetz=TRUE)
US_date <- as.Date(tradeDaysUS)
dt <- data.table(AUS_index, US_date= as.Date(US_date))
#dt[,.N,by=US_date][N>1]
x$original_index <- x$index
x <- merge(x, dt, by.x="index", by.y="US_date", all.x=TRUE)
x$AUS_date <- as.Date(x$AUS_index)
x$index <- x$AUS_date
x[,weekdays:=weekdays(AUS_index)]
x
}
hilo <- happyDays(hilo)
我忍不住认为我把这个复杂化了 - 必须有一种更简单的方法来在周一至周五的一周内获取 getSymbols 的输出。我猜到了时区和时间 - 并根据原始雅虎数据检查了输出。 very.ugly。