Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 2952

 
Evgeny Dyuka #:

Si me lo permite, una pregunta similar.
(esto no es acerca de su negocio, pero específicamente sobre el tema de la MoD)

Específicamente para MO se hace:

  • Metatrader 5 plataforma de negociación
  • lenguaje MQL5
  • matemáticas matriciales en MQL5
  • integración de Python en el terminal, incluida la biblioteca de comunicación
  • integración del modelo ONNX
  • OpenCL/DirectX para el uso de GPU
  • red en la nube, incluido probador
  • ecosistema www.mql5.com en 11 idiomas

Esto está hecho para el público y se utiliza masivamente en todo el mundo.

¿Quieres comparar esto con un par de scripts copiados (como es común con los adeptos al machine learning)?

Sé racional y no te lances contra los que hacen el trabajo y lo ponen a disposición del público.

 

Quisiera añadir mis cinco kopeks y separar las moscas de las chuletas, que, por muy cualitativas que sean, no resuelven los problemas de las moscas.

En este hilo, cierta parte de los participantes tienen claro que el principal problema de los mercados financieros es su no estacionariedad, y el problema de la no estacionariedad no tiene una solución definitiva por el momento. Toda esta palabrería sobre la duración de las pruebas, el tiempo de éxito de las operaciones, todo esto es vacío y ha sido refutado repetidamente por la práctica, arruinando a los premios Nobel que no reconocieron el problema de la no estacionariedad. La existencia del problema de la no estacionariedad está perfectamente confirmada por el mercado de señales de este sitio: todas las señales murieron, sólo que algunas antes y otras mucho después.

Podemos distinguir dos enfoques para resolver el problema de la no estacionariedad de los mercados financieros:

1. La modelización de la no estacionariedad, que se intenta realizar en el marco de los modelos GARCH, de los que ya existen más de un centenar.

2. Intentar encontrar patrones en el flujo de entrada no estacionario con la esperanza de que estos patrones se repitan en el futuro. Esto se intenta en el marco del llamado "aprendizaje automático". Por ejemplo, el modelo RandomForest encuentra un mínimo de 50 patrones, con 150 patrones que agotan cualquier periodo de tiempo. Pero el siguiente paso puede cambiar el conjunto de patrones, y se necesitan esfuerzos especiales para preparar los datos de entrada de modo que estos patrones, si cambian, no cambien mucho.

Desgraciadamente, el hilo ha descendido a la discusión de los modelos en sí, aunque, según mi experiencia, no hay ningún problema en utilizar modelos (Caret shell incluye hasta 200 modelos para cualquier gusto), pero sí en preparar los datos de entrada para estos modelos. No olvidemos el lema principal de la estadística: "Basura dentro - basura fuera".

 
СанСаныч Фоменко #:

Para usted personalmente, le vuelvo a adjuntar un texto completo sobre fórmulas en un archivo PDF. Esto incluye "dependencias y fuentes".

Y sobre los matices de los cálculos, no lo hago, porque sé a ciencia cierta que las fórmulas NO tienen nada que ver con la programación, es un problema independiente, que resuelven otras personas con otra formación y en otros, círculos científicos.

Así que leed el PDF.

Gracias, le echaré un vistazo.

Hasta ahora he encontrado una respuesta directa a mi pregunta aquí - https://blog.paperspace.com/gradient-boosting-for-classification/

Gradient Boosting for Classification | Paperspace Blog
Gradient Boosting for Classification | Paperspace Blog
  • blog.paperspace.com
Machine learning algorithms require more than just fitting models and making predictions to improve accuracy. Most winning models in the industry or in competitions have been using Ensemble Techniques or Feature Engineering to perform better. Ensemble techniques in particular have gained popularity because of their ease of use compared to...
 
La referencia de la estructura de datos para ONNX no parece ser cierta. MT versión 3602.
Документация по MQL5: ONNX модели / Структуры данных
Документация по MQL5: ONNX модели / Структуры данных
  • www.mql5.com
Структуры данных - ONNX модели - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Y no hay nada sobre claves para OnnxRun() en la ayuda.
Документация по MQL5: ONNX модели / OnnxRun
Документация по MQL5: ONNX модели / OnnxRun
  • www.mql5.com
OnnxRun - ONNX модели - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
En la ayuda de ONNX no hay información sobre las funciones OnnxSetInputShape() y OnnxSetOutputShape(). No está muy claro qué deben hacer.
 
Aleksey Nikolayev #:
En la ayuda de ONNX no hay información sobre las funciones OnnxSetInputShape() y OnnxSetOutputShape(). No está muy claro qué deben hacer.


Estos métodos establecen la dimensionalidad de los datos de entrada y salida del modelo. Hoy los añadiremos a la ayuda

//+------------------------------------------------------------------+
//|                                        ONNX.Price.Prediction.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

const long  ExtOutputShape[] = {1,1};
const long  ExtInputShape [] = {1,10,4};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {
   matrix rates;
//--- получаем 10 баров
   if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
      return(-1);
//--- на вход модели должен подаваться набор вертикальных векторов OHLC
   matrix x_norm=rates.Transpose();
   vector m=x_norm.Mean(0);               // нормируем цены
   vector s=x_norm.Std(0);
   matrix mm(10,4);
   matrix ms(10,4);

   for(int i=0; i<10; i++)
     {
      mm.Row(m,i);
      ms.Row(s,i);
     }

   x_norm-=mm;
   x_norm/=ms;
//--- создаём модель
   long handle=OnnxCreateFromBuffer(model,ONNX_DEBUG_LOGS);

   if(!OnnxSetInputShape(handle,0,ExtInputShape))
     {
      Print("failed, OnnxSetInputShape error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }

   if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
     {
      Print("failed, OnnxSetOutputShape error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- запускаем модель
   matrixf x_normf;
   vectorf y_norm(1);

   x_normf.Assign(x_norm);
   if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
     {
      Print("failed, OnnxRun error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }

   Print(y_norm);
//--- обратно разнормируем цену из выходного значения
   double y_pred=y_norm[0]*s[3]+m[3];

   Print("predicted ",y_pred);
//--- завершили работу
   OnnxRelease(handle);
   return(0);
  }
//+------------------------------------------------------------------+
 
mytarmailS #:
¿Qué quieres decir?
En mi ordenador estoy prohibido por 10 años, pero desde mi teléfono estoy fuera de la prohibición)))

Probablemente tengas un "baneo por IP falsa":

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Pregunta a la administración del sitio mql5.com

Sergey Golubev, 2022.12.16 17:22

Si estás baneado y puedes hacer posts aquí, es un "fake IP ban".
Probablemente tienes una IP dinámica, y accidentalmente "cayó" en la IP baneada de alguien.
Cuando "pillo" tal ban, simplemente apago mi ordenador, apago el router, luego enciendo el router y enciendo mi ordenador.
Como resultado, mi IP cambia (y también tengo una IP dinámica), y la inscripción sobre 10 años desaparece.

...

 

La salida a MT5 del modelo ONNX entrenado en LightGBM no funciona. Errores 5808 y 5805 al establecer la forma de los parámetros. Pero el problema parece estar en la definición de las dimensiones de los parámetros - se obtienen valores negativos (resaltados en el código). Tal vez he metido la pata en algo. En Python 3.10 todo parece normal.

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

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

Salida 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)
 
Parece un poco pronto para cambiar a python. Es mejor aprender la versión CLI de LightGBM y guardar los modelos en formato if-else en C. No es universal, pero es barata y áspera)