Problem mit 0ern und leeren Werten im Datensatz

Fragen zu Stata Syntax und Do-Files.

Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Akq22 » Sa 13. Feb 2021, 11:31


Hallo zusammen

Ich habe ein Problem bei meinen Codes im Stata. Mein Datensatz sieht wie folgt aus (sample):
Date THENATIVE ABBLTDN ACCUHOLDING
04.01.1993 KEINWERT -0.0056 KEINWERT
05.01.1993 KEINWERT 0.0056 KEINWERT
06.01.1993 KEINWERT 0 KEINWERT
07.01.1993 KEINWERT -0.0167 KEINWERT
....
26.01.1993 KEINWERT 0 0.02
...
29.01.1993 KEINWERT 0 0

Man sieht, die Aktien sind entweder illiquide oder die 1. Firma war zu diesem Zeitpunkt noch nicht gelistet und hat somit keinen Wert. Ich möchte in meinem Datensatz schauen, ob der Januar stärker/schwächer ist als die anderen Monate. Ich haben einen Datensatz über 20 Jahre von über 300 Firmen. Wenn ich jetzt mein Sample von oben berechne sieht das so aus: Ich rechne zuerst für jeden Tag 1+ Rendite. Somit hätte ich beispielsweise für ABBLTDN am 04.01.1993 -0.0056 + 1 = 0.9944. Danach rechne ich für jede Firma die täglichen Rendite (1+R) auf einen Monat hoch. Für das verwende ich folgende Formel: 1+r_t1 * 1+r_t2.....1+r_tn
Im Januar ist der letzte Tag im Jahre 1993 der 29. Januar also wäre n 29. Dies rechne ich für jede Firma und danach nehme ich den Mittelwert aller Firmen für z.B. 1993m1.
Ich hoffe, ich konnte das einigermassen verständlich erklären. Nun das Problem: Wenn ich 1+ rechne, dann nimmt dort wo kein Wert ist, dies ebenfalls den Wert 1 an. Wenn ich danach den Mittelwert rechne, verfälscht mir dies, dass Resultat komplett. Als konkretes Beispiel für den Januar 1993 mit den 3 Firmen oben:
Ich erhalte 1 für THENATIVE als Rendite für 1993m1, 1.00001 für ABBLTDN für 1993m1 und 1.02 für ACCUHOLDING 1.02. Der Mittelwert daraus ergibt 1.00667.
Der korrekte Mittelwert wäre jedoch meiner Meinung nach 1.010, also die beiden Mittelwerte für ABBLTDN und ACCUHOLDING. THENATIVE war nicht gelistet, sollte also nicht in die Berechnungen einfliessen solange kein Wert dort ist.

Ich habe dies versucht zu eliminieren mit folgendem Code:
Code: Alles auswählen
gen adjret1 = adjret if adjret != . & adjret != 0

Jedoch bleibt das Resultat dasselbe.
Kann mir jemand weiterhelfen? Ich kann natürlich meine anderen Codes auch noch zeigen. Ich glaube der richtige Ansatz wäre wenn ich nach dem ich alles gerechnet habe, die einzelnen Resultate -1 rechne und danach sage Stata soll alle 0er raushauen. Und danach den Mittelwert. Bin mir jedoch nicht sicher ob und wie das geht.


UPDATE: Ich glaube ich habe das Problem zum Teil gelöst. Ich muss einfach bevor ich den collapse (mean) command mache, die Renditen -1 rechnen und dann noch alle 0er droppen!
Code: Alles auswählen
gen monatsrendite = monthlyreturn - 1
drop if monatsrendite == 0
collapse (mean) monatsrendite, by(month1)

