Seite 1 von 3

Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: Sa Okt 31, 2020 1:00 am
von schubbiaschwilli
Gude!

Vielleicht am Thema vorbei, vielleicht interessant:
Ich habe mal mit dem Constant "Elasticity of Variance"-Model rumgespielt - Ist eine Alternative zum Black-Scholes-Merton-Model zur Bewertung von Optionen. Dieses nutzt die Nichtzentrale Chi-Quadrat-Verteilung, und die Berechnung dauert, zumindest mit den eingebauten Funktionen.

Ich habe das mal zum Anlass genommen, zu schauen, wieviel schneller julia im Vergleich zu R ist - Auch, um das dann mit julia zu berechnen, falls es sich lohnt.
Dazu habe ich 2 Tests gemacht.
Erst einmal habe ich 44.000 Testdatensätze zur Berechnungen mit 'realistischen' Parametern erstellt, die dann von R (Gnu R x64 4.0.2 und MRO 4.0.2) und julia 1.5.1 abgearbeitet wurde - Das natürlich mehrmals, da ich das mit meinem Arbeits-Laptop gemacht habe, auf dem ich parallel gearbeitet habe (OK, ich war im www, oder in der Küche - Aber ich bin mir halt nicht sicher, ob das Ding im Hintergrund vielleicht gerade Updates installiert).
Im 1. Test habe ich die eingebauten Funktionen benutzt, im 2. Test den Algorithmus von Ding, der schneller sein soll (und es auch ist).

Nun die Ergebnisse:
Im 1. Test (mit den eingebauten Funktionen) benötigte R im Mittel etwas über 4,5 Minuten; julia etwa 3,3 Minuten - Hm...
Im 2. Test (mit dem Algorithmus von Ding) benötigte R im Mittel knapp 1 Minute, julia nicht mal 1 Sekunde - Yep, schneller, wirklich schneller.

Der ganze Kram findet sich in meinem Blog unter:
https://thepathisthegoalblog.wordpress. ... -c-part-1/
https://thepathisthegoalblog.wordpress. ... -c-part-2/

Dank&Gruß
schubbiaschwilli

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: Sa Okt 31, 2020 8:15 am
von EDi
Kannst du mal ein Profiling von R Code machen? Mich würde interessieren, wo die Zeit liegen bleibt...

Auf den ersten Blick ist mir nichts super langsames (außer das repeat) aufgefallen...

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: Sa Okt 31, 2020 12:43 pm
von Athomas
Du solltest mal die Funktion "pchisq_ding" nach RCPP übertragen, dabei macht mir insbesondere die Schleife mit der "nach oben offenen Summation" im interpretierten R Sorgen:
For larger values of the non-centrality parameter, Ding's method can take an unreasonable number of terms before convergence is achieved.

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 1:53 am
von schubbiaschwilli
Gude!
Kannst du mal ein Profiling von R Code machen? Mich würde interessieren, wo die Zeit liegen bleibt...
So, ich hab' mich daran gehalten: https://support.rstudio.com/hc/en-us/ar ... th-RStudio - Und RTools und etliche Pakete manuell installiert, und bekomme keinen vernünftigen Output hin... - Ich hab den Kram dann mal als Bild ausgeschnitten und zusammengefügt - Ich hoffe, du kannst was damit anfangen.
Ich habe mir das auch mal angeschaut (ich habe vorher mit dem Tool noch nie gearbeitet), erkenne aber nix.

Bild

Ich habe den Code ein wenig umgestellt - Das Laden, Formatieren und Speichern der Daten habe ich vorher auch nicht mitgestoppt, und ist hier auch nicht drin.

Dank&Gruß
schubbiaschwilli

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 2:00 am
von schubbiaschwilli
Gude!
Athomas hat geschrieben: Sa Okt 31, 2020 12:43 pm Du solltest mal die Funktion "pchisq_ding" nach RCPP übertragen, dabei macht mir insbesondere die Schleife mit der "nach oben offenen Summation" im interpretierten R Sorgen:
OK, vielleicht kann man da was rausholen, aber mir ging es erst einmal um den Vergleich R vs julia - Und in julia läuft ja der gleiche Algorithmus - Wenn ich mal Zeit finde, probier' ich mal RCPP aus.

Dank&Gruß
schubbiaschwilli

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 11:32 am
von Athomas
Von meiner steilen These bin ich aufgrund Deiner Grafik schon wieder abgekommen - der größte Zeitfresser scheint ja die Zeile-für-Zeile-Ergänzung im Dataframe sowie die zweimalige Ergänzung der Systemzeit darzustellen - wofür brauchst Du die überhaupt?

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 12:05 pm
von schubbiaschwilli
Gude!
sowie die zweimalige Ergänzung der Systemzeit darzustellen - wofür brauchst Du die überhaupt?
Ich hatte mir mal angewöhnt, für jede Berechnung die Zeit zu nehmen, und das war in meiner (eigenen) Vorlage schon so - Es kommt wirklich vor (OK, nicht beim CEV, aber bei anderen Modellen), dass sich je nach Parametern die Zeiten der Berechnungen stark unterscheiden - Man kann es natürlich weglassen, weil es in gewisser Weise die Messung verzerren kann - Aber beim julia-Code mache ich es auch - Aber vielleicht ist julia da viel schneller? Spaß...

Vielleicht an dieser Stelle ein wenig mehr Hintergrund: Das Ziel ist es, die CEV-Preise an reale Preise zu fitten, d.h. die beiden Parameter sigma und alpha so zu Optimieren, dass die Summe der quadrierten Differenzen der CEV-Preise zu den realen Preisen (Euklidische Norm) minimal wird. Dazu benutze ich (bzw. wollte) dann die üblichen Verfahren (Nelder-Mead, BFGS, ...). Das bedeutet: Für jeden Näherungsschritt muss ich die Euklidische Norm neu berechnen (je nach Verfahren sogar mehrmals), und dass bei ungefähr +-350(?) einzelnen Optionen - Und da geht R beim CEV deutlich in die Knie.
Aber ich berechne/mache die Optimierung (naja, versuche) jetzt erst mal mit julia - Mal sehen.

Dank&Gruß
schubbiaschwilli

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 12:36 pm
von Athomas
So, Du kannst durch zwei kleine Maßnahmen Deinen R-Code entscheidend beschleunigen:
  • Verzicht auf die Systemzeitangaben (oder Verschieben der Berechnung an eine andere Stelle)
  • Vektorisierung der Funktion "CEVOption" mit "Vectorize" - ist ein wrapper für "mapply", hört sich aber besser an :) !

Code: Alles auswählen

CEVOptionVect <- Vectorize(CEVOption)
...
data$Price   = CEVOptionVect(data$PutCallFlag, data$S, data$T, data$K, data$r, data$sigma, data$alpha)

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 1:13 pm
von schubbiaschwilli
Gude!
Athomas hat geschrieben: So Nov 01, 2020 12:36 pmSo, Du kannst durch zwei kleine Maßnahmen Deinen R-Code entscheidend beschleunigen:
Naja, dass hier ist ein Beispiel, um mal zu messen, ob bzw. wie viel schneller julia ist, und ob sich es lohnt, die Numerik in julia zu machen - Das ist nicht mein Code, mit dem ich dann wirklich rechne. Mein Code sieht eher so aus:

Code: Alles auswählen

CEVLossFunction <- function(dat, par){
  sum <- 0
  for(i in 1:nrow(dat)){
    sum <- sum + (log(dat$Price[i]) - log(CEVOption(dat$PutCallFlag[i],S,dat$T[i],dat$K[i],r,sigma=par[1],alpha=par[2])))^2
  }
  return(sum)
}
(...)

  startvalues<-list(sigma=mean(data$ImpliedVola), alpha=startvalues_alpha[i])
  dat=data.frame(data$OptionType, data$TaeglicherAbrechnungspreis,data$StrikePrice, data$t_delta)
  colnames(dat) <- c("PutCallFlag", "Price", "K", "T")
  result<-optim(par=startvalues, fn=CEVLossFunction, dat=dat, method="Nelder-Mead")
Aber
Vektorisierung der Funktion
Daran hatte ich gar nicht mehr gedacht - Ich habe vorher mit Modellen gearbeitet, die mit der Carr-Madan-Formel berechnet wurden (https://en.wikipedia.org/wiki/Carr%E2%8 ... an_formula), und da musste numerisch Integriert werden (und das auch noch im Komplexen), und die (eingebauten) Funktionen sind da beim Versuch ausgestiegen, das mit Vektoren zu machen - Auf jeden Fall hab ich es nicht hinbekommen - Aber jeden Fall ist das noch drin, und das kann man mal ändern.

Dank&Gruß
schubbiaschwilli

Re: Kleiner Vergleich der Geschwindigkeit von R vs julia

Verfasst: So Nov 01, 2020 1:29 pm
von Athomas
Kleiner Hinweis: bei mir sinkt die Berechnungszeit von 84,50 auf 3,29 sec - und da geht bestimmt noch was!

R ist klarerweise nicht gut dafür geeignet, Programme "Wort für Wort" aus anderen Sprachen zu übertragen!