English Русский Deutsch 日本語
preview
Aprendizaje automático y Data Science (Parte 40): Uso de retrocesos de Fibonacci en datos de aprendizaje automático

Aprendizaje automático y Data Science (Parte 40): Uso de retrocesos de Fibonacci en datos de aprendizaje automático

MetaTrader 5Asesores Expertos |
63 0
Omega J Msigwa
Omega J Msigwa

Contenido


El origen de los números de Fibonacci

Los números de Fibonacci se remontan al matemático medieval Leonardo de Pisa, también conocido como Fibonacci.

En su libro titulado «Liber Abaci», publicado en 1202, Fibonacci presentó la sucesión numérica que hoy se conoce como la sucesión de Fibonacci. La sucesión comienza con 0 y 1, y cada número subsiguiente en la serie es la suma de los dos números anteriores.

Esta sucesión es poderosa, ya que aparece en muchos fenómenos naturales, incluidos los patrones de crecimiento de las plantas y los animales.

En biología, aunque no sea perfecta, la espiral logarítmica que se observa en las conchas de algunos animales e insectos se aproxima a los números de Fibonacci.

El patrón de crecimiento similar al de Fibonacci también se puede observar en la población de conejos y en los árboles genealógicos de las abejas.

Los números de Fibonacci también pueden observarse en la composición del ADN de algunos mamíferos y seres humanos.

Fuente de la imagen: unsplash.com

Estas cifras son universales, ya que se han observado prácticamente en todas partes. A continuación, se presentan algunos de los términos comunes que encontrará al trabajar con números de Fibonacci.

Sucesión de Fibonacci

En matemáticas, una sucesión de Fibonacci es una sucesión en la que cada elemento es la suma de los dos elementos que lo preceden. Los números que forman parte de una sucesión de Fibonacci se conocen como números de Fibonacci.

Sucesión de Fibonacci, rectángulo áureo

La sucesión de Fibonacci se puede expresar mediante la siguiente ecuación.

Fórmula de la sucesión de Fibonacci

Donde n es mayor que 1 (n > 1).

La proporción áurea

Este es un concepto matemático que describe la relación entre dos cantidades, donde la razón entre la cantidad menor y la mayor es la misma que la razón entre la mayor y la suma de ambas.

La proporción áurea es aproximadamente igual a 1,6180339887 y se representa con la letra griega phi (φ).

La proporción áurea, representada por φ, es el valor al que tiende la razón entre términos consecutivos de la sucesión de Fibonacci.

Cuando se divide el número mayor por el menor, el resultado es un valor cercano a Phi. Cuanto más se avanza en la sucesión de Fibonacci, más se acercan las respuestas al número Phi. Pero el resultado nunca será exactamente igual a Phi. Esto se debe a que Phi no se puede expresar como una fracción. ¡Es irracional!

Ilustración del cálculo de la proporción áurea

Este número se ha observado en diversas estructuras naturales y artificiales, y se considera un principio universal de belleza y armonía.


Comprensión de los niveles de retroceso de Fibonacci desde el punto de vista del trading

Los niveles de retroceso de Fibonacci son líneas horizontales que indican los posibles niveles de soporte y resistencia en los que el precio podría invertir su tendencia; se calculan utilizando los principios de los números de Fibonacci que hemos comentado anteriormente.

Se trata de una herramienta habitual que los operadores utilizan en MetaTrader 5 con diversos fines, como definir niveles de stop loss y take profit y detectar líneas de soporte y resistencia que sirven para identificar los puntos en los que es más probable que los precios cambien de tendencia.

En MetaTrader 5, se encuentra en la pestaña «Insertar» > «Objetos» > «Herramientas de Fibonacci».

Herramienta de retrocesos de Fibonacci en MT5

A continuación se muestra la herramienta de retrocesos de Fibonacci aplicada al par EURUSD en el gráfico de 1 hora.

Aunque la herramienta de retrocesos de Fibonacci parece fiable a la hora de proporcionar niveles útiles para detectar cambios de tendencia en el mercado y definir niveles de stop loss y take profit, analicemos la eficacia de los niveles de Fibonacci en el ámbito del aprendizaje automático y la inteligencia artificial (IA), la proporción áurea (61,8 o 0,618), para ser más concretos.

Exploremos diversas formas de crear niveles de Fibonacci matemáticamente y utilicémoslos para crear una variable objetivo que los modelos de aprendizaje automático puedan usar para comprender y predecir la dirección del mercado.


Creación de una variable objetivo mediante retrocesos de Fibonacci

Para entrenar un modelo que comprenda las relaciones en nuestros datos mediante el aprendizaje automático supervisado, necesitamos una variable objetivo bien definida. Dado que un nivel de Fibonacci es simplemente un número que representa un determinado nivel de precio, podemos recopilar el precio de mercado en el nivel de Fibonacci que necesitamos y usarlo como variable objetivo para un problema de regresión.

Para un problema de clasificación, creamos las etiquetas de clase basándonos en los movimientos del mercado según las líneas de Fibonacci. Es decir, si el mercado avanza ciertas barras, superando el nivel de Fibonacci calculado en una tendencia alcista, podemos considerar que es una señal alcista (indicada por 1), y de lo contrario, si el mercado se mueve a la baja superando el nivel de Fibonacci que establecimos, podemos considerar que es una señal bajista (indicada por 0). Podemos asignar cualquier otro caso a la categoría sin señal (indicada por -1).

Para un problema de clasificación

Importaciones.

import pandas as pd
import numpy as np

Funciones.

def create_fib_clftargetvar(price: pd.Series, lookback_window: int=10, lookahead_window: int=10, fib_level: float=0.618):
    """
    Creates a target variable based on Fibonacci breakthroughs in price data.
    
    Parameters:
    - price: pd.Series of price data (close, open, high, or low)
    - lookback_window: int - number of past periods to calculate high/low
    - lookahead_window: int - number of future periods to assess breakout
    - fib_level: float - Fibonacci retracement level (e.g. 0.618)
    
    Returns:
    - pd.Series: with values
        1 => Bullish fib level reached
        0 => Bearish fib level reached
       -1 => False breakthrough or no fib hit
    """


    high = price.rolling(lookback_window).max()
    low = price.rolling(lookback_window).min()

    fib_level_value = high - (high - low) * fib_level # calculate the Fibonacci level in market price
    
    price_ahead = price.shift(-lookahead_window) # future price values
    
    target_var = []
    
    for i in range(len(price)):
        
        if np.isnan(price_ahead.iloc[i]) or np.isnan(fib_level_value.iloc[i]) or np.isnan(price.iloc[i]):
            target_var.append(np.nan)
            continue
        
        # let's detect bull and bearish movement afterwards
        
        if price_ahead.iloc[i] > price.iloc[i]: # The market went bullish
            if price_ahead.iloc[i] >= fib_level_value.iloc[i]:
                target_var.append(1) # bullish Fibonacci target reached
            else:
                target_var.append(-1) # false breakthrough
            
        else: # The market went bearish
            if price_ahead.iloc[i] <= fib_level_value.iloc[i]:
                target_var.append(0) # bearish Fibonacci target reached
            else:
                target_var.append(-1) # false breakthrough
                
    return target_var

El nivel de Fibonacci del mercado se calcula utilizando la siguiente fórmula.

fib_level_value = high - (high - low) * fib_level

Dado que se trata de un problema de clasificación en el que queremos predecir la reacción del mercado basándonos en el nivel de Fibonacci anterior, debemos anticiparnos al futuro y detectar una tendencia. Posteriormente, comprobamos si el precio futuro, basado en la ventana de previsión, cruzó por encima del nivel de Fibonacci (para una tendencia alcista) o por debajo (para una tendencia bajista) para generar señales de compra o venta, respectivamente. Se asignará una señal neutral cuando el precio no alcance el nivel de Fibonacci en ninguna de las dos direcciones.

Vamos a crear la variable objetivo con esta función y añadir el resultado al DataFrame.

df["Fib signals"] = create_fib_clftargetvar(price=df["Close"], 
                                             lookback_window=10, 
                                             lookahead_window=5,
                                             fib_level=0.618)

df.dropna(inplace=True) # drop nan(s) caused by the shifting operation

df

Resultado.

Open High Low Close Fib signals
9 1.3492 1.3495 1.3361 1.3362 0.0
10 1.3364 1.3405 1.3350 1.3371 0.0
11 1.3370 1.3376 1.3277 1.3300 0.0
12 1.3302 1.3313 1.3248 1.3279 -1.0
13 1.3279 1.3293 1.3260 1.3266 0.0


En el caso de un problema de regresión

def create_fib_regtargetvar(price: pd.Series, lookback_window: int=10, fib_level: float=0.618):
    """
    This function helps us in calculating the target variable based on fibonacci breakthroughs given a price
    
    price:
        Can be close, open, high, low
    
    """
    
    high = price.rolling(lookback_window).max()
    low = price.rolling(lookback_window).min()

    return high - (high - low) * fib_level

Para un problema de regresión, no necesitamos desplazar los valores para obtener información futura porque en el trading manual, el nivel de Fibonacci calculado en la ventana anterior (lookback_window) es el que usamos para comparar si los precios futuros lo han cruzado por encima o por debajo.

Nuestro objetivo es entrenar el modelo regresor para que pueda predecir el siguiente valor del nivel de Fibonacci basándose en la ventana de retrospectiva (lookback_window).

df["Fibonacci Level"] = create_fib_regtargetvar(price=df["Close"], 
                                         lookback_window=10,
                                         fib_level=0.618)

df.dropna(inplace=True)

df.head(5)

A continuación se muestra el Dataframe resultante después de haberle añadido la columna del nivel de Fibonacci.

Open High Low Close Fibonacci Level
9 1.3492 1.3495 1.3361 1.3362 1.343840
10 1.3364 1.3405 1.3350 1.3371 1.342923
11 1.3370 1.3376 1.3277 1.3300 1.339015
12 1.3302 1.3313 1.3248 1.3279 1.337717
13 1.3279 1.3293 1.3260 1.3266 1.335195



Entrenamiento de un modelo clasificador con una variable objetivo basada en Fibonacci

Empezando por la variable de clasificación denominada «Fib signals», vamos a entrenar con estos datos un modelo sencillo RandomForestClassifier.

Importaciones.

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.utils.class_weight import compute_class_weight
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import RobustScaler

División entre datos de entrenamiento y de prueba.

X = df.drop(columns=[
    "Fib signals"
])

y = df["Fib signals"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, shuffle=False)

El modelo.

class_weights = compute_class_weight('balanced', classes=np.unique(y_train), y=y_train)
weight_dict = dict(zip(np.unique(y_train), class_weights))

model = RandomForestClassifier(n_estimators=100,
                               min_samples_split=2,
                               max_depth=10,
                               class_weight=weight_dict,
                               random_state=42
                              )

clf_pipeline = Pipeline(steps=[
    ("scaler", RobustScaler()),
    ("rfc", model)
])

clf_pipeline.fit(X_train, y_train)

El modelo Random Forest, al estar basado en árboles de decisión, no necesita necesariamente escalado; aun así, como los valores Open, High, Low y Close (OHLC) son variables continuas y pueden introducir valores atípicos con el paso del tiempo, RobustScaler puede ayudar a atenuar ese problema en los datos.

Finalmente, podemos probar este modelo clasificador tanto en las muestras de entrenamiento como en las de prueba.

y_train_pred = clf_pipeline.predict(X_train)

print("Train Classification report\n",classification_report(y_train, y_train_pred))

y_test_pred = clf_pipeline.predict(X_test)

print("Test Classification report\n",classification_report(y_test, y_test_pred))

Resultado.

Train Classification report
               precision    recall  f1-score   support

        -1.0       0.53      0.55      0.54      4403
         0.0       0.59      0.64      0.61      7122
         1.0       0.67      0.60      0.64      8294

    accuracy                           0.61     19819
   macro avg       0.60      0.60      0.60     19819
weighted avg       0.61      0.61      0.61     19819

Test Classification report
               precision    recall  f1-score   support

        -1.0       0.22      0.22      0.22      1810
         0.0       0.38      0.60      0.46      3181
         1.0       0.42      0.20      0.27      3504

    accuracy                           0.35      8495
   macro avg       0.34      0.34      0.32      8495
weighted avg       0.36      0.35      0.33      8495

El resultado parece impresionante en la muestra de entrenamiento, pero terrible en la muestra de prueba. Esto indica que el modelo no puede comprender los patrones presentes en una muestra distinta a aquella con la que fue entrenado. 

Esto podría deberse a varios factores, como la falta de características que ayuden a capturar patrones significativos presentes en el mercado (las características OHLC por sí solas podrían ser insuficientes), o tal vez la forma rudimentaria de detectar una tendencia basada en la siguiente barra de lookahead_window utilizada al crear la variable objetivo sea mala, lo que provoca que el modelo no detecte barras intermedias en las que el precio podría haber cruzado el nivel de Fibonacci. 

Dado que este proceso tenía como objetivo entrenar un modelo para predecir si el precio futuro cruzará el nivel de Fibonacci, este resultado del informe de clasificación podría ser engañoso, ya que no tiene por qué ser perfecto. Por ahora, seguiremos adelante con ello, mientras analizamos el resultado con los datos de prueba en el entorno real de negociación.

Guardemos este modelo entrenado en formato ONNX para su uso externo en el lenguaje de programación MQL5.

import skl2onnx
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
# Define the initial type of the model’s input
initial_type = [('input', FloatTensorType([None, X_train.shape[1]]))]

# Convert the pipeline to ONNX
onnx_model = convert_sklearn(clf_pipeline, initial_types=initial_type, target_opset=13)

# Save the ONNX model to a file
with open(f"{symbol}.{timeframe}.Fibonnacitarg-RFC.onnx", "wb") as f:
    f.write(onnx_model.SerializeToString())


Entrenamiento de un modelo de regresión con una variable objetivo basada en Fibonacci

Se pueden seguir los mismos principios al entrenar un modelo de regresión; en este caso, solo difieren el tipo de modelo y la variable de respuesta.

Importaciones.

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score

División entre datos de entrenamiento y de prueba.

X = df.drop(columns=[
    "Fibonacci Level"
])

y = df["Fibonacci Level"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, shuffle=False)

El modelo de regresión Random Forest.

model = RandomForestRegressor(n_estimators=100,
                               min_samples_split=2,
                               max_depth=10,
                               random_state=42
                              )

reg_pipeline = Pipeline(steps=[
    ("scaler", RobustScaler()),
    ("rfr", model)
])

reg_pipeline.fit(X_train, y_train)

Finalmente, podemos probar el modelo de regresión tanto en las muestras de entrenamiento como en las de prueba.

y_train_pred = reg_pipeline.predict(X_train)

print("Train accuracy score:",r2_score(y_train, y_train_pred))

y_test_pred = reg_pipeline.predict(X_test)

print("Test accuracy score:",r2_score(y_test, y_test_pred))

Resultado.

Train accuracy score: 0.9990321734526452
Test accuracy score: 0.9565827587164671

No podemos extraer demasiadas conclusiones solo a partir de este valor del coeficiente de determinación R2 en un modelo de regresión, aunque un 0,9565 en la muestra de prueba puede considerarse aceptable. 

Guardemos este modelo entrenado en formato ONNX para su uso externo en el lenguaje de programación MQL5.

# Define the initial type of the model’s input
initial_type = [('input', FloatTensorType([None, X_train.shape[1]]))]

# Convert the pipeline to ONNX
onnx_model = convert_sklearn(reg_pipeline, initial_types=initial_type, target_opset=13)

# Save the ONNX model to a file
with open(f"{symbol}.{timeframe}.Fibonnacitarg-RFR.onnx", "wb") as f:
    f.write(onnx_model.SerializeToString())

Ahora, pongamos a prueba la capacidad predictiva de estos dos modelos en un entorno comercial real.


Prueba de modelos de aprendizaje automático basados en Fibonacci en el Probador de estrategias

Comenzamos agregando modelos de bosques aleatorios en formato ONNX como recursos a nuestro Asesor Experto (EA).

#resource "\\Files\\EURUSD.PERIOD_H4.Fibonnacitarg-RFC.onnx" as uchar rfc_onnx[]
#resource "\\Files\\EURUSD.PERIOD_H4.Fibonnacitarg-RFR.onnx" as uchar rfr_onnx[]

A continuación, importamos una biblioteca que nos ayuda a cargar tanto el clasificador de bosque aleatorio como un modelo de regresión en formato ONNX.

#include <Random Forest.mqh>

CRandomForestClassifier rfc;
CRandomForestRegressor rfr;

Necesitamos los mismos valores de ventana de anticipación y de retroceso que los que aplicamos en los datos de entrenamiento. Estos valores resultan útiles para determinar cuánto tiempo mantener las posiciones y cuándo cerrarlas.

input group "Models configs";

input target_var_type fib_target = CLASSIFIER; //Model type
input int lookahead_window = 5;
input int lookback_window = 10;

La variable de entrada fib_target nos ayudará a seleccionar el tipo de modelo a utilizar.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Setting the symbol and timeframe
   
   if (!MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_DEBUG))
     if (!ChartSetSymbolPeriod(0, symbol_, timeframe_))
       {
         printf("%s failed to set symbol %s and timeframe %s",__FUNCTION__,symbol_,EnumToString(timeframe_));
         return INIT_FAILED;
       }

//---

   m_trade.SetExpertMagicNumber(magic_number);
   m_trade.SetDeviationInPoints(slippage);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
   
//---
   
   switch(fib_target)
     {
      case  REGRESSOR:
      
         if (!rfr.Init(rfr_onnx))
            {
               printf("%s failed to initialize the random forest regressor",__FUNCTION__);
               return INIT_FAILED;
            }
                    
        break;
      case CLASSIFIER:
            
         if (!rfc.Init(rfc_onnx))
            {
               printf("%s failed to initialize the random forest classifier",__FUNCTION__);
               return INIT_FAILED;
            }
            
        break;
     }

//---

   return(INIT_SUCCEEDED);
  }

Dentro de la función OnTick, obtenemos señales del modelo después de pasar los valores OHLC tal como se utilizaron en los datos de entrenamiento.

Esas señales se utilizan posteriormente para abrir operaciones de compra y venta.

void OnTick()
  {
//--- Getting signals from the model
   
   if (!isNewBar())
      return;
      
    vector x = {
       iOpen(Symbol(), Period(), 1),
       iHigh(Symbol(), Period(), 1),
       iLow(Symbol(), Period(), 1),
       iClose(Symbol(), Period(), 1)
    };
    
    long signal = 0;
    
    switch(fib_target)
      {
       case  REGRESSOR:
         {
            double pred_fib = rfr.predict(x);         
            signal = pred_fib>iClose(Symbol(), Period(), 0)?1:0; //If the predicted fibonacci is greater than the current close price, thats bullish otherwise thats bearish signal
         }
         
         break;
       case CLASSIFIER:
       
         signal = rfc.predict(x).cls;         
         
         break;
      }

//--- Trading based on the signals received from the model
   
   MqlTick ticks;
   if (!SymbolInfoTick(Symbol(), ticks))
      {
         printf("Failed to obtain ticks information, Error = %d",GetLastError());
         return;
      }
      
   double volume_ = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   
   if (signal == 1)
     {        
        if (!PosExists(POSITION_TYPE_BUY) && !PosExists(POSITION_TYPE_SELL))  
            m_trade.Buy(volume_, Symbol(), ticks.ask);
     }
     
   if (signal == 0)
     {        
        if (!PosExists(POSITION_TYPE_SELL) && !PosExists(POSITION_TYPE_BUY))  
             m_trade.Sell(volume_, Symbol(), ticks.bid);
     } 

//--- Closing trades 
   
   switch(fib_target)
     {
      case CLASSIFIER:
        
        CloseTradeAfterTime((Timeframe2Minutes(Period())*lookahead_window)*60); //Close the trade after a certain lookahead and according the the trained timeframe  
        
        break;
        
      case REGRESSOR:
      
        CloseTradeAfterTime((Timeframe2Minutes(Period())*lookback_window)*60); //Close the trade after a certain lookahead and according the the trained timeframe
        
        break;
     }
  }

El cierre de las operaciones depende del tipo de modelo seleccionado y de los valores de lookahead_window y lookback_window.

Cuando el modelo seleccionado sea un clasificador, las operaciones se cerrarán una vez que hayan transcurrido en el marco temporal actual un número de barras igual a lookahead_window.

Cuando el modelo seleccionado sea un regresor, las operaciones se cerrarán una vez que hayan transcurrido en el marco temporal actual un número de barras igual a lookback_window.

Esto se debe a la forma en que hemos creado las variables de destino dentro del script de Python.

Por último, podemos probar estos dos modelos en el Probador de estrategias.

Dado que los datos de entrenamiento se recopilaron entre el 1 de enero de 2005 y el 1 de enero de 2023, probemos los resultados del modelo para el periodo comprendido entre el 1 de enero de 2023 y el 31 de diciembre de 2023 (datos fuera de la muestra).

Tipo de modelo: Clasificador

Tipo de modelo: Regresor

El modelo de regresión obtuvo unos resultados excepcionales, teniendo en cuenta que se trata de datos fuera de la muestra, con una tasa de acierto del 57,42 %. 

Para simplificar las cosas y que el modelo de regresión resultara útil, dentro del robot de trading convertí el resultado continuo proporcionado por un modelo de regresión de bosque aleatorio en una solución binaria.

signal = pred_fib>iClose(Symbol(), Period(), 0)?1:0; //If the predicted Fibonacci is greater than the current close price, that's bullish otherwise that's bearish signal

Esto cambia por completo la forma en que interpretamos el nivel de Fibonacci previsto porque, a diferencia de lo que solemos hacer en el trading manual, solemos abrir una operación al final de la tendencia una vez recibida una señal de confirmación. Después, fijamos niveles objetivo en algún nivel de Fibonacci, normalmente el 61,8 %.

Al utilizar este enfoque, asumimos que nuestros modelos de aprendizaje automático ya han comprendido este patrón durante un período de tiempo determinado, tanto retrospectivo como prospectivo, utilizado en los datos de entrenamiento, por lo que simplemente abrimos algunas operaciones y las mantenemos de acuerdo con el número de barras especificado.

La clave aquí son los valores de las ventanas de anticipación y retrospectiva, sobre todo porque, cuando utilizamos la herramienta de Fibonacci en el trading manual, no tenemos en cuenta el número de barras que se deben utilizar para sus cálculos (valores mínimos y máximos); por lo general, colocamos la herramienta donde nos parece más adecuado.

Si bien la herramienta funciona bien en las operaciones manuales, nos engaña haciéndonos creer que la tenemos en el lugar correcto, cuando en realidad solo la estamos colocando donde queremos sin tener en mente reglas claras.

Estos dos valores (ventanas de anticipación y de retroceso) son los que debemos optimizar si queremos explorar la efectividad de los niveles de Fibonacci en la creación de la variable objetivo y para su uso en el aprendizaje automático en general. 


Reflexiones finales

Los retrocesos y niveles de Fibonacci son técnicas poderosas para crear la variable objetivo para el aprendizaje automático, como lo ilustra el informe del probador de estrategias anterior producido por el modelo de regresión. Incluso con tan pocos predictores como los valores de Apertura, Máximo, Mínimo y Cierre, que no ofrecen muchos patrones, los modelos podrían detectar algunos patrones valiosos y obtener buenos resultados en comparación con las conjeturas aleatorias, basándose en la información aprendida de los niveles de Fibonacci.

Independientemente de cómo se analicen los resultados, en mi opinión son impresionantes.

Tal como está planteada, esta idea no está lo suficientemente pulida; necesitamos añadir más características a nuestros datos, como lecturas de indicadores y confirmaciones de estrategias de negociación, para ayudar a nuestro modelo basado en Fibonacci a capturar patrones complejos que se producen en el mercado. Además, no dude en explorar otros niveles de Fibonacci.

Cuando esta idea se perfeccione aún más, considero que resultará muy eficaz en los mercados de valores e índices, donde se producen retrocesos con regularidad en algunas tendencias alcistas a largo plazo, así como en marcos temporales de mayor alcance, como el diario, en el que los datos son «menos ruidosos».


Tabla de archivos adjuntos

Nombre y ruta del archivo Descripción y uso
Experts\Fibonacci AI based.mq5 El principal asesor experto para la prueba de modelos de aprendizaje automático.
Include\Random Forest.mqh Contiene clases para cargar y desplegar el clasificador y el regresor de bosque aleatorio presentes en formato .ONNX.
Files\*.onnx Modelos de aprendizaje automático en formato ONNX.
Files\*.csv  Archivos CSV que contienen conjuntos de datos que se utilizarán para entrenar modelos de aprendizaje automático. 
Python\fibbonanci-in-ml.ipynb
Script de Python para procesar los datos y entrenar los modelos de bosque aleatorio.

Fuentes y referencias

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/18078

Archivos adjuntos |
Attachments.zip (1525.28 KB)
Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
Aprendizaje automático y Data Science (Parte 39): Noticias + Inteligencia artificial, ¿apostarías por ella? Aprendizaje automático y Data Science (Parte 39): Noticias + Inteligencia artificial, ¿apostarías por ella?
Las noticias impulsan los mercados financieros, especialmente las publicaciones importantes como las de nóminas no agrícolas (NFP, por sus siglas en inglés). Todos hemos sido testigos de cómo un solo titular puede desencadenar fuertes fluctuaciones de precios. En este artículo, profundizamos en la poderosa intersección entre los datos de noticias y la Inteligencia Artificial.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Del básico al intermedio: FileSave y FileLoad Del básico al intermedio: FileSave y FileLoad
En este artículo se explicarán y explorarán algunas formas de trabajar con las funciones de la biblioteca FileSave y FileLoad. Aunque mucha gente las considera poco prometedoras, debido a algunas limitaciones o dificultades que generan en ciertos escenarios, entender correctamente cómo funcionan estas dos funciones puede ahorrarte mucho trabajo en determinados momentos. Además, son una excelente forma de trabajar con archivos de log.