L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 2953

 

La sortie vers MT5 d'un modèle ONNX entraîné avec LightGBM ne fonctionne pas. Erreurs 5808 et 5805 lors de la définition de la forme des paramètres. Mais le problème semble se situer au niveau de la définition des dimensions des paramètres - des valeurs négatives sont obtenues (surlignées dans le code). J'ai peut-être fait une erreur. Avec Python 3.10, tout semble normal.

Sortie MQL5 :

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);
  }

Apprentissage en 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')

Sortie en 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)
 
Il semble un peu tôt pour passer à python. Il est préférable d'apprendre la version CLI de LightGBM et de sauvegarder les modèles au format if-else en C. Ce n'est pas universel, mais c'est bon marché et facile à utiliser)
 
Je me suis souvenu de la discussion sur les signes cycliques tels que l'heure de la journée. Selon moi, nous devrions les traduire en signes réguliers, simplement en sélectionnant le point de départ où se produit le changement le plus important dans le modèle possible. Vous pouvez soit utiliser des considérations de marché (horaire de la séance, dans ce cas) ou quelque chose comme ça, soit former un modèle d'arbre et prendre le point de la première scission sur cette caractéristique.
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
Je me suis souvenu de la discussion sur les signes cycliques tels que l'heure de la journée. Selon moi, nous devrions les traduire en signes réguliers, simplement en sélectionnant le point de départ où se produit le changement le plus important dans le modèle possible. Vous pouvez soit utiliser des considérations de marché (horaire de la séance, dans ce cas) ou quelque chose comme ça, soit former un modèle d'arbre et prendre le point de la première division sur la base de cette caractéristique.
Vous pouvez utiliser la volatilité au lieu des incréments, car elle reflète fidèlement les cycles du marché. Vous pouvez également utiliser deux modèles, dont l'un filtre les mauvais cas (comme je l'ai fait dans le dernier article). Les résultats sont parfois satisfaisants, il suffit de se réentraîner plusieurs fois. Potentiellement, cette approche donnera plus que le meilleur intervalle.

ZY onnx on mac a commencé à partir de l'exemple, ce qui est cool, je n'ai pas encore vérifié les boustings.
Est-il nécessaire d'entrer une matrice à 2 dimensions comme dans votre exemple ? Il semble plus logique d'utiliser un tableau unidimensionnel avec des attributs. Il se peut que le programme se plaigne de la mauvaise forme de la matrice. Par exemple, au lieu d'une matrice unidimensionnelle, vous devriez donner une matrice bidimensionnelle, où chaque entrée est dans la deuxième dimension, c'est-à-dire des tableaux imbriqués contenant 1 valeur chacun.

Il existe un exemple de traduction vers mql à partir de python pour catbust, lgbm ne semble pas être meilleur
 
Maxim Dmitrievsky #:
ZY onnx sur mac a démarré à partir de l'exemple, ce qui est cool, je n'ai pas encore vérifié les rebondissements.
Est-il nécessaire de saisir une matrice à 2 dimensions comme dans votre exemple ? Il semble plus logique d'utiliser un tableau unidimensionnel avec des attributs. Il se peut que le programme se plaigne de la mauvaise forme de la matrice. Par exemple, au lieu d'une matrice unidimensionnelle, vous devriez donner une matrice bidimensionnelle, où chaque entrée est dans la deuxième dimension, c'est-à-dire des tableaux imbriqués contenant 1 valeur chacun.
.

Lors de l'entraînement en python, j'ai testé le modèle sur les cinq premières lignes de l'ensemble de données. Ensuite, lorsque j'ai exécuté ONNX en python, j'ai également testé la sortie sur les cinq premières lignes. Quelle que soit la façon dont vous le regardez, il s'agit toujours d'une matrice. Dans la variante MT5, j'ai simplement copié ces mêmes cinq lignes en tant que matrice. Et dans l'exemple de Renat, l'entrée est également une matrice de dix lignes et quatre colonnes.

Le problème, IMHO, se pose déjà lors du chargement du modèle, car les nombres négatifs dans les dimensions sont édités. D'ailleurs, nous devrions voir ce qui sera produit dans l'exemple de Renate.

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
Vous pouvez prendre la volatilité au lieu des incréments, elle reflète fidèlement les cycles du marché. Vous pouvez également utiliser deux modèles, dont l'un filtre les mauvais cas (comme je l'ai fait dans le dernier article). Les résultats sont parfois satisfaisants, il suffit de se réentraîner plusieurs fois. Potentiellement, cette approche donnera de meilleurs résultats que le meilleur intervalle.

Non, je parle simplement de l'approche générale des variables cycliques. Il faut les "découper" pour les transformer en variables ordinaires. Mais on peut le faire de différentes manières, pas nécessairement en zéro formel.

Outre l'heure quotidienne, les variables cycliques apparaissent, par exemple, lorsque l'on recherche les pondérations d'un portefeuille composé de deux symboles.

 
Aleksey Nikolayev LightGBM et sauvegarder les modèles au format if-else en C. Ce n'est pas universel, mais c'est bon marché et rapide).
Il y a aussi un package intrees, qui permet d'extraire les règles de nombreux modèles de villages.
Forêts, boosts...
 
Maxim Dmitrievsky #:
Pour catbusta, il y a un exemple de traduction en mql à partir de python, lgbm ne semble pas être meilleur.

Il y a de légers doutes sur l'avenir de Yandex)

De plus, lgbm est censé mieux s'intégrer avec sysharp et d'autres créations de microsoft, si cela devient soudainement pertinent)

 
mytarmailS #:
Il y a aussi le paquet intrees, où vous pouvez tirer des règles de plusieurs modèles de villages.
Forêts, boosts...

Pouvez-vous nous montrer un script avec cette fonctionnalité ?

 
Aleksey Nikolayev #:

Il y a de légers doutes sur l'avenir de Yandex)

Sur quoi se basent-ils ?