2015-03-14 10 views
11

Ho un file CSV in cui ho 2 prezzi di azioni di chiusura (su base giornaliera)come convertire i frame di dati in serie storica in R

Dates Bajaj_close Hero_close 
3/14/2013 1854.8 1669.1 
3/15/2013 1850.3 1684.45 
3/18/2013 1812.1 1690.5 
3/19/2013 1835.9 1645.6 
3/20/2013 1840 1651.15 
3/21/2013 1755.3 1623.3 
3/22/2013 1820.65 1659.6 
3/25/2013 1802.5 1617.7 
3/26/2013 1801.25 1571.85 
3/28/2013 1799.55 1542 

voglio convertire i dati di cui sopra in formato serie storiche. (Data di inizio è 3/14/2013 e la data finale è 3/13/2015) Ho provato questo, ma la sua dandomi qualche uscita strano

values <- bajaj_hero[, -1] (excluded first column i.e date in real dataset) 
bajaj_hero_timeseries <- ts(values,start=c(2013,1),end=c(2015,3),frequency=365) 

uscita è:

  Bajaj_close Hero_close 
2013.000  1854.80 1669.10 
2013.003  1850.30 1684.45 
2013.005  1812.10 1690.50 
2013.008  1835.90 1645.60 
2013.011  1840.00 1651.15 
2013.014  1755.30 1623.30 
2013.016  1820.65 1659.60 
2013.019  1802.50 1617.70 
2013.022  1801.25 1571.85 

favore aiutatemi .. :)

risposta

8

R ha molteplici modi di represeting serie temporali. Poiché stai lavorando con i prezzi giornalieri delle azioni, potresti considerare che i mercati finanziari sono chiusi nei fine settimana e nei giorni festivi in ​​modo che i giorni di negoziazione e i giorni di calendario non siano gli stessi. Tuttavia, potrebbe essere necessario lavorare con le serie temporali in termini di giorni di negoziazione e giorni di calendario. Ad esempio, i ritorni giornalieri sono calcolati dai prezzi di chiusura giornalieri sequenziali indipendentemente dal fatto che intervenga un fine settimana. Ma potresti anche voler fare rapporti basati sul calendario come riepiloghi settimanali dei prezzi. Per questi motivi il pacchetto xts, un'estensione dello zoo, è comunemente usato con i dati finanziari in R. Un esempio di come potrebbe essere usato con i tuoi dati.

Supponendo che i dati riportati nel tuo esempio è nel DF dataframe

library(xts) 
    stocks <- xts(df[,-1], order.by=as.Date(df[,1], "%m/%d/%Y")) 
# 
# daily returns 
# 
    returns <- diff(stocks, arithmetic=FALSE) - 1 
# 
# weekly open, high, low, close reports 
# 
    to.weekly(stocks$Hero_close, name="Hero") 

che dà l'uscita

  Hero.Open Hero.High Hero.Low Hero.Close 
2013-03-15 1669.1 1684.45 1669.1 1684.45 
2013-03-22 1690.5 1690.50 1623.3 1659.60 
2013-03-28 1617.7 1617.70 1542.0 1542.00 
+0

Grazie a tonnellata :) ha funzionato come un fascino .. – Neil

+0

@ WaltS Non ho avuto modo.weekly (scorte $ Hero_close, name = "Hero ") – Neil

+0

È necessario utilizzare la libreria di istruzioni (xts) affinché funzioni. – WaltS

10

Ingresso. Inizieremo con il testo dell'ingresso mostrato in questione, in quanto la questione non ha fornito l'input CSV:

Lines <- "Dates Bajaj_close Hero_close 
3/14/2013 1854.8 1669.1 
3/15/2013 1850.3 1684.45 
3/18/2013 1812.1 1690.5 
3/19/2013 1835.9 1645.6 
3/20/2013 1840 1651.15 
3/21/2013 1755.3 1623.3 
3/22/2013 1820.65 1659.6 
3/25/2013 1802.5 1617.7 
3/26/2013 1801.25 1571.85 
3/28/2013 1799.55 1542" 

zoo."ts" serie di classe normalmente non rappresentano indici di data, ma siamo in grado di creare una serie zoo che non (vedi zoo package):

library(zoo) 
z <- read.zoo(text = Lines, header = TRUE, format = "%m/%d/%Y") 

In alternativa, se avete già letto questo in un frame di dati DF allora potrebbe essere convertito in zoo come mostrato sulla seconda riga sottostante:

DF <- read.table(text = Lines, header = TRUE) 
z <- read.zoo(DF, format = "%m/%d/%Y") 

In entrambi i casi sopra z ia una serie zoo con un indice temporale "Date" classe. Si potrebbe anche creare la serie zoo, zz, che utilizza 1, 2, 3, ... come indice temporale:

zz <- z 
time(zz) <- 1:nrow(zz) 

ts. Uno di questi potrebbe essere convertito in una serie "ts" classe:

as.ts(z) 
as.ts(zz) 

Il primo ha un indice temporale che è il numero di giorni trascorsi Epoch (1 gennaio 1970) ed avrà AN per giorni mancanti e la il secondo avrà 1, 2, 3, ... come indice temporale e nessun NA.

Serie mensile. In genere le serie "ts" vengono utilizzate per serie mensili, trimestrali o annuali. Così se dovessimo aggregare l'ingresso in mesi potremmo ragionevolmente rappresentare come una serie "ts":

z.m <- as.zooreg(aggregate(z, as.yearmon, mean), freq = 12) 
as.ts(z.m) 
+0

@ G. Grothendieck Grazie per il tuo rpl .. :) proverò la tua soluzione – Neil

1

Con biblioteca fpp, è possibile creare facilmente serie temporali con il formato della data: time_ser=ts(data,frequency=4,start=c(1954,2))

qui iniziamo al 2 ° trimestre del 1954 con trimestre di fequenza.

Problemi correlati