Multiplizieren und zusammenfügen von Variabeln

Fragen zu Stata Syntax und Do-Files.

Multiplizieren und zusammenfügen von Variabeln

Beitragvon Akq22 » Fr 27. Nov 2020, 12:42

Hallo zusammen

Ich habe ein paar Schwierigkeiten mit Stata und hoffe das mir jemand hier helfen kann. Mein Datensatz sieht momentan so aus:
Code: Alles auswählen
* Example generated by -dataex-. To install: ssc install dataex
clear
date str26 Firm double return float(adjret adjretadd1)
12058 "ABBLTDN" -.005597377634159429 -.005597378 .9944026
12059 "ABBLTDN" .0028647961300604825 .002864796 1.0028648
12061 "ABBLTDN" -.022515258379255495 -.02251526 .9774848
12064 "ABBLTDN" -.00855961789510194 .034238473 1.0342385
end
format %td date

Ich habe ca. 300 Firmen und für diese tägliche Returns vom 1993-2018 (also über 1.3 mio values). Die letzte Spalte (adjretadd1) ist der "veränderte" Return mit meinen Portfolios und zudem +1 um diese multiplizieren zu können. Nun meine Frage: Ich müsste nun die täglichen Returns multiplizieren um Monatsreturns zu erhalten. Konkretes Beispiel: Ich muss den adjretadd1 für 04. Januar 1993, 05. Januar 1993...29. Januar 1993 multiplizieren und das Resultat daraus wäre dann Monthly return. Was ich bisher habe:

Code: Alles auswählen
gen month = mofd(date)
format month %tm

Mit diesem habe ich geschafft, dass ich eine Variable month habe welche für jeden Tag im Januar erkennt, dass dies zum Jahr und Monat gehört. Also steht z.B. in der Spalte vom 04. Januar 1993 dann in der Variable month 1993m1 und dies für alle Monate und alle Jahre und alle Firmen.
Code: Alles auswählen
collapse (sum) return, by(Firm month)

Mit diesem command wäre das Ziel erreicht, jedoch summiert dieser nur, ich müsste aber multiplizieren.

Kann mir jemand weiterhelfen? Ich wäre um jede Hilfe sehr dankbar! Falls ich etwas unklar formuliert habe, oder ihr mehr Data example braucht, würde ich dies natürlich sofort liefern. :)
Gruss
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Staxa » Fr 27. Nov 2020, 13:37

Der folgende Code dient als Beispiel und sollte dein Problem lösen. Wenn du ihn Zeile für Zeile ausführt und im Editor die Ergebnisse nachvollziehst sollte er selbsterklärend sein.


Code: Alles auswählen
clear
input date str26 Firm double return float(adjret adjretadd1)
12058 "ABBLTDN" -.005597377634159429 -.005597378 .9944026
12059 "ABBLTDN" .0028647961300604825 .002864796 1.0028648
12061 "ABBLTDN" -.022515258379255495 -.02251526 .9774848
12064 "ABBLTDN" -.00855961789510194 .034238473 1.0342385
12058 "Test" -.005597377634159429 -.005597378 .9944026
12059 "Test" .0028647961300604825 .002864796 1.0028648
12061 "Test" -.022515258379255495 -.02251526 .9774848
12064 "Test" -.00855961789510194 .034238473 1.0342385
end

replace adjretadd1 = adjretadd1 + 5 if Firm == "Test"   //andere Werte zur Testung
bysort Firm (date): gen id = _n
gen product = adjretadd1 if id == 1
bysort Firm: replace product = product[_n-1] * adjretadd1 if id > 1
bysort Firm: egen maxid = max(id)
gen temp = product if id == maxid
bysort Firm: egen finalproduct = max(temp)
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 679
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Akq22 » Sa 28. Nov 2020, 12:24

Besten Dank für deine Antwort!

Ich habe es mal versucht auszuführen, jedoch verstehe ich die commands nicht und es hat nicht funktioniert (da ich wohl beim ersten command mit "Firm" falsch lag). Vor allem beim ersten weiss ich nicht, aus welchem Grund der adjretadd1 noch +5 hinzugefügt wird. Und nach dem == "Test" habe ich die Variable Firm hinzugefügt, jedoch denke ich das dies wohl falsch ist.

Kannst du mir weiterhelfen?
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Akq22 » Sa 28. Nov 2020, 17:54

Hallo

Kurzes Update, mit Hilfe deiner codes bin ich auf diesen gekommen.
Code: Alles auswählen
egen double monthlyadjretadd1 = total(ln(adjretadd1)), by(Firm month)
replace monthlyadjretadd1 = exp(monthlyadjretadd1)


