Automatisierung von Regression für große Datenmenge

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
hm243
Beiträge: 2
Registriert: Di Mär 16, 2021 3:26 pm

Automatisierung von Regression für große Datenmenge

Beitrag von hm243 »

Hallo Zusammen,

für meine Bachelorarbeit bearbeite ich grade einen Datensatz von ca. 40000 Fonds in der Periode 2016 - 2020. Insgesamt hat der Datensatz ca. 1.9 Millionen Zeilen. Ich möchte nun für jeden der Fonds das FamaFrench3Faktor Alpha berechnen (Maßstab wie sich der Fonds im Zeitraum im Vergleich zum allgemeinen Markt entwickelt hat. Das Alpha erhalte ich als Ergebnis (genauer gesagt als intercept value) einer Regression mit allen Datensätzen eines spezifischen Fonds. Für die Regression nutze ich die Fonperformance ("mexret") und die 3 Faktoren von FamaFrench ("Mkt_RF","SMB","HML")

Ich habe für einzelne Fonds das Alpha berechnen können, habe nun aber Schwierigkeiten damit die Regression zu automatisieren

Im ersten Schritt wollte ich über eine Funktion den intercept value für den Fonds berechnen

Code: Alles auswählen

get_intercept <- function(x) {
  return(lm(dat3$mexret ~ Mkt_RF + SMB + HML, 
      data = dat3[x,]))$coefficients[1]
}
Und das Ergebnis dann mit einer weiteren Hilfsfunktion in der Spalte "ff3fa" der zugehörigen Fonds zu speichern. Dazu habe ich alle individuellen Fondsnummern unter fund_list gespeichert (41406 Einträge)

Code: Alles auswählen

place_intercept <- function(x) your_data[x,"ff3fa"] = get_intercept(x)
lapply(fund_list, place_intercept)
add_intercepts <- function(x) lapply(x, place_intercept)
add_intercepts(fund_list)
Bin ich bis jetzt auf dem richtigen Weg? Mir ist noch nicht klar ob die Funktionen so stimmen und wie ich diese automatisieren kann

Mein Betreuer hat mir geraten, die Funktion group_by zu verwenden(hier Bsp für Fondsnummer 2704)

Code: Alles auswählen

dplyr::group_by(dat3, crsp_fundno) %>% do(get_intercept(2704))
Hier kriege ich folgende Fehlermeldung:
Fehler in model.frame.default(formula = dat3$mexret ~ Mkt_RF + SMB + HML, :
Variablenlängen sind unterschiedlich (gefunden für 'Mkt_RF')


Ich weiss aktuell nicht wie ich weiter machen soll, daher wende ich mich an dieses Forum

Also nochmal zusammenfassend:
  • Nur Datensätze mit einer bestimmten Fondsnummer analysieren ("crsp_fundno")
      • Die Regression für die selektierten Datensätze durchführen
      • Den intercept value in einer extra Spalte ("ff3fa") für jeden der selektierten Datensätze speichern
      • Die Schritte für alle Fondsnummern durchführen
      Angehängt ist eine Excel mit den Einträgen zu 3 Fondsnummern (2704, 2706 & 2708) anhand derer ich die Berechnungen beispielhaft versuche und ein Screenshot der Datenbank


      Ich hoffe ich konnte mein Problem relativ gut verständlich machen
      Bin dankbar für jede Antwort
Dateianhänge
Screenshot 2021-03-10 134708.png
dat3.xlsx
(21.46 KiB) 107-mal heruntergeladen
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Automatisierung von Regression für große Datenmenge

Beitrag von schubbiaschwilli »

Gude!

Hm, den Code würde ich mir noch mal genau anschauen:

Code: Alles auswählen

  return(lm(dat3$mexret ~ Mkt_RF + SMB + HML, data = dat3[x,]))$coefficients[1]
dat3$mexret, Mkt_RF, SMB, HML: Bist du sicher, dass das alles in dat3[x,] enthalten ist?

Ich hatte Regressionen (allerdings für Deterministic-Volatility-Functions) über Schleifen auch mal automatisiert, allerdings über das Datum, und das per Subset.
Falls dich das Interessiert:
https://thepathisthegoalblog.wordpress. ... functions/
https://github.com/schubbiaschwilli/sch ... Function.r
Die Schleife läuft über

Code: Alles auswählen

for(i in 1:nrow(DVF_Model0))
in

Code: Alles auswählen

DVF_Model3[i,]$Handelstag
steckt das Datum, und das Subset sieht so aus:

Code: Alles auswählen

data <- subset(EurexOptionsDax, OptionType == 'Call' & Handelstag == as.POSIXct(DVF_Model3[i,]$Handelstag, tz="UTC") & Moneyness >= 0.8 & Moneyness <= 1.2 & t_delta >= 1/12 & t_delta <= 1)
Und danach halt die Regression:

Code: Alles auswählen

# Model 1 (a_0 + a_1 K + a_2 K^2)
   Model1 <- lm(ImpliedVola  ~ StrikePrice + I(StrikePrice^2), data = data)
Dank&Gruß
Schubbiaschwilli
hm243
Beiträge: 2
Registriert: Di Mär 16, 2021 3:26 pm

Re: Automatisierung von Regression für große Datenmenge

Beitrag von hm243 »

Hallo Schubbiaschwilli,
dank dir schonmal für deine Antwort! Werde gleich mal in dein Projekt reinschauen, auch wenn ich beim ersten Reinschauen das Gefühl habe dass das etwas zu hoch für mich sein könnte
schubbiaschwilli hat geschrieben: Di Mär 16, 2021 6:30 pm Hm, den Code würde ich mir noch mal genau anschauen:

Code: Alles auswählen

  return(lm(dat3$mexret ~ Mkt_RF + SMB + HML, data = dat3[x,]))$coefficients[1]
dat3$mexret, Mkt_RF, SMB, HML: Bist du sicher, dass das alles in dat3[x,] enthalten ist?
An dem Code hat mein Betreuer nichts auzusetzten gehabt, aber nein, ich bin mir da nicht sicher. Irgendwie würde ich auch eine Referenz auf die Spalte "crsp_fundno" erwarten..
Leider weiss ich nicht so recht wie ich die Formel ändern muss
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Automatisierung von Regression für große Datenmenge

Beitrag von schubbiaschwilli »

Gude!
Irgendwie würde ich auch eine Referenz auf die Spalte "crsp_fundno" erwarten..
Hm, ich hatte das so verstanden, dass über crsp_fundno die Schleife läuft und darüber die Daten für die Regression ausgewählt werden?
Leider weiss ich nicht so recht wie ich die Formel ändern muss

Code: Alles auswählen

help(lm)
kann dir weiterhelfen...

Dank&Gruß
Schubbiaschwilli
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Automatisierung von Regression für große Datenmenge

Beitrag von EDi »

Schau dir mal dieses Kapitel an:

https://r4ds.had.co.nz/many-models.html

Ein ähnliche herangehensweise nutze ich auch gerne für Simulationen....
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten