Programmierhilfe - Lineares Regressionmodell

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich habe mir das Ganze nochmal näher angeschaut und das passt super.
Ich habe aber noch ein paar Fragen.
Die erste Frage ist relativ simple, ich brauche eine Auswertung zu den Modellen. Allerdings kriege ich den Zugriff auf die Liste nicht programmiert.
Vorher waren die Modelle ja in einem extra Element "Estimation_models" gespeichert, da hat es:

Code: Alles auswählen

lapply(estimation_models, summary)
getan um die Signifikanz von Steigung und Achsenabschnitt zu bestimmen. Gibt es hier eine Möglichkeit um auf das "M" im Element "L" zuzugreifen mit der summay() function?

Für die anderen Fragen muss ich erst einen Teil des Datensatzes neu aufbereiten und mit meinem Professor sprechen, bevor ich doch Codetechnisch nochmal um Hilfe bitten würde.

An dieser Stelle echt nochmals vielen Dank.
Viele Grüße,
Damian
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Sa Jul 28, 2018 3:05 pm ich habe mir das Ganze nochmal näher angeschaut und das passt super.
sehr schön. 8-)
Ich habe aber noch ein paar Fragen.
Die erste Frage ist relativ simple, ich brauche eine Auswertung zu den Modellen. Allerdings kriege ich den Zugriff auf die Liste nicht programmiert.
Vorher waren die Modelle ja in einem extra Element "Estimation_models" gespeichert, da hat es:

Code: Alles auswählen

lapply(estimation_models, summary)
getan um die Signifikanz von Steigung und Achsenabschnitt zu bestimmen. Gibt es hier eine Möglichkeit um auf das "M" im Element "L" zuzugreifen mit der summay() function?
Du weißt aber, dass es die Funktion coef() gibt?
Ansonsten gibt es zwei Möglichkeiten:
1. Du generierst Dir Dein gewohntes Objekt estimation_models:

Code: Alles auswählen

estimation_models <- lapply(L, '[[', "M") ## und dann weiter wie gehabt oder:
sapply(estimation_models, coef) ## kurz für: sapply(estimation_models, FUN=coef)
Dabei speicherst Du die Modelle noch mal um in ein anderes Objekt.

2. mit einer anonymen Funktion

Code: Alles auswählen

lapply(L, function(Li) summary(Li$M)) ## oder, falls Du nur die Koeffizienten möchtest:
sapply(L, function(Li) coef(Li$M)) ## bzw. sapply(L, FUN=function(Li) coef(Li$M))
Für die anderen Fragen muss ich erst einen Teil des Datensatzes neu aufbereiten und mit meinem Professor sprechen, bevor ich doch Codetechnisch nochmal um Hilfe bitten würde.

An dieser Stelle echt nochmals vielen Dank.
klaro, macht ja auch Spaß.

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich habe den Code übernommen. Das klappt wunderbar.
Ich freue mich, dass du auch Spaß an der Arbeit findest. Ich melde mich sobald es Rückmeldung gibt und ich weiß, wie ich weiter vorgehen kann.

Viele Grüße,
Damian
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich habe zwar noch keine Rückmeldung von meinem Prof, aber ich würde gern aus zeitlichen Gründen einfach weitermachen.
Ich denke, dass - wenn etwas anders gemacht werden muss - das direkt in der Exceldatei gemacht werden muss. Deshalb können wir eigentlich mit dem Programmieren weitermachen. :)

Im Anhang findest du die Excel "Insider_returns_actual". Diese beinhaltet die tatsächlichen Renditen, welche von den erwarteten Renditen nach den Modellen abgezogen werden müssen. Ich muss auf die vorhergesagten Werte zugreifen und diese von den tatsächlichen Renditen abziehen, um zu bestimmen was eine "abnormale Rendite" ist. Ich habe bezüglich der Formatierung den zweiten data.frame-Ansatz ausgewählt, wo Company und Trading_date sehr gut einsehbar sind. Ich musste allerdings den Zeitraum der predict() Funktion in der myreg-Funktion anpassen auf:

Code: Alles auswählen

P <- predict(M, newdata=Daily_returns_for_model_calc[(i.TTag-20):(i.TTag+20), c("Date", "DAX")])
weil ich ja die 20 Tage vor dem Trade als Benchmark brauche, demsprechend hat mein Dataframe jetzt 41 Spalten mit vorhersagen plus die Spalten für Company und Trading_date, also 43 Spalten. Der 21ste Tag (Spalte 23) ist dabei immer das Trading_date wenn ich mich nicht vertue, welcher quasi als "Wendepunkt" und Zeitpunkt "0" definiert ist.

Jetzt ist es so, dass ich quasi eine neue Funktion brauche, die das Rechnen übernimmt. Und zwar so, dass die erwarteten Renditen aus meinem Dataframe die 20 Tage VOR dem Trading_date liegen von den tatsächlichen Renditen abgezogen werden [Spalte 3 bis 22 des Dataframes) und das die 20 Tage nach dem Trading_date (Spalten 24 bis 43) von den tatsächlichen Renditen abgezogen werden. Spalte 23 ist hierbei ja immer der 21ste Tag und das Trading_date.
Die tatsächlichen Renditen der Insider befinden sich im Reiter "Insider_returns_actual", diese werden von den Spalten 24 bis 43 abgezogen. Die Spalten 3 bis 22 sind ja quasi eine "Benchmarkperiode" vor dem Trade, deshalb sollten diese von den entsprechenden Renditen aus dem Reiter "Daily_returns_actual".

Ich sehe im Anschluss aber wieder ein großes Problem entstehen, denn es ist so, dass die "abnormalen Renditen" der selben Tage vom selben Unternehmen zu einem Mittelwert verdichtet werden müssen. Das heißt, wenn das "Trading_date" für ein Unternehmen mehrmals vorkommt (das tut es öfters), dann muss für alle abnormalen Renditen der nachfolgenden Tage für jeden einzelnen Tag ein Mittelwert berechnet werden, damit das Kummulieren der Renditen im Anschluss nicht verzerrt wird. Ansonsten würde einige Tage ja doppelt eingerechnet werden. Ich habe extra für die Predictions die Variante gewählt wo beide Variablen vorkommen, damit die abnormalen Renditen besser zu zuordnen sind. Wenn man erstmal die abnormalen Renditen bestimmt hat (die Formatierung der Ergebnisse sollte wie bei dem Dataframe sein, was schon programmiert für die Predictions programmiert wurde), gibt es dann eine Möglichkeit die Zeilen des Dataframes, die das gleiche Trading_date und den gleichen Company-Eintrag haben, auf eine Zeile, welche den Mittelwert der Renditen für diesen Trade wiedergeben, zu verdichten?
Ich habe da irgendwie eine If-else() im Kopf, wo zwei Argumente (Trading_Date und Company) bestimmen welche verdichtet werden sollen. Die Benennung der verdichteten Zeile muss sich ja nicht mal ändern, weil die Namen ja aus Trading_Date und Company bestehen.

Vielen Dank für Deine Hilfe nochmal.
Viele Grüße,
Damian
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Mo Jul 30, 2018 1:11 pm Ich denke, dass - wenn etwas anders gemacht werden muss - das direkt in der Exceldatei gemacht werden muss. Deshalb können wir eigentlich mit dem Programmieren weitermachen. :)

Im Anhang findest du die Excel "Insider_returns_actual".
an Deine heutige Nachricht hast Du keine Datei angehangen.
... oder beziehst Du Dich auf Deine Excel-Datei, die Du am 24. Juli geschickt hast? (Dort ist keine Tabelle "Insider_returns_actual" enthalten - es gibt dort nur eine Tabelle "Daily_returns_actual")
Ich sehe im Anschluss aber wieder ein großes Problem entstehen, denn es ist so, dass die "abnormalen Renditen" der selben Tage vom selben Unternehmen zu einem Mittelwert verdichtet werden müssen. Das heißt, wenn das "Trading_date" für ein Unternehmen mehrmals vorkommt (das tut es öfters), dann muss für alle abnormalen Renditen der nachfolgenden Tage für jeden einzelnen Tag ein Mittelwert berechnet werden, damit das Kummulieren der Renditen im Anschluss nicht verzerrt wird. Ansonsten würde einige Tage ja doppelt eingerechnet werden. Ich habe extra für die Predictions die Variante gewählt wo beide Variablen vorkommen, damit die abnormalen Renditen besser zu zuordnen sind. Wenn man erstmal die abnormalen Renditen bestimmt hat (die Formatierung der Ergebnisse sollte wie bei dem Dataframe sein, was schon programmiert für die Predictions programmiert wurde), gibt es dann eine Möglichkeit die Zeilen des Dataframes, die das gleiche Trading_date und den gleichen Company-Eintrag haben, auf eine Zeile, welche den Mittelwert der Renditen für diesen Trade wiedergeben, zu verdichten?
https://stackoverflow.com/questions/350 ... ply-family
(eventuell in Kombination mit https://stackoverflow.com/questions/129 ... left-right )

Wichtig könnte bei der späteren Programmierung sein, dass Du ein algorithmisch umsetzbare Definition von "abnormalen Renditen" parat hast.

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

sorry, hier anbei die Datei. Die hatte ich vergessen anzuhängen.
Der Reiter aus der ersten Datei "Daily_returns_actual" wird allerdings auch benötigt.

Den Link schaue ich mir gleich mal an und gucke, ob es dort eine Möglichkeit gibt.
Viele Grüße,
Damian
Dateianhänge
Insider_returns_actual.xlsx
(14.59 KiB) 48-mal heruntergeladen
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Die Definition von abnormalen Renditen ist, wie folgt:

Abnormale Rendite = Tatsächliche Rendite von Aktie x im Zeitpunkt (oder auch Tag) t - Erwartete Rendite von Aktie x im Zeitpunkt /oder auch Tag) t