So hat es grundsätzlich geklappt! Ich habe jetzt folgende Data:

Code: Alles auswählen
* Example generated by -dataex-. To install: ssc install dataex
clear
input int date str26 Firm float(adjretadd1 month) double monthlyadjretadd1
12057 "ABBLTDN"         . 396 1.0218864531608671
12058 "ABBLTDN"  .9944026 396 1.0218864531608671
12059 "ABBLTDN" 1.0028648 396 1.0218864531608671
12060 "ABBLTDN"         1 396 1.0218864531608671
12068 "ABBLTDN" 1.0365549 396 1.0218864531608671
12071 "ABBLTDN"         1 396 1.0218864531608671
12072 "ABBLTDN" 1.0082304 396 1.0218864531608671
12088 "ABBLTDN" 1.0217228 397  .8722264944420984
12089 "ABBLTDN"  1.021261 397  .8722264944420984
12092 "ABBLTDN"  .9171871 397  .8722264944420984
12093 "ABBLTDN" 1.0026442 397  .8722264944420984
12094 "ABBLTDN"  .9948201 397  .8722264944420984
12095 "ABBLTDN"  .9922377 397  .8722264944420984
12096 "ABBLTDN" 1.0129422 397  .8722264944420984
12099 "ABBLTDN"  .9593349 397  .8722264944420984
12100 "ABBLTDN" 1.0126483 397  .8722264944420984
12120 "ABBLTDN" 1.0302672 398 1.0677724925927128
12121 "ABBLTDN" 1.0225308 398 1.0677724925927128
12122 "ABBLTDN"  .9951111 398 1.0677724925927128
12123 "ABBLTDN"  .9949751 398 1.0677724925927128
12124 "ABBLTDN"  1.027166 398 1.0677724925927128
12142 "ABBLTDN" 1.0150008 398 1.0677724925927128
12143 "ABBLTDN" 1.0171849 398 1.0677724925927128
12144 "ABBLTDN"  .9975943 399 1.0847430849749902
12145 "ABBLTDN"  .9926378 399 1.0847430849749902
12148 "ABBLTDN" 1.0394572 399 1.084430849749902
12169 "ABBLTDN" 1.0470569 399 1.0847430849749902
12170 "ABBLTDN"   .995191 399 1.0847430849749902
12171 "ABBLTDN"  .9879296 399 1.0847430849749902
12172 "ABBLTDN"  .9952179 399 1.0847430849749902
12173 "ABBLTDN"  .9901466 399 1.0847430849749902
12176 "ABBLTDN"  .9510109 400  .8519972246549241
12177 "ABBLTDN" 1.0072554 400  .8519972246549241
12178 "ABBLTDN"  .9927446 400  .8519972246549241
12179 "ABBLTDN" 1.0048789 400  .8519972246549241
end
format %td date
format %tm month


Also sollte es geklappt haben Ich habe für jede Firma die monatlichen Returns. Jetzt wäre meine Frage: Gibt es commands, damit ich die monatlichen Firmen returns (monthlyadjretadd1) untereinander (von allen 300 Firmen die monatlichen) multiplizieren kann damit ich dann einen return (nennen wir ihn SPI) als gesamten habe.
Also das Schlussresultat sollte so aussehen:
SPI 1993m1 return
SPI 1993m2 return
SPI 1993m2 return
....
SPI 2017m12 return
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Staxa » Sa 28. Nov 2020, 22:28

Tatsächlich ist deine Lösung deutlich kompakter und eleganter, man muss eben nur seine Logarithmen Rechenregeln kennen ;) Der andere Code ist dafür allgemeiner, also kann auf ähnliche Probleme angewandt werden, wenn diese Rechentricks nicht klappen. Dennoch wäre es wissenswert, warum der Code bei dir nicht läuft bzw. welche Fehlermeldung du siehst. Die Zahl habe ich nur für die Anschauung angepasst, so wird es einfacher zu erkennen, wie das Produkt zeilenweise erzeugt wird, bei Zahlen zwischen 0 und 1 ist das nicht so offensichtlich.

Um deine zweite Frage zu lösen kannst du deinen bisherigen Code einfach auf dein bisheriges Ergebnis erneut anwenden. Dazu wählst du jeweils ein Unternehmen aus, was mit egen tag klappt.

Code: Alles auswählen
preserve
egen tagger = tag(Firm month)
keep if tagger == 1
egen double totalret = total(ln(monthlyadjretadd1)), by(month)
replace totalret = exp(totalret)
egen monthtag = tag(month)
keep if monthtag == 1
sort month
list month totalret
restore


So ungefähr könnte ich mir das vorstellen.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 679
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Akq22 » So 29. Nov 2020, 10:51

