2017-05-14 19 views
0

Ich habe ein Panel Daten von täglichen Aktienrückgaben. Für jede Aktie, ich brauche seine Verbindung Monatsrendite berechnen (etwa 30 Tage):Stata tägliche Rendite auf monatliche Zusammensetzung

(1+r_1)*(1+r_2)*...*(1+r_30) - 1 

Auf Kennung ist permno, dm ist Jahr und Monat Anzeige. Ich verwende den folgenden Stata-Code:

gen gross_ret = 1+ret 
bys permno dm: gen prod = sum(ln(gross_ret)) 
by permno dm: replace prod = exp(prod[_N]) 
gen mret = prod - 1 

ich zufällig permno dm Kombinationen wählen die Ergebnisse zu überprüfen, und sie scheinen richtig zu sein. Allerdings sehe ich extreme Werte wie mret = 26. Ich vermute der Grund ist, dass einige ist in der Nähe von 0, so ln(gross_ret) ist sehr hoch. Dann überprüfe ich anhand der monatlichen CRSP-Rückgabedaten, dass ich 99% der Unterschiede zwischen der Compounding-Rendite (berechnet nach dem obigen Code) und der monatlichen CRSP-Rendite kleiner als 0,0007 feststelle, was akzeptabel ist. Aber der größte absolute Unterschied ist 3,24, was zu groß ist und mein Endergebnis beeinflussen könnte (ich habe zwei Tage lang Probleme mit der Fehlersuche gemacht, und dies könnte meine letzte Rettung sein).

Ist meine Art der monatlichen Berechnung falsch? Wenn ja, schlagen Sie bitte einen besseren Weg vor.

+1

Ich würde 'double' Variablen überall verwenden. Ihre Methode verwendet standardmäßig Float-Variablen. –

+0

Wir brauchen keine Kommentare wie "Danke im Voraus". Danke, aber guter Wille wird standardmäßig von allen Seiten angenommen. Gute Threads sind nur technisch informativ: Wir brauchen diese Art von Kommentar nicht. –

Antwort

1

Vielleicht können Sie eine bessere Genauigkeit erzielen, indem Sie die Logarithmen vermeiden, zusammen mit Double für Zwischenergebnisse, wie Nick empfiehlt.

bys permno dm: gen double prod = (1+ret) if _n==1 
by permno dm: replace prod = (1+ret)*prod[_n-1] if _n>1 
by permno dm: gen mret = prod[_N] - 1 

das gesagt ist, wenn Sie einen Tagesdatum Variable (entweder Jahr-Monat-Tag oder Tag), können Sie es in der Art enthalten könnte, so werden Ihre Daten in der gewünschten Reihenfolge sie nach diesem Prozess erwarten .

bys permno dm (day): gen double prod = (1+ret) if _n==1 
by permno dm: replace prod = (1+ret)*prod[_n-1] if _n>1 
by permno dm: gen mret = prod[_N] - 1