Diskussion zum Artikel "Statistische Verteilungen in MQL5 - Nur das Beste aus R" - Seite 13
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Lies es.
Habe mich damit befasst.
Ich denke, dass die von Ihnen angegebenen Tests nicht ganz korrekt sind. Ich halte es für notwendig, darüber zu schreiben, denn Leistungsvergleiche sind nicht das Letzte.
Der Punkt ist, dass MKL sich qualitativ von R unterscheidet. Und bei Leistungsvergleichen sollten diese qualitativen Unterschiede nach Möglichkeit berücksichtigt werden. R ist ein Interpreter und MKL ist ein Compiler. Dieser qualitative Unterschied für industrielle Programme ist ein Vorteil für MKL.
Werfen Sie einen Blick auf den Quellcode von R (es ist ein Open-Source-Code). Dort ist die gesamte grundlegende Mathematik in C/C++ in die Engine kompiliert. Und die meisten Pakete sind auch in C++ geschrieben, da man sonst nicht auf die Ergebnisse der Berechnungen warten kann.
Wenn R ein Interpreter für Basis-/Systemfunktionen wäre, würde es 200-500 Mal hinter MQL5 zurückbleiben. Wir haben speziell die C/C++-Systemfunktionen von R getestet, anstatt die manuelle Verarbeitung in Schleifen aufzubauen (wo R um das Hundertfache hinterherhinkt).
Bei der Entwicklung von R wird ständig nach der Frage gesucht, wie ich ein Paket finden kann, damit ich keine for/while/foreach-Schleife schreiben muss. Tatsächlich gibt es nur eine Methode, um Berechnungen in R durchzuführen, nämlich die Übergabe von mehr oder weniger umfangreichen Berechnungen an Drittanbieter-Pakete.
Es gibt aber noch einen weiteren qualitativen Unterschied, der auch für den industriellen Betrieb von Programmen von großer Bedeutung ist und bei den Tests nicht berücksichtigt wurde, was zu verzerrten Ergebnissen führte.
Der qualitative Unterschied zwischen R und MKL besteht darin, dass das elementare Objekt in MKL ein Skalar ist, aus dem komplexere Objekte, zum Beispiel Vektoren, gebildet werden. Es sind Vektoren, die dem Eingang von Verteilungsfunktionen zugeführt werden.
Im Katalog /include/math/stat finden Sie Hunderte von Vektorfunktionen.
In R gibt es überhaupt kein Konzept eines Skalars. Das einfachste Objekt ist ein Vektor. R nutzt diese Tatsache ausgiebig, und in unserem Beispiel, in dem wir Verteilungsfunktionen in R-Code vergleichen, können wir deutlich eine für R spezifische Programmiertechnik, die "Vektorisierung", erkennen, die in MKL nicht verfügbar ist. Da es sich hierbei um eine spezifische Technik in R handelt, die Berechnungen um das 10-100fache beschleunigt (je nach Größe der Matrix), müsste der Code für R diese Technik enthalten. Die Verwendung der Vektorisierung ist offensichtlich, denn in den Tests nehmen wir einen Eingabevektor und führen 100 Mal Berechnungen darüber durch, d. h. es handelt sich um eine Matrix mit den gleichen, aber unterschiedlichen Spalten.
Es gibt keine Vektorisierung und keine modernen Funktionen in R. Der Code dort wird einfach von gewöhnlichen Programmieranfängern mit dem Kopf nach unten geschrieben. Ja, sie sind anständige Mathematiker, aber sie sind mittelmäßige Programmierer.
GPUs in R bleiben nur Märchen und isolierte Versuche in den seltensten Paketen.
Zusammenfassend lässt sich sagen: Ein Text in R sollte in R geschrieben werden, um dessen Möglichkeiten zu nutzen, insbesondere in Ermangelung von Entsprechungen in MKL.
Sie kennen einfach weder R noch MQL5.
Sie haben keinen Blick in die Quellen von R geworfen, Sie kennen die Quellen von MQL5 nicht. Sie haben in den letzten 15 Jahren keine Compiler gebaut. Aber Sie versuchen, mit denjenigen zu streiten, die das alles gemacht haben.
Derzeit verfügt die statistische Bibliothek von MQL5 (ohne Alglib, Fuzzy) bereits über mehr als 461 Funktionen: https://www.mql5.com/ru/forum/86386/page222#comment_3867386.
Damit sind die grundlegenden statistischen Funktionen bereits gut abgedeckt.
Wenn Sie den Artikel bereits gelesen haben, empfehle ich Ihnen, ihn erneut zu lesen - gestern wurde eine neue Version des Artikels mit vielen neuen Funktionen veröffentlicht.
Derzeit verfügt die statistische Bibliothek von MQL5 (ohne Alglib, Fuzzy) bereits über mehr als 461 Funktionen: https://www.mql5.com/ru/forum/86386/page222#comment_3867386.
Damit sind die grundlegenden statistischen Funktionen bereits gut abgedeckt.
Ich empfehle denjenigen, die den Artikel bereits gelesen haben, ihn noch einmal zu lesen - gestern wurde eine neue Version des Artikels mit einer Menge neuer Funktionen veröffentlicht.
Ich habe immer noch nicht herausgefunden, wie ich eine Push-Nachricht an Quantum senden kann. Bitte fügen Sie eine Funktion hinzu, die vielleicht nicht einmal in R enthalten ist.
Dies ist eine schnelle Berechnung des mittleren Intervalls, wenn es um eins nach rechts verschoben wird. Ähnliches gilt für die Berechnung des Pearson-Korrelationskoeffizienten.
Pearson ist ziemlich schwer zu berechnen, wenn man es direkt macht. Aber es gibt iterative Methoden der Berechnung: K[i] bis K[i-1].
Komisch, das ist das erste Mal, dass ich auf Russisch einen Satz mit einem Komma nach jedem Wort sehe:
Warum schreibst du die notwendige Funktion nicht selbst?
Schauen Sie sich die vollständigen Quellen der Funktionen in /include/math/stat an und schreiben Sie die fehlenden Funktionen.
In R gibt es keine Vektorisierung und keine modernen Funktionen. Der Code dort wird einfach von gewöhnlichen Programmierern geschrieben. Ja, sie sind anständige Mathematiker, aber sie sind mittelmäßige Programmierer.
Sie kennen sich einfach weder mit R noch mit MQL5 aus.
Sie haben sich die R-Quellen nicht angesehen, Sie kennen die MQL5-Quellen nicht. Sie haben in den letzten 15 Jahren keine Compiler gebaut. Aber Sie versuchen, mit denen zu argumentieren, die das alles schon gemacht haben.
Ich habe sehr bescheidene Kenntnisse in der Programmierung, aber nicht in dem von Ihnen beschriebenen Umfang.
Jedenfalls verstehe ich sehr gut, dass die interne Implementierung von R in C++, auf die Sie sich beziehen, nichts mit dem von mir angesprochenen Problem der Messung der Ausführungsgeschwindigkeit zu tun hat. Ich schreibe über die Technik des Schreibens von Code in R selbst, und was sich darin befindet, ist das, was wir messen.
Also, zur Vektorisierung.
Eine Zeichenkette sieht in R normal aus
Er ist immer mindestens eine Vektorberechnung. Es kommt auf den Kontext an - was a und b sind.
Außerdem,
einen Vektor c, bei dem jedes Element die Quadratwurzel aus dem entsprechenden Element des Vektors a ist
In diesem Fall muss a nicht notwendigerweise ein Vektor sein, sondern kann auch ein komplexeres Objekt sein, wie z.B. eine Matrix.
In MQL sind dies immer Zyklen.
Außerdem impliziert die Vektorisierung in R nicht nur die Objekte selbst, sondern:
Und um auf die Bedeutung dessen zurückzukommen, was ich im vorherigen Beitrag geschrieben habe.
Ich schreibe überhaupt nichts über die Qualität der Implementierung von C++-Funktionen. Wie Sie schlage ich vor, sie so zu messen, wie sie sind. Aber mit den Werkzeugen der Sprache R, die speziell für vektorisierte Operationen gedacht sind.
Ein Beispiel.
Bilden Sie für alle Ihre Tests eine Matrix M mit 100 (wie Sie es getan haben), wobei jede Spalte ein Zitat darstellt
In R sieht dann das Minimum über alle Spalten so aus
Das Ergebnis wird ein Vektor sein, der das Minimum jeder Spalte enthält
Anhand dieses Musters müssen wir die Rate aller Verteilungsfunktionen messen, die in die entsprechende Anwendung eingeschlossen sind. Es gibt viele von ihnen und sie sind unterschiedlich. Es gibt keine Entsprechungen in MKL.
Stellen Sie gleichzeitig sicher, dass die MKL-Bibliothek zusammen mit R installiert ist.
Warum schreibst du die notwendige Funktion nicht selbst?
Sehen Sie sich die vollständigen Funktionsquellen in /include/math/stat an und schreiben Sie die fehlenden Funktionen.
Interessante Idee.
Vielleicht können Sie einen Darsteller finden, der Pakete portiert. Zum Beispiel, Splines. Ich habe Mashups von höchster Qualität, das einzig Wahre.
Ich habe sehr bescheidene Kenntnisse in der Programmierung, aber nicht in dem von Ihnen beschriebenen Umfang.
Auf jeden Fall verstehe ich sehr gut, dass die interne C++-Implementierung von R, auf die Sie sich beziehen, nichts mit dem Problem der Messung der Ausführungsgeschwindigkeit zu tun hat, das ich angesprochen habe. Ich schreibe über die Technik des Schreibens von Code in R selbst, und was sich darin befindet, ist das, was wir messen.
Also, zur Vektorisierung.
In R sieht ein String normal aus
Es ist immer mindestens eine vektorisierende Berechnung. Es kommt auf den Kontext an - was a und b sind.
Außerdem,
einen Vektor c, bei dem jedes Element die Quadratwurzel aus dem entsprechenden Element des Vektors a ist
In diesem Fall muss a nicht notwendigerweise ein Vektor sein, sondern kann auch ein komplexeres Objekt sein, z. B. eine Matrix.
In MQL sind dies immer Zyklen.
Wir haben gezeigt, wie man in Schleifen schneller arbeiten kann. Und in reinen Quellen in MQL5, ohne C++ zu verwenden.
Und wir werden auch den einfachsten Vektor sqrt besiegen. Hier sind zwei Standardfunktionen aus der Bibliothek mit einem vollständigen Analogon von R:
bool MathSqrt(const double &array[],double &result[]) // Ergebnis in einen separaten Vektor
Sie haben noch nicht ganz verstanden, dass diese 461 Funktionen der Standard-Mathematikbibliothek von MQ5 eine riesige Abdeckung von mathematischen Grundoperationen haben.
Außerdem beinhaltet die Vektorisierung in R nicht nur die Objekte selbst, sondern:
Ja, ja. Theoretisch.
Und 99% aller Operationen machen Sie ausschließlich in den einfachsten Funktionen ohne Chance auf Beschleunigung.
In MQL5 ist OpenCL Standard und Sie können alles ohne Drittanbieter-Bibliotheken beschleunigen. Und in normalem MQL5 können Sie Ergebnisse auf dem Niveau von C++ erzielen.
Aber in R besteht die einzige Möglichkeit darin, nach einem Paket zu suchen, das jeden Zyklus beschleunigt. Ja, genau jeder Zyklus, wenn es sich um irgendetwas in Bezug auf die Anzahl der Iterationen handelt.
Und um auf die Bedeutung dessen zurückzukommen, was ich im vorherigen Beitrag geschrieben habe.
Nur wenige Leute wissen das, aber es ist wahrscheinlich, dass bei der Verwendung von MKL ein fabelhafter Overhead entsteht, wenn man die R-Eingabedaten in reguläre Arrays umwandelt, die von MKL verarbeitet werden können, und dann muss das Ergebnis wieder in das interne Datenrepräsentationsformat von R umgewandelt werden.
Ich habe mich damit nicht näher beschäftigt, aber logisch gesehen sieht es so aus. Das bedeutet erhebliche Kosten für die Bereitstellung von MKL-Unterstützung.
In MQL5 gibt es solche Verluste natürlich überhaupt nicht. Nur in OpenCL muss man Daten kopieren, aber dort ist es eine einfache und flache Memcopy.
Warum schreibst du die notwendige Funktion nicht selbst?
Ich habe sie schon einmal geschrieben, aber ich habe sie nicht als mathematische Funktion formatiert.
Sehen Sie sich die vollständigen Quellen der Funktionen in /include/math/stat an und schreiben Sie die fehlenden Funktionen.
Die Frage ist, ob man sie in eine Standardbibliothek mit wissenschaftlicher und programmiertechnischer Verknüpfung aufnehmen kann, wie es Quantum tut.
Höchstwahrscheinlich wird es notwendig sein, einen Leistungsvergleich mit Ihrer Lösung durchzuführen. Dann, denke ich, wird es möglich sein, das Fahrrad davon zu überzeugen, es in die Mat-Bibliothek aufzunehmen. Ich selbst habe das noch nicht in Mat. Paketen gesehen (für R kann ich das nicht sagen).
Ein weiteres kleines Geheimnis - warum MQL5 so schnell ist, insbesondere wenn die Bibliotheken vollständig im Quellcode enthalten sind.
Unser Compiler ist mit einer so tiefen Optimierung beschäftigt und hat die Fähigkeit, so viele Prüfungen und Bedingungen abzuschneiden, dass Funktionen komplett verschwinden und Schleifen extrem vereinfacht werden. Natürlich nur für die x64-Version.
Im Gegensatz zur Verwendung von Bibliotheken/Paketen (wo man nicht einmal einen Aufruf optimieren kann) durch andere Systeme arbeitet der MQL5-Compiler fast immer mit dem vollständigen Quellcode und führt immer eine globale Optimierung bis zur maximalen Tiefe durch. Dies führt zu erstaunlichen Ergebnissen.
Deshalb ist es für uns wichtig, alle Standardbibliotheken im Quellcode bereitzustellen. Wir wissen, dass in der Endrunde alles überoptimiert sein wird, so dass man in Sachen Geschwindigkeit fast jeden schlagen kann. Und selbst der Overhead der verwalteten Sprache wird sich nicht mehr so stark auswirken.