Das einzige Problem ist, hier lösche ich wohl auch 0er von Aktien welche illiquide sind und nicht nur keine Werte haben. Ich sollte also beim drop if command noch eine folgende If-Funktion einfügen: Stata soll nur 0er droppen, bei welchen im Vormonat ebenfalls ein 0 ist!
Das heisst Februar 1993 von einer Firma darf nur gedroppt werden, wenn der Februar 1993 UND auch der Januar 1993 von dieser Firma 0 ist. Kennt da jemand den Command?
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Staxa » Sa 13. Feb 2021, 12:44

Warum bleibt das Ergebnis gleich? Kann es sein, dass du hier einen Tippfehler hast oder eine falsche Bezeichnung? Ich würde dir raten deine Berechnung an einem konkreten Beispiel wie hier gezeigt durchzugehen und jeden Zwischenschritt im Datenbrowser zu kontrollieren. Dann siehst du ja welche Werte dort stehen. Ich denke, dadurch solltest du erkennen ob deine Strategie funktioniert und ggf. deine Ausschlussbedingung anpassen.

EDIT: In Bezug auf deine zweite Frage kannst du hier die Datenstruktur auszunutzen, also etwa: gen x = 1 if t == 0 & t[_n-1] == 1. Also hier wird dann in x nur der Wert 1 geschrieben wenn der Wert t gleich 0 ist und der Wert von t in der vorhergehenden Zeile ebenfalls 0 ist. Damit kannst du dann deine Bedingung konstruieren.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 685
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Akq22 » Sa 13. Feb 2021, 18:36

Ich weiss leider nicht warum das Ergebnis gleich bleibt, ich dachte es würde so klappen. Ich habs kontrolliert, sobald ich dann 1+ rechne gibt es mir einfach überall den Wert 1, auch wenn kein Wert drinnen ist. Deshalb klappt es erst, wenn ich -1 rechne und erst dann den Mean rechne.

Danke für die Antwort auf die zweite Frage:
Momentan habe ich diesen code:
Code: Alles auswählen
bys Firm (month): gen returns = sum(monatsrendite)

drop if returns == 0

Grundsätzlich klappt das, jedoch ist das sum das Problem; Es summiert mir meine Means, also das Resultat welches ich bekomme sieht so aus:
1993m1 return_m1
1993m2 return_m1+return_m2
1993m3 return_m1+return_m2+return_m3

Ich möchte aber:
1993m1 return_m1
1993m2 return_m2
usw.

Ich könnte es lösen indem ich einfach noch eine Variable generiere in der ich die Rendite des vorrangigen Monates abziehe. Jedoch würde ich es gerne schon im oben genannten Code schaffen, was mir aber nicht gelingt und ich nicht weiss wie ich sum anders verwenden kann.
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Staxa » Sa 13. Feb 2021, 19:08

Kannst du mal ein paar Datenzeilen posten wo man es an einer Firma mal nachvollziehen kann numerisch?
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 685
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Akq22 » Sa 13. Feb 2021, 21:27

Klar:
1993m1 0.0100027
1993m2 0.0685691
1993m3 0.079862
1993m4 0.093442
1993m5 0.110926
1993m6 0.12334

Erhalte ich jetzt. Ich sollte aber folgendes erhalten:

1993m1 0.0100027
1993m2 0.058566
1993m3 0.008479
1993m4 0.017284
1993m5 0.015248

Wie du siehst, ist oben die Rendite vom Januar 1993 auch im Februar 1993 drinnen und nicht nur der Februar 1993 alleine.
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Staxa » So 14. Feb 2021, 11:20

Bitte auch die Variablen mit posten die in die Berechnung eingehen, damit man sieht wie die Werte berechnet werden. So sehe ich ja nicht auf welchen Werten diese Ergebnisse basieren.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 685
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Akq22 » So 14. Feb 2021, 12:20

