Aktienschätzung
Moderator: EDi
Aktienschätzung
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!
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
Was hast du denn schon gemacht und probiert? Reproduzierbares Beispiel!Über Ratschläge wäre ich sehr dankbar!
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
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Aktienschätzung
Hey, danke erstmal für die schnelle Antwort.
ich habe probiert mit 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:
ich habe probiert mit
Code: Alles auswählen
count(Aktiensub, Aktiensub$stock_nr)
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
Für diesen Datensatz habe ich bereits eine Lösung gefunden.
Mit 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:
Mit
Code: Alles auswählen
Test<-subset(Aktiensub, !(Aktiensub$stock_nr %in% c(2,7,9)))
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
Diesen Datensatz habe ich gar nicht auf meinem Rechner gefunden. Wie EDi schon schrieb, wäre ein mcve gut: https://stackoverflow.com/help/mcveStatistikMensch hat geschrieben: ↑Di Aug 14, 2018 4:14 pmFür diesen Datensatz habe ich bereits eine Lösung gefunden.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Aktienschätzung
Hallo StatistikMensch,
mit data.table könnte das etwa so aussehen:
Hier ist noch eine Umsetzung in base R:
oder mit subset()
Gruß, Jörg
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]
Code: Alles auswählen
n <- tapply(Aktiensub$stock_nr, Aktiensub$stock_nr, length)
Aktiensub[Aktiensub$stock_nr %in% names(n[n>=60]), ]
Code: Alles auswählen
subset(Aktiensub, stock_nr %in% names(n[n>=60])
Re: Aktienschätzung
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
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?
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
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
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:
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.
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:
Gruß, Jörg
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) {
...
}
}
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.
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)
Re: Aktienschätzung
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.
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
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
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