Seite 3 von 4

Re: Aktienschätzung

Verfasst: Di Aug 28, 2018 9:40 am
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

Re: Aktienschätzung

Verfasst: Fr Aug 31, 2018 8:51 am
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

Re: Aktienschätzung

Verfasst: Mo Sep 03, 2018 5:28 pm
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!

Re: Aktienschätzung

Verfasst: Fr Sep 28, 2018 12:49 pm
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

Re: Aktienschätzung

Verfasst: Sa Sep 29, 2018 2:32 pm
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

Re: Aktienschätzung

Verfasst: Do Okt 04, 2018 12:13 pm
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.

Re: Aktienschätzung

Verfasst: Do Okt 04, 2018 5:40 pm
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

Re: Aktienschätzung

Verfasst: Do Okt 04, 2018 10:35 pm
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.

Re: Aktienschätzung

Verfasst: Fr Okt 05, 2018 11:58 am
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

Re: Aktienschätzung

Verfasst: Fr Okt 05, 2018 8:20 pm
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.