Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 2953

 

Die Ausgabe des in LightGBM trainierten ONNX-Modells an MT5 funktioniert nicht. Fehler 5808 und 5805 bei der Einstellung der Form der Parameter. Aber das Problem scheint bei der Definition der Parameterdimensionen zu liegen - es werden negative Werte erhalten (im Code hervorgehoben). Vielleicht habe ich nur etwas durcheinander gebracht. In Python 3.10 scheint alles normal zu sein.

MQL5-Ausgabe:

void OnStart()
  {
   long h = OnnxCreate("model.onnx", FILE_COMMON);
   
   //Print(OnnxGetInputCount(h));
   //Print(OnnxGetOutputCount(h));
   //Print(OnnxGetInputName(h, 0));
   //Print(OnnxGetOutputName(h, 0));
   OnnxTypeInfo otype;
   OnnxGetInputTypeInfo(h, 0, otype);
   ArrayPrint(otype.dimensions);                   // -1 8
   //Print(otype.element_type, " ", otype.type);
   OnnxGetOutputTypeInfo(h, 0, otype);
   ArrayPrint(otype.dimensions);                   // -1 1
   //Print(otype.element_type, " ", otype.type);
   
   matrix mx={{8.32520000 e+00, 4.10000000 e+01, 6.98412698 e+00, 1.02380952 e+00,
               3.22000000 e+02, 2.55555556 e+00, 3.78800000 e+01,-1.22230000 e+02},
              {8.30140000 e+00, 2.10000000 e+01, 6.23813708 e+00, 9.71880492 e-01,
               2.40100000 e+03, 2.10984183 e+00, 3.78600000 e+01,-1.22220000 e+02},
              {7.25740000 e+00, 5.20000000 e+01, 8.28813559 e+00, 1.07344633 e+00,
               4.96000000 e+02, 2.80225989 e+00, 3.78500000 e+01,-1.22240000 e+02},
              {5.64310000 e+00, 5.20000000 e+01, 5.81735160 e+00, 1.07305936 e+00,
               5.58000000 e+02, 2.54794521 e+00, 3.78500000 e+01,-1.22250000 e+02},
              {3.84620000 e+00, 5.20000000 e+01, 6.28185328 e+00, 1.08108108 e+00,
               5.65000000 e+02, 2.18146718 e+00, 3.78500000 e+01,-1.22250000 e+02}};
   matrix my={{0.0},{0.0},{0.0},{0.0},{0.0}};   
   
   const long  ExtInputShape [] = {1,5,8};
   const long  ExtOutputShape[] = {1,5};
   Print(OnnxSetInputShape(h,0,ExtInputShape));
   Print(GetLastError());                            // 5808
   ResetLastError();
   Print(OnnxSetOutputShape(h,0,ExtOutputShape));
   Print(GetLastError());                            // 5805
   
   OnnxRun(h, ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION, mx, my);
   //Print(mx);
   //Print(my);
   OnnxRelease(h);
  }

Lernen in Python:

from lightgbm import LGBMRegressor
from sklearn.datasets import fetch_california_housing
import onnxmltools
from onnxconverter_common import *

housing = fetch_california_housing()
X, Y = housing.data, housing.target

model = LGBMRegressor()
model.fit(X, Y)
Yreal, Ypredict = Y[:5], model.predict(X[:5])
print(Yreal)
print(Ypredict)

initial_type = [('input', FloatTensorType([None, len(X[0])]))]
onnx_model = onnxmltools.convert_lightgbm(model, name='LightGBM', initial_types=initial_type)
onnxmltools.utils.save_model(onnx_model, 'model.onnx')

Ausgabe in Python:

import numpy as np
import onnxruntime as ort
from sklearn.datasets import fetch_california_housing

housing = fetch_california_housing()
X, Y = housing.data, housing.target
Xtest, Yreal = X[:5], Y[:5]

sess = ort.InferenceSession("model.onnx", providers=ort.get_available_providers())
input_name = sess.get_inputs()[0].name
Ypredict = sess.run(None, {input_name: Xtest.astype(np.float32)})[0]

print(Xtest)
print(Yreal)
print(Ypredict)
 
Es scheint ein bisschen früh, um zu Python zu wechseln. Es ist besser, die CLI-Version von LightGBM zu lernen und Modelle im if-else-Format in C zu speichern. Nicht universell, aber billig und sicher)
 