Datum: FIRMA1 FIRMA2 FIRMA 3
January 4, 1993 #WERT! -0.0056 #WERT!
January 5, 1993 #WERT! 0.0056 #WERT!
January 6, 1993 #WERT! 0 #WERT!
January 7, 1993 #WERT! -0.0167 #WERT!
January 8, 1993 #WERT! -0.0085 #WERT!
January 11, 1993 #WERT! -0.0143 #WERT!
January 12, 1993 #WERT! 0.0145 #WERT!
January 13, 1993 #WERT! -0.0057 #WERT!
January 14, 1993 #WERT! 0.0316 #WERT!
January 15, 1993 #WERT! 0.0028 #WERT!
January 18, 1993 #WERT! 0.0167 #WERT!
January 19, 1993 #WERT! 0.0137 #WERT!
January 20, 1993 #WERT! -0.0081 #WERT!
January 21, 1993 #WERT! 0.0027 #WERT!
January 22, 1993 #WERT! 0.0054 #WERT!
January 25, 1993 #WERT! -0.0081 #WERT!
January 26, 1993 #WERT! 0 0.02
January 27, 1993 #WERT! -0.0136 0
January 28, 1993 #WERT! -0.011 0
January 29, 1993 #WERT! 0 0
February 1, 1993 #WERT! 0.0028 0
February 2, 1993 #WERT! 0.0056 0
February 3, 1993 #WERT! 0.0193 0
February 4, 1993 #WERT! 0.0163 0
February 5, 1993 #WERT! 0.024 0
February 8, 1993 #WERT! 0.0234 0
February 9, 1993 #WERT! -0.0127 0
February 10, 1993 #WERT! -0.0077 0
February 11, 1993 #WERT! 0.0078 0
February 12, 1993 #WERT! 0.0129 0
February 15, 1993 #WERT! 0.0076 0
February 16, 1993 #WERT! -0.0076 0
February 17, 1993 #WERT! -0.0127 0
February 18, 1993 #WERT! 0.0129 0
February 19, 1993 #WERT! 0.0025 0
February 22, 1993 #WERT! -0.0076 0
February 23, 1993 #WERT! -0.0102 0
February 24, 1993 #WERT! 0.0103 0
February 25, 1993 #WERT! 0.0026 0
February 26, 1993 #WERT! 0.023 0

Das wäre ein Sample der Raw Data. Dann folgen meine Codes.
Code: Alles auswählen
bys Firm (month1): gen returns = sum(monatsrendite)
drop if returns == 0
collapse (mean) returns, by(month1)


Mit diesem Code schliesse ich dann ab und erhalte jedoch die Summe der Monate wie oben erklärte und nicht jeden Monat einzeln. Klar ist dass ich ja mit dem code sum(Monatsrendite) dies summiere. Jedoch weiss ich nicht wie ich sonst den Code schreiben soll, damit ich am Ende den richtigen Mean erhalte. So ist der Mittelwert ja korrekt, jedoch summiert.
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Staxa » So 14. Feb 2021, 12:58

Damit wir das in Stata nachvollziehen können brauchen wir die Daten im Stata lesbaren Format, zudem ist ja da ein Fehler enthalten, wegen #WERT oder? Das ist aus Excel kopiert? Mit Dataex kannst du das auch direkt posten:

https://www.stata.com/help.cgi?dataex

Code: Alles auswählen
ssc install dataex
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 685
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Akq22 » So 14. Feb 2021, 13:06

Entschuldige bitte. Ich habe jetzt dem gefolgt und dies daraus erhalten. Der #WERT! ist kein Fehler, dort war das Unternehmen einfach noch nicht gelistet. Dies ergibt dann im Stata ein "." ---> 0-Wert wäre ja falsch, da 0 für eine Rendite von 0 steht und . fliesst dann nirgends in die Berechnungen.

- -----------------------
Code: Alles auswählen
* Example generated by -dataex-. To install: ssc install dataex
clear
input int date double(THENATIVE ABBLTDN ACCUHOLDING)
12057 . -.005600000000000001     .
12058 .  .005600000000000001     .
12059 .                    0     .
12060 .               -.0167     .
12061 .               -.0085     .
12064 .               -.0143     .
12065 .  .014499999999999999     .
12066 . -.005699999999999999     .
12067 .                .0316     .
12068 . .0028000000000000004     .
12071 .                .0167     .
12072 .                .0137     .
12073 . -.008100000000000001     .
12074 .                .0027     .
12075 .                .0054     .
12078 . -.008100000000000001     .
12079 .                    0   .02
12080 . -.013600000000000001     0
12081 . -.011000000000000001     0
12082 .                    0     0
12085 . .0028000000000000004     0
12086 .  .005600000000000001     0
12087 .  .019299999999999998     0
12088 .                .0163     0
12089 .                 .024     0
12092 .  .023399999999999997     0
12093 .               -.0127     0
12094 .               -.0077     0
12095 . .0078000000000000005     0
12096 .                .0129     0
12099 .                .0076     0
12100 .               -.0076     0
12101 .               -.0127     0
12102 .                .0129     0
12103 .                .0025     0
12106 .               -.0076     0
12107 .               -.0102     0
12108 .                .0103     0
12109 .                .0026     0
12110 .                 .023     0
12113 .                 .005     0
12114 .                    0     0
12115 .                 .005     0
12116 .               -.0148     0
12117 .               -.0125     0
12120 .                .0152     0
12121 .                .0075     0
12122 .                .0025     0
12123 .                .0074     0
12124 .               -.0123     0
12127 .                 .005     0
12128 .               -.0124     0
12129 .                -.005     0
12130 .                .0151     0
12131 .                    0     0
12134 .               -.0124     0
12135 .                    0     0
12136 .                -.005     0
12137 .               -.0101     0
12138 .  .015300000000000001     0
12141 .                .0025     0
12142 .  .020099999999999996     0
12143 .                .0074     0
12144 .               -.0073     0
12145 .               -.0074     0
12148 .                .0025     0
12149 .                .0049     0
12150 .                .0049     0
12151 .               -.0024     0
12152 .                    0     0
12155 .                    0     0
12156 .               -.0025     0
12157 .                    0     0
12158 .                .0025     0
12159 .                .0025 .0196
12162 .                    0     0
12163 .                .0196     0
12164 .                .0096     0
12165 .                .0095     0
12166 . -.004699999999999999     0
12169 .               -.0118     0
12170 .               -.0191     0
12171 .                .0098     0
12172 . -.014499999999999999     0
12173 .                .0123     0
12176 .                .0048     0
12177 .               -.0072     0
12178 .                .0024     0
12179 .  .014499999999999999     0
12180 .                .0048     0
12183 .  .011899999999999999     0
12184 .                .0023     0
12185 . -.015600000000000001     0
12186 .               -.0158     0
12187 .               -.0025     0
12190 .                .0025     0
12191 .               -.0049     0
12192 .               -.0025     0
12193 .                    0     0
12194 .  .011200000000000002     0
end
format %td date

------------------
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Problem mit 0ern und leeren Werten im Datensatz

Beitragvon Staxa » So 14. Feb 2021, 13:53

Ohne deinen Code kann ich deine Rechnungen an sich nicht nachvollziehen, aber ich denke es ist letztlich so, dass du an einer gewissen Stelle hier explizit auf den Vormonat prüfen musst. Also hast du bereits auf eine Monatsbasis heruntergerechnet, dann sortiere zuerst nach Monaten und dann erstelle eine neue Variable, etwa so:

Code: Alles auswählen
sort month:
gen neu = old if old != 0 & old[_n-1] != 0


So werden nur die Werte übernommen die keinen Wert 0 haben und auch im Vormonat der Wert nicht 0 ist. Mit dieser neuen Variable kannst du dann weiterrechnen. Falls das nicht klappt musst du deinen ganzen Code posten. Nachvollziehen kann ich das bisher nicht, weil deine Codebeispiele mit deinem Datenauszug nicht klappen, hier fehlen ja irgendwo Zwischenschritte.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 685
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Nächste

Zurück zu Stata Syntax

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron