3 Stimmen

R: index() oder index.xts() ändert die Werte des Datums einer Zeitreihe, warum?

Ich möchte die Daten aus einer Zeitreihe extrahieren, die mit getSymbols erhalten wurde, aber wenn ich die Funktion index / index.xts verwende, scheinen die zurückgegebenen Daten einen Tag früher zu erscheinen. Ich verstehe nicht, warum dieses Verhalten im folgenden Code auftritt.

Die beabsichtigte Verhaltensweise besteht jedoch darin, eine Liste von Date-Objekten zu erhalten, die mit der in der Original-Zeitreihe übereinstimmen.

Hier ist der Code, beachten Sie, dass das letzte Datum der Zeitreihe SPY der 24. August 2012 ist, aber der letzte Wert des index(SPY)-Aufrufs der 23. August 2012 ist:

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"

Vielen Dank an alle, die auf meinen Beitrag geantwortet haben.

Zusätzliche Informationen zur Sitzung

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

lokale Einstellungen:
[1] LC_COLLATE=Englisch_Vereinigte Staaten.1252  LC_CTYPE=Englisch_Vereinigte Staaten.1252   
[3] LC_MONETARY=Englisch_Vereinigte Staaten.1252 LC_NUMERIC=C                          
[5] LC_TIME=Englisch_Vereinigte Staaten.1252    

angehängte Basispakete:
[1] stats     graphics  grDevices utils     datasets  methods   base     

andere angehängte Pakete:
 [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                 

geladen über einen Namensraum (und nicht angehängt):
 [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" 

Beachten Sie auch, dass ich einige R-Code von dem Systematic Investor Blog, systematicinvestor.wordpress.com, installiert habe, indem ich die Befehle verwendet habe

setInternet2(TRUE)
con = gzcon(url('systematicportfolio.com/sit.gz', 'rb'))
source(con) 
close(con) 

LÖSUNG ZUZÜGLICH EINER WEITEREN FRAGE

Der Benutzer GSee hat die Antwort gefunden (Danke!), indem er darauf hinweist, dass in meiner Sitzung index.xts überschrieben wurde. Eine Lösung besteht darin, xts:::index.xts(SPY) aufzurufen, anstatt einfach index.xts(SPY), um die Maskierung zu überschreiben. Tatsächlich ergibt der Befehl

> tail(xts:::index.xts(SPY)) 

die richtige Antwort zurück

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

Die Antwort hat nun eine weitere Frage aufgeworfen: Angesichts des Codes für die "Maskierung/Überschreibung" der Funktion index.xts (die die Daten falsch zurückgibt, indem sie die Daten einen Tag früher verschiebt):

> index.xts
function (
x           # XTS-Objekt
)
{
temp = attr(x, 'index')
class(temp)='POSIXct'   
if( attr(x, '.indexCLASS')[1] == 'Date')
    temp = as.Date(temp)
return(temp)
}

Warum gibt diese Funktion die falschen Ergebnisse zurück, wenn sie als tail(index.xts(SPY)) aufgerufen wird? Was ist falsch an diesem Code der index.xts-Funktion?

Vergleichen Sie die beiden Ausgaben (die erste ist falsch, während die zweite die richtige Antwort liefert):

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"

Nochmals vielen Dank für Ihre Zeit und Aufmerksamkeit.

7voto

GSee Punkte 47100

Dieses Problem besteht darin, dass Sie einige Codes ausgeführt haben, die die index.xts-Methode aus dem Paket xts maskieren. In den Kommentaren zu Ihrem OP haben Sie uns mitgeteilt, dass Sie diesen Code ausgeführt haben

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

Nach Ausführung dieses Codes wurde index.xts neu definiert (eigentlich maskiert) zu

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

        if( attr(x, '.indexCLASS')[1] == 'Date')
                temp = as.Date(temp)
        return(temp)
}

Wenn Sie das mit der xts:::index.xts-Funktion vergleichen, die masziert wird, können Sie sehen, dass sie ziemlich unterschiedlich ist. Daher können Sie nicht mehr die gleichen Ergebnisse erwarten.

Wenn Sie den Code von systematicportfolio.com/sit.gz herunterladen und sich diesen ansehen, werden Sie diesen Kommentar sehen

###############################################################################
# Schnellere Alternative zu index(x) für XTS-Objekt
# HINWEIS: index.xts ist derselbe Name wie die index-Funktion im Paket XTS
###############################################################################

Es scheint also, dass der Autor dies absichtlich gemacht hat, um es schneller zu machen. Leider hat er es dadurch auch weniger robust gemacht.

Dieser Code liefert mir tatsächlich das gleiche Ergebnis wie xts:::index.xts, daher bin ich nicht zu 100% sicher, warum Sie damit unterschiedliche Ergebnisse erhalten. Aber ich vermute, dass es damit zu tun hat, die Klasse von numeric zu POSIXct zu ändern und dann zurück zu Date zu konvertieren

Auf jeden Fall würde ich wahrscheinlich folgendes ausführen

rm(index.xts)

nachdem Sie diesen Code geladen haben, um diese "Verbesserung" zu entfernen.

0voto

Henry Punkte 6623

Es könnte sich lohnen, eine saubere Kopie von R zu öffnen. Ich bekomme (mit R 2.15.0):

> require(quantmod)
> getSymbols("SPY")
[1] "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
> index(tail(SPY))
[1] "2012-08-17" "2012-08-20" "2012-08-21" "2012-08-22" "2012-08-23" "2012-08-24"
> tail(index(SPY))
[1] "2012-08-17" "2012-08-20" "2012-08-21" "2012-08-22" "2012-08-23" "2012-08-24"
> tail(index.xts(SPY))
Fehler in tail(index.xts(SPY)) : konnte Funktion "index.xts" nicht finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X