Hallo

Danke vielmal für deine Antwort. Dein Code hat soweit nicht geklappt, als das ich nicht den ersten command nicht wirklich verstanden habe, dann statt "Test" "Firm" genommen habe und dann die codes ausgeführt. Es hat mir dann nie eine Fehlermeldung angezeigt, jedoch wurde auch nichts berechnet, da ich deine commands wohl einfach falsch ausgeführt habe (vor allem den ersten).

Ich habe jetzt mal versucht deine codes für die Zusammenrechnung zu brauchen. Grundsätzlich klappen diese super. Ich habe ein problem, bei dem ich ein bisschen ausholen muss, damit Du es verstehen kannst;
Ich habe in der raw data die täglichen returns aller Firmen welche im SPI gelistet waren von 1993 - 2017. Dann habe ich mein (neutrales) portfolio gebildet: ich habe für jeden Montag return *(-4) gerechnet und für jeden anderen Wochentag *1. Somit hatte ich dann den adjret.
Um von täglichen auf einen monatlichen return (r_m) zu kommen, habe ich folgende Formel verwendet:
r_m = (1+r_d1) + (1+r_d2) ... (1+r_d31)
Also habe ich bei meiner adjret variable überall ein +1 hinzugefügt, was mir die variable adjretadd1 ergab.
Als ich dann für diese Berechnung meinen ersten code von hier verwendet habe;
Code: Alles auswählen
egen double monthlyadjretadd1 = total(ln(adjretadd1)), by(Firm month)
replace monthlyadjretadd1 = exp(monthlyadjretadd1)

Hat dies geklappt und die Zahlen waren korrekt: Also für den Januar für die Firma ABB z.B. habe ich die 20 Observationen von Hand ausgerechnet und die ergab mir einen return von 1.021 welchen mir auch der obere Code gab. Dies wären 2.1% und machen Sinn. Also stimmt das.

Wenn ich jetzt jedoch die monatlichen returns von allen firmen nochmal addieren will, mit deinem code oder mit meinem (welchen ich hier dann gleich zeige) ergibt es mir extrem komische Resultate. Zum Beispiel habe ich irgendwo ein Resultat von 8.99 was dann 899% wären. Oder sogar 215 was dann 215'000% oder so wären.

Ich denke das Problem ist folgendes: Ich habe in meiner raw Data alle Firmen von 1993 - 2017, auch wenn einige davon nicht die ganze Zeitperiode gelistet waren. Also habe ich viel ein - oder ein 0 drinnen. Dies hat bisher keinen Einfluss auf die Resultate gehabt. Auch den monthly return hat es nicht beeinflusst, da trotz des +1 zuvor, der return dort halt dann 1 war. Wenn ich etwas mit 1 multipliziere macht das ja nichts aus. Bei der Zusammenfügung aller Returns ist es jetzt jedoch ein Problem!
Kannst du mir weiterhelfen?

Ich habe es mit diesem code versucht:
Code: Alles auswählen
egen double monthadjretadd1 = total(ln(adjretadd1)), by(month)
replace monthadjretadd1 = exp(monthadjretadd1)
collapse (first) monthadjretadd1, by(month)
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Staxa » So 29. Nov 2020, 11:41

Ich bin in den Finanzwissenschaften nicht bewandert und kann daher nicht einschätzen, ob dein allgemeines Vorgehen sinnvoll oder usus ist. Da die Zahlen offenbar viel zu groß sind vermute ich, dass du Unternehmen doppelt zählst. Also du erzeugst ja erst den Monatsanteil für jedes Unternehmen, was offenbar noch korrekt ist. Wenn du dann diese Anteile wiederum aufsummierst musst du aufpassen, dass jetzt ja jede Firma in jedem Monat nur genau 1x gezählt wird. Hast du mal deine Fallzahlen kontrolliert, die in die Berechnung eingehen? Deshalb eben immer die Zeile egen tagger, hier wird dann für jedes Unternehmen (zufällig) eine Zeile ausgewählt. Welche, ist egal, da ja die interessierende Variable in jeder Zeile des Unternehmens in dem Monat identisch ist.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 679
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Akq22 » So 29. Nov 2020, 22:12

Das mit dem Tagger kannte ich nicht, dies hilft sehr, danke!

Ich habs jetzt mal von Anfang (also seit meinem ersten Post hier) an so probiert:
egen double monthlyadjretadd1 = total(ln(adjretadd1)), by(Firm month)
replace monthlyadjretadd1 = exp(monthlyadjretadd1)

egen tagger = tag(Firm month)
keep if tagger == 1
egen double totalret = total(ln(monthlyadjretadd1)), by(month)
replace totalret = exp(totalret)
egen monthtag = tag(month)
keep if monthtag == 1
sort month
list month totalret


