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 »

Und hier die letzten beiden Dateien.
Dateianhänge
Stock_prices_adj.xlsx
(55.79 KiB) 41-mal heruntergeladen
Stock_prices.xlsx
(40.86 KiB) 48-mal heruntergeladen
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,

also kann so eingelesen werden:
setwd("~/Desktop/R.Zeug/Damian")

Code: Alles auswählen

library(readxl)
Insider_trading_data <- read_excel("Data_for_forum.xlsx", sheet = "Insider_trading_data")
Company_description <- read_excel("Data_for_forum.xlsx", sheet = "Company_description")
Stock_prices <- read_excel("Data_for_forum.xlsx", sheet = "Stock_prices")
Daily_returns_actual <- read_excel("Data_for_forum.xlsx", sheet = "Daily_returns_actual")
Stock_prices_adj <- read_excel("Data_for_forum.xlsx", sheet = "Stock_prices_adj")
Daily_returns_for_model_calc <- read_excel("Data_for_forum.xlsx", sheet = "Daily_returns_for_model_calc")
richtig?

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

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Di Jul 24, 2018 11:31 pm Ein Beispiel für das Modell des ersten Trades aus Zeile 2 des ersten Reiters wäre statisch und nicht automatisiert codiert wie folgt:

Code: Alles auswählen

 Adidas_20171128 <- lm( Daily_returns_for_model_calc$Adidas ~ Daily_returns_for_model_calc$DAX, Data = Daily_returns_for_model_calc, subset = ?? 
HIer taucht das Problem mit der automatisierten Datenselektion für das Subset auf. Hier müsste R die Daten anhand folgender Regel automatisch bestimmen:
Nimm den Wert der Variable "Trading_date" aus dem Reiter "Insider_trading_data", suche ihn im Reiter "Daily_returns_for_model_calc" bei der Variable "Date", rechne MINUS 201 Beobachtungen und nimm dann die nächsten 180 Beobachtungen.
Das resultierende Subset würde dann aus 180 Beobachtungen bestehen und genau 21 Tage vor dem Wert der Variable "Trading_date" enden.
So schaut bei mir die Lösung für dieses erste Problem aus:

Code: Alles auswählen

library(readxl)
Insider_trading_data <- read_excel("Data_for_forum.xlsx", sheet = "Insider_trading_data")
Company_description <- read_excel("Data_for_forum.xlsx", sheet = "Company_description")
Stock_prices <- read_excel("Data_for_forum.xlsx", sheet = "Stock_prices")
Daily_returns_actual <- read_excel("Data_for_forum.xlsx", sheet = "Daily_returns_actual")
Stock_prices_adj <- read_excel("Data_for_forum.xlsx", sheet = "Stock_prices_adj")
Daily_returns_for_model_calc <- read_excel("Data_for_forum.xlsx", sheet = "Daily_returns_for_model_calc")

## subset: "201 Tage vor" bis "20 Tage vor" Handelstag aus Insider_trading_data
## !! passendes Unternehmen
## Adidas_20171128 <- lm(Adidas ~ DAX, Data=Daily_returns_for_model_calc, subset = ?? )

# z.B. erste Zeile aus Insider_trading
TTag <- Insider_trading_data$Trading_date[1]
i.TTag <- which(Daily_returns_for_model_calc$Date==TTag)
# Adidas_20171128 <- 
lm(Adidas ~ DAX, data=Daily_returns_for_model_calc[(i.TTag-201):(i.TTag-21),])

#BASF_20180507 <- lm(BASF ~ DAX, Data = Daily_returns_for_model_calc, subset = ?? )
Gruß, Jörg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,

und so schaut meine Musterlösung für beide Probleme zusammen aus.

Code: Alles auswählen

## subset: "201 Tage vor" bis "20 Tage vor" Handelstag aus Insider_trading_data
## !! passendes Unternehmen
## Adidas_20171128 <- lm(Adidas ~ DAX, Data=Daily_returns_for_model_calc, subset = ?? )

names(Company_description)[2] <- "Company" # Namensangleichung
myInside <- merge(Insider_trading_data, Company_description, sort=FALSE)

# z.B. erste Zeile aus Insider_trading
TTag <- myInside$Trading_date[1]
i.TTag <- which(Daily_returns_for_model_calc$Date==TTag)
Comp <- myInside$Company_name[1]

# Adidas_20171128 <- 
lm(as.formula(paste0(Comp, " ~ DAX")), data=Daily_returns_for_model_calc[(i.TTag-201):(i.TTag-21),])
lm(Adidas ~ DAX, data=Daily_returns_for_model_calc[(i.TTag-201):(i.TTag-21),]) ## Vergleich
Der nächste Schritt wird sein, dies in eine Funktion zu packen, die TTag und Comp als Parameter nimmt und das Regressionsmodell liefert.

...

Code: Alles auswählen

names(Company_description)[2] <- "Company" # Namensangleichung
myInside <- merge(Insider_trading_data, Company_description, sort=FALSE)

myregr <- function(TTag, Comp) {
  i.TTag <- which(Daily_returns_for_model_calc$Date==TTag)
  lm(as.formula(paste0(Comp, " ~ DAX")), data=Daily_returns_for_model_calc[(i.TTag-201):(i.TTag-21),])
}

mapply(FUN=myregr, myInside$Trading_date, myInside$Company_name, SIMPLIFY = FALSE)
paste(myInside$Trading_date, myInside$Company_name) ## passende Namen für die Elemente der Ergebnisliste von mapply()
Die Ergebnisse für die Zeilen 3 bis 5 aus myInside liefern das gleiche Ergebnis, denn es ist dreimal die gleiche Kombination von trading_date und Company.

Gruß, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

den Code verstehe ich und er funktioniert einwandfrei.
Vielen Dank für Deine echt hervorragende Hilfe, du bist echt ein super Programmierer!
Kann man sich hier irgendwie erkenntlich zeigen für die Hilfe? Bspw. in Form einer Spende?

Viele Grüße,
Damian
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,
eine Frage habe ich noch.
Ich habe die Modelle aus dem Code im Object "estimation_models" gespeichert:

Code: Alles auswählen

estimation_models <- mapply(FUN=myregr, myInside$Trading_date, myInside$Company_name, SIMPLIFY = FALSE)
Im Anschluss wollte ich die Spalten entsprechend benennen, den Befehl zur automatischen Namensentwicklung hast du mir ja bereits angemerkt.

Code: Alles auswählen

paste(myInside$Company_name, myInside$Trading_date)
Ich habe daher versucht die Namen und die Modelle zu kombinieren und habe dafür folgende Funktionen verwendet:

Code: Alles auswählen

rownames(estimation_models) <- paste(myInside$Company_name, myInside$Trading_date)

Code: Alles auswählen

dimnames(estimation_models) <- paste(myInside$Company_name, myInside$Trading_date)
Allerdings werden mir bei beiden Fehlermeldungen anzeigt, weil das Objekt "estimation_models" ein non-array ist. Eine Umwandlung in ein Dataframe geht ja aufgrund der lm()-Funktion nicht.
Hast du einen Ansatz wie ich die Namen zu den Modellen zugeordnet bekomme?

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

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Mi Jul 25, 2018 4:56 pm Ich habe die Modelle aus dem Code im Object "estimation_models" gespeichert:

Code: Alles auswählen

estimation_models <- mapply(FUN=myregr, myInside$Trading_date, myInside$Company_name, SIMPLIFY = FALSE)
Im Anschluss wollte ich die Spalten entsprechend benennen, den Befehl zur automatischen Namensentwicklung hast du mir ja bereits angemerkt.

Code: Alles auswählen

paste(myInside$Company_name, myInside$Trading_date)
Ich habe daher versucht die Namen und die Modelle zu kombinieren und habe dafür folgende Funktionen verwendet:

Code: Alles auswählen

rownames(estimation_models) <- paste(myInside$Company_name, myInside$Trading_date)
Bedenke: das Objekt estimation_models ist eine Liste. Eine Liste hat keine Zeilen.

Code: Alles auswählen

dimnames(estimation_models) <- paste(myInside$Company_name, myInside$Trading_date)
Bedenke: das Objekt estimation_models ist eine Liste. Eine Liste hat nur eine Dimension. Die Funktion dimnames<- ist zum Zuweisen von Namen bei mehrdimensionalen Objekten. Eine Liste hat nur einen Index - ist also eindimensional.
Allerdings werden mir bei beiden Fehlermeldungen anzeigt, weil das Objekt "estimation_models" ein non-array ist. Eine Umwandlung in ein Dataframe geht ja aufgrund der lm()-Funktion nicht.
Hast du einen Ansatz wie ich die Namen zu den Modellen zugeordnet bekomme?
Richtig ist die Verwendung von names(...) <- ...

Code: Alles auswählen

L <- mapply(FUN=myregr, myInside$Trading_date, myInside$Company_name, SIMPLIFY = FALSE)
N <- paste(myInside$Trading_date, myInside$Company_name) ## passende Namen für die Elemente der Ergebnisliste von mapply()
names(L) <- N
Anmerkung:
Eigentlich hätte ich hier sogar mit einer Fehlermeldung gerechnet, weil manche Namen mehrfach auftauchen - die Namen sind also nicht eindeutig.

Code: Alles auswählen

c(length(N), length(unique(N)))
vergleiche auch mit:

Code: Alles auswählen

cbind(N)
Auch wenn man sich freut, dass so ein Codestück fehlerfrei läuft, sollte einem klar sein, was Mehrfachnamen bewirken:

Code: Alles auswählen

L[[N[3]]]
liefert nur ein Element aus der Liste und nicht alle drei Elemente, die alle den gleichen Namen haben.

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

nochmals vielen Dank für deine Hilfe.
Ich habe inzwischen weitergearbeitet und bin auf eine Hürde gestoßen. Nun, wo ich die Modelle habe, muss ich diese ja noch zur Vorhersage von "erwarteten" Tagesrenditen nutzen. Dabei bin ich auf Probleme gestoßen. Ich brauche ja eine Liste von Werten, die ich in das jeweilige Modell eingebe, um die erwarteten Rendite aus dem Modell erhalten. Diese Werte sind die des DAXs aus dem Datensatz "Daily_returns_for_model_calc", welche 20 Tage nach dem Trading_date liegen. Ein Beispiel: Trading_date = 2017-11-28, dann brauche ich ein Subset der Werte für die DAX-Renditen aus dem Zeitraum 2017-11-29 bis 2017-12-29. Dies entspricht 20 Werkstagen (ohne Feiertage), oder auch den Zeilen 487 bis 507 aus dem Datensatz Daily_returns_for_model_calc.

Mein Code dazu, ohne Automatisierung, war wie folgt:

Code: Alles auswählen

Subset_adi <- subset(Daily_returns_for_model_calc, data = Daily_returns_for_model_calc$Date[(i.Tag+0):(i.Tag+20),], select = "DAX")
Allerdings gibt er mir bei dem Code immer einfach alle Werte und nicht die 20 gesuchten aus, obwohl mit i.Tag+20 und i.Tag+0 die richtigen Zeilen aus dem Datensatz bestimmt werden.

Im nächsten Schritt würde dieses Subset ja zur Vorhersage von erwarteten Renditen gebraucht werden. Wenn das oben aufgehen würde, dann würde sich das Subset ja auch automatisch immer anpassen und die richtigen Inputs für predict.lm() Funktion liefern, oder vertue ich mich da?. Leider zeigt mir die predict.lm() Funktion immer den selben Fehler an, dass sie nicht mit einer Liste von Werte Arbeiten kann. Außerdem ist das Ganze natürlich nicht automatisiert, da müsste wieder eine Funktion (wie bei myregr) geschrieben und mit mapply() kombiniert werden, damit das ganze automatisiert für alle Modelle abläuft, oder?
Die Modelle sind gespeichert in der Liste "estimation_models".
Zusätzlich habe ich auch das Problem, dass der Output eine bestimmte Form haben muss, damit die besser verarbeitet werden können. Am geeignetsten wäre das in etwas so:

Funktion 1 2 3 4 ... 20
ADIDAS_2017-11-29 0.02 -0.01 0.00 -0.05 ... 0.07
----
bis zur letzten Funktion.

Die Ergebnisse wären dann perfekt angeordnet um die tatsächlichen Renditen davon abzuziehen und so die Differenzen zu bestimmen, die dann getestet werden.
Ich scheitere allerdings schon am ersten Schritt. Mein Code sähe wie folgt aus und ist analog zu dem bereits vorhanden:

Code: Alles auswählen

mypredict <- function(TDAY) {
  i.TDAY <- which(Daily_returns_for_model_calc$Date==TDAY)
   predict.lm(estimation_models, data=Daily_returns_for_model_calc[(i.Tag+0):(i.Tag+25),])
}
Die Funktion schreibt R zwar, aber irgendwie fehlt mir der Ansatz um das mit dem formatierten Output zu integrieren bzw. das wird wahrscheinlich in der mapply() Funktion erst erledigt. Ich würde die wie folgt schreiben (ohne Formatierung)

Code: Alles auswählen

mapply((FUN=mypredict))


Ich habe nach Lösungen gegoogelt, aber leider habe ich keinen brauchbaren Ansatz gefunden. Am ehesten ist die Variante der Formatierung der Outputs noch mit einem as.data.frame() eine Möglichkeit gewesen. Aber irgendwie habe ich die Umsetzung in Kombination mit predict() und automatisierten Subset nicht hinbekommen.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Do Jul 26, 2018 5:08 pm Ich habe inzwischen weitergearbeitet und bin auf eine Hürde gestoßen. Nun, wo ich die Modelle habe, muss ich diese ja noch zur Vorhersage von "erwarteten" Tagesrenditen nutzen. Dabei bin ich auf Probleme gestoßen. Ich brauche ja eine Liste von Werten, die ich in das jeweilige Modell eingebe, um die erwarteten Rendite aus dem Modell erhalten. Diese Werte sind die des DAXs aus dem Datensatz "Daily_returns_for_model_calc", welche 20 Tage nach dem Trading_date liegen. Ein Beispiel: Trading_date = 2017-11-28, dann brauche ich ein Subset der Werte für die DAX-Renditen aus dem Zeitraum 2017-11-29 bis 2017-12-29. Dies entspricht 20 Werkstagen (ohne Feiertage), oder auch den Zeilen 487 bis 507 aus dem Datensatz Daily_returns_for_model_calc.

Mein Code dazu, ohne Automatisierung, war wie folgt:

Code: Alles auswählen

Subset_adi <- subset(Daily_returns_for_model_calc, data = Daily_returns_for_model_calc$Date[(i.Tag+0):(i.Tag+20),], select = "DAX")
Allerdings gibt er mir bei dem Code immer einfach alle Werte und nicht die 20 gesuchten aus, obwohl mit i.Tag+20 und i.Tag+0 die richtigen Zeilen aus dem Datensatz bestimmt werden.

Im nächsten Schritt würde dieses Subset ja zur Vorhersage von erwarteten Renditen gebraucht werden. Wenn das oben aufgehen würde, dann würde sich das Subset ja auch automatisch immer anpassen und die richtigen Inputs für predict.lm() Funktion liefern, oder vertue ich mich da?.
Bei predict() ist der Parameter newdata= dafür zu verwenden. ... und ich würde das gleich in die Funktion myreg() reinpacken - die Funktion myreg() ist quasi das Arbeitstier:

Code: Alles auswählen

myregr <- function(TTag, Comp) {
  i.TTag <- which(Daily_returns_for_model_calc$Date==TTag)
  M <- lm(as.formula(paste0(Comp, " ~ DAX")), data=Daily_returns_for_model_calc[(i.TTag-201):(i.TTag-21),])
  P <- predict(M, newdata=Daily_returns_for_model_calc[i.TTag:(i.TTag+20), c("Date", "DAX")])
  list(M=M, P=P)
}

L <- mapply(FUN=myregr, myInside$Trading_date, myInside$Company_name, SIMPLIFY = FALSE)
N <- paste(myInside$Trading_date, myInside$Company_name) ## passende Namen für die Elemente der Ergebnisliste von mapply()
Leider zeigt mir die predict.lm() Funktion immer den selben Fehler an, dass sie nicht mit einer Liste von Werte Arbeiten kann. Außerdem ist das Ganze natürlich nicht automatisiert, da müsste wieder eine Funktion (wie bei myregr) geschrieben und mit mapply() kombiniert werden, damit das ganze automatisiert für alle Modelle abläuft, oder?
wäre mit der Modifikation des Arbeitstieres erledigt.
Die Modelle sind gespeichert in der Liste "estimation_models".
Zusätzlich habe ich auch das Problem, dass der Output eine bestimmte Form haben muss, damit die besser verarbeitet werden können. Am geeignetsten wäre das in etwas so:

Funktion 1 2 3 4 ... 20
ADIDAS_2017-11-29 0.02 -0.01 0.00 -0.05 ... 0.07
----
bis zur letzten Funktion.

Die Ergebnisse wären dann perfekt angeordnet um die tatsächlichen Renditen davon abzuziehen und so die Differenzen zu bestimmen, die dann getestet werden.
Ich scheitere allerdings schon am ersten Schritt. Mein Code sähe wie folgt aus und ist analog zu dem bereits vorhanden: ...
...
Ich habe nach Lösungen gegoogelt, aber leider habe ich keinen brauchbaren Ansatz gefunden. Am ehesten ist die Variante der Formatierung der Outputs noch mit einem as.data.frame() eine Möglichkeit gewesen. Aber irgendwie habe ich die Umsetzung in Kombination mit predict() und automatisierten Subset nicht hinbekommen.
Um solche Formfragen kümmere ich mich immer ganz zum Schluss, aber ich glaube, da lässt sich was machen.
... demnächst mehr an dieser Stelle
...
(drei Minuten später) Es war gar nicht so schwer:

Code: Alles auswählen

data.frame(N=N, t(sapply(L, `[[`, "P")))  ## oder
data.frame(myInside[c("Company_name", "Trading_date")], t(sapply(L, `[[`, "P")))
Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich war heute leider den ganzen Tag nebenberuflich unterwegs und habe mir gerade den Code angesehen. Ich verstehe den Code und er sieht echt super aus. Ich habe ihn auch schon durch R gejadgt und entsprechend angepasst. Er funktioniert einwandfrei und liefert auch die vorgestellten Ergebnisse. Ich schaue mir das morgen nochmal in Ruhe an, aber es sieht echt top aus.

Vielen Dank an dieser Stelle nochmal.
Du bist echt eine fantastische Hilfe!!
Grüße,
Damian
Antworten