Seite 1 von 4

Aktienschätzung

Verfasst: So Aug 12, 2018 10:05 pm
von StatistikMensch
Hallo zusammen,
ich habe eine Programmierfrage für eine Betaschätzung, vielleicht kann mir ja jemand hier helfen :)
Ich habe monatliche Aktiendaten (im Trainingsbeispiel etwa 1000 Beobachtungen), bestehend aus der Aktien-Id, dem Datum bzw. Monatsnummer, der Marktrendite und der Aktienrendite. Dabei möchte ich gerne das Beta schätzen (Regression der Aktienrendite - risikoloser Zins auf Marktrendite).
Die Betaschätzung soll dabei mindestens 36 Monate umfassen, da rollierend. Wie kriege ich es hin, dass mir R automatisch nur die Aktien anzeigt, bei die jeweils mindenstens 36 Mal mit der jeweiligen Aktien-Id gelistet werden? Darüber hinaus würde ich eine Schleife machen um das Beta zu schätzen. Hier meine Frage, wie kriege ich es hin, dass R durch alle Aktien-Ids geht und dann jeweils immer bei der ersten Beobachtung der jeweiligen Aktien-Id anfängt für die jeweilige Aktie das Beta zu schätzen und bei der nächste Aktie wieder von vorne anfängt?
Über Ratschläge wäre ich sehr dankbar!

Re: Aktienschätzung

Verfasst: So Aug 12, 2018 11:58 pm
von EDi
Über Ratschläge wäre ich sehr dankbar!
Was hast du denn schon gemacht und probiert? Reproduzierbares Beispiel!

Hört sich nach rollapply() an... Irgendwie sowas (ohne reproduzierbares Beispiel muss du das selbst anpassen):

Code: Alles auswählen

rollapply(df, width = 36,
  FUN = function(z) coef(lm(y ~ t, data = z))[2])

Re: Aktienschätzung

Verfasst: Mo Aug 13, 2018 1:09 am
von StatistikMensch
Hey, danke erstmal für die schnelle Antwort.
ich habe probiert mit

Code: Alles auswählen

count(Aktiensub, Aktiensub$stock_nr)
die Summen der jeweiligen Aktien aufzusummieren, allerdings komme ich mit dem resultierenden Vektor dann nicht viel weiter, weil er mir weder hilft die Daten rauszunehmen, noch kann ich damit sinnvoll eine Schleife durchführen.
Ich habe bereits für einzelne Aktien das Beta anhand der Zeitreihe mit folgenden Code geschätzt:

Code: Alles auswählen

Beta36<-c(1:(nrow(Aktiesubset)-36))
for(i in 1:(nrow(Aktiesubset)-36)){
for(j in 36:nrow(Aktiesubset)){
Beta36[i]<-lm(Aktie$ret_monthly[i:j] ~ Aktie$mktrf[i:j])$coefficients[2]
     }
  }
Beta36

Re: Aktienschätzung

Verfasst: Di Aug 14, 2018 4:14 pm
von StatistikMensch
Für diesen Datensatz habe ich bereits eine Lösung gefunden.
Mit

Code: Alles auswählen

Test<-subset(Aktiensub, !(Aktiensub$stock_nr %in% c(2,7,9)))
konnte ich bereits manuell für diesen kleinen Datensatz die Aktien für in diesem Falle kleiner als 60 Beobachtungen entfernen.
Allerdings ist dies auch nur ein kleiner Testdatensatz. Für meinen großen Datensatz (etwa 200000 Beobachtungen) ist das mit dem manuell entfernen keine so gute Idee. Irgendeine Idee wie ich eine Schleife, die automatisch alle Aktien kleiner 60 Beobachtungen aus dem Datensatz entfernt in den subset()-Befehl integrieren kann?
Für den kleinen Dattensatz habe ich das mit folgender Schleife gemacht, die hier jedoch nicht mehr funtioniert:

Code: Alles auswählen

 Aktiencount<-count(Aktiensub, Aktiensub$stock_nr)
b<-c()
for(i in 1:nrow(Aktiencount)){
  if (Aktiencount[i,2] < 60){
    b<-c(b,Aktiencount[i,1])}
}
b 

Re: Aktienschätzung

Verfasst: Di Aug 14, 2018 4:19 pm
von bigben
StatistikMensch hat geschrieben: Di Aug 14, 2018 4:14 pmFür diesen Datensatz habe ich bereits eine Lösung gefunden.
Diesen Datensatz habe ich gar nicht auf meinem Rechner gefunden. Wie EDi schon schrieb, wäre ein mcve gut: https://stackoverflow.com/help/mcve

LG,
Bernhard

Re: Aktienschätzung

Verfasst: Di Aug 14, 2018 4:26 pm
von jogo
Hallo StatistikMensch,

mit data.table könnte das etwa so aussehen:

Code: Alles auswählen

library("data.table")
setDT(Aktiensub)
Aktiensub[, if (.N >= 60) .SD, stock_nr]
Hier ist noch eine Umsetzung in base R:

Code: Alles auswählen

n <- tapply(Aktiensub$stock_nr, Aktiensub$stock_nr, length)
Aktiensub[Aktiensub$stock_nr %in% names(n[n>=60]), ]
oder mit subset()

Code: Alles auswählen

subset(Aktiensub, stock_nr %in% names(n[n>=60])
Gruß, Jörg

Re: Aktienschätzung

Verfasst: Mi Aug 15, 2018 10:07 am
von StatistikMensch
Vielen Dank Jörg, hat sehr gut geklappt!
Nun noch einmal detailierter zu meiner zweiten Frage mit der rollierenden Schätzung des Betas. Mit Hilfe des o.g Codes

Code: Alles auswählen

Beta36<-c(1:(nrow(Aktiesubset)-36))
for(i in 1:(nrow(Aktiesubset)-36)){
  for(j in 36:nrow(Aktiesubset)){
    Beta36[i]<-lm(Aktie$ret_monthly[i:j] ~ Aktie$mktrf[i:j])$coefficients[2]
  }
}
Beta36
konnte ich bereits für eine Aktie das Beta schätzen. (ob nun Beta36 oder Beta60 sollte keinen Unterschied machen)
Entsprechend versuche ich mit einer Schleife, die durch die jeweiligen Aktiennummern zu gehen. Dabei sollte es dann am Ende so aussehen, dass jeweils die ersten 36 bzw. 60 Einträge für das Beta einer jeweiligen Aktie NAs sind, da es dazu entsprechend keine Beobachtung gibt. Jemand eine Idee welche Funktion man nutzen kann, bzw. wie man das entsprchend mit der rollapply-Funktion spezifiziert?

Re: Aktienschätzung

Verfasst: Mi Aug 15, 2018 10:25 am
von jogo
Hallo StatistikMensch,

ich habe bei dem Code in Verbindung mit dem erklärten Anliegen Verständnisprobleme.
Nehmen wir mal an, Aktiesubset hätte 40 Zeilen. Dann würden die for-Schleifen so aus sehen:

Code: Alles auswählen

for (i in 1:4) {
  for (j in 36:40) {
    ...
  }
}
Für jede Kombination von i und j wird dann bei ... der Wert Beta36[ i] neu berechnet und überschrieben.
Als Ergebnis bleibt dann in Beta36[ i] nur der Wert, den es bekommt beim letzten Wert von j (j=40).
Ich glaub nicht, dass dies das Ergebnis ist, was Du haben wolltest. :shock:
So, jetzt zu rollapply():
Ich sehe noch nicht wie rollapply() mit seinem festen Fenster zu dem Code oben passt, denn die Indexbereiche haben für verschiedene Werte von i und j verschiedene Länge; Möglichkeiten für i:j hier:
1:36, 1:37, ..., 1:40
2:36, ...
3:36, ...
4:36, ...

Wenn es ein festes Fenster von Beobachtungen sein soll, hätte ich mir das so (oder so ähnlich) vorgestellt:

Code: Alles auswählen

I36 <- 1:36
Beta36i <- function(i) lm(ret_monthly ~ mktrf, data=Aktie[i+I36,])$coefficients[2]
Beta36 <- sapply(0:(nrow(Aktiesubset)-36), Beta36i)
Gruß, Jörg

Re: Aktienschätzung

Verfasst: Mi Aug 15, 2018 10:34 am
von StatistikMensch
Hallo Jörg,
ich habe mir zunächst ein Teildatensatz erstellt (3070 Beobachtungen mit 24 verschiedenen Aktien)
Als ich die o.g. Schleife für eine Aktie durchlaufen lassen habe, habe ich einen Vektor der Länge n-36 bzw- n-60 erhalten und diesen dann mit cbind(AlterDatensatz, Beta60) ergänzt.
Entsprechend sollte ich am Ende der Schleife für die Beta60 Schätzung 24*60 = 1440 NAs erhalten.
Die Schleife müsste also durch die stock_nrs gehens (for i in 1:nrow(stock_nr)) und jedes Mal bei einem Wechsel der Stock_nr erkennen, dass es sich um eine neue Aktie handelt und entsprechend nicht die 60 vorhergehenden Werte der alten Aktie (Aktie mit vorhergehender Stock_nr) mit in die Schätzung einbeziehen, also dass sich die Schätzung für Beta[Aktie10] nur den Beobachtungen von Aktie10 bedient und die ersten 60 Beobachtungen leer lässt.

Re: Aktienschätzung

Verfasst: Mi Aug 15, 2018 10:45 am
von jogo
Hallo StatistikMensch,

ohne Daten (siehe: viewtopic.php?f=20&t=11 oder https://stackoverflow.com/questions/596 ... le-example ) kann ich mir das nicht vorstellen.

Gruß, Jörg