Aktienschätzung

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

StatistikMensch

Aktienschätzung

Beitrag 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!
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Aktienschätzung

Beitrag 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])
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
StatistikMensch

Re: Aktienschätzung

Beitrag 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
StatistikMensch

Re: Aktienschätzung

Beitrag 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 
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Aktienschätzung

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag 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
StatistikMensch

Re: Aktienschätzung

Beitrag 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?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag 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
StatistikMensch

Re: Aktienschätzung

Beitrag 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.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag 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
Antworten