2016-06-24 18 views
0

Ich versuche, 15-Monats-Aktienrenditen für eine Reihe von US-Unternehmen zu berechnen. Ich habe immer SAS dafür verwendet, aber meine SAS-Lizenz ist abgelaufen.mit R data.table, um kumulative Aktienrenditenwerte über einen Zeitraum von 15 Monaten zu suchen

Die Daten sieht wie folgt aus, wo ich 1 zu den Monatsrenditen hinzugefügt

Return Daten (crsp.msf), die Quelldaten:

permno date  ret 
10002 1994-01-31 1.039 
10002 1994-02-28 0.991 
10002 1994-03-31 1.005 
10002 1994-04-29 0.943 
10002 1994-05-31 1.060 
10002 1994-06-30 1.061 
10002 1994-07-29 0.946 
10002 1994-08-31 1.009 
10002 1994-09-30 0.977 
10002 1994-10-31 1.000 
10002 1994-11-30 0.962 
10002 1994-12-30 1.056 
10002 1995-01-31 1.000 
10002 1995-02-28 1.000 
10002 1995-03-31 0.978 
10002 1995-04-28 1.020 
10002 1995-05-31 1.038 
10002 1995-06-30 0.969 
10002 1995-07-31 1.000 
10002 1995-08-31 1.000 
10002 1995-09-29 1.122 
10002 1995-10-31 0.862 
10002 1995-11-30 1.070 
10002 1995-12-29 1.053 

Für diese Firma 10002, für jeden Monat, ich mag die Rendite über 15 Monate finden, wie in der Liste angegeben (elist) unter:

permno,begdat,enddat 
10002,1994-03-31,1995-06-30 
10002,1994-06-30,1995-09-30 
10002,1994-09-30,1995-12-31 
10002,1994-12-31,1996-03-31 
10002,1995-03-31,1996-06-30 
10002,1995-06-30,1996-09-30 
10002,1995-09-30,1996-12-31 
10002,1995-12-31,1997-03-31 

ich habe eine lange Liste von Unternehmen, so ‚elist‘ 40000 Zeilen.

Jede Hilfe wäre großartig.

Antwort

0

Wenn Sie es mit data.table tun möchten.

dt[date %between% c("1994-03-31","1995-06-30")] 

Ergebnis.

permno  date ret 
1: 10002 1994-03-31 1.005 
2: 10002 1994-04-29 0.943 
3: 10002 1994-05-31 1.060 
4: 10002 1994-06-30 1.061 
5: 10002 1994-07-29 0.946 
6: 10002 1994-08-31 1.009 
7: 10002 1994-09-30 0.977 
8: 10002 1994-10-31 1.000 
9: 10002 1994-11-30 0.962 
10: 10002 1994-12-30 1.056 
11: 10002 1995-01-31 1.000 
12: 10002 1995-02-28 1.000 
13: 10002 1995-03-31 0.978 
14: 10002 1995-04-28 1.020 
15: 10002 1995-05-31 1.038 
16: 10002 1995-06-30 0.969 

Wenn Sie dies für die gesamte Elist tun möchten, können Sie Folgendes tun. Lesen Sie zuerst Ihre Daten mit read.table.

elist <- read.table(text=" 
permno,begdat,enddat 
10002,1994-03-31,1995-06-30 
10002,1994-06-30,1995-09-30 
10002,1994-09-30,1995-12-31 
10002,1994-12-31,1996-03-31 
10002,1995-03-31,1996-06-30 
10002,1995-06-30,1996-09-30 
10002,1995-09-30,1996-12-31 
10002,1995-12-31,1997-03-31", header=T, sep = ",", fill=TRUE,stringsAsFactors=FALSE) 

Dann verwenden Sie eine einfache for loop.

res <- NULL 
for (i in 1:NROW(elist)){ 
    res <- rbind(res, dt[date %between% c(elist[i,2],elist[i,3])]) 
} 
2

Ihre Daten Gesetzt ist bereits in Datentabellen, die Sie foverlaps Funktion für diese verwenden:

# create a begindate ('bdat') and enddate ('edat') from the 'date' column 
crsp.mrf[, `:=` (bdat = as.Date(date), edat = as.Date(date))][, date := NULL] 
# convert the date columns in 'elist to Date format (only if they aren't already) 
elist[, `:=` (begdat = as.Date(begdat), enddat = as.Date(enddat))] 

# set the keys 
setkey(crsp.mrf, permno, bdat, edat) 
setkey(elist, permno, begdat, enddat) 

# see which dates fall in the specified date-windows from 'elist' and calculate the sum for each window 
foverlaps(crsp.mrf, elist, type = "within", nomatch=0L)[, .(sum.ret = sum(ret)), by = .(permno, begdat, enddat)] 

die gibt:

permno  begdat  enddat sum.ret 
1: 10002 1994-03-31 1995-06-30 16.024 
2: 10002 1994-06-30 1995-09-30 16.138 
3: 10002 1994-09-30 1995-12-31 16.107 
4: 10002 1994-12-31 1996-03-31 12.112 
5: 10002 1995-03-31 1996-06-30 10.112 
6: 10002 1995-06-30 1996-09-30 7.076 
7: 10002 1995-09-30 1996-12-31 2.985 
+0

Ich mochte Ihre Antwort hier, Sie sind wirklich gut im Text Mining !!!!!! oder String-Verwaltung – nik

0

Dank Helfer! Die MySql-Lösung für die Fragen wäre: create table return1 as select a.*, b.ret, b.date from elist as a, crsp.msf as b where a.permno = b.permno and (b.date > a.begdat and b.date <= a.enddat)

Allerdings dauerte dies 2 Stunden (!), Um das gewünschte Ergebnis zu produzieren.

data.table

Zuerst verwenden, definieren, eine Funktion, wo ricrsp.msf ist, und row die Zeilennummer in elist:

cumret <- function(ri,row){ 
    r<-ri[permno==elist[row,permno],] 
    r<-r[date>elist[row,begdat] & date<=elist[row,enddat],.(ret)] 
    r<-r[,.(prod(ret,na.rm = FALSE)-1)] 
    return(r) 
} 

Hinweis, dass ich zwei Schritte verwenden, um die relevanten zurückzuholen Beobachtungen von ri. Ich könnte es in einem Schritt tun, aber das dauert zu viel Zeit. Die vorletzte Zeile der Funktion berechnet die kumulativen Erträge.

Zweitens fügen Sie eine returns Spalte elist:

elist[, return := NA_real_]

Schließlich Schleife durch elist:

for (row in 1:elist[,.N]){ elist[row,return:=cumret(ri,row)] }

Diese ca. 2 Minuten für 40k von Beobachtungen nahm.