首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QUANTMOD包getSymbols (雅虎和阿尔法优势)返回周末的数据

QUANTMOD包getSymbols (雅虎和阿尔法优势)返回周末的数据
EN

Stack Overflow用户
提问于 2018-01-08 18:14:41
回答 2查看 436关注 0票数 1

我有一个与getSymbols (quantmod) giving wrong dates类似的问题,不能通过添加TZ来解决。我的设置是:

代码语言:javascript
运行
复制
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      

我的时区:

代码语言:javascript
运行
复制
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"   

如您所见,数据返回Sundays。我也看到过使用Alpha Vantage选项的类似返回--返回数据的尾部通常会省略星期五。任何避免这种情况的技巧都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-08 19:11:19

我不确定原因,在没有仔细检查来源的情况下我会猜测。我猜,因为在澳大利亚(股票交易地,.AX)的星期一通常对应于北美的星期天,根据时区的不同,加减几个小时,数据是使用北美日期记录的。

我还得到,即使我在进行数据调用之前将我的时区设置为美国东部夏令时,也会返回从Sun到星期四的日期。

代码语言:javascript
运行
复制
Sys.timezone()
#[1] "America/New_York"



unique(weekdays(index(Data)))
# [1] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Sunday" 

但是这里有一个你的问题的解决方案:

代码语言:javascript
运行
复制
library(lubridate)
index(Data) <- index(Data) + days(1)

unique(weekdays(index(Data)))
# [1] "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"   

或者在不使用lubridate的情况下,如果您确定时间索引的类型是"Date“而不是"POSIXct",这也是可行的(加1会递增日期):

代码语言:javascript
运行
复制
index(Data) <- index(Data) + 1

上面的代码显示没有像预期的那样返回周六或周日的日期(股票不会在周末交易)。

增加一天会给出合理的结果。查看调整后的最新日期:

代码语言:javascript
运行
复制
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是公众假期,2018-01-02是星期二。

票数 1
EN

Stack Overflow用户

发布于 2018-01-09 15:45:01

好的-感谢FXQ指出了tz的问题,并迅速做出了回答。我已经使用这个丑陋的变通方法,在将日期解析为oz时间方面进行了思考和尝试。首先,将XTS移动到data.table中,然后:

代码语言:javascript
运行
复制
 #### 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的输出。我猜测了时区和时间-并将输出与原始的yahoo数据进行了对比。very.ugly。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48148184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档