Daher müssen die Abnormalen Renditen einer Aktie x für den selben Tag t auch zu einem Mittelwert verdichtet werden. Damit man später über die Tage die Renditen einfach kummlieren kann für verschiedenen Zeiträume. Und diese können dann getestet werden.

Die apply() Familie könnte tatsächlich eine Lösung für das Problem sein, aber ich frage mich, wie die "Parameter" für das Verdichten, Trading_date und Company dort eingebettet werden können.

Viele Grüße,
Darren
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Darren
darrgans hat geschrieben: Mo Jul 30, 2018 1:11 pm Die tatsächlichen Renditen der Insider befinden sich im Reiter "Insider_returns_actual", diese werden von den Spalten 24 bis 43 abgezogen. Die Spalten 3 bis 22 sind ja quasi eine "Benchmarkperiode" vor dem Trade, deshalb sollten diese von den entsprechenden Renditen aus dem Reiter "Daily_returns_actual".
die Excel-Datei Insider_returns_actual.xlsx hat keinen Reiter "Daily_returns_actual".

Müssen die Daten aus der Datei Data_for_forum.xlsx (dort aus dem entsprechenden Reiter) konstruiert werden? evtl. so:

Code: Alles auswählen

TTag <- myInside$Trading_date[1]
Comp <- myInside$Company_name[1]
a.Tag <- which(Daily_returns_actual$Date==TTag)
Daily_returns_actual[(a.Tag+1):(a.Tag+20), Comp]
Gruß, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

genau. Der Reiter "Daily_return_actual" befindet sich in der "Data_for_Forum" Datei.
Ich habe eine Frage und irgendwie kommt das Problem völlig unvorbereitet, weil ich das eigentlich schon fertig hatte, aber irgendwie spuckt mir die mappl() Funktion jetzt folgenden Fehler aus:

Error in `[.default`(X[], ...) :
only 0's may be mixed with negative subscripts

Für diesen Code:

Code: Alles auswählen

model_predictions_buys <- mapply(FUN=myworkaholic, myInside_buys$Trading_date, myInside_buys$Company_name, SIMPLIFY = FALSE)
Die Funktion sieht wie folgt aus:

Code: Alles auswählen

myworkaholic <- function(TDAY, Comp) {
  i.TDAY <- which(Daily_returns_for_model_calc$Date==TDAY)
  M <- lm(as.formula(paste0(Comp, " ~ DAX")), data=Daily_returns_for_model_calc[(i.TDAY-201):(i.TDAY-21),])
  P <- predict(M, newdata=Daily_returns_for_model_calc[(i.TDAY-20):(i.TDAY+20), c("Date", "DAX")])
  list(M=M, P=P)
}
Ich habe im Datensatz selber neue Daten reingeladen, allerdings hat sich da an der Natur der Daten nichts geändert und bei Google kamen die letzte Stunde bei der Suche nur sehr kryptische Beschreibungen zu dem Fehler.
Hast du eine Idee, woran das liegen könnte?

Viele Grüße,
Damian
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Mo Jul 30, 2018 4:02 pm Die Funktion sieht wie folgt aus:

Code: Alles auswählen

myworkaholic <- function(TDAY, Comp) {
  i.TDAY <- which(Daily_returns_for_model_calc$Date==TDAY)
  M <- lm(as.formula(paste0(Comp, " ~ DAX")), data=Daily_returns_for_model_calc[(i.TDAY-201):(i.TDAY-21),])
  P <- predict(M, newdata=Daily_returns_for_model_calc[(i.TDAY-20):(i.TDAY+20), c("Date", "DAX")])
  list(M=M, P=P)
}
Ich habe im Datensatz selber neue Daten reingeladen, allerdings hat sich da an der Natur der Daten nichts geändert und bei Google kamen die letzte Stunde bei der Suche nur sehr kryptische Beschreibungen zu dem Fehler.
Hast du eine Idee, woran das liegen könnte?
ja, wahrscheinlich wird (i.TDAY-201) negativ (wird als Zeilenindes verwendet in data=Daily_returns_for_model_calc[(i.TDAY-201):(i.TDAY-21),])
Wie möchtest Du so einem Fall behandeln?

Gruß, Jörg
Antworten