Das Problem ist einfach das meine monthlyadjretadd1 für einzelne firmen völlig sinn ergeben. Ich bekomme dort für z.B. ABBLTD 1993m1 den Wert 1.0021, was 0.21% wären.
Für einzelne gibts schon auch höhere Returns, also z.b. 2.21 was dann 121% wären, was hoch ist aber auch sein kann.

Nach den Codes oben bekomme ich folgendes Resultat:
Code: Alles auswählen
* Example generated by -dataex-. To install: ssc install dataex
clear
input float month double totalret
396     .10114320664244662
397   .0004201661708152645
398      .5478615910340938
399       22.3943967557019
400      .8948313062069889
401      .3680321035137766
402     1.8529718265904782
403      6.346764601903226
404     .15624331046780252
405     3.7555772708778226
406  .00004122114655155676
407    .019166179639563814
408  2.157278477053193e-06
409      263.2760504951288
410    .000326648209541546
411      .1751228835703448
412     .11137300528171522
413      4706.713296898954
414      3.773822571642554
415     .12823524235339048
416     .14203969595212534
417  .00020836780656481525
418   .0028759331156870895
419     .10637132009012486
420      .0871986847448602
421     3.6189647928919086
422    .006639793927555816
423      7.283499613230393
424      4.398044015991017
425     21.419516335948373
426    .005376394717669129
427     .17447489041814368
428     13.407198463797885
429     .11165347926407576
430      .3691294866631343
431      .3913834973992847
432     .46605186997511877
433      222.9754695340725
434     186.03393214602116
435    .017003256634055795
436  .00007637800387477911
437     2.2651076127031247
438     .02498890090211867
439     .18650816317200875
440   .0005904107735424653
441    .011228312216591842
442   .0025695318037246757
443  4.608787227715367e-06
444     .08745948950653196
445    .021064113544357537
446    .001446267814881715
447     .20675922748720502
448  .00007827882345611097
449    .004217942694981422
450      568.6808903416703
451      3002293030.545479
452  .00007308618702075924
453    .003877510342621931
454  .00006126041015079522
455    .008739166206920747
456      1807.349148158397
457 .000060186957345566275
458   8.92182461229354e-11
459   .0009337394277812499
460  .00024913340775609794
461   .0030487161820319138
462  .00004776873362619783
463  7.200289090617586e-14
464  5.320094736196835e-13
465     10.210032933183406
466  4.594895749919212e-13
467 .000020326145184216362
468  3.005760956975641e-07
469 5.7721313225962955e-08
470 1.6043509398346034e-06
471      58.73373207137271
472    .005216039828563768
473    .041694670143279655
474   .0002033052341047757
475 2.4459618542180867e-06
476 1.8914076656589852e-06
477     61.395768271217555
478     .11150673580686067
479 .000011102247752434616
480 1.4833075548793292e-13
481     14.416902134351993
482      .7515086988225493
483      401797.1854845513
484     .06094952699274703
485  1.659721208275765e-06
486 2.1449841290807692e-07
487 .000057739381980346344
488 3.8803662473776904e-07
489  1.992842266639736e-09
490 2.9192980327750585e-07
491  3.167767310779837e-12
492     .22866654907154677
493    .009125511006211846
494 1.2154769014652006e-09
495    .014502157931110345
end
format %tm month

Wie zu sehen ist, macht das kaum Sinn. 0.0004 wären z.b. -40000% oder 222 wären 222000%.
Ich sehe nicht, wo ich den Fehler mache
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Akq22 » Mo 30. Nov 2020, 11:23

Hallo,

Kurzes Update:
Ich muss natürlich, wenn ich die monatlichen Returns pro Firma habe, diese dann mit dem mean rechnen und sicher nicht diese nochmal multiplizieren! Das war ein Fehler meinerseits!
egen double monthlyadjretadd1 = total(ln(adjretadd1)), by(Firm month)
replace monthlyadjretadd1 = exp(monthlyadjretadd1)


Kann ich dann nach diesem Command einen mean nehmen der mir dies dann monatlich zeigt? Weisst du da etwas?
Akq22
 
Beiträge: 22
Registriert: Fr 27. Nov 2020, 12:28
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Multiplizieren und zusammenfügen von Variabeln

Beitragvon Staxa » Mo 30. Nov 2020, 18:00

Ja sicher, egen ist hier flexibel (siehe help egen), also dann etwa egen test = mean(VAR). Kommt drauf an den mean von was, hier musst du dann eben mit bysort arbeiten um nach Firmen bzw. Monaten einzugrenzen.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 679
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 0 Gäste

cron