Aktienschätzung

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag von jogo »

Hallo StatistikMensch,

da der Code so funktioniert für einen Monat, muss man ihn jetzt nur noch verallgemeinern, indem man ihn in eine Funktion packt.
Ich habe mal an der data.table-Version weitergebastelt:

Code: Alles auswählen

library("data.table")
A <- fread("http://forum.r-statistik.de/download/file.php?id=306")
BetasDT <- function(Aktie) {
  n <- 60
  Fenster <- 1:n
  Betai <- function(i) lm(Aktienrendite ~ Marktrendite, data=Aktie[i+Fenster,])$coefficients[2]
  c(rep(NA, n-1), sapply(0:(nrow(Aktie)-n), Betai))
}
A[, Beta:=BetasDT(.SD), AktienNummer]
A[AktienNummer==1] ## Kontrolle

A <- na.omit(A)

myDelta <- function(S) {
  Q <- S[, ntile(Beta, 2)]
  S[Q==1, mean(Aktienrendite)] - S[Q==2, mean(Aktienrendite)]  ## a100 - b100
}
A[, myDelta(.SD), Monats_id]
Hier noch mit der Anzahl der Beobachtungen pro Monats_id, womit auch die NaNs eine Erklärung finden.

Code: Alles auswählen

A[, .(t100=myDelta(.SD), .N), Monats_id]
Die Funktion ntile() ist aus dem Paket dplyr. Bei Bedarf kann die Funktion quantile() Ersatz schaffen.
... oder man kupfert den Quelltext von ntile()
... oder man bastelt sich etwas mit frank()

Gruß, Jörg
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag von jogo »

jogo hat geschrieben: Di Aug 28, 2018 9:40 am Die Funktion ntile() ist aus dem Paket dplyr. Bei Bedarf kann die Funktion quantile() Ersatz schaffen.
... oder man kupfert den Quelltext von ntile()
... oder man bastelt sich etwas mit frank()
Hier eine Variante:

Code: Alles auswählen

fntile <- function (x, n) {
  len <- sum(!is.na(x))
  if (len == 0L) rep(NA_integer_, length(x)) 
  else as.integer(floor(n * (frank(x) - 1)/len + 1)) 
}
Gruß, Jörg
StatistikMensch

Re: Aktienschätzung

Beitrag von StatistikMensch »

Hallo Jörg,
vielen Lieben Dank, das hat mir doch mal wieder gut weitergeholfen :)
Habe erst versucht den zweiten Teil des Codes, also alles was A<-na.omit(A) passierte separat durchlaufen zu lassen, funktioniert allerdings nicht. Packe ich es in die Beta-generierende Schleife funktioniert es perfekt!
StatistikMensch

Re: Aktienschätzung

Beitrag von StatistikMensch »

Hallo nochmal :)
Ich habe nochmal eine kleine Frage zur Überführung. Ich habe nun sämtliche Betastrukturen durchlaufen lassen (also mean(low-high), mean(high), mean(low))für verschiedene Beobachtungen. Wie kriege ich es hin, dass die Monatsvariable einem Datum zugeordnet wird, sodass ich es als Zeitreihe grafisch vergleichen kann? Würde es hier reichen, die Definition erst bei der Plottdarstellung der Zeitreihe zu ändern? Wäre super wenn es dafür einen automatisierten Befehl gäbe, denn es sind teilweise über 400 Monate.

LG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag von jogo »

Hallo Statistikmensch,

kannst Du mich bitte auf den aktuellen Stand bringen, was Du gerade betreibst im Sinne von viewtopic.php?f=20&t=11
Ich habe wirklich keine Ahnung, was hier low und heigh sind und mit welchen Datenstrukturen Du gerade hantierst.

Gruß, Jörg
StatistikMensch

Re: Aktienschätzung

Beitrag von StatistikMensch »

Guten Tag,
zunächst einmal, das Problem mit der Darstellung als Zeitreihe hatte sich von selbst gelöst, es ist nur eine kleine Einstellungssache gewesen :)
Ich habe den Code etwas ergänzt, da es bei der Berechnung der Qunitile doch etwas mehr Sinn macht hier ein paar mehr Beobachtungen zu haben.

Die Daten habe ich gemäß des Codes

Code: Alles auswählen

library("data.table")
A <- fread("http://forum.r-statistik.de/download/file.php?id=306")
BetasDT <- function(Aktie) {
  n <- 60
  Fenster <- 1:n
  Betai <- function(i) lm(Aktienrendite ~ Marktrendite, data=Aktie[i+Fenster,])$coefficients[2]
  c(rep(NA, n-1), sapply(0:(nrow(Aktie)-n), Betai))
}
A[, Beta:=BetasDT(.SD), AktienNummer]
A[AktienNummer==1] ## Kontrolle

A <- na.omit(A)

myDelta <- function(S) {
  Q <- S[, ntile(Beta, 2)]
  S[Q==1, mean(Aktienrendite)] - S[Q==2, mean(Aktienrendite)]  ## a100 - b100
}
A[, myDelta(.SD), Monats_id]
durchlaufen lassen. Dabei habe ich allerdings

Code: Alles auswählen

Q<-S[,ntile(Beta,10)]
gewählt und dies für alle 10 Dezile durchlaufen lassen. Gibt es hier eine elegantere Schleife, sodass ich die 10 Zeitreihen direkt als ein Vektor abgreifen kann?
Ebenfalls fände ich es wichtig, für jedes Dezil den Mittelwert des dort verwendeten Betafaktors ebenfalls zu ermitteln.
Um das hier am Beispiel ein bisschen anschaulicher zu machen, würde ich vorschlagen es als

Code: Alles auswählen

Q<-S[,ntile(Beta,5)]
zu diskutieren.
Dateianhänge
Test.csv
(76.29 KiB) 63-mal heruntergeladen
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag von jogo »

StatistikMensch hat geschrieben: Do Okt 04, 2018 12:13 pm Die Daten habe ich gemäß dem Code

Code: Alles auswählen

library("data.table")
...
myDelta <- function(S) {
  Q <- S[, ntile(Beta, 2)]
  S[Q==1, mean(Aktienrendite)] - S[Q==2, mean(Aktienrendite)]  ## a100 - b100
}
A[, myDelta(.SD), Monats_id]
durchlaufen lassen. Dabei habe ich allerdings

Code: Alles auswählen

Q<-S[,ntile(Beta,10)]
gewählt und dies für alle 10 Dezile durchlaufen lassen.
und wie sieht dann die Differenzbildung aus, also immer nur zwischen aufeinanderfolgenden Gruppen oder auch z.B. zwischen den Gruppen mit Q==1 und Q==3 :?:

Gruß, Jörg
StatistikMensch

Re: Aktienschätzung

Beitrag von StatistikMensch »

Differenzen werden nicht gebildet.
Also einfach

Code: Alles auswählen

 library("data.table")
...
myDelta <- function(S) {
  Q <- S[, ntile(Beta, 5)]
  S[Q==3, mean(Aktienrendite)]
}
A[, myDelta(.SD), Monats_id]
für bspw. hier das 3. Quintil.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Aktienschätzung

Beitrag von jogo »

also sowas:

Code: Alles auswählen

library("data.table")

fntile <- function (x, n) {
  len <- sum(!is.na(x))
  if (len == 0L) rep(NA_integer_, length(x)) 
  else as.integer(floor(n * (frank(x) - 1)/len + 1)) 
}

A <- fread("http://forum.r-statistik.de/download/file.php?id=306")
BetasDT <- function(Aktie) {
  n <- 60
  Fenster <- 1:n
  Betai <- function(i) lm(Aktienrendite ~ Marktrendite, data=Aktie[i+Fenster,])$coefficients[2]
  c(rep(NA, n-1), sapply(0:(nrow(Aktie)-n), Betai))
}
A[, Beta:=BetasDT(.SD), AktienNummer]
A[AktienNummer==1] ## Kontrolle

na.omit(A)[, .SD[, mean(Aktienrendite), fntile(Beta, 3)], Monats_id]
oder :?:
plus Kosmetik:

Code: Alles auswählen

B <- na.omit(A)[, .SD[, mean(Aktienrendite), fntile(Beta, 3)], Monats_id]
dcast(B, Monats_id ~ fntile)
Gruß, Jörg
StatistikMensch

Re: Aktienschätzung

Beitrag von StatistikMensch »

Vielen Dank, wie immer eine gute Idee von dir :)
Als letztes würde mich noch interessieren wie ich einfach für jeden Monat das durchschnittliche Beta aller Aktien berechne. Sinnvollerweise würde man diese Operation separat durchführen, wenn bereits alle Betas geschätzt sind. Ziel soll es dann sein, für alle Monate jeweiles einen Beta Wert zu erhalten, das wäre dann der durchschnittliche Beta Wert für diesen Monat.
Antworten