Aprendizaje automático (Lenguaje R | Python)
A pesar de tener unos años de haber sido publicado la información contenida nos parece excelente y nos puede ayudar a aclarar el terreno que estamos pisando cuando negociamos en el mercado financiero, la orden del día son las máquinas es por ello que el mercado a veces parece más errático que nunca pero la realidad es que las operaciones son tan rápidas debido a la presencia de los sistemas automatizados que da esa impresión pero al final la oferta y la demanda es la que manda, el artículo fue traducido por nuestro equipo de trabajo, a continuación la transcripción, esperamos la disfrute tanto como nosotros:
Durante el año pasado hemos escrito varias historias sobre el uso del aprendizaje automático para el trading. Desarrollar programas de trading con inteligencia artificial no es fácil, no solo porque es un trabajo duro desarrollar algo predictivo sino también por las limitadas herramientas dentro de las mejores plataformas de trading para el aprendizaje automático.
Otros lenguajes de programación disponen de herramientas para la pronosticación de series temporales y el aprendizaje automático. Los dos principales son el lenguaje R y Python. R no tiene una buena interfaz para desarrollar y probar los sistemas de trading de la manera que los traders desearían, aunque hay muchas bibliotecas que intentan permitir el backtesting de los sistemas de trading y la elaboración de gráficos de los datos del mercado. El backtesting en Python es algo mejor, también tiene muchas bibliotecas de aprendizaje automático, pero no tiene tan buenas bibliotecas de predicción estadística como tiene R.
Una solución para esto es que varias plataformas de negociación han añadido una interfaz para R, nativa del lenguaje, de modo que siempre se puede pasar la información a través de archivos. Una de estas empresas con una interfaz nativa de R es la plataforma InfoReach. Otra es la versión TradersStudio Turbo 2017. Esto se puede conseguir mediante un complemento.
En los próximos artículos le mostraremos cómo se puede utilizar R para desarrollar el aprendizaje automático y las tecnologías de modelado de operaciones, y utilizarlas para hacer backtest y operar con sistemas de trading.
El final de los operadores promedio
En 2015, el fondo de cobertura de 165.000 millones de dólares de Ray Dalio, Bridgewater Associates, puso en marcha una unidad de inteligencia artificial con seis personas. Este equipo está dirigido por David Ferrucci, que se incorporó a Bridgewater a finales de 2012 tras dirigir a los ingenieros de International Business Machines (IBM) que desarrollaron Watson, el ordenador que venció a los jugadores humanos en «Jeopardy». Esta nueva unidad de Bridgewater dispondrá de grandes recursos para aplicar a los mercados la tecnología de predicción, que se adapta a las condiciones cambiantes del mercado; es un nuevo paradigma que podría suponer el fin del trader promedio.
El desarrollo de sistemas adaptativos y de aprendizaje automático para los sistemas de negociación es muy caro por dos razones. En primer lugar, es necesario desarrollar el código del método de aprendizaje automático, como ocurre con los algoritmos de redes neuronales, los algoritmos de ondículas y los algoritmos de aprendizaje profundo. Este software requiere habilidades matemáticas y de programación de alto nivel para ser escrito. Desarrollar un complemento para Excel o TradeStation con un algoritmo a partir de publicaciones científicas podría llevar varios meses de desarrollo utilizando mentes de clase mundial. Sólo el algoritmo podría costar hasta 100.000 dólares en su desarrollo y podría no funcionar para usted. Lo ideal sería tener una colección de docenas de herramientas que costarían millones. Este enfoque para grandes fondos de cobertura como Bridgewater es ideal porque le permite una mejor integración entre los algoritmos de aprendizaje y las señales de negociación.
Las empresas de inversión cuantitativa, como Two Sigma Investments, de 24.000 millones de dólares, y Renaissance Technologies, de 25.000 millones de dólares, están contratando cada vez más programadores e ingenieros para ampliar sus plantillas de inteligencia artificial. El aprendizaje automático ofrece a los fondos de cobertura una ventaja competitiva en los mercados en los que la negociación se ha visto perjudicada por la riqueza de los precios de los activos, según Gustavo Dolfino, director general de la empresa de contratación WhiteRock Group. dice Dolfino: «El aprendizaje automático es la nueva ola de inversión para los próximos 20 años y los jugadores inteligentes se están centrando en él».
La otra habilidad costosa que se necesita es la del ingeniero de conocimiento con experiencia en el mercado y el trading. Tienen que utilizar las herramientas y entender los algoritmos, pero no al nivel de los desarrolladores que han desarrollado el código.
El coste de la creación de algoritmos retrasó la investigación. Por eso R se ha vuelto tan valioso. R tiene miles de bibliotecas construidas con código abierto por una comunidad de desarrolladores. Si una empresa tuviera que desarrollar estas bibliotecas, le costaría decenas de millones de dólares, pero con R puede aprovecharlas y sólo tiene que preocuparse de la ingeniería del conocimiento y el desarrollo del sistema.
El lenguaje de programación R es ahora uno de los lenguajes de programación más populares para el aprendizaje automático y el trading.
R ofrece bibliotecas de aprendizaje automático, análisis estadístico, análisis fractal y de ondículas, procesamiento del lenguaje natural y mucho más. R requiere de una curva de aprendizaje, pero si se tienen en cuenta las herramientas avanzadas en términos de modelado que puede realizar, merece la pena. El backtesting en R es muy primitivo. Debido a esto, el mejor uso de R para los traders es hacer análisis que ayuden al desarrollo del sistema o la salida. La salida producida por sus estudios de mercado realizados en R puede ser utilizada como datos de entrada en una estrategia. Algunas plataformas de negociación pueden utilizar R-Scripts. Actualmente tenemos R disponible para TradersStudio como un complemento. En el momento de escribir esto está en beta con un lanzamiento en el año 2017.
Estas son fuentes gratuitas para aprender R. También hay muchos cursos de pago para aprender R y servicios a buen precio con un montón de buenos cursos sobre R y aprendizaje automático en DataCamp.
Herramientas de traders para todos
Ahora todos podemos utilizar las herramientas de trading que emplean los principales fondos de cobertura utilizando R y también hasta cierto punto Python, aunque R tiene la mejor interfaz con los programas externos lo que permite una mejor integración entre las estrategias de negociación y la inteligencia. Estas herramientas van desde las más modernas de análisis de series temporales, como los modelos híbridos Arima/Garch, pasando por las ondículas y los métodos de aprendizaje automático, hasta una serie de algoritmos de redes neuronales, inducción de reglas y algoritmos evolutivos, desde la programación genética hasta la tecnología de enjambre. Además, existen herramientas de modelización de la teoría del caos y la teoría de los juegos, así como modelos de Markov ocultos.
Incluso las herramientas avanzadas de modelado de series temporales pueden llevar el trading a donde no ha llegado antes. TradersStudio ha desarrollado un sistema híbrido Arima/Garch. Este modelo predice el cierre del S&P 500 para el día siguiente menos el cierre del día actual. Esto está bien porque los futuros se negocian después de las 16:00 horas y el SPY tiene liquidez hasta las 18:00 horas aproximadamente, por lo que es posible obtener una señal sobre el cierre y realizar una operación un minuto o dos después. Las predicciones en bruto obtuvieron beneficios en más de 2.800 puntos, lo que demuestra que este tipo de tecnología es importante y valiosa para los operadores. He aquí cómo los métodos de aprendizaje automático que construyen un árbol recursivo pueden utilizarse en el trading.
El dinero crece en los árboles
La partición recursiva es un método estadístico para el análisis multivariable. La partición recursiva crea un árbol de decisión que trata de clasificar correctamente a los miembros de la población dividiéndola en subpoblaciones basadas en varias variables independientes dicotómicas. El proceso se denomina recursivo porque cada subpoblación puede dividirse a su vez un número indefinido de veces.
Los métodos de partición recursiva se han desarrollado desde la década de 1980. Entre los métodos de partición recursiva más conocidos están el algoritmo ID3 de Ross Quinlan y sus sucesores, C4.5 y C5.0, y los árboles de clasificación y regresión. Los métodos de aprendizaje conjunto, como los bosques aleatorios, ayudan a superar el problema habitual de estos métodos (su vulnerabilidad al sobreajuste de los datos) al emplear diferentes algoritmos y combinar sus resultados de alguna manera.
Una variación es la partición recursiva lineal de Cox. Estos métodos pueden utilizarse para elegir valores basándose en fundamentos y juzgar si un valor está sobrevalorado, correctamente valorado o infravalorado (sólo utilizaremos valores infravalorados).
Estos métodos también se pueden utilizar para predecir los rendimientos del mercado en el siguiente periodo en variables categóricas, como por ejemplo: gran ascenso, alza, estabilidad, caída y gran descenso. Veamos un ejemplo sencillo. El objetivo no es dar el santo grial, sino mostrarle cómo puede empezar a construir estos modelos usted mismo. R es un gran lenguaje para el preprocesamiento de datos, pero requiere una comprensión más profunda de los tipos de datos de R. Por ejemplo, algunas librerías usan Matrices, Data Frames mientras que otras usan xts que está basado en la librería zoo y necesitas pasar el tipo correcto. Hay funciones para hacer esta conversión sobre la marcha. Otra opción si no eres un experto en R es hacer tu preproceso en TradersStudio o TradeStation ya que nos sentimos más confirmados haciendo el procesamiento de datos en esas plataformas y sabemos cómo llamar a todos los indicadores que necesitamos así como escribir los nuevos que se nos ocurran. Crearemos un archivo CSV que cargaremos en R y probaremos estos algoritmos de árbol.
Nos facilitaremos la vida y utilizaremos el terminal de impresión de TradersStudio para dar salida a los datos. A continuación, guardaremos el terminal de impresión en un archivo. Haremos nuestro análisis con datos semanales del S&P 500. Utilizaremos los beneficios del S&P 500, el Dow Transports y el S&P Dividends además de los datos de precios del S&P 500. Nuestro objetivo es predecir la variación del S&P 500 una semana en el futuro. Lo haremos mediante el Árbol de regresión utilizando la Biblioteca RPart en R. Originalmente predecimos la dirección del S&P 500 utilizando una serie de entradas. Fallamos mucho. El árbol podía resolver cualquier división que añadiera información a la división de la clase de salida. La clave en el desarrollo de estos algoritmos de árbol es definir inteligentemente la variable de predicción.
El problema es el ruido. La predicción de la dirección de un día es muy ruidosa y podemos tener operaciones de «whipsaw», que costarían deslizamientos y comisiones adicionales. Realmente no queremos cambiar de posición cuando el mercado puede moverse ligeramente en nuestra contra y también queremos filtrar el ruido. Estos factores se contrarrestan con el beneficio. De este modo, deberíamos probar nuestro objetivo como si lo conociéramos perfectamente para ver la rentabilidad que hubiera tenido. Hemos optado por utilizar el siguiente objetivo.
La serie ForClose es la serie de precios para el cierre desplazado en una barra hacia el futuro. Puede ver que no cambiamos las posiciones cuando el precio no se mueve más del 10% del rango en su contra una barra en el futuro.
Debido a la reducción de ruido, este objetivo es mucho más fácil de predecir y todavía hace una locura de dinero si pudiéramos predecir perfectamente. Haciendo un backtesting desde el 10 de enero de 1980 hasta el 9 de diciembre de 2016, sin deslizamientos ni comisiones ganamos más de 23.000 puntos si supiéramos este objetivo a la perfección. Conociendo el cambio de precio perfectamente una barra en el futuro hace más de 26.700 puntos, aproximadamente un 12% más pero es mucho más difícil de predecir. Usaremos mi nuevo objetivo para el resto de este análisis.
Utilizamos los datos semanales del S&P 500, los beneficios del S&P 500, los dividendos del S&P 500 y el DJ Transports para nuestro modelo. Llamamos a este archivo DataWkPred.csv. Lo utilizaremos junto con el paquete RPart de R para implementar un árbol recursivo. Utilizaremos el 80% de nuestros datos para el entrenamiento y el 20% para las pruebas, fuera de los datos de la muestra. (Ambos códigos están disponibles en línea).
Este código contiene mucha información. Estudiaremos la información más interesante y útil de esta salida (véase «Explicación de la salida», más adelante).
El parámetro de complejidad explica la cantidad en que cambiará el error relativo si se realiza una división. Número de divisiones muestra que el número de divisiones realizadas es cero y, por tanto, el número total de nodos es 0+1 = 1, que es el nodo padre; nsplit = 1 indica que se ha realizado una división, es decir, que el nodo padre se ha dividido y ahora el total de nodos pasa a ser 1+1 =2. El error relativo a las divisiones se mide en relación con el nodo padre. Se considera que el nodo padre tiene el error 1.000, suponiendo el mayor número de errores de clasificación.
La tabla muestra que nsplit=0 lo cual indica el nodo padre. El error relativo en este caso es de 1,0. El valor del parámetro de complejidad es 0,18969849, lo que indica que se realiza 1 división (nsplit = 1). El error relativo pasa a ser de 1-0,18969848 = 0,8103015, lo que es evidente en la segunda línea. La salida se muestra hasta donde el valor del parámetro de complejidad es muy pequeño. En este caso en nsplit = 4 porque sólo hay una reducción marginal del error. El error de validación cruzada de diez veces (xerror) es el conjunto de datos en 10 muestras. Cada una de las muestras se divide en prueba y entrenamiento en una proporción de 90:10. A continuación, se entrena el modelo y se calcula el error y se hace la media de las muestras.
En este caso, el error se calcula en cada división. También se mide en relación con el nodo principal. El error estándar se utiliza generalmente para obtener el número óptimo de divisiones en las que el error estándar es mínimo y 1-SE es máximo.
Este procedimiento se sigue porque inicialmente el error estándar disminuye con el número de divisiones, pero después de una determinada división el error estándar aumenta. Este valor de división puede considerarse como el valor óptimo de división. Sin embargo, hay otra regla general utilizada para determinar el número óptimo de divisiones y podar el árbol, que es error relativo + SE < xerror.
De los ejemplos anteriores se desprende que, según la regla «1-SE», el número óptimo de divisiones es 2, ya que el valor de SE en nsplit=3 es mayor que el valor de SE en SE=2.
Como regla general, el número óptimo de divisiones debe ser tomado como 3 porque en esta etapa, el error relativo + SE es menor que el xerror. La importancia de la variable se emite cuando ejecutamos el código R para el árbol recursivo.
También tenemos mucha información sobre cómo se dividen los nodos y utilizando qué valores críticos. Esta información nos dice cuánto ayuda cada división a la separación de la clase de salida y a nivel de hoja nos da la precisión del sistema. Cada variable puede utilizarse varias veces en el mismo árbol. También realizamos un análisis de la distribución de salida de nuestros datos. Por ejemplo, el 57% de los casos corresponden a la clase de salida «comprar». También crea una salida que puede traducirse en un árbol (véase «Árbol del dinero», más adelante).
La salida del código también nos da todo tipo de información sobre la predicción de cada división y la cantidad de información que se obtiene. Este código utiliza la función rpart.plot, que da como resultado un bonito árbol, con más detalles (véase «Recorte del árbol», más adelante).
La Poda
La poda es una técnica utilizada para reducir el tamaño de un árbol de decisión y conservar las contribuciones importantes en la clasificación de instancias. Un árbol demasiado grande puede provocar un sobreajuste de los datos y clasificar mal una nueva observación. Si es demasiado pequeño, puede no contener toda la información estructural. El código en R, incluye el código de poda. El código de poda eliminará dos hojas de 7 a 5 y mejorará la robustez del árbol.
Una matriz de confusión o matriz de error es una tabla que clasifica las predicciones en función de si coinciden con los valores reales. Una de las direcciones de la tabla indica las posibles categorías de los valores predichos y la otra incluye categorías para otros valores. Cuando el valor predicho coincide con el valor original se denomina clasificación correcta. Ésta cae en la diagonal de la matriz de confusión. Los elementos fuera de la diagonal indican las predicciones incorrectas (véase «Estadísticas de predicción», a continuación).
Para la clase Comprar: Las clasificaciones correctas son (Tasa de verdaderos positivos) = 174/205 = 0,8487. Esto también se conoce como sensibilidad. La clasificación incorrecta se conoce como tasa de falsos positivos = 71/158 = 0,4493.
Para la clase Vender: Clasificaciones correctas (Tasa de verdaderos negativos) = 87/158 = 0,5507. Esto también se conoce como especificidad. La clasificación incorrecta se conoce como tasa de falsos negativos = 31/205 = 0,1513.
El aprendizaje automático en el trading no es simplemente la novedad, sino una herramienta esencial para que los traders tengan éxito en los mercados actuales. Aquí mostramos cómo podemos utilizar los árboles recursivos, en futuras entregas cubriremos métodos que le ayudarán a mantener su ventaja en la negociación de los mercados.
Artículo redactado por MURRAY A. RUGGIERO JR.
Publicado en la revista Futures
Canal de YouTube de Quantified Models
En nuestro canal de YouTube tenemos varios videos disponibles que pueden resultarle muy útiles para desarrollar sistemas de trading.
Esperamos que esta información te haya sido de utilidad.






