Hallo Damian,
darrgans hat geschrieben: ↑Do Aug 02, 2018 1:07 pm
vorab sorry für die lange Antwortzeit, allerdings hat der Austausch mit meinem Professor etwas länger gedauert und irgenwie ist mir deine Antwort auch durch die Lappen gegangen.
bitte schaue sie Dir trotzdem nochmal an ... (siehe unten)
Ich habe mit ihm die inhaltlichen Sachen geklärt und eigentlich sind jetzt nur noch 3 Sachen zu erledigen.
1) Tatsächliche Tagesrenditen von Erwarteten Tagesrenditen abziehen
2) Die Abnormalen Renditen von gleichen Trading_date und Company-Einträgen verdichten
3) Aggregation der Zeilen über unterschiedliche Zeitintervalle[/list]
wir gehen Stück für Stück vor.
Inhaltlich hat sich allerdings etwas geändert (was die Sache erleichtert). Die Tatsächlichen Renditen sind jetzt alle im Reiter "Actual_returns_for_model_calc". Diese müssen einfach entsprechend des Trading_dates einfach nur von den Erwarteten Renditen, welche im Element:
Code: Alles auswählen
erwartete_renditen <- data.frame(myInside[c("Company_name", "Trading_date")], t(sapply(model_predictions_buys, `[[`, "P")))
Wie ich sehe, hast Du wieder einige Umbenennungen vorgenommen.
gespeichert sind abgezogen werden. Die Tatsächlichen Renditen sind ja alle bereits vorhanden, daher habe ich mir überlegt, dass man ja einfach einfach mir einer Function() lösen kann, die anhängig vom Trading_date die Daten in "Daily_returns_for_model_calc" subsetted und dann die Werte 41 Werte (Trading_date - 20 bis Trading_date + 20) wieder in die Spalten schreibt und in einem Element "Tatsächliche_renditen" speichert, damit wäre das Subtrahieren ziemlich leicht. In den Spalten davor sollte dann wieder das Trading_date und die Company stehen, wie bei den Erwarteten Renditen auch. Mein Ansatz ist eine Abwandlung von dem was wir bisher gemacht haben.
Für Diesen Teil hatte ich schon nach dem damaligen Stand etwas entwickelt, IMHO ist die ursprüngliche Arbeitstier-Funktion auch hierfür die geeignete Stelle.
Bitte schaue Dir deshalb meinen Quelltext nochmal an.
Code: Alles auswählen
Arbeitstier2 <- function(TDAY, Comp) {
i.TDAY <- which(Daily_returns_for_model_calc$Date==TDAY)
A <- subset.data.frame(Daily_returns_for_model_calc, newdata=Daily_returns_for_model_calc[(i.TDAY-20):(i.TDAY+20)])
list(A=A)
}
...
Das funktioniert bis auf den wichtigsten Teil, den Subset() Teil in der Arbeitstier2 Funktion eigentlich ganz gut.
Hast du eine Idee warum er es nicht so subsetted wie gewollt?
Du wendest die Funktion
subset() falsch an.
Die Funktion
subset() hat kein Argument
newdata= . Bitte lies hierzu nochmal die Dokumentation von
subset()
Zusätzlicher Literaturhinweis:
Ich habe noch einige Anmerkungen zu Deiner Funktion
Arbeitstier2():
1. Die Funktion erwartet einen Parameter
Comp - dieser wird in der Funktion gar nicht verwendet. Warum?
2. Natürlich kann man explizit die passende subset-Funktion aufrufen - das sieht man selten. Üblicherweise überlasse ich es R, die passende Funktion anhand der Objektklasse zu suchen, also subset() statt subset.data.frame() - aber die Geschmäcker sind verschieden.
3. Ein nochmaliges Umspeichern des Ergebnisses in eine Liste ist nicht erforderlich. Es hätte gereicht:
Code: Alles auswählen
Arbeitstier2 <- function(TDAY, Comp) {
i.TDAY <- which(Daily_returns_for_model_calc$Date==TDAY)
subset(...)
}
Mein Grundsatz lautet:
Möglichst die Strukturen flach halten.
Aber auch hier sind die Geschmäcker verschieden.
Eigentlich könnte es so (oder so ähnlich) aussehen:
Code: Alles auswählen
names(Company_description)[2] <- "Company" # Namensangleichung
myInside <- merge(Insider_trading_data, Company_description, sort=FALSE)
# Zeilenindizes (in Daily_returns_for_model_calc) von myInside$Trading_date
sapply(myInside$Trading_date, function(TDAY) which(Daily_returns_for_model_calc$Date==TDAY))
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")])
a.Tag <- which(Daily_returns_actual$Date==TDAY)
list(M=M, P=P, Dact=unlist(Daily_returns_actual[(a.Tag-20):(a.Tag+20), Comp], use.names = FALSE))
}
model_predictions_buys <- mapply(FUN=myworkaholic, myInside$Trading_date, myInside$Company_name, SIMPLIFY = FALSE)
erwartete_renditen <- data.frame(myInside[c("Company_name", "Trading_date")], t(sapply(model_predictions_buys, `[[`, "P")))
as.matrix(erwartete_renditen[3:43]) - t(sapply(model_predictions_buys, '[[', "Dact"))
(Ich habe mal das Stück, in dem es um das Einlesen der Daten geht, weggelassen.)
Ich bin mir nicht sicher, ob ich bei
Dact=unlist(Daily_returns_actual[(a.Tag-20):(a.Tag+20), Comp], use.names = FALSE) die Daten aus der richtigen Tabelle ziehe. Das musst Du bitte nochmal kontrollieren
Viele Grüße, Jörg