Ich erinnerte mich an die Diskussion über zyklische Zeichen wie die Tageszeit. IMHO sollten wir sie in regelmäßige Zeichen umwandeln, indem wir einfach den Punkt als Ausgangspunkt wählen, an dem die stärkste Veränderung im möglichen Muster auftritt. Man kann entweder Marktüberlegungen (in diesem Fall den Sitzungsplan) oder etwas Ähnliches heranziehen, oder man trainiert ein Baummodell und nimmt den Punkt des ersten Splits auf diesem Merkmal.
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
Ich erinnerte mich an die Diskussion über zyklische Zeichen wie die Tageszeit. IMHO sollten wir sie in regelmäßige übersetzen, indem wir einfach den Punkt für den Startpunkt auswählen, an dem die stärkste Veränderung im möglichen Muster auftritt. Man kann entweder Marktüberlegungen (in diesem Fall den Sitzungsplan) oder etwas Ähnliches heranziehen, oder ein Baummodell trainieren und den Punkt des ersten Splits auf der Grundlage dieses Merkmals nehmen.
Sie könnten die Volatilität anstelle von Inkrementen verwenden, da sie die Marktzyklen genau widerspiegelt. Und lassen Sie es durch 2 Modelle laufen, von denen eines die schlechten Fälle herausfiltert (wie ich es im letzten Artikel getan habe). Die Ergebnisse sind manchmal anständig, man muss sie nur ein paar Mal neu trainieren. Möglicherweise liefert dieser Ansatz mehr als bestinterval.

ZY onnx auf dem Mac ist von dem Beispiel ausgegangen, was gut ist, ich habe die Boustings noch nicht überprüft
Ist es notwendig, eine 2-dimensionale Matrix wie in Ihrem Beispiel einzugeben? Es scheint logischer zu sein, ein eindimensionales Array mit Attributen zu verwenden. Es könnte sich über die falsche Form der Matrix beschweren. Anstelle einer eindimensionalen Matrix sollten Sie beispielsweise eine zweidimensionale Matrix angeben, bei der jeder Eintrag in der zweiten Dimension liegt, d.h. verschachtelte Arrays mit jeweils einem Wert.

Für catbust gibt es ein Beispiel für die Übersetzung in mql aus Python, lgbm scheint nicht besser zu sein
 
Maxim Dmitrievsky #:
ZY onnx auf dem Mac hat mit dem Beispiel angefangen, was gut ist, ich habe die Ergebnisse noch nicht überprüft
Ist es notwendig, eine 2-dimensionale Matrix wie in Ihrem Beispiel einzugeben? Es scheint logischer zu sein, ein eindimensionales Array mit Attributen zu verwenden. Es könnte sich über die falsche Form der Matrix beschweren. Anstelle einer eindimensionalen Matrix sollten Sie zum Beispiel eine zweidimensionale Matrix angeben, bei der jeder Eintrag in der zweiten Dimension ist, d.h. verschachtelte Arrays mit je einem Wert.
.

Nun, beim Training in Python habe ich das Modell mit den ersten fünf Zeilen des Datensatzes getestet. Als ich dann ONNX in Python ausführte, testete ich auch die Ausgabe mit denselben ersten fünf Zeilen. Egal wie man es betrachtet, es ist immer noch eine Matrix. In der MT5-Variante habe ich einfach dieselben fünf Zeilen als Matrix kopiert. Und im Beispiel von Renat ist die Eingabe ebenfalls eine Matrix mit zehn Zeilen und vier Spalten.

Das Problem liegt da IMHO schon beim Laden des Modells, denn es werden negative Zahlen in den Dimensionen ausgegeben. Übrigens sollten wir uns ansehen, was in Renates Beispiel ausgegeben wird.

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
Sie können die Volatilität anstelle von Inkrementen verwenden, sie spiegelt die Marktzyklen genau wider. Und lassen Sie es durch 2 Modelle laufen, von denen eines schlechte Fälle herausfiltert (wie ich es im letzten Artikel getan habe). Die Ergebnisse sind manchmal anständig, man muss nur ein paar Mal neu trainieren. Möglicherweise bringt dieser Ansatz mehr als bestinterval.

Nein, ich spreche nur über den allgemeinen Ansatz für zyklische Variablen. Sie müssen "aufgeschnitten" werden, um sie in normale Variablen zu verwandeln. Aber das kann man auf verschiedene Weise tun, nicht unbedingt in formaler Null.

Neben der täglichen Zeit treten zyklische Variablen zum Beispiel auf, wenn man nach Gewichten für ein Portfolio aus zwei Symbolen sucht.

 
Aleksey Nikolayev LightGBM zu lernen und Modelle im if-else-Format in C zu speichern. Es ist nicht universell, aber es ist billig und sicher).
Es gibt auch ein Paket intrees, dort kann man Regeln aus vielen Dorfmodellen ziehen.
Wälder, Boosts...
 
Maxim Dmitrievsky #:
Nun für catbusta gibt es ein Beispiel für die Übersetzung in mql von Python, lgbm scheint nicht besser sein

Es gibt leichte Zweifel an der Zukunft von Yandex)

Außerdem soll sich lgbm besser in sysharp und andere Microsoft-Entwicklungen integrieren lassen, falls das plötzlich relevant wird)

 
mytarmailS #:
Es gibt auch ein intrees-Paket, in dem Sie Regeln aus vielen Dorfmodellen ziehen können.
Wälder, Boosts...

Können Sie ein Skript mit dieser Funktionalität demonstrieren?

 
Aleksey Nikolayev #:

Es gibt leichte Zweifel an der Zukunft von Yandex)

Worauf stützen sie sich?

Grund der Beschwerde: