R:index()或index.xts()改变时间序列的日期值,为什么?

Fil*_*eri 3 indexing r date time-series xts

我想从使用getSymbols获得的时间序列中提取日期,但是当我使用index/index.xts函数时,返回的日期似乎是提前一天.我无法理解为什么在以下代码中发生此行为.

但是,预期的行为是获取与原始时间序列中的对象相对应的Date对象列表.

以下是代码,请注意时间序列SPY的最后日期是2012年8月24日,但索引(SPY)调用的最后一个值是2012年8月23日:

getSymbols("SPY")

tail(SPY)

    SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted
2012-08-17   142.23   142.30  141.86    142.18   90813700       142.18
2012-08-20   141.98   142.22  141.59    142.19   78255700       142.19
2012-08-21   142.54   143.09  141.45    141.76  105581100       141.76
2012-08-22   141.40   142.05  141.07    141.82  132999200       141.82
2012-08-23   141.47   141.48  140.44    140.66  111406800       140.66
2012-08-24   140.31   141.83  140.22    141.51   99431500       141.51 

tail(index(SPY))

[1] "2012-08-16" "2012-08-19" "2012-08-20" "2012-08-21" "2012-08-22" "2012-08-23"

tail(index.xts(SPY))

[1] "2012-08-16" "2012-08-19" "2012-08-20" "2012-08-21" "2012-08-22" "2012-08-23"
Run Code Online (Sandbox Code Playgroud)

感谢所有能回复我帖子的人.

有关会话的其他信息

>sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] rbenchmark_0.3.1             fGarch_2110.80.1            
 [3] fBasics_2160.81              MASS_7.3-20                 
 [5] timeSeries_2160.95           timeDate_2160.95            
 [7] tseries_0.10-29              quadprog_1.5-4              
 [9] PerformanceAnalytics_1.0.4.4 quantstrat_0.6.8            
[11] blotter_0.8.10               FinancialInstrument_0.15.2  
[13] quantmod_0.3-17              TTR_0.21-1                  
[15] Defaults_1.1-1               xts_0.8-6                   
[17] zoo_1.7-7                    lubridate_1.1.0             
[19] stringr_0.6.1                plyr_1.7.1                  
[21] XML_3.9-4.1                 

loaded via a namespace (and not attached):
 [1] colorspace_1.1-1   dichromat_1.2-4    digest_0.5.2       ggplot2_0.9.1     
 [5] grid_2.15.1        labeling_0.2       lattice_0.20-6     memoise_0.1       
 [9] munsell_0.3        proto_0.3-9.2      RColorBrewer_1.0-5 reshape2_1.2.1    
[13] scales_0.2.1       stabledist_0.6-4   tools_2.15.1     


> getDefaults(getSymbols)
NULL
> getSymbolLookup("SPY")
NULL
> showSymbols()
 SPY     GSPC      IBM      XLF      XLP      XLE      XLY      XLV      XLI 
 "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo" 
     XLB      XLK      XLU      IEF     AAPL      DIA     MSFT      IWM      EEM 
 "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo" 
     EFA      GLD      AGG      HYG      FXE      FXY      VXX      VXZ      HIG 
 "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo"  "yahoo" 
    VTI      VEU      VNQ      DBC      XAU     gold     Gold STOXX50E     GOLD 
"yahoo"  "yahoo"  "yahoo"  "yahoo"  "oanda"  "oanda"  "oanda"  "yahoo"  "yahoo" 
     VIX  DEXUSEU   EURUSD  DEXKOUS    EUR=X    INR=X 
 "yahoo"   "FRED"  "oanda"   "FRED"  "yahoo"  "yahoo" 
Run Code Online (Sandbox Code Playgroud)

另请注意,我已通过使用命令从Systematic Investor博客,systeinvestor.wordpress.com安装了一些R代码

setInternet2(TRUE)
con = gzcon(url('systematicportfolio.com/sit.gz', 'rb'))
source(con) 
close(con) 
Run Code Online (Sandbox Code Playgroud)

解决方案还有其他问题

GSee用户找到答案(谢谢!)指出在我的会话中我屏蔽了index.xts.因此,解决方案是调用xts ::: index.xts(SPY)而不仅仅是index.xts(SPY)来覆盖屏蔽.实际上是命令

> tail(xts:::index.xts(SPY)) 
Run Code Online (Sandbox Code Playgroud)

返回正确的答案

[1]"2012-08-17""2012-08-20""2012-08-21""2012-08-22""2012-08-23""2012-08-24" -

答案现在又提出了另一个问题:在下面给出了"屏蔽/覆盖"index.xts函数的代码(返回错误的答案,提前一天移动日期):

> index.xts
function (
x           # XTS object
)
{
temp = attr(x, 'index')
class(temp)='POSIXct'   
if( attr(x, '.indexCLASS')[1] == 'Date')
    temp = as.Date(temp)
return(temp)
}
Run Code Online (Sandbox Code Playgroud)

当调用tail(index.xts(SPY))时,为什么这个函数返回错误的结果?这个index.xts函数的代码有什么问题?

比较两个输出(第一个输出错误,第二个提供正确答案):

tail(index.xts(SPY))

[1] "2012-08-16" "2012-08-19" "2012-08-20" "2012-08-21" "2012-08-22" "2012-08-23"

tail(xts:::index.xts(SPY))
[1] "2012-08-17" "2012-08-20" "2012-08-21" "2012-08-22" "2012-08-23" "2012-08-24"
Run Code Online (Sandbox Code Playgroud)

再次感谢您的时间和关注.

GSe*_*See 7

此问题是您运行了一些代码来掩盖xts包中的index.xts方法.在OP的评论中,您告诉我们您运行了此代码

setInternet2(TRUE)
con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb'))
source(con)
close(con)
Run Code Online (Sandbox Code Playgroud)

运行该代码后,index.xts已重新定义(实际上,已屏蔽)

> index.xts
function
(
        x                       # XTS object
)
{
        temp = attr(x, 'index')
        class(temp)='POSIXct' 

        if( attr(x, '.indexCLASS')[1] == 'Date')
                temp = as.Date(temp)
        return(temp)
}
Run Code Online (Sandbox Code Playgroud)

如果将其与xts:::index.xts被屏蔽的函数进行比较,可以看出它是完全不同的.所以,你不能再期待相同的结果了.

如果您从systeportfolio.com/sit.gz下载代码并查看它,您将看到此评论

###############################################################################
# Fast alternative to index(x) for XTS object
# NOTE index.xts is the same name as the index function in the XTS package
###############################################################################
Run Code Online (Sandbox Code Playgroud)

因此,似乎作者故意这样做是为了让它更快.不幸的是,他也使它不那么健壮了.

这段代码实际上给了我相同的结果xts:::index.xts,所以我不能100%肯定你为什么会得到不同的结果.但是,我的猜测是,它具有与改变类做的numericPOSIXct,然后转换回Date

无论如何,我可能会跑

rm(index.xts)
Run Code Online (Sandbox Code Playgroud)

在获取该代码后删除此"增强".

  • +1和为什么_not_做包糟透了的很好的例子.之前我试过告诉"sit.gz"的作者,但似乎没有太大的成功. (4认同)
  • `xts ::: index.xts`解释了时区差异,而"更快"的代码却没有.这就是为什么有些人无法复制这种行为. (2认同)