L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 2953

 

L'output su MT5 del modello ONNX addestrato in LightGBM non funziona. Errori 5808 e 5805 quando si imposta la forma dei parametri. Ma il problema sembra essere la definizione delle dimensioni dei parametri: si ottengono valori negativi (evidenziati nel codice). Forse ho sbagliato qualcosa. In Python 3.10 tutto sembra essere normale.

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

Apprendimento 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')

Output 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)
 
Mi sembra un po' presto per passare a python. È meglio imparare la versione CLI di LightGBM e salvare i modelli in formato if-else in C. Non è universale, ma è economico e veloce)
 
Mi sono ricordato della discussione sui segni ciclici come l'ora del giorno. IMHO, dovremmo tradurli in segni regolari, semplicemente selezionando il punto di partenza in cui si verifica il cambiamento più forte nel possibile pattern. Si possono usare considerazioni di mercato (l'orario della sessione, in questo caso) o qualcosa di simile, oppure addestrare un modello ad albero e prendere il punto del primo split su questa caratteristica.
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
Mi sono ricordato della discussione sui segni ciclici come l'ora del giorno. IMHO, dovremmo tradurli in segnali regolari, semplicemente selezionando il punto di partenza in cui si verifica il cambiamento più forte nel possibile pattern. Si possono utilizzare considerazioni di mercato (l'orario della sessione, in questo caso) o qualcosa di simile, oppure addestrare un modello ad albero e prendere il punto del primo split basato su questa caratteristica.
Si può prendere la volatilità invece degli incrementi, che riflette accuratamente i cicli di mercato. E farli passare attraverso due modelli, uno dei quali filtra i casi negativi (come ho fatto nell'ultimo articolo). I risultati sono a volte decenti, basta riqualificarsi un po' di volte. Potenzialmente questo approccio darà più di bestinterval.

ZY onnx su mac è partito dall'esempio, che è ottimo, ma non ho ancora controllato i rimbalzi.
È necessario inserire una matrice bidimensionale come nel tuo esempio? Sembra più logico usare un array monodimensionale con attributi. Potrebbe lamentarsi della forma sbagliata della matrice. Per esempio, invece di una matrice monodimensionale si dovrebbe fornire una matrice bidimensionale, in cui ogni voce è nella seconda dimensione, cioè matrici annidate contenenti 1 valore ciascuna.

C'è un esempio di traduzione in mql da python per catbust, lgbm non sembra essere migliore
 
Maxim Dmitrievsky #:
ZY onnx su mac è partito dall'esempio, il che va bene, non ho ancora controllato i rimbalzi.
È necessario inserire una matrice bidimensionale come nel vostro esempio? Sembra più logico usare un array monodimensionale con attributi. Potrebbe lamentarsi della forma errata della matrice. Ad esempio, invece di una matrice monodimensionale, si dovrebbe fornire una matrice bidimensionale, in cui ogni voce è nella seconda dimensione, cioè array annidati contenenti 1 valore ciascuno.
.

Durante l'addestramento in python, ho testato il modello sulle prime cinque righe del dataset. Poi, quando ho eseguito ONNX in python, ho testato l'output sulle stesse prime cinque righe. Comunque la si guardi, si tratta sempre di una matrice. Nella variante MT5 ho semplicemente copiato queste stesse cinque righe come matrice. E nell'esempio di Renat, anche l'input è una matrice di dieci righe e quattro colonne.

Il problema, IMHO, si presenta già al momento del caricamento del modello, perché vengono emessi numeri negativi nelle dimensioni. A proposito, dovremmo vedere cosa viene emesso nell'esempio di Renate.

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
Si può prendere la volatilità invece degli incrementi, che riflette accuratamente i cicli di mercato. E farli passare attraverso due modelli, uno dei quali filtra i casi negativi (come ho fatto nell'ultimo articolo). I risultati sono a volte decenti, basta riqualificarsi un po' di volte. Potenzialmente questo approccio può dare risultati superiori a bestinterval.

No, sto solo parlando dell'approccio generale alle variabili cicliche. Devono essere "affettate" per trasformarle in variabili ordinarie. Ma si può fare in diversi modi, non necessariamente in modo formale zero.

Oltre all'ora giornaliera, le variabili cicliche si presentano, ad esempio, quando si cercano i pesi per un portafoglio di due simboli.

 
Aleksey Nikolayev LightGBM e salvare i modelli nel formato if-else in C. Non è universale, ma è economico e veloce).
Esiste anche un pacchetto intrees, da cui si possono estrarre le regole di molti modelli di villaggio.
Forze, boost...
 
Maxim Dmitrievsky #:
Per catbusta c'è un esempio di traduzione in mql da python, lgbm sembra non essere migliore

Ci sono lievi dubbi sul futuro di Yandex)

Inoltre, lgbm dovrebbe integrarsi meglio con sysharp e altre creazioni microsoft, se improvvisamente diventerà rilevante)

 
mytarmailS #:
C'è anche il pacchetto intrees, dove è possibile estrarre le regole da molti modelli di villaggio.
Forre, potenziare...

Puoi dimostrare uno script con questa funzionalità?

 
Aleksey Nikolayev #:

Ci sono lievi dubbi sul futuro di Yandex)

Su cosa si basano?

Motivazione: