0% encontró este documento útil (0 votos)
480 vistas224 páginas

Aprendizaje Automático en Trading

El documento es una guía práctica sobre la implementación de modelos de aprendizaje automático en el trading, escrita por Ishan Shah y Rekhit Pachanekar. Cubre desde los conceptos básicos hasta metodologías avanzadas, incluyendo ejemplos de código y aplicaciones comerciales. Está diseñado para ser accesible tanto para principiantes como para programadores que buscan optimizar su trabajo en el ámbito del trading algorítmico.

Cargado por

JOSE
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
480 vistas224 páginas

Aprendizaje Automático en Trading

El documento es una guía práctica sobre la implementación de modelos de aprendizaje automático en el trading, escrita por Ishan Shah y Rekhit Pachanekar. Cubre desde los conceptos básicos hasta metodologías avanzadas, incluyendo ejemplos de código y aplicaciones comerciales. Está diseñado para ser accesible tanto para principiantes como para programadores que buscan optimizar su trabajo en el ámbito del trading algorítmico.

Cargado por

JOSE
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Machine Translated by Google

Machine Translated by Google

Aprendizaje automático en el trading


Machine Translated by Google

Ishan Shah
Rekhit Pachanekar

Aprendizaje automático en el trading


Implementación paso a paso de modelos de Machine Learning.

Instituto Cuantitativo
Machine Translated by Google

Contenido

I Introducción 5

Prefacio 6

Reconocimiento 12

1 Introducción al aprendizaje automático 13

II Marco de implementación del aprendizaje automático 22

2 Definición del enunciado del problema, el objetivo y la característica 25

3 Objetivos y características en Python 29

4 División de entrenamiento y prueba 40

5 Entrenamiento y pronóstico utilizando el modelo de clasificación 47

6 Métricas para Evaluar el Modelo Clasificador 52

7 Backtesting y trading en vivo 63

8 desafíos en el trading en vivo 78

III Aprendizaje Supervisado: Regresión y Clasificación 85

9 El modelo de regresión lineal 86

10 Regresión logística 97

11 Modelo Bayesiano Ingenuo 106


Machine Translated by Google

CONTENIDO

12 árboles de decisión 115

13 Algoritmo de bosque aleatorio 126

14 Algoritmo XGBoost 134

15 redes neuronales 150

IV Aprendizaje no supervisado, procesamiento del lenguaje natural y


Aprendizaje por refuerzo 164

16 Aprendizaje no supervisado 165

17 Agrupamiento de K­medias 173

18 Agrupamiento jerárquico 181

19 Análisis de componentes principales 190

20 Procesamiento del lenguaje natural 204

21 Aprendizaje por refuerzo 209

Referencias 219

2
Machine Translated by Google

Elogios anticipados para el libro

Si buscas una introducción al aprendizaje automático para el trading, no hay nada mejor que
el nuevo libro de Shah y Pachanekar. Te guiarán desde los conceptos básicos hasta la
metodología avanzada de la industria.
Es un libro sumamente práctico, lleno de instrucciones paso a paso, código fuente y
explicaciones. Para aquellos interesados en adquirir conocimientos serios sobre el ámbito del
trading con aprendizaje automático, recomiendo encarecidamente este libro.

Andreas F. Clenow, director de inversiones de Acies Asset Management y autor de los best
sellers Following the Trend, Stocks on the Move y Trading Evolved
Machine Translated by Google

Prefacio

Hay muchos libros sobre aprendizaje automático, pero la mayoría de los autores se centran en
mostrando sus credenciales en matemáticas y habilidades de programación en lugar de enseñar
habilidades prácticas. Fiel a sus raíces educativas, este libro
Por Ishan Shah y Rekhit Pachanekar de QuantInsti hace lo contrario.

Aquí no encontrarás técnicas sofisticadas y novedosas. No encontrarás tentaciones idílicas para


ser el próximo Jim Simons. Lo que encontrarás es
Una guía sólida, práctica y paso a paso para implementar un aprendizaje automático.
programa tras otro, con códigos de muestra y todo, y con especial enfoque
sobre aplicaciones comerciales.

Ya sea que lea los capítulos secuencialmente como un libro de texto o lo use como un...
Diccionario para buscar temas especiales, es invaluable para el comerciante práctico.
¿Quién necesita estas habilidades para sobrevivir en el mundo ultracompetitivo del comercio
cuantitativo actual?

Dr. Ernest P. Chan Fundador de [Link] y autor de tres de los mejores


Venta de libros “Trading cuantitativo: cómo construir su propio algoritmo
“Negocios comerciales”, “Comercio algorítmico: estrategias ganadoras y su fundamento” y
“Comercio de máquinas”.
Machine Translated by Google

Parte I

Introducción
Machine Translated by Google

Prefacio
Machine Translated by Google

“Si inventas un gran avance en inteligencia artificial,


para que las máquinas puedan aprender, eso vale 10 Microsofts”.

— Bill Gates

7
Machine Translated by Google

En 1950, Alan Turing creó un test, llamado “Test de Turing”, para determinar si una máquina era lo
suficientemente “humana”. Para ello, la máquina debía interactuar con una persona real. En dichas
interacciones, si la persona consideraba que el comportamiento de la máquina era indistinguible del
de un humano, la máquina aprobaba el test.

¿Crees que tenemos tales dispositivos hoy en día?

Google lanzó recientemente un asistente de voz con inteligencia artificial que podría reservar citas
llamando al establecimiento y conversando con la recepcionista.

¿Cómo puede una máquina pensar como un humano?

Un programa informático convencional tiene un algoritmo o un conjunto de pasos que ejecutar. El


programa lo hace de manera eficiente. Pero si le dices a una calculadora normal que encuentre la
fuerza gravitatoria en Marte, no podrá hacerlo hasta que programes la ecuación de la gravedad. Así
nació este nuevo campo llamado aprendizaje automático, donde las máquinas no estaban limitadas
a su programa inicial. ¡Podían aprender! Y mejorar.

Arthur Samuel escribió el primer programa informático de aprendizaje para jugar a las damas.
Estudió los movimientos anteriores y los incorporó a sus movimientos cuando jugó contra un
oponente. Hoy, la inteligencia artificial DeepMind de Google ha derrotado a un jugador humano en el
juego de mesa Go!, una hazaña que antes se creía imposible. Todo esto, gracias al aprendizaje
automático.

El aprendizaje automático tiene diversas aplicaciones. Desde pronósticos agrícolas hasta estimaciones
de precios de acciones, se puede utilizar prácticamente en cualquier lugar donde haya que analizar
datos. Algunos algoritmos de aprendizaje automático desvelan información que ni siquiera sabías
que existía.

¡En el mundo actual generamos más datos que nunca! Según el Foro Económico Mundial, en 2025
generaremos casi 463 exabytes (es decir, mil millones de GB) de datos cada día.

Obviamente, un ser humano no podrá seguir el ritmo de la sobrecarga de datos, y los programas
informáticos convencionales podrían no ser capaces de manejar cantidades tan grandes de datos.

Por lo tanto, necesitamos el aprendizaje automático, que aprovecha el método de aprendizaje


adaptativo de un ser humano y lo combina con la eficiencia y la velocidad de un programa informático.
Esto es más evidente en el ámbito del comercio que en otros.

Si nos centramos en el trading algorítmico, ejecutamos rutinariamente las siguientes tareas:

• Descargue y administre precios, datos fundamentales y otros datos alternativos de múltiples


proveedores de datos y en diferentes formatos.

8
Machine Translated by Google

• Preprocesamiento y limpieza de los datos •


Formulación de una hipótesis para una estrategia comercial y prueba retrospectiva
de la misma • Automatización de la estrategia comercial para asegurarse de que las
emociones no interfieran en su estrategia comercial.

Descubrimos que podemos externalizar la mayoría de estas tareas a la máquina.


Y esta es la razón por la que usted, el lector, tiene un libro que habla sobre el aprendizaje
automático y sus aplicaciones en el trading.

¿Por qué se escribió este libro? El aprendizaje automático es un tema muy amplio si se tienen
en cuenta las distintas disciplinas que se originaron a partir de él. También se oyen palabras
de moda como IA, redes neuronales, aprendizaje profundo e ingeniería de IA asociadas al
aprendizaje automático.

Nuestro objetivo en este libro es desmitificar estos conceptos y aclarar en qué se diferencia el
aprendizaje automático de la programación convencional y, además, cómo se puede utilizar
para obtener una ventaja en el ámbito del trading.

Hemos estructurado el libro de tal manera que inicialmente aprenderás sobre las distintas
tareas que lleva a cabo un algoritmo de aprendizaje automático.

Cuando sea apropiado, se le presentará el código necesario para ejecutar estas tareas. Si tiene
conocimientos de programación en Python, podrá leer estas secciones rápidamente y
comprender los conceptos con facilidad.

¿Qué pasa si no tengo experiencia en programación o Python?

No te preocupes. Python es un lenguaje relativamente más fácil de entender y de programar.


Además, hemos intentado dividir el código en fragmentos pequeños y explicar lo que hace el
código en un lenguaje sencillo. Esto no solo te ayudará a comprender más rápido, sino que
también te servirá de apoyo más adelante cuando comiences a codificar y a crear tu propio
algoritmo de aprendizaje automático.

Una vez que se cubren los conceptos básicos de las tareas de ML, avanzamos y analizamos
varios algoritmos de ML, un capítulo a la vez. Desarrollaremos los conceptos y le brindaremos
una guía paso a paso sobre cómo se puede convertir una idea en reglas y aplicar el aprendizaje
automático para probar esta idea en datos del mundo real. Y si está satisfecho con los
resultados, avance e impleméntelos en la vida real.

¿Quién debería leer esto? Creemos que también puede ser útil para:

9
Machine Translated by Google

• Cualquiera que haya oído hablar de los algoritmos de aprendizaje automático y esté
entusiasmado por saber más.

• Programadores que quieran ampliar sus horizontes y ver cómo


El aprendizaje automático puede ayudarles a optimizar su trabajo.
• Comerciantes algorítmicos que buscan continuamente una ventaja sobre los demás.
petición.

Como dijimos anteriormente, no queremos que los lectores de este libro sean programadores
de computadoras, ya que hemos tratado de mantener el texto simple con muchos ejemplos
del mundo real para ilustrar varios conceptos.

¿Qué contiene este libro? El material que se presenta aquí es una introducción básica al
mundo del aprendizaje automático. Puede pensar en él como un libro que le cuenta los
fundamentos del aprendizaje automático y cómo se aplica en la vida real.

Desde el principio, creemos que la teoría por sí sola no es suficiente para retener el
conocimiento. Es necesario saber cómo se pueden aplicar estos conocimientos en el mundo
real. Por ello, nuestro libro contiene muchos ejemplos del mundo real, especialmente en el
ámbito del trading. Pero tenga la seguridad de que estos conceptos se pueden transferir a
cualquier otra disciplina que requiera el análisis de datos.

¿Cómo leerlo? La forma ideal de leer este libro es capítulo por capítulo. Pero también puedes
probar otras opciones, como:

1. Hojee el libro y deténgase en un capítulo que le llame la atención.


Y luego vuelve atrás si quieres algún conocimiento preliminar.
2. Si has trabajado anteriormente en algoritmos de aprendizaje automático, no dudes en ir
a cualquier capítulo al azar que te guste y ver si el texto se puede mejorar o no.

¿Dónde más se puede encontrar todo esto? El aprendizaje automático existe desde hace más
de medio siglo. De hecho, la palabra «robota», que hace referencia a una máquina con
aspecto humano, se mencionó por primera vez en una obra de teatro checa en 1920.

De esta forma, se puede encontrar una gran variedad de información relacionada con el
aprendizaje automático en forma de blogs, cursos, vídeos y otros medios. Y también hay
recursos gratuitos. La idea de este libro era presentar el conjunto básico y los principios del
aprendizaje automático en un lenguaje fácil de entender y, además, de forma compacta.

10
Machine Translated by Google

Licencia de derechos de autor Esta obra está bajo la Licencia Creative Commons Atribución­
CompartirIgual 4.0 Internacional.

Código y datos utilizados en el libro Puedes descargar todos los archivos de código y datos
desde el enlace de Github: '[Link] También
actualizaremos los códigos y archivos de datos en el mismo enlace.

Sugerencias y errores Creemos que ninguno de nosotros es perfecto en este mundo. Todos
nos esforzamos constantemente por mejorar y nosotros no somos diferentes. Por lo tanto, sus
sugerencias y comentarios son bienvenidos. Puede decirnos cualquier cosa que podamos
mejorar o simplemente escribirnos a quantra@[Link].

11
Machine Translated by Google

Reconocimiento
Cuando iniciamos este proyecto, lo sentimos como una simple transferencia de conocimientos.
De los autores a usted, el lector. En retrospectiva, este libro ha sido más que eso. A lo largo
del camino, hubo muchas discusiones con personas talentosas de diferentes equipos y
funciones. En QuantInsti, creemos en el poder de la colaboración y este libro es otro ejemplo
de un esfuerzo en equipo con el único objetivo de transmitir conocimiento de una manera
lúcida que sea interesante e informativa.

Con esto en mente, nos gustaría agradecer a nuestro propio equipo de investigación y
contenido de Quantra, Rishabh, Satyapriya y Kevin, quienes trabajaron en horarios extraños,
revisando el libro en varias etapas y brindándonos consejos útiles durante todo nuestro viaje.
De cara al futuro, nos gustaría extender nuestra gratitud al equipo de contenido de EPAT,
especialmente a Vivek, Ashutosh, Anshul, Mario y Jay, por brindarnos comentarios críticos y
asegurarse de que nos mantuviéramos en el camino correcto. Además, gracias a Aiman, Kshitij
y Viraj, por apoyarnos con comentarios sobre varios aspectos del libro.

Nos gustaría agradecer al Dr. Thomas Starke y a Andreas Clenow por sus valiosos comentarios
para aumentar la calidad del contenido cubierto en este libro.

También queremos expresar nuestro agradecimiento a Anupriya y Nitesh por creer en nosotros
cuando emprendimos nuestro ejercicio de escritura. Por último, nos gustaría agradecerte a ti,
querido lector, porque estás a punto de invertir el activo más valioso que tienes en este mundo,
tu tiempo, mientras lees el libro.
Machine Translated by Google

1
Introducción a la máquina
Aprendiendo

El aprendizaje automático ha sido un tema candente durante décadas. Sin embargo, la investigación en este
campo había declinado a fines del siglo XX. Había dos cosas que obstaculizaban el progreso del aprendizaje
automático.

1. Los recursos informáticos necesarios para el aprendizaje automático eran prohibitivamente caros y, por
lo tanto, sólo las grandes instituciones eran capaces de invertir en su investigación.

2. El aprendizaje automático requiere datos para aprender. En el comienzo, estos datos eran difíciles de
obtener.

Pero con la revolución de la industria informática, los recursos informáticos se abarataron y la cantidad de datos
generados se multiplicó por diez. Se trataba de datos digitales, por lo que incluso su adquisición se volvió más
barata. Todo esto contribuyó a un aumento repentino del progreso del aprendizaje automático. Esto ha dado
como resultado que numerosas bibliotecas de aprendizaje automático sean capaces de procesar años de datos
en segundos. ¡Incluso en su computadora personal!

¿Por qué debería utilizar el aprendizaje automático? El mundo avanza hacia la automatización y el aprendizaje
automático, y el sector financiero no es la excepción.
Zest AI, que desarrolla soluciones de inteligencia artificial para prestamistas, ayuda a los prestamistas de
automóviles a evaluar a los clientes potenciales y les asesora sobre la tasa de préstamo correcta que se les debe cobrar.
[Link] afirma que después de usar su modelo ML para evaluar a los clientes, redujo la tasa de
incumplimiento del primer pago del 32% al 8%.

¿Qué pasa con el aprendizaje automático en el trading? Los algoritmos de aprendizaje automático (ML) pueden
crear una cartera de inversiones para usted. Un asesor humano tiene que estudiar los mercados y obtener
certificaciones de asesoramiento para tener la confianza suficiente.
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

para sugerir una cartera a sus clientes. Por otro lado, un algoritmo de ML puede realizar la
misma tarea en segundos. Betterment y Wealthfront son empresas que brindan servicios de
inversión a través de su plataforma de aprendizaje automático.

¿Cómo puede un algoritmo ML asesorar a una persona sobre inversiones?

Tomemos un ejemplo sencillo para ilustrar este concepto. En primer lugar, el algoritmo ML
recibe los detalles de todos los clientes y sus respectivas carteras como entrada. A
continuación, el algoritmo ML aprende la relación entre la cartera recomendada y las
características del cliente (a partir de nuestros datos de entrada). Después de esto, el modelo
está listo para hacer recomendaciones para la cartera de cualquier cliente en función de sus
características (como edad, ingresos, situación laboral, etc.). Por ejemplo, si el cliente es una
mujer de 25 años con un alto apetito de riesgo, el modelo, basándose en patrones previos
aprendidos, sugeriría una cartera inclinada hacia acciones tecnológicas como Apple y
Facebook.

Los algoritmos de ML son muy rápidos y es probable que hagan esto en cuestión de segundos.
La ventaja de la velocidad es aprovechada por los fondos de cobertura que utilizan el comercio
algorítmico. Renaissance Technologies es solo un ejemplo entre cientos de fondos impulsados
por IA. Se sabe que Renaissance Technologies utiliza el aprendizaje automático en sus
estrategias comerciales y tiene alrededor de 55 mil millones de dólares en activos bajo su
administración. Varios fondos de cobertura y empresas de comercio de alta frecuencia
confían en el aprendizaje automático para crear sus estrategias comerciales.

Fuente: [Link]
outperforming­the­hedge­fund­benchmark

En un informe de 2019, Preqin informó que siguió el desempeño de 152 fondos de cobertura
impulsados por ML e IA. Preqin comparó el desempeño de los fondos de IA

14
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

a su propio índice de referencia de fondos de cobertura. Y vieron que la IA superó en 3 puntos


porcentuales.

¿El aprendizaje automático es solo para fondos de cobertura y grandes instituciones? Eso fue
así durante mucho tiempo, pero ya no. Con la llegada de la tecnología y los recursos de
ciencia de datos de código abierto, los comerciantes minoristas y los particulares también han
comenzado a aprender y utilizar el aprendizaje automático. Tomemos un ejemplo.
Supongamos que comprende la tendencia del mercado. Tiene una estrategia comercial
sencilla que utiliza algunos indicadores técnicos que le ayudan a predecir la tendencia del
mercado y operar en consecuencia. Mientras tanto, otro operador utiliza el aprendizaje
automático para implementar la misma estrategia comercial. Aunque, en lugar de unos pocos
indicadores técnicos antiguos, permitirá que la máquina revise cientos de indicadores técnicos.
Deja que la máquina decida qué indicador funciona mejor para predecir la tendencia correcta
del mercado. Mientras que el operador habitual podría haberse conformado con el RSI o la
MA, el algoritmo ML podrá revisar muchos más indicadores técnicos y elegir los mejores, en
términos de poder de predicción.

Esta técnica se conoce como selección de características, en la que el aprendizaje automático


elige entre diferentes características de los indicadores y elige las más eficientes para la
predicción. Estas características pueden ser, por nombrar algunas, cambios de precio, señales
de compra/venta, señales de volatilidad, ponderaciones de volumen, etc. Es obvio que el
operador que ha realizado una investigación más cuantitativa, un mejor backtesting de los
datos históricos y una mejor optimización tiene mayores posibilidades de obtener un mejor
rendimiento en los mercados en vivo.

¿Cómo se implementa el aprendizaje automático? El aprendizaje automático se puede


implementar en cualquier lenguaje de programación. De hecho, los programadores utilizan
C++ para implementar proyectos de aprendizaje automático que son urgentes. Si eres una
empresa de alta frecuencia, es posible que elijas C++. Pero una gran mayoría utiliza Python
porque es más fácil de aprender y admite varias bibliotecas de aprendizaje automático. La
sintaxis también es más clara y fácil de entender. Según tus requisitos, puedes elegir cualquier
biblioteca de Python, ya sea scikit­learn o TensorFlow.

Por lo tanto, no necesitarás un título en informática o programación para implementar


algoritmos de aprendizaje automático en tu dominio. Solo necesitas conocer las bibliotecas y
la sintaxis de aprendizaje automático de Python. Y con unas pocas líneas de código,
implementar tu proyecto de aprendizaje automático en tiempo real.

Este libro le brinda una guía detallada y paso a paso para crear una estrategia comercial de
aprendizaje automático.

15
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

1. Utilice bibliotecas de Python, que le ayudarán a leer los datos.


2. Utilice el aprendizaje automático para encontrar patrones en los datos.
3. Generar señales sobre si debe comprar o vender el activo.
4. Aprenda a analizar el rendimiento del modelo.

Respondamos algunas preguntas relacionadas con el aprendizaje automático antes de pasar a un modelo
de aprendizaje automático de la vida real.

¿Qué es el aprendizaje automático? Una diferencia clave entre un algoritmo regular y un algoritmo de
aprendizaje automático es el modelo de “aprendizaje”, que permite que el algoritmo aprenda de los datos
y tome sus propias decisiones.
Esto permite que las máquinas realicen tareas que de otro modo les resultarían imposibles. Dichas tareas
pueden ser tan sencillas como reconocer la escritura humana o tan complejas como los coches
autónomos.

Por ejemplo, supongamos que se supone que un algoritmo debe distinguir correctamente entre un rostro
masculino y uno femenino a partir de un grupo de fotos de documentos de identidad. Se entrenaría un
algoritmo de aprendizaje automático (ML) en una parte de los datos para "aprender" a reconocer cualquier
rostro. Mientras que un algoritmo simple no sería capaz de realizar esta tarea, un algoritmo de ML no solo
podría categorizar las fotos como entrenadas, sino que aprendería continuamente de los datos de prueba
y aumentaría su "aprendizaje" para volverse más preciso en sus predicciones.

¡Recuerde con qué frecuencia Facebook (FB) le pide que etiquete a la persona que aparece en la foto!
Entre miles de millones de usuarios, los algoritmos de aprendizaje automático de FB son capaces de
hacer coincidir correctamente diferentes fotos de la misma persona e identificarla. La función de piloto
automático de Tesla es otro ejemplo.

¿Cómo aprenden las máquinas? La respuesta es sencilla: ¡igual que los humanos!

En primer lugar, recibimos información sobre una cosa determinada, que se almacena en nuestra mente.
Si nos encontramos con la misma cosa en el futuro, nuestro cerebro es capaz de identificarla. Además,
las experiencias pasadas nos ayudan a tomar mejores decisiones en el futuro. Nuestro cerebro se entrena
a sí mismo identificando las características y patrones en el conocimiento/datos recibidos, lo que le permite
identificar o diferenciar con éxito entre varias cosas.

El aprendizaje automático es uno de los enfoques más populares en el campo de la inteligencia artificial.
Uno de los aspectos clave del aprendizaje automático es el uso de datos nuevos y continuos para iterar y
seguir aprendiendo.

Hay muchas industrias clave en las que el ML está teniendo un gran impacto: servicios financieros,
logística, marketing y ventas, atención médica, etc. Se espera que en

16
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

En un par de décadas, las tareas mecánicas repetitivas habrán terminado. El aprendizaje


automático y las mejoras en las técnicas de inteligencia artificial han hecho posible lo imposible,
desde los coches autónomos hasta la detección de células cancerosas.

¿Cuál es la diferencia entre Machine Learning, Deep Learning e Inteligencia Artificial? La gente
suele confundir estos términos, por eso hemos creado una infografía que te ayudará a aclarar
estos conceptos.

Ahora veamos cómo el aprendizaje automático aborda diferentes tipos de problemas.

Un algoritmo de aprendizaje automático puede realizar tareas de clasificación sencillas y


cálculos matemáticos complejos, como la regresión. Implica la creación de modelos
matemáticos que se utilizan en la clasificación o la regresión. Para "entrenar" estos modelos
matemáticos, se necesita un conjunto de datos de entrenamiento. Este es el conjunto de datos
sobre el que el sistema crea el modelo.

Los modelos matemáticos se dividen en dos categorías, dependiendo de sus datos de


entrenamiento: modelos de aprendizaje supervisado y no supervisado.

17
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

1.1 Aprendizaje supervisado

Piense en el aprendizaje supervisado como si fuera un niño que está aprendiendo las tablas
de multiplicar. Dígale al niño la tabla de multiplicar del 2 hasta 2 por 5. Luego, el niño deduce
la lógica de que tiene que sumar 2 para obtener la siguiente respuesta en la tabla de
multiplicar. Luego, dice que 2 por 6 es 12. Al crear modelos de aprendizaje supervisado, los
datos de entrenamiento contienen las respuestas requeridas o el resultado esperado. Estas
respuestas requeridas se denominan etiquetas. Por ejemplo, si los datos de entrenamiento
contienen los indicadores técnicos como RSI y ADX, así como la posición comercial a tomar,
como comprar o vender, entonces se conoce como el enfoque de aprendizaje supervisado.

Con suficientes puntos de datos, el algoritmo de aprendizaje automático podrá clasificar la


señal comercial correctamente la mayoría de las veces. Los modelos de aprendizaje
supervisado también se pueden utilizar para predecir valores numéricos continuos, como el
precio de las acciones de Disney. Estos modelos se conocen como modelos de regresión.
En este caso, las etiquetas serían el precio de las acciones de Disney.

Tipos de modelos supervisados

Los modelos supervisados se entrenan con conjuntos de datos etiquetados. Puede tratarse
de una etiqueta continua (regresión) o de una etiqueta categórica (clasificación).

Modelos de regresión La regresión se utiliza cuando se trabaja con valores continuos, como
el costo de una casa, cuando se le dan características como la ubicación, el área cubierta, los
precios históricos, etc. Modelos de regresión populares
son:

• Regresión lineal

18
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

• Regresión Lasso •
Regresión Ridge

Modelos de clasificación La clasificación se utiliza para datos que se dividen en categorías, cada
una de las cuales está representada por una etiqueta. Los datos de entrenamiento deben contener
las etiquetas y deben tener suficientes observaciones de cada etiqueta.

Algunos modelos de clasificación populares incluyen:

• Clasificadores de árboles de
decisión • Clasificadores de bosques
aleatorios • Clasificadores de redes neuronales

Existen varios métodos de evaluación para determinar el rendimiento de estos modelos.


Analizaremos estos modelos y los métodos de evaluación con mayor detalle en capítulos posteriores.

Tipos de clasificación Existen principalmente tres tipos de clasificación.

Clasificación binaria

Este tipo de clasificación tiene solo dos categorías. Por lo general, son valores booleanos: 1 o 0 (a
veces conocidos como Verdadero/Falso o Alto/Bajo). Algunos ejemplos en los que se podría
utilizar esta clasificación son la detección de cáncer o la detección de correo no deseado. En la
detección de cáncer, las etiquetas serían positivas o negativas para el cáncer. De manera similar,
las etiquetas para la detección de correo no deseado serían spam o no spam. También puede
convertir el comercio en un problema de clasificación binaria con etiquetas como comprar y vender,
o comprar y ninguna posición.

Clasificación multiclase

Los clasificadores multiclase o multinomiales pueden distinguir entre más de dos clases. Por
ejemplo, puede tener tres etiquetas, como comprar, sin posición o vender.

Clasificación de múltiples etiquetas

Este tipo de clasificación se produce cuando una sola observación contiene varias etiquetas. Por
ejemplo, una sola imagen podría contener un coche, un camión y una persona. El algoritmo debe
poder clasificar cada uno de ellos por separado.
Por lo tanto, debe entrenarse para muchas etiquetas y debe informar "Verdadero" para cada uno de los
objetos, es decir, un automóvil, un camión y un humano, y "Falso" para cualquier otra etiqueta para la
que se haya entrenado.

Veamos ahora el siguiente tipo de enfoque de aprendizaje automático.

19
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

1.2 Aprendizaje no supervisado


En el aprendizaje no supervisado, como sugiere el nombre, el conjunto de datos utilizado para el
entrenamiento no contiene las respuestas requeridas. En su lugar, el algoritmo utiliza técnicas como la
agrupación para agrupar objetos similares.

En un sistema de este tipo, se supone que los grupos descubiertos coincidirán razonablemente bien con
una clasificación intuitiva. Por ejemplo, la agrupación de acciones en función de datos históricos dará
como resultado la agrupación de las acciones que pertenecen al mismo sector o grupo industrial.
También puede haber algunas sorpresas, como que Facebook y Twitter puedan formar parte de un
grupo diferente aunque pertenezcan al mismo sector.

Otra aplicación del aprendizaje no supervisado es la detección de anomalías. Esta utiliza un algoritmo
de agrupamiento para descubrir los valores atípicos más importantes en un gráfico. Estos se utilizan
para detectar fraudes con tarjetas de crédito y para detectar un desplome del mercado o una caída de la bolsa.
eventos del cisne.

Además de los dos tipos de modelos de aprendizaje mencionados anteriormente, el aprendizaje


automático incluye un tercer tipo conocido como aprendizaje de refuerzo.
El aprendizaje por refuerzo implica métodos que retroalimentan el modelo con recompensas o castigos
para mejorar el rendimiento. Para mejorar el rendimiento, el modelo debe poder interpretar las entradas
correctamente. Además, el modelo decidirá qué acción tomar y comparará el resultado con un sistema
de recompensas predefinido.

El aprendizaje por refuerzo toma acciones para maximizar las recompensas. No es un tipo de aprendizaje
supervisado porque no depende estrictamente de datos supervisados o etiquetados. Y tampoco es un
aprendizaje no supervisado, ya que modifica el modelo de acuerdo con la recompensa final. La
característica especial de estos modelos es que intentan aprender de sus errores y tomar mejores
decisiones en ejecuciones posteriores. Un buen ejemplo de este tipo de modelo de aprendizaje
automático puede ser el robot AlphaGo controlado por computadora para jugar al juego de mesa Go. Se
pueden utilizar agentes de aprendizaje automático similares para el comercio.

Un activo.

Algunos algoritmos son una mezcla de algoritmos supervisados y no supervisados.


Estos algoritmos combinan una pequeña cantidad de datos etiquetados con una gran cantidad de datos
no etiquetados durante el entrenamiento. Por ejemplo, la clasificación basada en texto (procesamiento
del lenguaje natural). El conocimiento de los tipos de algoritmos de aprendizaje automático le ayudará a
seleccionar adecuadamente un modelo para un enunciado de problema determinado.

Para ayudarlo a comenzar, hemos creado una explicación paso a paso de las diferentes tareas que se
llevan a cabo durante la creación y ejecución del aprendizaje automático.

20
Machine Translated by Google

CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE AUTOMÁTICO

Algoritmos, en la siguiente parte del libro.

21
Machine Translated by Google

Parte II

Aprendizaje automático
Marco de implementación
Machine Translated by Google

Cuando se utiliza el aprendizaje automático, hay algunas cosas que hay que tener en cuenta antes de
pasar la información a un algoritmo de aprendizaje automático. En general, se realizan las siguientes
tareas.

1. Definición del enunciado del problema 2. Lectura


de datos 3.
Comprobaciones de la integridad
de los datos 4. Configuración de la
variable de destino 5. Ingeniería
de características 6. División de
datos de prueba y entrenamiento 7. Resultados de pruebas retrospectivas y análisis del rendimiento del algoritmo

El señor Rob Read, un operador de Manhattan, busca utilizar un algoritmo de aprendizaje automático
que le permita saber cuándo comprar acciones de JP Morgan. Para ello, acude a un proveedor de
datos para obtener los datos de precios.

Luego se asegura de que la calidad de los datos sea buena. Para ello, comprueba si hay valores
faltantes o duplicados en los datos. Realiza otros análisis para garantizar que los datos se puedan
utilizar con el algoritmo de aprendizaje automático.

Ahora, Rob quiere que el algoritmo ML prediga cuándo comprar acciones de JP Morgan.

Marca los días en que el precio del día siguiente es mayor que el precio de ese día como 1. Y el resto
de los días los marca como cero.

Esta es su variable objetivo o lo que su algoritmo ML intentará predecir.

Pero, ¿qué se necesita como entrada para predecir la variable objetivo? Las entradas del algoritmo de
aprendizaje automático se denominan variables de características. Utiliza indicadores como el RSI,
el MACD e incluso indicadores de impulso como el ADX.

¿Cómo evalúa si el modelo de aprendizaje automático es eficaz? Para ello, divide los datos en
entrenamiento y prueba.

El algoritmo utiliza los datos del entrenamiento para aprender la relación entre las variables de
características y el objetivo. Esta relación se denomina modelo ML.

De esta manera, el algoritmo aprenderá cómo se relacionan las variables de características y las
variables de destino mediante el uso del conjunto de datos de entrenamiento y verificará el rendimiento
del modelo en el conjunto de datos de prueba.

¿Qué métricas se pueden utilizar para evaluar el modelo? Dado que ha creado la variable objetivo de

antemano, dispone de las señales reales. Puede comparar fácilmente las señales previstas del modelo
de aprendizaje automático con los datos reales.

23
Machine Translated by Google

Por ejemplo, el modelo ML predijo una señal de 1 el 8 de julio de 2021. Esto significa
que el modelo ML cree que el precio el 9 de julio de 2021 sería más alto que el 8 de
julio de 2021.

Comprobó el precio y, efectivamente, había aumentado el 9 de julio. Esto significa que


el programa ML acertó al predecir los movimientos de precios para ese día.

Por último, genera señales a través del modelo de aprendizaje automático y las prueba
retrospectivamente. Grafica la curva de capital y la caída para analizar el rendimiento en
mayor profundidad.

Esta fue una breve descripción general de las tareas de ML. Profundicemos en cada
uno de estos pasos e implementémoslos en Python.

24
Machine Translated by Google

Definiendo el problema
Declaración, objetivo y característica

2.1 Definición del enunciado del problema


Un proyecto o tarea de aprendizaje automático debe comenzar definiendo el problema.
declaración.

Como sugiere el nombre, el enunciado del problema indica el problema que se desea resolver. Es
lo que se desea obtener como resultado del algoritmo de aprendizaje automático.

Pero ¿por qué necesitamos un planteamiento del problema bien definido?

Un problema bien definido es un problema medio resuelto.

—Charles Kettering

Todos sus esfuerzos se dedicarán a resolver este enunciado del problema. En aplicaciones
comerciales, el enunciado del problema puede ser:

• ¿Comprar o vender oro? • ¿Cuál es el


precio esperado de Tesla para el día siguiente? • ¿Cuánto capital se
debe asignar a diferentes acciones en una cartera?
¿Lío?

Para los propósitos de este libro, nuestro planteamiento del problema será: "¿Comprar acciones de
JP Morgan en un momento dado o no?"

En jerga técnica, la posible respuesta a esta pregunta es la variable objetivo.


Machine Translated by Google

CAPÍTULO 2. DEFINICIÓN DEL ENUNCIADO DEL PROBLEMA, OBJETIVO Y CARACTERÍSTICAS

2.2 Variable objetivo

Rob, un corredor de bolsa, ha definido su planteamiento del problema en términos de si debería


comprar o vender acciones de JP Morgan. Pero, ¿cómo entenderá esta lógica el algoritmo de
aprendizaje automático?

Rob define comprar cuando el rendimiento esperado al día siguiente es positivo y vender si el
rendimiento esperado al día siguiente es negativo.

Rob toma los datos históricos de los retornos y comienza a marcar estos días como compra y venta.

Posición de retorno al día siguiente


0,003 Comprar

0,007 Comprar

­0,002 Vender

0,02 Comprar

­0,005 Vender

Esta columna marcada como compra y venta se denomina variable objetivo. En el aprendizaje
automático, se indicará con la letra "y" la variable objetivo.

De manera similar, puedes crear una variable objetivo en función de los diferentes enunciados de
problemas que estarás resolviendo.

Por ejemplo, Mary quiere crear un algoritmo de aprendizaje automático para predecir el precio de
las acciones de JP Morgan al final del siguiente día de negociación. En este caso, la variable
objetivo será una serie de datos de precios de cierre.

¡Muy bien! Ya tienes en mente la variable objetivo. ¿Qué sigue?

Veamos qué requieren los modelos ML para realizar estas predicciones.

2.3 Características

Supongamos que no existe un modelo de aprendizaje automático y Rob tiene que tomar esta
decisión por su cuenta.

¿Qué datos o información necesitaría Rob para tomar esta decisión? ¿Puedes ayudar a Rob?

Probablemente Rob pueda ver las siguientes cosas:

1. Tendencia del precio: ¿ha aumentado o disminuido en los últimos días?

26
Machine Translated by Google

CAPÍTULO 2. DEFINICIÓN DEL ENUNCIADO DEL PROBLEMA, OBJETIVO Y CARACTERÍSTICAS

2. Volatilidad de las acciones


3. Valores de indicadores técnicos como el RSI de 14 días y el índice móvil de 50 días.
promedio

Volvamos al mundo del aprendizaje automático. La información que Rob necesita...


predecir comprar o vender acciones de JP Morgan, la misma información es utilizada por el
modelo ML para tomar esa decisión.

Rob pasa toda esta información al modelo ML, que a su vez procesa esta información y le
indica a Rob que compre o venda. La información, como la volatilidad, que Rob pasa al modelo
ML se denomina características.

Es importante tener en cuenta que la información que Rob le pasó al modelo de aprendizaje
automático debe ser de buena calidad. Estarás de acuerdo en que una mala calidad de la
información de entrada producirá una salida deficiente y engañosa. El dicho común es: "basura
que entra, basura que sale".

Los datos originales pueden tener datos incorrectos o valores faltantes.

Rob tiene que limpiar los datos y luego introducirlos en el modelo ML.

Rob estaba entusiasmado y comenzó a recopilar todos los datos que tenía y los preparó para
pasarlos al modelo ML. Por capricho, también decidió recopilar el historial de precios de las
manzanas durante el mismo período de tiempo para usarlo como una característica en su
modelo ML.

¿Qué utilidad tendrán estos datos? No serán útiles en absoluto. El precio de la fruta no tendrá
poder predictivo sobre el precio de las acciones de la empresa Apple Inc. Por lo tanto, antes
de pasar cualquier dato al modelo de ML, Rob debe asegurarse de que cada característica
sea relevante y tenga algún poder predictivo.

Pero, aunque los datos sean relevantes, hay algo importante que comprobar. Veamos en qué
consiste este punto en la siguiente sección.

27
Machine Translated by Google

CAPÍTULO 2. DEFINICIÓN DEL ENUNCIADO DEL PROBLEMA, OBJETIVO Y CARACTERÍSTICAS

La mayoría de los modelos de aprendizaje automático se basan en el supuesto de entrada estacionaria


La estacionariedad se refiere a la propiedad de que el valor observado de la característica es
independiente del tiempo. Significa que la media y la varianza de la característica serían constantes a lo

largo del tiempo. Por ejemplo, se dice que el precio de una acción, que ha fluctuado entre $8 y $9 desde
que comenzó a cotizar, es estacionario. Tenga en cuenta que esta característica no es obligatoria para
todos los algoritmos de aprendizaje automático.

Sin embargo, los modelos básicos no pueden manejar características no estacionarias.

Veamos otro ejemplo. El modelo de aprendizaje automático aprende que, a medida que el índice S&P
500 aumenta, el índice de volatilidad (VIX) disminuye y viceversa. Un algoritmo básico de aprendizaje
automático, al observar un aumento constante en el precio del SP500 a lo largo de los años, comenzaría
a predecir que el VIX caería a cero y luego entraría en la zona negativa, mientras que esto nunca
sucederá.

Rob ahora ha comprendido este concepto y casi ha decidido las características que se agregarán.

Finalmente, quiso incluir la volatilidad de las acciones en su modelo, pero ¿qué debería incluir en su
modelo, la volatilidad semanal o mensual, o ambas?

Dado que ambas características, la volatilidad semanal y mensual, están altamente correlacionadas
entre sí, agregar ambas no agregará ninguna información adicional al modelo.

En cambio, mantenerlos juntos en el modelo podría agregar más peso a la información que contiene
cada uno de ellos individualmente. Por lo tanto, Rob decide descartar uno de ellos. Por lo tanto, para
asegurarse de obtener resultados confiables, debe asegurarse de que se cumplan las condiciones
anteriores.

Hagamos un resumen rápido de las características.

• Las características son la entrada que se le da al modelo ML para hacer predicciones. • Cada
característica que se pasa al modelo ML debe ser relevante y tener algún poder predictivo. • La
mayoría de los modelos ML requieren
características estacionarias para hacer predicciones.
ciones.

• Las características correlacionadas pueden añadir peso a la información que contiene cada una
de ellas individualmente. Por lo tanto, se desean características no correlacionadas.

En el próximo capítulo, veremos cómo puedes crear estos objetivos y características en Python.

28
Machine Translated by Google

Objetivo y características en Python

En el capítulo anterior, vio cómo un algoritmo de aprendizaje automático requiere un conjunto de


características para predecir la variable objetivo.

Este capítulo está creado especialmente para que puedas entender cómo aplicar los conocimientos que
has aprendido hasta ahora en un entorno de programación como Python.

Planteamiento del problema

Ha decidido que quiere operar en JP Morgan. Más específicamente, quiere diseñar un algoritmo de
aprendizaje automático que le ayude a decidir si debe invertir en JP Morgan en un momento determinado.
Por lo tanto, el enunciado del problema es el siguiente:
El propósito es:

¿Conviene comprar acciones de JP Morgan en un momento dado o no?

Para codificar las variables de destino y características en Python, necesitaremos algunas bibliotecas o
paquetes, y también los datos históricos de JP Morgan.

[3]: importar pandas como pd importar


numpy como np

importar [Link] como plt %matplotlib en


línea [Link]('seaborn­
darkgrid')

Importar talib como ta desde


[Link] Importar adfuller
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

Leer los datos

Todos los módulos de datos utilizados en el libro se encuentran cargados en el siguiente


enlace de Github: [Link] Los datos OHLCV de
15 minutos del precio de las acciones de JP Morgan se almacenan en un archivo CSV [Link]
en el directorio data_modules. Los datos abarcan desde enero de 2017 hasta diciembre de
2019.

Para leer un archivo CSV, puedes utilizar el método read_csv de pandas. La sintaxis se
muestra a continuación:

Sintaxis:

importar pandas como pd


pd.read_csv(nombre de archivo)

nombre_archivo: Ruta completa del archivo y nombre del archivo en formato de cadena.

[4]: # Los datos se almacenan en el directorio 'data_modules'


ruta = "../módulos_de_datos/"

#Leer los datos


datos = pd.read_csv(ruta + 'JPM_2017_2019.csv', index_col=0) datos.índice =
pd.to_datetime(datos.índice)

[Link](figsize=(8,5), color='b') [Link](' Precio de


cierre') [Link]('Fecha') [Link]()

30
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

Variable objetivo

La variable objetivo es lo que el modelo de aprendizaje automático intenta predecir para


resolver el enunciado del problema. Recuerde que la habíamos denotado con la letra y.

Volviendo al enunciado del problema: ¿debería comprarse o no la acción de JP Morgan?


Crearemos una columna, señal. La columna señal tendrá dos etiquetas, 1 y 0.

Siempre que la etiqueta sea 1, el modelo indica una señal de compra . Y siempre que la
etiqueta sea 0, el modelo indica una señal de no compra . Asignaremos 1 a la columna de
señal siempre que los rendimientos futuros sean mayores que 0.

Los valores future_returns se pueden calcular utilizando el método pct_change de pandas. El


método pct_change calculará el cambio porcentual para el período de tiempo actual.

¿Recuerdas cómo Rob analizó los retornos del día siguiente para formar las variables objetivo,
compra o venta, para ese día? Aquí se aplica el mismo concepto.

Como queremos obtener rendimientos futuros, trasladaremos el cambio porcentual del período
actual al período anterior. Esto se puede hacer utilizando el método shift de pandas.

Sintaxis:

DataFrame[columna].pct_change().shift(período)

Parámetros: 1. Columna: La columna para la que se calculará el cambio porcentual. 2.


Período: El período para desplazar la serie. Para desplazar el valor actual al período de tiempo
anterior, el período será ­1.

[11]: # Crea una columna 'future_returns' con el cálculo del cambio porcentual
data['future_returns'] =
data['close'].pct_change().shift(­1)

# Crea la columna de señal


data['signal'] = [Link](data['future_returns'] > 0, 1, 0)

datos[['cerrar','señal']].head()

[11]: señal de cierre 0


2017­01­03 [Link]+00:00 87.39

31
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

2017­01­03 [Link]+00:00 87.19 1


2017­01­03 [Link]+00:00 87.30 1
2017­01­03 [Link]+00:00 87.38 0
2017­01­03 [Link]+00:00 87.13 0

Como puede ver en la tabla anterior, el precio de cierre de la segunda a la tercera fila aumenta
y, por lo tanto, la columna de señal en la segunda fila está marcada como 1. En otras palabras,
si compra cuando la columna de señal es 1, obtendrá ganancias positivas. Nuestro objetivo
es desarrollar un modelo de aprendizaje automático que pueda predecir con precisión cuándo
comprar.

Características Para predecir la señal, crearemos las variables de entrada para el modelo ML.
Estas variables de entrada se denominan características. Las características se conocen
como X. Puede crear características de tal manera que cada característica en su conjunto de
datos tenga algún poder predictivo.

Comenzaremos creando las columnas de cambio porcentual anterior de 15 minutos, 30


minutos y 75 minutos.

[4]: # Crea una columna 'pct_change' con el cambio porcentual anterior de 15 minutos
data['pct_change'] =
data['close'].pct_change()

# Crea una columna 'pct_change2' con el cambio porcentual anterior de 30 minutos


data['pct_change2'] =
data['close'].pct_change(2)

# Crea una columna 'pct_change5' con el cambio porcentual anterior de 75 minutos


data['pct_change5'] =
data['close'].pct_change(5)

A continuación, calcularemos los indicadores técnicos RSI y ADX. Esto se puede hacer
utilizando el método RSI y ADX de la biblioteca talib.

Sintaxis:

importar talib como ta


[Link](datos, período de tiempo)
[Link](datos_altos, datos_bajos, datos_abiertos, período de tiempo)

Los parámetros anteriores se explican por sí solos.

Dado que hay 6,5 horas de negociación en un día y nuestros datos son de 15 minutos, el
período de tiempo será 6,5*4.

32
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

[5]: # Crea una columna con el nombre RSI, # y asígnale


los valores RSI data ['rsi'] =
[Link](data['close'].values, timeperiod=int(6.5*4))

# Crea una columna con el nombre ADX, # y


asígnale los valores ADX data['adx'] =
[Link](data['high'].values, data['low'].values,
data['open'].values,
timeperiod=int(6.5*4))

Ahora crearemos la media móvil simple y la correlación continua del precio de cierre. Esto se
puede hacer utilizando el método mean y corr de la biblioteca pandas.

Sintaxis:

DataFrame[columna].rolling(ventana).mean()
DataFrame[columna].rolling(ventana).corr()

columna: La columna en la que se realizará la operación. ventana: El lapso de la ventana


móvil.

Calcularemos la media móvil diaria y la correlación.

[6]: # Crea una columna con el nombre sma, # y asígnale


valores SMA data['sma'] = data['close'].rolling(

ventana=int(6.5*4)).media()

# Crea una columna con el nombre corr, # y


asígnale los valores de correlación data ['corr'] =
data['close'].rolling( window=int(6.5*4))\

.corr(datos['sma'])

Calculemos ahora la volatilidad de las acciones. Esto se puede hacer calculando la desviación
estándar móvil de la columna pct_change.

[7]: # Volatilidad de 1 día y 2 días


datos['volatilidad'] = [Link](
int(6.5*4), min_periodos=int(6.5*4))
[ 'pct_change'].std()*100

33
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

datos['volatilidad2'] = [Link](
int(6.5*8), períodos_mínimos=int(6.5*8))
[ 'pct_change'].std()*100

Crea X e y

Antes de crear las características (X) y el objetivo (y), eliminaremos las filas con valores
faltantes.

[8]: # Descarta los valores faltantes


[Link](inplace=True)

Almacene la columna de señal en y y las características en X. Las columnas en la variable X


serán la entrada para el modelo ML y la columna de señal en y será la salida que el modelo
ML predecirá.

[9]: # Objetivo
y = datos[['señal']].copy()

# Características

X = datos[['apertura','máximo','mínimo','cierre','cambio_pct',
'pct_change2', 'pct_change5', 'rsi', 'adx', 'sma', 'corr', 'volatilidad',
'volatilidad2']].copy()

yo=1

# Establezca el número de filas en la subparcela nrows


= int([Link][1]+1/3) para la característica en
[Link]:

[Link](nfilas, 3, i)

# Grafique la característica
X[feature].plot(figsize=(8,3*[Link][1]),
color=[Link](3,))
[Link](característica)
[Link](característica) i+=1

plt.tight_layout()
[Link]()

34
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

35
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

Comprobación de estacionariedad

Como has visto que la mayoría de los algoritmos ML requieren características estacionarias,
eliminaremos las características no estacionarias de X.

Puede utilizar el método adfuller de la biblioteca statsmodels para realizar esta prueba en
Python y comparar el valor p.

• Si el valor p es menor o igual a 0,05, se rechaza H0 • Si el valor p es


mayor a 0,05, no se rechaza H0

Para utilizar el método adfuller, debes importarlo desde la biblioteca statsmodels como se
muestra a continuación:

desde [Link] importar adfuller

El método adfuller se puede utilizar como se muestra a continuación:

resultado = adfuller(X)

Se puede acceder al valor p como resultado[1].

[10]: def estacionario(serie):


"""Función para comprobar si la serie está estacionaria o no.
"""

resultado = adfuller(serie)
si(resultado[1] < 0.05):
volver 'estacionario'
demás:
volver 'no estacionario'

# Verificar la estacionariedad de
col en [Link]:
si estacionario(datos[col]) == 'no estacionario':
print('%s no está estacionario. Lo estamos soltando.' % col)
[Link](columnas=[col], eje=1, inplace=True)

abierto no es estacionario. Lo estoy bajando. alto no


es estacionario. Lo estoy bajando. bajo no es
estacionario. Lo estoy bajando. cerrado no es
estacionario. Lo estoy bajando. sma no es estacionario.
Lo estoy bajando.

36
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

De esta forma, se puede observar que los parámetros de apertura, máximo, mínimo, cierre y SMA no son estacionarios.

Se eliminan del conjunto de datos.

Correlación: puedes comprobar si dos características tienen una alta correlación, entonces
esencialmente una de las características es redundante. Podemos eliminar esa
característica y mejorar el aprendizaje del modelo.

[11]: importar seaborn como sns


[Link](figsize=(8,5))
[Link]([Link](), annot=True, cmap='coolwarm') [Link]()

En este ejercicio, definiremos que la correlación es alta si es mayor que 0,7.


La elección es subjetiva, pero no debe ser muy pequeña, de lo contrario la mayoría de las
características parecerán correlacionadas. Y al mismo tiempo, no debe ser muy alta, de
lo contrario ninguna de las características estará correlacionada. En el resultado anterior,
puede ver que la correlación entre volatility y volatility2 está por encima del umbral de
0,7. Por lo tanto, deberíamos eliminar cualquiera de las columnas anteriores. Eliminaremos
la columna volatility2. A continuación, se incluye un código automatizado para obtener el
par correlacionado:

37
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

[12]: def get_pair_above_threshold(X, umbral): """Función para devolver los pares con
correlación por encima del umbral.

"""

# Calcular la matriz de correlación


correl = [Link]()

# Desagrupar la matriz
correl = [Link]().unstack()

# Par recurrente y redundante


pairs_to_drop = set() cols =
[Link]().columns para i en
rango(0, [Link]().shape[1]): para j en rango(0, i+1):
pairs_to_drop.add((cols[i], cols[j]))

# Descartar el par recurrente y redundante correl =


[Link](labels=pairs_to_drop) \ .sort_values(ascending=False)

devuelve correl[correl > umbral].índice

imprimir(obtener_par_por_encima_del_umbral(X, 0.7))

MultiIndex([('volatilidad', 'volatilidad2')], )

[13]: # Eliminar la columna altamente correlacionada


X = [Link](columnas=['volatilidad2'], eje=1)

Una vez que hayamos eliminado las características que no son estacionarias y están
correlacionadas, mostraremos las características que hemos seleccionado.

Mostrar las características finales

[14]: lista([Link])

[14]: ['pct_cambio',
'pct_cambio2',

38
Machine Translated by Google

CAPÍTULO 3. OBJETIVO Y FUNCIONES EN PYTHON

[pct_change5', 'rsi',
'adx',
'corr',
'volatilidad']

¡Genial! Ya tenemos las características y la variable objetivo. ¿Qué sigue?

En el próximo capítulo, aprenderá por qué es importante dividir los datos en conjuntos de datos
de prueba y de entrenamiento.

39
Machine Translated by Google

División de entrenamiento y prueba

Pregúntele a cualquiera que haya escrito exámenes que implicaran cálculos matemáticos y le dirá
que las preguntas le resultaron familiares, pero que no eran lo que había estudiado.

Esto se debe a que se desea evaluar la capacidad de resolución de problemas de alguien y no su


memoria. De manera similar, no se entrena el algoritmo de aprendizaje automático dándole todo el
conjunto de datos. Se guarda una parte para más adelante, cuando se desea probar si el algoritmo
de aprendizaje automático ha aprendido correctamente.

En el aprendizaje automático, la división de entrenamiento y prueba significa dividir los datos en dos
partes:

1. Datos de entrenamiento (train_data)


2. Datos de prueba (test_data)

El algoritmo de aprendizaje automático se entrena con train_data y luego se aplica a test_data. El


resultado del aprendizaje automático se compara con el resultado real de test_data para evaluar el
rendimiento del modelo con datos "no vistos" (datos que no se conocen en el momento del
entrenamiento).

Dividamos nuestros datos en datos de prueba y de entrenamiento. En el primer paso, importaremos


las bibliotecas y el conjunto de datos.

Importar bibliotecas

[ ]: # Para la manipulación de datos, importe


pandas como pd

# Importar el módulo dividido train­test de sklearn


Machine Translated by Google

CAPÍTULO 4. ENTRENAMIENTO Y PRUEBA SPLIT

desde sklearn.model_selection importar train_test_split

# Para trazar
gráficos, importe [Link] como plt
%matplotlib inline
[Link]('seaborn­darkgrid')

Leer los datos

Para mayor comodidad, guardamos el objetivo (y) y las características (X), preparados para JP
Morgan en las secciones anteriores, como archivos csv.

Primero carguemos estos archivos csv usando el método read_csv de la biblioteca pandas.

[ ]: # Leer las características X =


pd.read_csv('../data_modules/JPM_features_2017_2019.csv', index_col=0,
parse_dates=True)

# Leer el objetivo y =
pd.read_csv('../data_modules/JPM_target_2017_2019.csv',
índice_col=0, fecha_análisis=Verdadero)

En la división de tren­prueba se dividen los datos en dos partes.

¿Pero en qué proporción se dividen los datos?

Pensemos en un estudiante un día antes de los exámenes universitarios.

Si el examen consta de 10 capítulos y el estudiante intenta realizarlo solo después de estudiar


2 capítulos, es probable que el resultado sea bajo. En el contexto del aprendizaje automático,
esta situación es análoga al subaprendizaje, que se produce cuando el modelo se entrena con
un conjunto de datos de entrenamiento muy pequeño.

Para que el estudiante universitario evite el subaprendizaje, se puede recomendar estudiar al


menos 7 u 8 de los 10 capítulos antes de presentarse al examen.
De manera similar, en el aprendizaje automático, debe seleccionar la proporción de división de entrenamiento
y prueba de manera tal que los datos de entrenamiento sean una representación justa de todos los datos.

Digamos que la división de entrenamiento y prueba es del 80 % al 20 %. Esto significa que el 80 % de


los datos originales son datos de entrenamiento y el 20 % restante son datos de prueba. El 80 % al 20 %

41
Machine Translated by Google

CAPÍTULO 4. ENTRENAMIENTO Y PRUEBA SPLIT

La proporción es una proporción popular para dividir los datos, pero no existe una regla general
que indique que siempre debemos usar la proporción 80%­20%.

También puedes probar otras opciones de proporción populares como 90%­10%, 75%­25%.

Utilizaremos un método listo para usar llamado train_test_split del módulo sklearn para realizar la
división de entrenamiento­prueba.

Sintaxis:

desde sklearn.model_selection importar tren_prueba_división tren_X, prueba_X,


tren_y, prueba_y = tren_prueba_división(
X, y, tamaño del tren, aleatorio)

Parámetros:

1. X: Las características de todo el conjunto de datos.


2. y: Los valores objetivo de todo el conjunto de datos. 3.
train_size: La proporción de los datos de entrenamiento. 4.
shuffle: Parámetro para especificar la mezcla de datos.

Devoluciones:

1. X_train: Las características del conjunto de datos de entrenamiento.


2. X_test: Las características del conjunto de datos de prueba.
3. y_train: Los valores objetivo del conjunto de datos de entrenamiento.
4. y_test: Los valores objetivo del conjunto de datos de prueba.

Utilicemos train_test_split para dividir los datos en una proporción de 80% de entrenamiento y
20% de prueba.

[ ]: # Obtener las características y el objetivo para `train_data` y


# `test_data` # Las
características (X) y el objetivo (y) se pasan junto con # el tamaño de train_data como
porcentaje de los datos totales X_train, X_test, y_train, y_test = \ train_test_split(X, y,
train_size=0.80)

# Imprimir las dimensiones de las variables print(f"La forma


de la variable X es {[Link]}.") print(f"La forma de la variable y es {[Link]}.
\n") print(f"La forma de la variable X_train es \

{X_train.shape}.") print(f"La
forma de la variable y_train es \ {y_train.shape}.\n") print(f"La forma de
la variable X_test es \

42
Machine Translated by Google

CAPÍTULO 4. ENTRENAMIENTO Y PRUEBA SPLIT

{X_test.shape}.")
print(f"La forma de la variable y_test es \ {y_test.shape}.\n")

La forma de la variable X es (19317, 7).


La forma de la variable y es (19317, 1).

La forma de la variable X_train es (15453, 7).


La forma de la variable y_train es (15453, 1).

La forma de la variable X_test es (3864, 7).


La forma de la variable y_test es (3864, 1).

Algunas observaciones después de la separación entre trenes y pruebas:

1. Las dimensiones del conjunto de datos original muestran que había 7 características
y 19318 observaciones en el conjunto de datos de características (X). La variable de
destino (y) tiene una columna y la misma cantidad de observaciones que X.
2. Las dimensiones de train_data muestran que X_train tiene 7 características y 15454
observaciones. Esto es el 80 % de 19318, redondeado hacia abajo al entero más
cercano. La variable de destino para los datos de train (y_train) tiene una columna y
la misma cantidad de observaciones que X_train.
3. Las dimensiones de test_data muestran que X_test tiene 7 características y 3864
observaciones. Es decir, el 20 % restante de 19318. La variable de destino para los
datos de entrenamiento (y_test) tiene una columna y la misma cantidad de
observaciones que X_test.

Visualizar los datos

Grafiquemos una de las columnas de características para ver cómo se dividen los datos.

[ ]: # Graficar los datos


[Link](figsize=(8, 5))

[Link](X_train['pct_change'], estilo de línea='Ninguno',


marcador='.', tamaño del marcador=3.0, etiqueta='Datos del tren X',
color='azul')
[Link](X_test['pct_change'], estilo de línea='Ninguno',
marcador='.', tamaño del marcador=3.0, etiqueta='datos de prueba
X', color='verde')

43
Machine Translated by Google

CAPÍTULO 4. ENTRENAMIENTO Y PRUEBA SPLIT

# Establecer el título y la etiqueta del eje

[Link]("Visualización de conjuntos de datos de prueba y entrenamiento (pct_change


→Columna)",
fontsize=14)
[Link]('Años', fontsize=12) [Link]('%
cambio (%)', fontsize=12)

# Mostrar la trama
[Link]()
[Link]()

Podemos ver que los datos train_data (puntos azules) y los datos test_data (puntos naranjas) se
mezclan aleatoriamente.

¿Quieres datos aleatorios para nuestros conjuntos de datos de prueba y entrenamiento? La


respuesta depende del tipo de datos que estés manejando. Si estás manejando observaciones
discretas, como la cantidad de productos defectuosos en una línea de producción de fábrica,
entonces puedes mezclar los índices para la división de prueba y entrenamiento.

Pero, como se ve en la ilustración anterior, estamos tratando con datos de series temporales
financieras.

En el caso de los datos de series temporales, el orden de los índices es importante y no se pueden mezclar
aleatoriamente. Esto se debe a que los índices de los datos de series temporales son marcas de tiempo que

44
Machine Translated by Google

CAPÍTULO 4. ENTRENAMIENTO Y PRUEBA SPLIT

ocurren uno después del otro (en secuencia).

Los datos no tendrían sentido si se mezclaran las marcas de tiempo.

La razón es sencilla: no se pueden utilizar los datos de 2021 para entrenar el modelo y luego
utilizarlo para predecir los precios de 2017. No es posible en la vida real porque no tenemos
acceso a datos futuros.

Forma correcta de dividir datos de series temporales Para dividir los datos de series temporales, no
debemos mezclar los conjuntos de datos. Podemos especificar el parámetro shuffle en False. Está
configurado en True de manera predeterminada, por lo que no especificarlo en la llamada al método
da como resultado una salida mezclada.

[ ]: # Obtener las características y el objetivo para `train_data` y


# `test_data` sin mezclar X_train, X_test,
y_train, y_test = train_test_split( X, y, train_size=0.80, mezclar=False)

# Graficar los datos


[Link](tamaño de figura=(8, 5))

[Link](X_train['pct_change'], estilo de línea='Ninguno',


marcador='.', tamaño del marcador=3.0, etiqueta='Datos del tren X',
color='azul')
[Link](X_test['pct_change'], estilo de línea='Ninguno',
marcador='.', tamaño del marcador=3.0, etiqueta='datos de prueba X',
color='verde')

# Establecer el título y la etiqueta del eje

[Link]("Visualización de conjuntos de datos de prueba y entrenamiento (pct_change


→Columna)",
fontsize=14)
[Link]('Años', fontsize=12) [Link]('%
cambio (%)', fontsize=12)

# Mostrar la trama
[Link]()
[Link]()

45
Machine Translated by Google

CAPÍTULO 4. ENTRENAMIENTO Y PRUEBA SPLIT

Como se ve en el gráfico, los puntos de datos de prueba y de entrenamiento no se mezclan. El


modelo se entrena con datos de entrenamiento (parte azul) y luego se evalúa el rendimiento con
datos de prueba ( parte verde). El problema anterior, en el que posiblemente usábamos datos
futuros para predecir el pasado, ya no ocurrirá.
En esta ilustración, el modelo se entrenará con datos hasta mayo de 2019 (parte azul) y luego se
utilizará para hacer predicciones para el futuro.

Ahora que ha aprendido a dividir los datos, intentemos entrenar un modelo y usar el modelo
entrenado para hacer algunas predicciones en los próximos capítulos.

46
Machine Translated by Google

Entrenamiento y pronóstico utilizando


Modelo de clasificación

En los capítulos anteriores, aprendimos sobre las características (X), el objetivo (y) y la división de
entrenamiento­prueba.

Como habrás visto en innumerables películas, el héroe siempre entrena duro antes de enfrentarse al
competidor. Del mismo modo, también tenemos que entrenar el algoritmo de aprendizaje automático.
Para que cuando entre en el mundo real, funcione espectacularmente.

Utilizaremos X_train y y_train para entrenar el modelo de aprendizaje automático.


El entrenamiento del modelo también se denomina “ajuste” del modelo.

Una vez ajustado el modelo, se utilizará X_test con el modelo de aprendizaje automático entrenado
para obtener los valores previstos (y_pred).
Machine Translated by Google

CAPÍTULO 5. ENTRENAMIENTO Y PREVISIÓN USANDO MODELO


DE CLASIFICACIÓN

Importar bibliotecas

[1]: # Para la manipulación de datos,


importe pandas como pd

# Importar clasificador de bosque aleatorio desde


[Link] import RandomForestClassifier

Leer los datos

El objetivo (y) y las características (X) del conjunto de datos de prueba y entrenamiento se leen
desde los archivos CSV. Tenga en cuenta que estos datos se prepararon en los capítulos anteriores.

[2]: # Define la ruta para los archivos de datos path = "../


data_modules/"

# Lea el objetivo y las características del entrenamiento y la prueba


→datos
X_tren = pd.read_csv(
ruta + "JPM_features_training_2017_2019.csv", index_col=0, parse_dates=True)

X_prueba = pd.read_csv(
ruta + "JPM_features_testing_2017_2019.csv", índice_col=0,

fechas_de_análisis=Verdadero) y_train = pd.read_csv(


ruta + "JPM_target_training_2017_2019.csv", índice_col=0,

fechas_de_análisis=Verdadero) y_test = pd.read_csv(


ruta + "JPM_target_testing_2017_2019.csv", índice_col=0,
fechas_de_análisis=Verdadero)

Seleccione un modelo de clasificación

A modo de ejemplo, utilizaremos el RandomForestClassifier. No se preocupe si no está


familiarizado con este modelo de aprendizaje automático.

En este momento no es importante entender cómo funciona el clasificador de bosque aleatorio.


Podemos utilizar cualquier otro modelo de clasificación en su lugar.

Lo importante aquí es aprender cómo se utilizan train_data y test_data junto con el modelo ML.

El modelo RandomForestClassifier del paquete sklearn se utiliza para crear el modelo de árbol
de clasificación. Si no tienes mucha experiencia en aprendizaje automático,

48
Machine Translated by Google

CAPÍTULO 5. ENTRENAMIENTO Y PREVISIÓN USANDO MODELO


DE CLASIFICACIÓN

Puede omitir la interpretación y comprensión de estos parámetros.


ahora.

Sintaxis:

RandomForestClassifier(n_estimadores, max_características,
profundidad_máxima, estado_aleatorio)

Parámetros:

1. n_estimators: La cantidad de árboles en el bosque. 2.


max_features: La cantidad de características a considerar al buscar
la mejor división.
3. max_depth: La profundidad máxima de un árbol. 4.
random_state: Valor inicial para el arranque aleatorio y la selección de características. Esto se
configura para replicar los resultados en ejecuciones posteriores.

Devoluciones:

Un objeto de tipo RandomForestClassifier que se puede ajustar a los datos de prueba y luego usarse
para realizar pronósticos.

Hemos establecido los valores de los parámetros. Son a modo de ejemplo y se pueden modificar.

[3]: # Crea el modelo de aprendizaje automático rf_model =


RandomForestClassifier( n_estimators=3,
max_features=3, max_depth=2, random_state=4)

Entrenar el modelo

Ahora es el momento de que el modelo aprenda de X_train e y_train. Llamamos a la función de ajuste
del modelo y pasamos los conjuntos de datos X_train e y_train.

Sintaxis:

[Link](tren_X, tren_Y)

Parámetros:

1. modelo: El objeto modelo (RandomForestClassifier).


2. X_train: Las características del conjunto de datos de entrenamiento.
3. y_train: El objetivo del conjunto de datos de entrenamiento.

Devoluciones:

La función de ajuste entrena el modelo utilizando los datos que se le pasan. El modelo entrenado se
almacena en el objeto de modelo donde se aplicó la función de ajuste.

49
Machine Translated by Google

CAPÍTULO 5. ENTRENAMIENTO Y PREVISIÓN USANDO MODELO DE


CLASIFICACIÓN

[4]: # Ajuste el modelo a los datos de entrenamiento


rf_model.fit(tren_X, tren_Y['señal'])
"El modelo está entrenado"

[4]: 'El modelo está entrenado'

Datos de pronóstico

El modelo ya está listo para realizar pronósticos. Ahora podemos pasar los datos no vistos (X_test) al
modelo y obtener los valores predichos por el modelo (y_pred).
Para realizar un pronóstico, se llama a la función de predicción y se pasan los datos no vistos como
parámetro.

Sintaxis:

[Link](X_test)

Parámetros: 1. modelo: El objeto modelo (RandomForestClassifier). 2.


X_test: Las características del conjunto de datos de prueba.

Devoluciones: Se obtiene una matriz numerosa de las salidas previstas.

Hagamos una predicción usando el modelo. A modo de ejemplo, usaremos el primer punto de datos
en X_test.

[5]: # Obtener un día de muestra de los datos de X_test


unseen_data_single_day = X_test.head(1)

# Vista previa de los datos

datos_invisibles_de_un_solo_día.T

[5]: 28/05/2019 [Link]+00:00


pct_cambio 0.000000
pct_cambio2 ­0,000091

pct_cambio5 0,001374
rsi 47.746053
anuncio 26.139722
corre ­0,515815

volatilidad 0,143024

Estos datos corresponden al 28 de mayo de 2019. Pasémoslos al modelo para obtener la predicción.

50
Machine Translated by Google

CAPÍTULO 5. ENTRENAMIENTO Y PREVISIÓN USANDO MODELO


DE CLASIFICACIÓN

[6]: # Obtener la predicción de un solo día


single_day_prediction = rf_model.
→predict(unseen_data_single_day)

# Vista previa de la predicción


single_day_prediction

[6]: matriz([0])

El resultado previsto del modelo es 0. Esto significa que el modelo indica que no tomará
posición el 28 de mayo de 2019. Apliquemos el modelo a todo el conjunto de datos de prueba.

[7]: # Utilice el modelo y prediga los valores para los datos de prueba y_pred =
rf_model.predict(X_test)

# Mostrar las primeras cinco predicciones print("Los


primeros cinco valores predichos", y_pred[:5])

('Los primeros cinco valores predichos', array([0, 0, 1, 0, 0]))

Las predicciones del modelo se almacenan en y_pred. 0 significa que no hay posición y 1
significa que hay una posición larga. Con y_pred, ahora podemos realizar operaciones
utilizando un modelo ML.

Pero ¿cómo sabemos que las predicciones del modelo ML son buenas?

Como podemos ver, el modelo predice correctamente los tres primeros valores de test_data.
Pero, ¿cómo sabemos la precisión de la predicción del modelo para todo el conjunto de
datos? Necesitamos aprender algunas métricas para medir el rendimiento del modelo. Esto
se tratará en el próximo capítulo.

51
Machine Translated by Google

6
Métricas para evaluar el clasificador
Modelo

En el capítulo anterior, creó un modelo de clasificación de aprendizaje automático y se preguntó:


"¿Cómo puedo comprobar si el modelo de aprendizaje automático es eficaz y útil?" ¿Y si el modelo
de aprendizaje automático es capaz de aprender los patrones de los datos y hacer predicciones
correctas?

Una de las formas más sencillas de averiguarlo es ver cuántas veces las predicciones realizadas por
el modelo de aprendizaje automático fueron correctas. Por ejemplo, si el modelo de aprendizaje
automático solo es correcto el 50 % de las veces, entonces no es en absoluto útil. También se puede
acertar el 50 % de las veces tomando decisiones aleatorias.

Por ejemplo, la tarea consiste en predecir si saldrá cara o cruz en el lanzamiento de una moneda. El
modelo puede predecir cara todas las veces y acertar el 50 % de las veces. Como solo hay dos
opciones, cara o cruz, incluso una suposición aleatoria acertará el 50 % de las veces. Por lo tanto, es
necesario que el modelo acierte más del 50 % de las veces.
tiempo.

Por otro lado, si el modelo de ML acertó 8 de cada 10 veces, entonces acertó el 80 % de las veces. Y
podemos decir que, en efecto, es capaz de encontrar algunos patrones para mapear la entrada con la
salida y que no es aleatorio. En la jerga técnica, esta puntuación del 80 % se denomina precisión.

¿Cuál debería ser el umbral deseado de precisión al utilizar modelos ML para el trading?

Una puntuación de precisión superior al 50 % es satisfactoria para un modelo de aprendizaje


automático. ¿No le interesa comprobar la precisión del modelo de aprendizaje automático que creamos
en el capítulo anterior?

¡Descubrámoslo ahora!
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

Para ello, utilizaremos la salida prevista (y_pred) y la salida esperada (y_test).

Importaremos las bibliotecas y leeremos los valores predichos del modelo (y_pred) y los valores
objetivo esperados (y_test) de test_data.

[1]: # Para la manipulación de datos,


importe pandas como pd

# Bibliotecas para evaluar el modelo from [Link]


import classification_report, \ confusion_matrix

# Bibliotecas para trazar gráficos


import [Link] as plt %matplotlib inline
[Link]('seaborn­
darkgrid') import seaborn as sns import
[Link] as clrs

# Define la ruta para los archivos de datos path = "../


data_modules/"

# Leer los valores objetivo previstos por el modelo y_pred =


pd.read_csv(
ruta + "JPM_predicted_2017_2019.csv", index_col=0,
parse_dates=True)['señal']

# Leer los valores objetivo del conjunto de datos de prueba y_test =


pd.read_csv(
ruta + "JPM_target_testing_2017_2019.csv", índice_col=0,
fechas_de_análisis=Verdadero)['señal']

La precisión no es más que el total de predicciones correctas dividido por el total de


predicciones. Representamos gráficamente los datos para ver cómo se distribuyen las
predicciones correctas e incorrectas. Los puntos verdes son aquellos en los que las
predicciones fueron correctas y los puntos rojos son aquellos en los que las predicciones fueron incorrectas.

[2]: # Define los datos de precisión precision_data


= (y_pred == y_test)

# Porcentaje de precisión
precision_percentage = round(100 *

53
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

precision_data.sum()/len(precision_data), 2)

# Graficar los datos de precisión


[Link](figsize=(8, 5))

# Mapeo de colores para las predicciones correctas e incorrectas cmap =


[Link](['green', 'red'])

[Link]([])
[Link](x=prueba_y.índice, y=[1]*len(prueba_y),
c=(datos_de_precisión != True).astype(float), marcador='.',
cmap=cmap)

# Establecer el título y la etiqueta del eje

[Link]("Precisión (predicciones incorrectas en rojo)", fontsize=14)


[Link]('Años',
fontsize=12)

# Mostrar los resultados


[Link]()
print(f"La precisión es {accuracy_percentage}%.")

54
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

La precisión es del 51,55%.

La precisión se calcula como se muestra arriba. Estos cálculos de precisión y otras métricas de
rendimiento se pueden realizar utilizando el método classification_report ya preparado. Aprenderá sobre
el método classification_report en la última parte del capítulo.

¿Es el puntaje de precisión suficiente para concluir que el modelo ML es efectivo?

Probablemente no. Considere un modelo de ML diseñado para predecir si debe comprar o vender. Este
modelo de ML tiene una precisión del 73 %. Pero al utilizar este modelo, las señales de venta no son
muy buenas y se generan pérdidas.

¿Cómo es posible eso para un modelo ML con una precisión del 73%?

Para obtener una respuesta a esa pregunta, debe obtener la etiqueta numérica de precisión o la acción
que realizará el modelo de aprendizaje automático. En este caso, la precisión de cada predicción de
compra y venta. Esto lo ayudará a obtener una visión más granular de cómo funciona el modelo.

Resulta que el modelo ML predijo 100 veces que el precio subiría, el precio en realidad subió 90 veces
y en realidad bajó 10 veces.

Por lo tanto, para predecir la señal de "compra", el modelo tiene una precisión del 90 %. Eso es bastante
bueno.

Compra prevista de ML

El precio actual cae un 10%


El precio actual sube un 90

Pero en el caso de la señal de venta, el modelo predijo 50 veces que el precio bajaría, pero el
precio bajó solo 20 veces y subió 30 veces. El modelo solo tiene un 40 % de precisión a la
hora de predecir la señal de venta, por lo que colocar una orden de venta basándose en la
recomendación del modelo seguramente será desastroso.

ML pronostica compra ML pronostica venta

El precio actual cae un 10% 20

El precio actual sube un 90 30

La matriz que se muestra aquí se llama matriz de confusión.

A veces, se utilizan jergas para explicar las etiquetas de la matriz, como Falso

55
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

Positivo, Verdadero positivo, Falso negativo y Verdadero negativo. En el ejemplo anterior,


supongamos que Comprar es Positivo y Vender es Negativo.

En todas las ocasiones en las que el modelo ML predijo correctamente la compra, lo llamamos
Verdadero Positivo. La cantidad de veces en las que el modelo ML se equivocó al predecir la
compra o la etiqueta positiva, lo llamamos Falso Positivo. Falso porque el modelo ML se equivocó
al pronosticar la etiqueta positiva.

De manera similar, ¿puedes decir qué es un Verdadero Negativo y un Falso Negativo?

La cantidad de veces que el modelo de ML predijo correctamente una señal negativa o de venta
se denomina Verdadero Negativo. Y cuando el modelo de ML se equivocó en la predicción de
una etiqueta negativa o una señal de venta, se denomina Falso Negativo. Este uso de la
terminología de positivo y negativo proviene de la ciencia médica, donde realizamos la prueba y
el resultado es positivo o negativo. Pero en algunos casos, puede haber un diagnóstico erróneo.

Veamos ahora la matriz de confusión de nuestro modelo de aprendizaje automático.

Sintaxis:

matriz_confusión(y_test, y_pred)

Parámetros:

1. y_test: El objetivo observado del conjunto de datos de entrenamiento.


2. y_pred: El objetivo previsto del modelo.

Devoluciones:

Una matriz numpy de la matriz de confusión.

[3]: # Defina la matriz de confusión


matriz_confusión_datos = matriz_confusión(valores_prueba_y, valores_pred_y)

# Graficar los datos


fig, ax = [Link](figsize=(6, 4))
[Link](datos_de_matriz_de_confusión, fmt="d",
cmap='Blues', cbar=Falso, annot=Verdadero, ax=ax)

# Establezca las etiquetas de los ejes y el título ax.set_xlabel('

Etiquetas previstas', fontsize=12) ax.set_ylabel(' Etiquetas reales', fontsize=12)


ax.set_title(' Matriz de confusión ', fontsize=14) [Link].set_ticklabels(['Sin
posición', 'Posición larga']) [Link].set_ticklabels(['Sin posición', 'Posición
larga'])

56
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

# Mostrar la gráfica
[Link]()

La matriz de confusión vista arriba nos da la siguiente información:

1. Verdadero positivo: 1007 predicciones correctas para tomar una posición larga.
2. Falso positivo: 951 predicciones incorrectas para tomar una posición larga
Cuando la acción esperada no era posición.
3. Verdadero Negativo: 985 predicciones correctas para no tomar posición.
4. Falso Negativo: 921 predicciones incorrectas por no tomar posición cuando
La acción esperada era tomar una posición larga.

La matriz de confusión nos ayuda a comprender la efectividad del modelo,


pero tiene su propia limitación.

Si tiene más etiquetas para clasificar, la matriz de confusión crece. Por ejemplo, 3 etiquetas
como comprar, sin posición y vender se ven así.

ML Compra prevista Sin posición Venta

El precio real aumenta un 10 25 40


El precio actual se mantiene igual 90 25 20

57
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

ML Compra prevista Sin posición Venta

El precio real cae 80 40 30

Y si sus etiquetas son la cantidad de acciones, que pueden variar de 0 a 10,


para comprar, entonces será una mesa de 11x11.

Por lo tanto, a medida que aumenta el número de etiquetas, se hace difícil su interpretación.

Predicciones de ML

Comprar 0 .. .. .. Compre 10
Precio Actual Sin incremento 10 25 .. 40 10
El movimiento aumenta 0,1% 25 40 .. 10 25
Aumenta 0,2% 40 10 .. 25 40
Aumenta 0,3% 25 40 .. 10 25
Aumenta 0,4% 10 25 .. 40 10
Aumenta 0,5% 25 40 .. 10 25
Aumenta 0,6% 40 10 .. 25 40
Aumenta 0,7% 10 25 .. 40 10
Aumenta 0,8% 40 10 .. 25 40
Aumenta 0,9% 25 40 ..25 10 25
Aumenta 1%+ 10 .. 40 10

¿Existen otras razones por las que no deberíamos mantener la precisión como la única métrica?

Vamos a desviarnos un poco del tema e imaginar que Rob quiere crear un
Algoritmo de ML que sería útil en tiempos de estrés o caída del mercado, como
como durante el brote de la pandemia de covid 19.

Analizó los rendimientos diarios del S&P 500 durante los últimos 40 años.

Rob construyó un algoritmo ML para predecir cuándo se producirán los retornos diarios del S&P 500.

58
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

ser inferior al ­5 %. Y según la predicción del modelo ML, Rob venderá en corto los futuros del SP500.
Este modelo ML creado por Rob mostró una precisión del 99,8 %.
¡Guau! ¡Estaba en el séptimo cielo!

Pero Mary, su amiga y colega, parecía sospechosa y analizó en profundidad los datos. El algoritmo de
aprendizaje automático se ejecutó durante 10.000 días entre 1980 y 2021.
El ML fue correcto 9980 veces, lo que resultó en una precisión del 99,8%.

Descubrió que el S&P 500 cayó por debajo del 5% sólo 20 veces.

Y el algoritmo predijo que no se venderían futuros del S&P 500 en corto todos los días, incluidos
los 20 días siguientes. En los 20 días en que el SP500 cayó un 5 % o más, el modelo fue
incorrecto.

Mary le explicó el problema a Rob y le dijo que hay una métrica mejor que se puede usar en este caso:
comprobar cuántas veces el modelo predijo correctamente que el mercado caería un 5 % o más .

Predicción de ML

Precio no inferior al 5% Precio inferior al 5%

Precio actual no inferior al 5% 9980 0

El precio actual baja un 5% 20 0

En el ejemplo, es cero de 20 instancias.

Esto se llama métricas de recuperación.

Entonces Rob estaba encantado y dijo que solo usaría el recuerdo en el futuro.

Mary tuvo que decirle a Rob que la métrica de recuperación como independiente tampoco es buena.

¿Qué pasa si el modelo simplemente predice que se venderá todos los días?

Predicción de ML

Precio no inferior al 5% Precio inferior al 5%

Precio real no inferior al 5% 0 9980

El precio actual baja un 5% 0 20

La recuperación de la caída del mercado del 5% será del 20/20 o del 100%, eso siempre es correcto,
pero ya sabes que este modelo no es útil.

Mary dijo que también deberías comprobar el número de veces que el modelo dio la señal de venta y
resultó correcto.

59
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

Predicción de ML

Precio no inferior al 5% Precio inferior al 5%

Precio real no inferior al 5% 0 9980

El precio actual baja un 5% 0 20


Total 10000

Rob se dio cuenta de que este valor es 20 de cada 10 000 veces, es decir, 0,002. Este valor se llama
precisión.

Rob se dio cuenta de que tanto el recuerdo como la precisión son igualmente importantes.

Le preguntó a Mary si hay una manera de crear una medida de rendimiento que pueda
combinar ambos.

Mary dijo que sí. Se llama puntuación f1. Puedes usar la puntuación f1 para entender el rendimiento
general del algoritmo. La puntuación f1 es la media armónica de precisión y recuperación.

(precisión recuperación)
f 1puntuación = 2
(precisión + recuperación)

Rob calculó rápidamente la puntuación f1 de su modelo y resultó ser 0,003.

(1 0,002) f 0,004
1puntuación = 2 = = 0,003
(1 + 0,002) 1,002

Veamos las fórmulas para las diferentes métricas de rendimiento:

Número de veces que el algoritmo predijo un resultado correctamente


Recordar =
Número total de resultados reales

Número de veces que el algoritmo predijo un resultado correctamente


Precisión =
Número total de dichos resultados predichos por el algoritmo

2 (precisión * recuperación)
f1­score =
(precisión + recuperación)

60
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

La biblioteca scikit­learn tiene una función llamada classification_report


que proporciona medidas como precisión, recuperación, puntuación f1 y soporte para
Cada clase. La precisión y la exactitud indican la calidad de nuestras predicciones.
La puntuación f1 proporciona la media armónica de precisión y recuperación. Los valores de
soporte se utilizan como ponderaciones para calcular los valores promedio de precisión y recuperación.
y puntuación f1.

Una puntuación f1 superior a 0,5 suele considerarse un buen número.

Puede utilizar simplemente la siguiente sintaxis para imprimir el informe de clasificación.

Sintaxis:

informe_clasificación(y_test, y_pred)

Parámetros:

1. y_test: El objetivo observado del conjunto de datos de entrenamiento.


2. y_pred: El objetivo previsto del modelo.

Devoluciones:

Informe de clasificación que contiene precisión, recuperación, puntuación f1 y soporte.

[4]: # Informe de clasificación


datos_del_informe_de_clasificación = informe_de_clasificación(prueba_y,
y_pred)

# Imprimir el informe de clasificación


imprimir(datos del informe de clasificación)

precisión Recordar el soporte de f1­score

0 0,52 0,51 0,51 1936


1 0,51 0,52 0,52 1928

exactitud 0,52 3864

promedio macro 0,52 0,52 0,52 3864

promedio ponderado 0,52 0,52 0,52 3864

En la columna más a la izquierda, puedes ver los valores 0,0 y 1,0. Estos representan
La posición es la siguiente:

1. 0 significa que no hay posición.


2.1 significa una posición larga.

Entonces, a partir de la tabla, se puede decir que el modelo ML tiene una precisión general

61
Machine Translated by Google

CAPÍTULO 6. MÉTRICAS PARA EVALUAR EL MODELO CLASIFICADOR

Puntuación de 0,52. La precisión que calculamos fue del 51,55 %, es decir, aproximadamente 0,52.
Además de la precisión, también puede identificar la precisión, la recuperación y la puntuación f1 de
las señales.

El soporte es el número de ocurrencias reales de la clase en el conjunto de datos especificado. Por lo


tanto, en la señal total, hubo 1936 ocurrencias de 0 y 1928 ocurrencias de la señal 1.

La puntuación de precisión le indica el rendimiento total del modelo ML.

¿Qué son los promedios macro y ponderados?

A veces, los valores de la señal pueden no estar equilibrados. Puede haber casos en los que la
cantidad de ocurrencias de 0 sea apenas 50, mientras que la cantidad de ocurrencias de 1.0 sea
500. En este escenario, el promedio ponderado le dará más peso a la señal 1. Por el contrario, el
promedio macro toma un promedio simple de todas las ocurrencias.

De esta forma, el rendimiento del modelo de aprendizaje automático se puede analizar


utilizando las métricas que has aprendido en este cuaderno. ¡Genial! Ahora ya conoces las
métricas para analizar el rendimiento, pero ¿qué pasa si utilizamos este algoritmo en el mundo
real?

¡Hagamos una prueba retrospectiva de este modelo y veamos cómo habría funcionado!

62
Machine Translated by Google

7
Backtesting y trading en vivo

Hasta ahora has visto diferentes métricas de evaluación de modelos como exactitud,
precisión, recuperación y puntuación f1. Una vez que estés satisfecho con el rendimiento
del modelo, puedes tomar las señales generadas por ellos para operar y analizar los retornos.
No solo los retornos, sino que también debes analizar el riesgo asociado con la generación
de retornos.

Este proceso se llama backtesting.

¿Por qué hacemos pruebas retrospectivas del modelo? Piénsalo: antes de comprar cualquier
cosa, ya sea un teléfono móvil o un coche, querrás comprobar el historial de la marca, sus
características, etc. para comprobar si merece la pena invertir en ella. El mismo principio se
aplica al trading, y las pruebas retrospectivas te ayudan con ello.

¿Sabías que la mayoría de los traders en el mercado pierden dinero?

Pierden dinero no porque les falte comprensión del mercado.


Pero simplemente porque sus decisiones comerciales no se basan en investigaciones sólidas
y métodos comerciales probados.

Toman decisiones basadas en emociones, sugerencias de amigos y asumen riesgos


excesivos con la esperanza de enriquecerse rápidamente. Si eliminan las emociones y los
instintos de las operaciones y prueban las ideas antes de operar, aumentan las posibilidades
de obtener rentabilidad en el mercado.

En el backtesting, se prueba una hipótesis/estrategia comercial en datos históricos.

En los capítulos anteriores, usted tomó como características el cambio porcentual previo de
15, 30 y 75 minutos y esperaba que estas características lo ayudaran a predecir los
rendimientos futuros. Esta es su hipótesis.
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

¿Cómo pondrías a prueba esta hipótesis? ¿Cómo sabrías si la estrategia funcionará en el


mercado o no?

Al utilizar datos históricos, puede realizar pruebas retrospectivas y ver si su hipótesis es


verdadera o no. Esto ayuda a evaluar la viabilidad de una estrategia comercial al descubrir
cómo se comporta en los datos históricos.

Si realiza pruebas retrospectivas de su estrategia con datos históricos y obtiene buenos


resultados, tendrá confianza para operar con ella. Si la estrategia no funciona bien con los datos
históricos, descartará o reevaluará la hipótesis.

Repasaremos algunos términos y conceptos que nos ayudarán a analizar nuestra estrategia.
Pero lo haremos simultáneamente para ver cómo funciona nuestra estrategia.

Primero, leamos los archivos de datos.

En los capítulos anteriores, ha utilizado un clasificador de bosque aleatorio para generar la


señal de si comprar o no acciones de JP Morgan.

Las señales se almacenan en un CSV JPM_predicted_2019.csv. Usaremos el método read_csv


de pandas para leer este CSV y almacenarlo en un marco de datos strategy_data.

Además, leeremos el precio de cierre de JP Morgan almacenado en una columna de cierre en


el archivo CSV JPM_2017_2019.csv.

Además, lo almacenaremos en la columna de cierre en strategy_data. Mientras leemos los datos


del precio de cierre, dividiremos el período para que coincida con los datos de la señal.

[1]: # Para la manipulación de datos


importar numpy como np
importar pandas como pd

# Para trazar
gráficos, importe [Link] como plt
%matplotlib inline
[Link]('seaborn­darkgrid')

# Los datos se almacenan en el directorio 'data_modules' path = '../


data_modules/'

# Leer el precio de cierre


strategy_data = [Link]()
strategy_data['close'] = pd.read_csv(path +
"JPM_2017_2019.csv", index_col=0)['cerrar']

64
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

# Leer las señales previstas


datos_de_estrategia['señal_predicha'] = pd.read_csv(ruta +
"JPM_predicción_2017_2019.csv", índice_col=0)

estrategia_datos.índice = pd.hasta_fecha_hora(estrategia_datos.índice)
datos_de_estrategia = datos_de_estrategia.dropna()

# Vista previa de los datos de la estrategia


estrategia_datos.head()

[1]: cerrar señal_predicha


2019­05­28 [Link]+00:00 109.29 0.0
2019­05­28 [Link]+00:00 109.37 0.0
2019­05­28 [Link]+00:00 109.33 1.0
2019­05­28 [Link]+00:00 109.37 0.0
2019­05­28 [Link]+00:00 109.38 0.0

Lo primero que debes saber sobre tu estrategia es cuáles son los retornos.
Sólo entonces pensarás si el negocio tenía sentido. Así que primero calcularás
La estrategia regresa, como se muestra a continuación.

Calcular el rendimiento de la estrategia


[2]: # Calcular el cambio porcentual
datos_de_estrategia['pct_change'] = datos_de_estrategia[
'cerrar'].pct_change()

# Calcular el rendimiento de la estrategia


datos_de_estrategia['retornos_de_estrategia'] = datos_de_estrategia[
'señal_predicha'].shift(1) * \
datos_de_estrategia['pct_change']

# Descarta los valores faltantes


estrategia_data.dropna(inplace=True)

datos_de_estrategia[['retornos_de_estrategia']].head()

[2]: estrategia_devoluciones
28/05/2019 [Link]+00:00 0.000000
28/05/2019 [Link]+00:00 ­0.000000
28/05/2019 [Link]+00:00 0,000366
28/05/2019 [Link]+00:00 0.000000

65
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

28/05/2019 [Link]+00:00 ­0.000000

Registros de operaciones Crearemos una función llamada get_trades. La función tomará


como entrada el marco de datos con las señales y el precio de cierre junto con los nombres
de las columnas de las señales y el precio de cierre.

Devolverá un marco de datos que contiene los detalles de cada operación realizada durante
la prueba retrospectiva. Se incluyen los siguientes detalles para cada operación:

• Dirección de la operación (posición) •


Hora de entrada •
Precio de entrada
• Hora de salida

• Precio de
salida • Ganancia o pérdida

[3]: def get_trades(datos, columna_de_cierre, columna_de_señal):


# Crea un marco de datos para almacenar el valor de cada transacción
trades = [Link]()

# Establezca la posición actual como 0,


# y la hora de entrada como vacía
current_position = 0
"
entry_time =

# Recorrer cada operación en el marco de datos para i en


[Link]:

# Cada fila en el marco de datos será # tratada


como una nueva posición new_position
= [Link][i, signal_column]

# Si la posición cambia # registra la


entrada y la salida if new_position !=
current_position: if entry_time != '': entry_price =
[Link][entry_time,

cerrar_columna]
hora_de_salida = i
precio_de_salida = [Link][hora_de_salida,
columna_de_cierre]
detalles_de_operación = [Link](
[(posición_actual, hora_de_entrada,
precio_de_entrada, hora_de_salida,

66
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

precio_de_salida)])
operaciones = [Link](detalles_de_operación,
ignore_index=True)
"
hora_de_entrada =

si nueva_posición != 0:
tiempo_entrada = i
posición_actual = nueva_posición

# Agregue los detalles de la operación al marco de datos `trades`


[Link] = ['Posición', 'Hora de entrada', 'Precio de entrada',
'Hora de salida', 'Precio de salida']

operaciones['PnL'] = (operaciones[' Precio de salida'] ­


operaciones[' Precio de entrada']) * \
operaciones['Posición']
operaciones de retorno

# Obtener detalles comerciales para la estrategia de relación de


aciertos trade_log = get_trades(strategy_data, 'close', 'predicted_signal')

registro_comercial.iloc[0].T

[3]: Posición 1.0


Hora de entrada 28/05/2019 [Link]+00:00
Precio de entrada 109.33
Hora de salida 28/05/2019 [Link]+00:00
Precio de salida 109.37
PNL 0,04
Nombre: 0, tipo: objeto

Análisis de nivel de operaciones Definiremos una función get_analytics. La función tomará el registro
de operaciones que generamos en el paso anterior y devolverá lo siguiente:

• Número de operaciones largas •


Número de operaciones cortas •
Número total de operaciones •

Ganancia bruta •
Pérdida bruta

67
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

• Ganancia/pérdida neta
• Número de operaciones ganadoras •
Número de operaciones perdedoras
• Porcentaje de ganancias
• Porcentaje de pérdidas
• Ganancia promedio por operación ganadora •
Pérdida promedio por operación perdedora

[4]: def get_analytics(operaciones):

# Creando el marco de datos para almacenar los parámetros analytics


= [Link](index=['Strategy'])

# Número de operaciones largas


analytics['num_of_long'] = len([Link][ [Link] ==
1])

# Número de operaciones cortas


analytics['num_of_short'] = len([Link][ [Link] ==
­1])

# Número total de transacciones


analytics['total_trades'] = analytics.num_of_long + \ analytics.num_of_short

# Utilidad bruta
analytics['gross_profit'] = [Link][ [Link] >
0].[Link]()

# Pérdida bruta
analytics['pérdida_bruta'] =
[Link][ [Link] < 0].[Link]()

# Utilidad neta
analytics['net_profit'] = [Link]()

# Análisis de operaciones
rentables ['ganadores'] = len([Link][ [Link] > 0])

# Análisis de operaciones
con pérdidas ['losers'] = len([Link][

68
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

[Link] <= 0])

# Porcentaje de victorias
analytics['win_percentage'] = 100 * [Link] /\
análisis.total_trades

# Porcentaje de pérdida
analytics['porcentaje_pérdida'] = 100 * [Link] /\
análisis.total_trades

# Ganancia/pérdida por operación de operaciones ganadoras


analytics['ganadores_de_PnL_por_operación'] = [Link][
[Link] > 0].[Link]()

# Por operación, ganancia/pérdida de operaciones perdedoras


analytics['perdedores_de_PnL_por_operación'] = [Link][
[Link] <= 0].[Link]()

analítica = ronda(analítica, 2)

análisis de retorno.T

# Obtener análisis de estrategia


análisis = obtener_analíticas(registro_comercial)

analítica

[4]: Estrategia
169,00
0.00
169,00
59.21
­29,49
29,72
102.00
núm_de_operaciones_largas núm_de_operaciones_cortas totales beneficio_bruto pérdida_bruta beneficio_neto ganadores
perdedores 67,00

porcentaje de 60.36

ganancias porcentaje 39,64


de pérdidas por operación 0,58
­0,44
ganadoras por operación perdedoras por operación

69
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

Visualizaremos cómo ha cambiado el valor de la cartera a lo largo del tiempo.


Puedes utilizar la curva de equidad para este propósito.

Trazar la curva de capital Puede trazar las columnas cumulative_returns de strategy_data


para obtener la curva de capital.

[5]: # Calcular los rendimientos acumulados


datos_de_estrategia['retornos_acumulados'] =
( 1+datos_de_estrategia['retornos_de_estrategia']).cumprod()

# ­­­­­­­­­­­­­­­­­­­­­Curva de capital­­­­­­­­­­­­­­­­­­­­­ # Trazar los retornos acumulados


de la estrategia
strategy_data['cumulative_returns'].plot(figsize=(8, 5), color='green')

[Link](' Curva de capital', fontsize=14)


[Link]('Rendimientos acumulados')
plt.tight_layout() [Link]()

rendimientos_acumulados = (datos_de_estrategia[
'cumulative_returns'][­1] ­ 1) *100 print("El
rendimiento acumulado es {0:.2f}%." .format(cumulative_returns))

70
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

La rentabilidad acumulada es del 28,10%.

Del resultado anterior, se puede ver que la estrategia generó un rendimiento acumulado del
28,10 % en siete meses. Es impresionante, pero no es la única métrica que necesitamos ver.
Profundicemos más para comprender el rendimiento de su estrategia en detalle.

Puede analizar los rendimientos generados por la estrategia y el riesgo asociado a ellos
utilizando diferentes métricas de rendimiento.

Rendimiento anualizado El rendimiento anualizado es la media geométrica de la cantidad de


dinero que se obtiene con una inversión cada año durante un período de tiempo determinado.
Muestra qué rendimiento obtendría una estrategia durante un período de tiempo si se calculara
el rendimiento anual compuesto. Se calcula utilizando la siguiente fórmula:

252 6,5 4

Rendimientos anualizados = (rendimiento acumulado , número de puntos de datos de 15 minutos ) − 1

Nota: Hay aproximadamente 252 días de negociación en un año y 6,5 horas de negociación
en un día. Como trabajamos con datos de 15 minutos, la cantidad de frecuencias de
negociación en un año es 252 6,5 4.

Y el numerador en el término exponencial es 252 6,5 4.

[6]: # Calcular los rendimientos anualizados


rendimiento_anualizado =
((datos_de_estrategia[ 'rendimiento_acumulativo']
[­1]) **\ (252*6.5*4/datos_de_estrategia.shape[0]) ­ 1)*100
print("El rendimiento anualizado es {0:.2f}%.".
format(annualised_return))

La rentabilidad anualizada es del 52,20%.

Del resultado anterior se desprende que la rentabilidad media anual de la estrategia es del
52,20 %. Pero, ¿qué tan volátil es el activo? Puedes averiguarlo utilizando la volatilidad anual.

Volatilidad anualizada La volatilidad es una medida del riesgo. Se define como la desviación
estándar de los rendimientos de la inversión. La volatilidad anualizada se puede calcular
multiplicando la volatilidad diaria por la raíz cuadrada del número de días de negociación en
un año.

Volatilidad anualizada = Var(Retornos) √ 252 6,5 4

71
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

[7]: # Calcular la volatilidad anualizada annualised_volatility =


strategy_data[ 'strategy_returns'].std()*[Link](252*6.5*4)*100

print("La volatilidad anualizada es {0:.2f}%."


.format(volatilidad_anualizada))

La volatilidad anualizada es del 14,90%.

Una volatilidad anualizada del 14,90% significa que, durante aproximadamente el 68% del
tiempo en un año, el precio en el momento actual diferiría en menos del 14,90% del precio
del momento anterior.

Esto es interesante. Pero la volatilidad como término trata a los términos positivos y negativos
como si fueran lo mismo. Te gustaría saber cuánto puede llegar la cartera a territorio negativo.
Puedes comprobarlo utilizando la caída máxima.

Caída máxima La caída máxima es el valor máximo que una cartera perdió desde su punto
máximo. Es la pérdida máxima que puede generar la estrategia.
Cuanto mayor sea el valor de la reducción, mayores serán las pérdidas. Se calcula de la
siguiente manera:

Valor mínimo − Valor máximo


Caída máxima =
Valor pico

[8]: # Calcular el máximo en ejecución


running_max =
[Link]( datos_de_estrategia['retornos_acumulativos'].dropna())

# Asegúrese de que el valor nunca caiga por debajo de


1 running_max[running_max < 1] = 1

# Calcular el porcentaje de reducción drawdown =


((strategy_data[
'retornos_acumulados'])/máximo_ejecución ­ 1)*100

# Calcular la reducción máxima


max_dd = [Link]()
print("La reducción máxima es {0:.2f}%." .format(max_dd))

# ­­­­­­­­­­­­­­­­­­­­­Gráfico DD­­­­­­­­­­­­­­­­­­­­­ fig = [Link](figsize=(8, 5))

72
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

# Graficar la caída máxima


[Link](dibujo, color='rojo')
# Rellene entre los espacios en blanco

plt.fill_between([Link], [Link], color='red') [Link]('Estrategia de


reducción', tamaño de fuente=14) [Link]('Reducción(%)',
tamaño de fuente=12) [Link]('Año', tamaño de
fuente=12)

plt.tight_layout() [Link]()

La caída máxima es del ­7,94%.

Del resultado anterior, se puede ver que la reducción máxima es del 7,94%.
Esto significa que el valor máximo que perdió la cartera desde su pico fue del 7,94%.

Como con cualquier inversión, también puedes calcular el índice de Sharpe para comprender el
rendimiento de la estrategia.

Ratio de Sharpe El ratio de Sharpe mide el rendimiento de una cartera en comparación con un
activo libre de riesgo. Es la relación entre los rendimientos obtenidos por encima de la tasa libre
de riesgo y la volatilidad de los rendimientos. Se calcula de la siguiente manera:

73
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

Rp ­ Rf
Relación de Sharpe =
σp

dónde,

• Rp es la rentabilidad de la cartera. •
Rf es la tasa libre de riesgo.

σp es la volatilidad.

Se preferirá una cartera con un índice de Sharpe más alto a una cartera con un índice
de Sharpe más bajo.

[9]: # Calcular el índice de Sharpe


sharpe_ratio = round(strategy_data['strategy_returns'] \ .mean()/
strategy_data['strategy_returns'] \ .std() * [Link](252*6.5*4),
2) print("El índice de Sharpe es
{0:.2f}." .format(sharpe_ratio))

El ratio de Sharpe es 2,89.

El ratio de Sharpe de 2,89 indica que la rentabilidad es bastante buena en comparación


con el riesgo asociado.

Tenga en cuenta que, para simplificar el capítulo, no se tuvieron en cuenta el coste de


transacción ni el deslizamiento al analizar el rendimiento de la estrategia. Pero este
también es un concepto importante. Además, dado que la tasa libre de riesgo depende
de la región y del período de tiempo, hemos preferido mantenerla en 0. Por supuesto,
puede introducirla en la fórmula para calcularla usted mismo.

¿Cómo debería usted definir sus métricas de riesgo?

La volatilidad y la caída máxima son las medidas estándar de riesgo. Si le preocupa la


pérdida máxima que puede generar una estrategia a lo largo de un período de tiempo,
puede utilizar la caída máxima.

Los operadores también utilizan el ratio de Sharpe, ya que proporciona información sobre los
rendimientos por unidad de riesgo. Por lo tanto, utiliza ambos factores, riesgo y rendimientos.

Es importante tener en cuenta que no hemos considerado los costos de transacción,


comisiones, deslizamientos e impuestos al calcular los retornos de la estrategia y las diferentes
métricas.

Backtesting vs Walk Forward Trading Testing El backtesting de una estrategia le


brinda una buena comprensión de lo que sucedió en el pasado, pero no es

74
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

Un predictor del futuro. La prueba de caminar hacia adelante es un método mejor que, hasta cierto punto,
puede predecir el futuro.

En el método de prueba de avance, dividimos los datos históricos en el conjunto de datos de entrenamiento
(dentro de la muestra) y de prueba (fuera de la muestra). En el conjunto de datos de entrenamiento,
optimizamos los parámetros comerciales y verificamos el rendimiento de la estrategia en los conjuntos de
datos de prueba.

Supongamos que tienes diez años de datos.

Se toman los primeros tres años de datos como entrenamiento y se mantiene el cuarto año como prueba.
Luego evalúa el desempeño durante el cuarto año utilizando varias métricas de desempeño.

A continuación, repite la optimización utilizando datos de los años 2 a 4 y valida utilizando el mes 5.
Repite este proceso hasta que hayas llegado al final de los datos. Recopila los resultados de todos los
datos fuera de la muestra del año 4 al 10, que es tu resultado fuera de la muestra.

Trading en papel y trading en vivo Usted creó la estrategia y analizó el rendimiento de la misma.

¿Puedes iniciar una operación en papel o en vivo directamente?

¿Cuándo debería considerar su estrategia para operar en papel o en vivo?

Si está satisfecho con el rendimiento de la estrategia de backtesting, puede comenzar a operar con papel.
Si no, debe modificar la estrategia hasta que el rendimiento le resulte aceptable. Y una vez que los
resultados de la estrategia de backtesting sean satisfactorios, puede comenzar a operar en vivo.

Proceso de trading en papel y trading en vivo

Cómo

¿Cuántos backtests debes hacer antes de poner en marcha una estrategia?

No hay un número fijo. Puede poner en marcha su estrategia después de realizar una prueba retrospectiva
o después de realizar varias pruebas retrospectivas. Como mencionamos en la pregunta anterior, una
vez que esté satisfecho con los resultados de la prueba retrospectiva, puede

75
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

Considere su estrategia comercial para el trading en papel y el trading en vivo.

Un buen analista de backtesting debe ser consciente de ciertas desventajas y sesgos que
pueden cambiar drásticamente los resultados de sus pruebas retrospectivas. Veámoslos uno
por uno.

Sesgo de optimización/sobreajuste Las pruebas retrospectivas, como cualquier otro modelo,


son propensas al sobreajuste. Al probar el modelo con datos históricos, sin darse cuenta se
intenta ajustar los parámetros para obtener los mejores resultados.

Obtendrá el mejor resultado en el conjunto de datos históricos, pero cuando implemente el


mismo modelo en el conjunto de datos invisible, es posible que no obtenga el mismo resultado.

La mejor manera de evitar el sobreajuste es:

• Dividir el conjunto de datos en conjuntos de datos de entrenamiento y

de prueba. • Realizar pruebas retrospectivas de su estrategia comercial en el conjunto de datos de


entrenamiento y ejecutar su estrategia en el conjunto de datos de prueba con los mismos
parámetros que utilizó en el conjunto de datos de entrenamiento para garantizar la eficacia de la estrategia.

Sesgo de anticipación El sesgo de anticipación es el uso de información en el análisis antes del


momento en que realmente habría ocurrido.

Al diseñar una estrategia, tienes acceso a todos los datos, por lo que pueden darse situaciones
en las que incluyas datos futuros que no estaban disponibles en el período de tiempo que se
está probando.

Un descuido aparentemente insignificante, como suponer que el informe de ganancias estará


disponible un día antes, puede generar resultados sesgados durante las pruebas retrospectivas.

Debe asegurarse de no utilizar datos que solo estarán disponibles en el futuro para evitar el
sesgo de anticipación.

Sesgo de supervivencia Durante el backtesting de la estrategia, a menudo se tiende a probar


una estrategia en el universo de acciones actual en lugar de en el universo de acciones
histórico. Es decir, se utiliza el universo que ha sobrevivido hasta hoy para realizar el
backtesting.

Hay un ejemplo famoso que se utiliza para ilustrar el sesgo de supervivencia.

Si usted utilizara acciones de empresas tecnológicas para formular una estrategia, pero tomara
los datos después del estallido de la burbuja punto com, presentaría un escenario marcadamente
diferente que si los hubiera incluido antes del estallido de la burbuja.

Es un hecho simple, después del año 2000, las empresas que sobrevivieron lo hicieron bien
porque sus fundamentos eran sólidos y, por lo tanto, su estrategia sería...

76
Machine Translated by Google

CAPÍTULO 7. BACKTESTING Y TRADING EN VIVO

No incluye todo el universo. Por lo tanto, el resultado de su prueba retrospectiva podría no brindar
una imagen completa.

Software de backtesting Existen plataformas disponibles que brindan la funcionalidad para realizar
backtesting en datos históricos. Los puntos importantes a considerar antes de seleccionar una
plataforma de backtesting son:

• ¿Qué clases de activos admite la plataforma? • Fuentes de los


datos de mercado que admite • ¿Qué lenguajes de
programación se pueden utilizar para codificar la estrategia comercial?
¿Qué es lo que se quiere probar?

Algunos de los programas de backtesting y trading en vivo más comunes son:

1. Blueshift 2.
MetaTrader 3.
Amibroker 4.
QuantConnect 5.
Quanthouse, etc.

Aunque esto ya se ha dicho antes, no es necesario que el pasado sea siempre representativo del
futuro.

Por lo tanto, es importante tener en cuenta que no se debe confiar demasiado en las pruebas retrospectivas.
Por ejemplo, la pandemia de COVID en 2020 fue la primera de su tipo y tuvo un impacto en los
mercados globales.

Es posible que las reglas identificadas en los datos históricos no hayan funcionado bien durante
esta pandemia.

¡Genial! Has creado con éxito tu propio algoritmo de aprendizaje automático y no solo lo has
probado con datos históricos, sino que también has analizado sus resultados.

Antes de comenzar a operar en vivo, es posible que haya algunas cosas que deba tener en
cuenta. En la siguiente sección, responderemos algunas de las preguntas más comunes cuando
se trata de aplicar el modelo de aprendizaje automático en los mercados en vivo.

77
Machine Translated by Google

8
Desafíos en el trading en vivo

Cuando intente implementar un modelo de aprendizaje automático en operaciones en vivo,


deberá responder algunas preguntas prácticas como:

• ¿Cómo guardo un modelo para usarlo más adelante?

• ¿Cómo uso un modelo ya guardado?

• ¿Cómo manejar los datos?

• ¿Cuándo debo volver a entrenar el modelo?

Vamos a analizarlos uno por uno.

¿Cómo guardar un modelo? Entrenar modelos de aprendizaje automático requiere mucho


tiempo y recursos. Por eso, la mayoría de los traders entrenan sus modelos los fines de
semana, si el modelo funciona con datos diarios. O si el modelo funciona con datos intradiarios,
lo entrenan después del cierre del mercado.

En ambos casos, los operadores utilizan los datos más recientes disponibles para entrenar sus
modelos y luego los guardan. Estos modelos se recuperan más tarde y se utilizan para hacer
predicciones durante la negociación. Este proceso ahorra tiempo y recursos. Puede utilizar la
biblioteca pickle para guardar un modelo una vez que se haya entrenado.

El módulo pickle implementa un algoritmo fundamental, pero poderoso, para guardar y cargar
una estructura de objeto de Python. El proceso de guardar se conoce como “serialización” y el
proceso de carga se denomina “desserialización”.

Guardar serialización Cargar deserialización

Cuando guarde un objeto con pickle, ese objeto se convertirá en un flujo de bytes de 1 y 0, y
luego se guardará. Cuando desee cargar un objeto dirigido por pickle, se lleva a cabo una
operación inversa, por la cual se guarda un flujo de bytes.
Machine Translated by Google

CAPÍTULO 8. DESAFÍOS EN EL TRADING EN VIVO

convertido nuevamente en un objeto. Hay un par de cosas que debes recordar al guardar un
objeto con Pickle.

Cosas a tener en cuenta durante la serialización o deserialización

Compatibilidad de versiones de Python

Al (des)serializar objetos, debe utilizar la misma versión de Python, ya que el proceso utilizado
es diferente en las distintas versiones y esto puede generar
errores.

Seguridad

Los datos de Pickle se pueden alterar para insertar código malicioso, por lo que no se recomienda
restaurar datos de fuentes no autenticadas.

Guardemos el modelo. Antes de hacerlo, debe decidir dos parámetros:

¿Qué quieres guardar? ¿Cómo quieres guardarlo?

En el código que se muestra aquí, hemos creado una función simple llamada save_model que
toma estos dos parámetros como entradas y guarda el modelo.

En una simulación, guardaremos el modelo entrenado varias veces. Por lo tanto, creamos una
función llamada save_model para manejar este paso repetitivo. Esta función toma el nombre del
modelo y el nombre guardado del modelo como entrada, y guarda el modelo en un archivo
binario, ya que la máquina puede ser local, remota o un sistema de archivos desubicado.

Por ahora, asumiremos que estamos guardando el archivo en un sistema local.

La función save_model abre un archivo en la máquina local utilizando la variable


model_pickled_name. Aquí, la palabra clave 'wb', o 'write binary', implica que Python sobrescribirá
el archivo, si ya existe, o creará uno nuevo si no existe. Luego, se utiliza el comando dump de la
biblioteca pickle para escribir el modelo en el destino especificado.

Además de la biblioteca pickle, también puedes usar las bibliotecas joblib y JSON para guardar
tus modelos. La biblioteca joblib es muy eficiente en comparación con la biblioteca pickle a la
hora de guardar objetos que contienen datos de gran tamaño. Por otro lado, JSON guarda un
modelo en un formato de cadena que es más fácil de leer para los humanos.

79
Machine Translated by Google

CAPÍTULO 8. DESAFÍOS EN EL TRADING EN VIVO

[ ]: def save_model(model_name, model_saved_name): # Abra un archivo


con el nombre mencionado en la máquina local con open(model_saved_name, 'wb')
como model_save: # Use el comando dump para guardarlo
[Link](model_name, model_save)

En este ejemplo, ejecutamos esta función save_model y guarda el modelo en la máquina local
con el nombre model_pickle como se muestra.

[ ]: modelo_guardado_nombre = 'modelo_guardado.pkl'
guardar_modelo(modelo, modelo_guardado_nombre)

Cargar un modelo Una vez que haya guardado el modelo, puede acceder a él en su máquina
local mediante la función load_model. Esta función toma el nombre del modelo seleccionado
como entrada y carga ese modelo.

Cargaremos el modelo entrenado en cada punto de datos.

[ ]: def load_model(nombre_guardado_del_modelo):
# Abra el archivo que contiene el modelo # con el nombre
mencionado en la máquina local con open(model_saved_name, 'rb') como archivo:

# Cargar el modelo y asignarlo a una variable model = [Link](file)

# Devuelve el modelo
modelo de retorno

¿Cómo manejar los datos? Para entrenar modelos de trading basados en aprendizaje automático
necesitamos una gran cantidad de datos. Descargar datos de una fuente en línea cada vez que
se desea entrenar un modelo lleva mucho tiempo. Para evitar esto, los datos antiguos que se
usaron para entrenar el modelo inicial deben guardarse en la máquina local y los datos nuevos
pueden agregarse a este archivo al final de la operación todos los días. Los datos nuevos pueden
agregarse a los datos existentes usando la función de anexión de pandas.

[ ]: Datos actualizados = Datos [Link](día actual_OHLC,


ignore_index=True)
Datos actualizados a csv("[Link]")

80
Machine Translated by Google

CAPÍTULO 8. DESAFÍOS EN EL TRADING EN VIVO

A la izquierda puede ver el archivo de datos antiguo y a la derecha puede ver el archivo de datos
actualizado después de agregar los nuevos datos.

¿Cuándo se debe volver a entrenar el modelo? Necesitamos volver a entrenar un modelo cada vez
que su rendimiento deja de ser bueno.

Puede decidir cuándo volver a entrenar un modelo en función de sus métricas de rendimiento, como:

1. Pérdida de capital Supongamos que desea volver a entrenar un modelo en función de su pérdida de
capital. En ese caso, debe realizar un seguimiento de las ganancias y pérdidas (o PnL) de la estrategia
en cada período de tiempo, como por ejemplo, cada día o cada minuto.

Si el PnL cae por debajo de un cierto límite, entonces lo volverás a entrenar.

Si el modelo inicialmente obtuvo una ganancia de 100 dólares y luego perdió 5 dólares, cuál es el
criterio de corte en este caso.

Una vez que se activa el criterio de corte, dejaremos de operar y luego volveremos a entrenar el
modelo.

Este criterio de corte lo decide el comerciante, dependiendo de su propia tolerancia al riesgo.

2. Precisión Este es otro criterio que puede utilizarse para decidir si se debe volver a entrenar un
modelo o no.

81
Machine Translated by Google

CAPÍTULO 8. DESAFÍOS EN EL TRADING EN VIVO

Digamos que ha establecido una precisión del 55 % como criterio para volver a entrenar un modelo.

Siempre que la precisión del modelo caiga por debajo del 55%, debes volver a entrenarlo.

Además de estos dos enfoques, puedes volver a entrenar tu modelo con la mayor frecuencia
posible, independientemente de su rendimiento. Sin embargo, asegúrate de que tu modelo no esté
sobreajustado.

Esto creará un modelo que se entrenará con los últimos datos disponibles en todo momento.

Cuando desea volver a entrenar un modelo, debe realizar muchas tareas, como crear las
características, entrenar el modelo y guardarlo.

Para realizar estas tareas múltiples, creamos una función simple llamada create_new_model. Esta
función toma los datos sin procesar y el nombre guardado del modelo como entrada.

[ ]: def crear_nuevo_modelo(datos, nombre_guardado_del_modelo):


# Crear una característica a partir de los datos sin procesar
X, y = crear_características(datos)
# Entrena el modelo con las características generadas model =
train_model(X, y)
# Guardar el modelo en la máquina local

save_model(modelo, nombre_guardado_del_modelo)

De esta manera, debe asegurarse de que su modelo de aprendizaje automático funcione de


acuerdo con sus expectativas. Recuerde que puede haber ocasiones en las que el rendimiento
de su modelo comience a deteriorarse. No dude en pausar sus operaciones hasta que haya
modificado la estrategia para que funcione de acuerdo con sus expectativas.

¡Genial! Finalmente hemos implementado un modelo de aprendizaje automático de principio a fin.

Hasta ahora has estudiado el modelo de aprendizaje automático basado en clasificación.


Este es un tipo de algoritmo de aprendizaje supervisado. Esto nos lleva al final de la segunda parte
del libro. En la siguiente parte, verás otros tipos de algoritmos de aprendizaje automático.

Lectura adicional

1. Una guía práctica para la ingeniería de características en Python ­

82
Machine Translated by Google

CAPÍTULO 8. DESAFÍOS EN EL TRADING EN VIVO

[Link]

2. Ingeniería de datos y características para el trading [Curso] ­


[Link]
trading
3. Mejor para Financiero Modelos ­
Entrada
[Link]
para­tontos­parte­1­7913aa7226f5
4. Las 9 principales técnicas de ingeniería de características con Python ­
[Link]

5. Etiquetado de datos: el método de triple barrera ­


[Link]

6. Cómo utilizar las transformaciones StandardScaler y MinMaxScaler en


Python: [Link]
transforms­in­python/
7. ¿Cuál es la relación ideal entre la longitud dentro de la muestra y fuera de la muestra?
¿longitud? ­ [Link]
ideal­entre­la­longitud­dentro­de­la­muestra­y­la­longitud­fuera­de­la­muestra
­
8. ¿Normalización de datos antes o después de la división entre entrenamiento y prueba?
[Link]
before­or­after­train­test­split
9. Validación cruzada en modelos de trading de aprendizaje automático ­
[Link]

10. Validación cruzada en finanzas: depuración, embargo, combinación


­ [Link]

11. Cómo elegir la métrica adecuada para evaluar el modelo de ML ­


[Link]
ml­model
12. Cómo elegir la métrica adecuada para evaluar el aprendizaje automático
Modelos, parte 2: [Link]
learning­models­[Link]
13. ¿Cómo evalúo los modelos que predicen el desempeño de las acciones?
[Link]

­
14. ¿Cuál es el ratio de Sharpe aceptable para un escritorio de prop? https://
[Link]/questions/21120/what­is­an­acceptable­sharpe­ratio­
for­a­prop­desk/21123#21123
­
15. Hacer lo contrario de lo que dice el modelo

83
Machine Translated by Google

CAPÍTULO 8. DESAFÍOS EN EL TRADING EN VIVO

[Link]
the­model­says/35906#35906
16. ¿Debe volver a entrenarse un modelo si hay nuevas observaciones disponibles?
­ [Link]
trained­if­new­observations­are­available

84
Machine Translated by Google

Parte III

Aprendizaje supervisado:
Regresión y clasificación
Machine Translated by Google

9
El modelo de regresión lineal

Si dos acciones se mueven siguiendo un patrón determinado, ¿puedes aprovecharlo?

Por ejemplo, los precios de las acciones de JP Morgan y Bank of America se mueven al
unísono. ¿Cómo cree que será la relación entre JP Morgan y Bank of America?

¡Regresión lineal al rescate!

Este conocimiento de la relación le ayudará a predecir el precio de las acciones


de JP Morgan utilizando el precio de las acciones de Bank of America. Y podrá
generar señales de trading cuando exista una desviación extrema entre el
precio previsto y el precio real.
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

¿ Cómo funciona la regresión lineal o cómo encontrar la relación?


Trabajaremos con un ejemplo simplificado para aprender el funcionamiento de la regresión lineal.

Hay dos series de tiempo x e y.

Fecha xy
1 24
2 48
3 8 16
4 3?

El día 1, el precio de X es 2 y el de Y es 4, y así sucesivamente.

¿Cuál debería ser el precio de Y en el día 4 dado que el precio de X es $3?

Aquí se puede ver fácilmente que y es el doble de x. Por lo tanto, se puede decir que
El precio de Y será $6. En otras palabras, la representación matemática de
La relación es y = 2x.

También puedes representar gráficamente los tres primeros puntos.

Y traza una línea que pase por estos puntos.

87
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

Para predecir el precio de Y en el día 4, dado que el precio de X es $3, puedes trazar la
línea como se muestra para obtener el precio de $6 para Y.

Este gráfico también se llama diagrama de dispersión.

Tomemos otro ejemplo. Según la tabla o el diagrama de dispersión que se muestra


arriba, ¿cuál será el precio de y el día 4, dado que el precio de X es $6?

Es fácil ver en el diagrama de dispersión que el precio sería $17.

x
29
3 11
4 13
6 17

De la tabla, el precio de y es el doble de x más 5 dólares. (y = 2x + 5)


Eso es el doble de 6 más 5. El precio de Y es 17.

88
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

Esta ecuación también se puede utilizar para describir la línea en el diagrama de


dispersión. Aquí, 2 es la pendiente de la línea y 5 es la intersección o el valor de y cuando x es 0.

Este es el principio básico de la regresión lineal, en el que se ajusta una línea para
conectar los puntos de datos. Además, se puede utilizar esta línea para predecir el valor
de Y si se conoce el valor de X.

En los dos ejemplos anteriores, todos los puntos estaban en la línea.

Pero esto dista mucho de ser cierto en el caso de los datos del mundo real. Si cambiamos
x e y por JP Morgan y Bank of America, los puntos quedarían por encima o por debajo de
la línea. La distancia entre el punto y la línea se denomina error de pronóstico.

Existen varios modelos de regresión que funcionan para minimizar este error. Veamos
cómo se puede utilizar la regresión lineal con datos del mundo real y cómo evaluar su
rendimiento.

9.1 Regresión lineal en el trading


Veamos ahora cómo funciona la regresión lineal con los datos comerciales. Construirás un modelo de
regresión lineal utilizando los precios de las acciones de Bank of America y JP Morgan. Dado que estás
utilizando el precio de las acciones de Bank of America para predecir los precios de las acciones de JP Morgan,
El precio de Morgan y el precio de Bank of America serán su variable independiente y su
coordenada x. JP Morgan será su variable dependiente y su coordenada y. Para leer un
archivo CSV, puede utilizar el método read_csv de pandas.

[ ]: # Importar las bibliotecas


importar pandas como pd
importar [Link] como plt
%matplotlib inline
[Link]('seaborn­darkgrid')

89
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

# Los datos se almacenan en el directorio 'data_modules' path = '../


data_modules/'
# Leer el archivo csv usando el método read_csv de pandas data =
pd.read_csv(path + 'jpm_and_bac_price_2019.csv', index_col=0)

[Link]('BAC Close','JPM observado', color='azul', figsize=(6,5));

Puede utilizar el método fit() de [Link] para calcular las variables necesarias
para desarrollar un modelo de regresión lineal. La sintaxis se muestra a continuación:

Sintaxis:

importar [Link] como sm model


= [Link](y, X).fit()

1. y: coordenada y 2.
X: coordenada x

90
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

Se utilizan los siguientes métodos/propiedades.

1. add_constant(): Calcula el coeficiente, ya que el valor predeterminado se considera


0. 2. summary(): Ver los detalles del modelo de regresión.

[ ]: importar advertencias
[Link]('ignorar') importar
[Link] como sm Y = data['JPM
observado']
X = sm.add_constant(data['BAC Close']) modelo =
[Link](Y,X).fit() [Link]()

[ ]: [Link]

[ ]: constante ­10.857609
BAC Cerrar 4.216694
tipo: float64

La ecuación de regresión lineal se puede calcular de la siguiente manera:

[ ]: print(f"y = {round([Link][0],2)} + \
{round([Link][1],2)} * x") print(f"JPM
= {round([Link][0],2)} + \ {round([Link][1],2)} *
BAC")

y = ­10,86 + 4,22 * x JPM = ­10,86


+ 4,22 * BAC

Pero, ¿qué tan bien pueden los datos de precios del Bank of America predecir el precio del J.
P. Morgan. Para ello, utilizaremos la métrica de bondad de ajuste o R2, como se le conoce
comúnmente.

Comprendamos también las matemáticas detrás de la métrica y aprendamos a calcularla


usando la biblioteca sklearn en Python.

9.2 R­cuadrado
R­cuadrado también se conoce como coeficiente de determinación y se denota por R
2
.

Ya has visto que el R cuadrado explica el porcentaje de variación en la variable dependiente,


y, que se describe mediante la variable independiente, X. Es igual al cuadrado de la correlación.
Matemáticamente,

91
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

Varianza explicada por el modelo


R2 =
Varianza total

Varianza inexplicada = 1 −
Varianza total

Error de regresión de suma al cuadrado


=1−
Error total al cuadrado de la suma

2
∑ i=1 (yi − yˆi)
norte

=1−
norte
2
∑ i=1 (yi − y¯)

El
Donde, ­ yi es el valor observado para la i ­ ésima fila. ­ y¯ es el promedio de las fila. ­ yˆi es el valor predicho
y
observadas.

2
Ahora, ya que entiendes las matemáticas detrás de R , ¿Cuál es el rango de R? 2?

El valor de R 2
siempre se encuentra entre 0 y 1.

Regrese a la fórmula anterior y podrá ver que R 1 si y solo si todas las yi fueran exactamente iguales a las yˆi respectivas . 2 serán

Eso 2 significa que R será 1 cuando el modelo pueda predecir todos los valores y será 0 cuando el modelo no pueda capturar ninguno.

2
Precisamente. Y la
relación R entre las X y las Y.

Calcular R­cuadrado Calculemos el R­cuadrado para los datos anteriores usando la fórmula.

[ ]: r_sq = 1 ­ ((datos[' JPM observado']­datos['JPM_BAC predicho ']) \ ** 2).sum()/((datos[' JPM


observado'] \
­ data[' JPM observado'].mean()) \
** 2).sum()
print('El R­cuadrado es %.2f' % r_sq)

El R cuadrado es 0,82

El valor anterior de R­cuadrado significa que el 82% de la variación en el precio de las acciones de
JP Morgan se explica por la variación en el precio de las acciones de Bank of America.

92
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

También puedes calcular lo mismo usando la biblioteca sklearn. La biblioteca sklearn


La biblioteca tiene una función r2_score que se puede importar de la siguiente manera:

desde [Link] importar r2_score

Usando la función r2_score, el R cuadrado se puede calcular como se muestra


abajo:

r2_score(y_verdadero,y_predicho)

[ ]: desde [Link] importa r2_score


r_sq = r2_score(datos[' JPM observado'], datos['Predicho
→JPM_BAC'])
print('El R­cuadrado es %.2f' % r_sq)

El R cuadrado es 0,82

Leamos otro archivo CSV almacenado en el mismo directorio y verifiquemos


valor de R 2 Este archivo ha observado y predicho el precio de las acciones de JP Morgan.
Esta vez, el precio de las acciones de JP Morgan se ha predicho utilizando las acciones
Precio de Nestlé.

[ ]: data_nestle = pd.read_csv(ruta \
+
→'Precio previsto de JPM y Nestlé para [Link]',
índice_col=0)
datos_nestle.tail()

[ ]: Observación del cierre de JPM Nestlé Predicción del cierre de JPM_Nestle


Fecha
23­12­2019 137.199997 108.800003 120.207267
24­12­2019 137.580002 108.589996 120.048491
26­12­2019 139.039993 108.709999 120.139220
27­12­2019 139.139999 108.980003 120.343358
30­12­2019 138.630005 107.849998 119.489012

[ ]: r_sq = r2_score(data_nestle[' JPM observado'],


data_nestle['Predicción de JPM_Nestle'])
print('El R­cuadrado es %.2f' % r_sq)

El R cuadrado es 0,35
2
¿Puedes interpretar el valor de R? ¿arriba? El valor anterior de R­cuadrado,
0,35, significa que solo el 35% de la variación en el precio de las acciones de JP Morgan
Se explica por la variación del precio de las acciones de Nestlé.

93
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

Echemos un vistazo al gráfico del precio de JPM frente al precio de BAC y del precio de JPM frente
al precio de Nestlé.

[ ]: fig, (ax1, ax2) = [Link](2, 1, tamaño de fig=(6, 5*2))

# Gráfico del precio de JPM frente al precio de


BAC [Link](data['BAC Close'], data['Observed JPM'], color="green")

[Link](data['BAC cerrado'], data['JPM_BAC previsto'])


# Establezca el título y las etiquetas para el gráfico
ax1.set_title('BAC Group y JPM Price Graph, R­squared = %.
→2f' \
%r2_score(datos['JPM observado'],
datos['JPM_BAC previsto']),
→tamaño de fuente=14)

ax1.set_xlabel(' Precio BAC', tamaño de fuente=12)


ax1.set_ylabel('Precio JPM ', tamaño de fuente=12)

# Gráfico del precio de JPM frente al precio de


Nestlé [Link](data_nestle['Nestle Close'],
data_nestle[' JPM observado'], color="rojo")
[Link](data_nestle[' Cierre de Nestlé'],
data_nestle['Predicción de JPM_Nestle'])
# Establezca el título y las etiquetas para el gráfico
ax2.set_title(' Gráfico de precios de Nestlé y JPM, R­cuadrado = %.2f' \
%r2_score(data_nestle['JPM observado'], data_nestle['
JPM previsto_Nestle']),
tamaño de fuente=14)

ax2.set_xlabel(' Precio de Nestlé', tamaño de fuente=12)


ax2.set_ylabel(' Precio de JPM', tamaño de fuente=12)

[Link]()

94
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

2 ¿ De los dos valores de R mejor? que hemos visto cual creeis que es

95
Machine Translated by Google

CAPÍTULO 9. EL MODELO DE REGRESIÓN LINEAL

Sí, el primer valor (82 %) es mejor, ya que explica más varianza. En el primer gráfico, se puede
ver que los puntos están más cerca de la línea de mejor ajuste y dispersos en el segundo
gráfico. Esto explica la diferencia entre los dos valores de R
2.

Intuitivamente, el cambio en el precio de las acciones de JP Morgan estaría altamente


correlacionado con el cambio en el precio de las acciones de Bank of America, y no estaría
correlacionado con el cambio en el precio de las acciones de Nestlé. Esto se debe a que tanto
JP Morgan como Bank of America pertenecen al mismo sector de la banca y son muy
sensibles a factores como las tasas de interés. Nestlé pertenece a un sector diferente, el de
bienes de consumo de rápido movimiento. La dinámica de este sector es diferente y se ve
afectada por diferentes factores.

9.2.1 Limitaciones del R­cuadrado


El R cuadrado no nos permite ver si las predicciones están sesgadas. Esto se puede hacer
mediante el análisis de los residuos. Cualquier patrón en el gráfico de residuos nos ayudará a
2
identificar el sesgo en nuestro modelo, si lo hay. Por lo tanto, un R alto por sí solo no siempre
será una buena estadística.

Conclusión R­cuadrado es una de las métricas más populares para medir la bondad del ajuste
de un modelo de regresión lineal.

Utilizando R­cuadrado, usted concluyó cómo el precio de las acciones de Bank of America fue
capaz de explicar mejor la variación en el precio de las acciones de JP Morgan.
¿Se le ocurre algún otro precio de acciones que también pueda ayudarle a explicar esta
variación? El precio de las acciones de cualquier otro banco o instituto de inversión podría
serle de ayuda.

Ahora te toca a ti. Puedes descargar cualquier dato de este tipo desde fi­[Link] y
aplicar lo aprendido.

La regresión lineal es una forma sencilla de modelar la relación entre las variables
independientes y dependientes. Otro nombre similar es regresión logística, que veremos en
el próximo capítulo.

96
Machine Translated by Google

10
Regresión logística

La regresión logística se incluye en la categoría de aprendizaje supervisado. Mide la relación


entre la variable dependiente categórica y una
o más variables independientes estimando probabilidades utilizando una función logística/
sigmoidea.

A pesar del nombre "regresión logística", este no se utiliza para problemas de regresión de
aprendizaje automático donde la tarea es predecir el resultado en valor real.
Es un problema de clasificación que se utiliza para predecir un resultado binario (1/0,
­1/1, Verdadero/Falso) dado un conjunto de variables independientes.

La regresión logística es un poco similar a la regresión lineal, o podemos decir que es


Un modelo lineal generalizado. En la regresión lineal, predecimos un valor real
salida 'y' basada en una suma ponderada de variables de entrada.

y = c + x1 w1 + x2 w2 + ....xn wn
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

El objetivo de la regresión lineal es estimar valores para los coeficientes del modelo c, w1,
w2, w3. . . .wn y ajustar los datos de entrenamiento con un error cuadrático mínimo y
predecir la salida y.

La regresión logística hace lo mismo, pero con un añadido. El modelo de regresión logística
calcula una suma ponderada de las variables de entrada similar a la regresión lineal, pero
ejecuta el resultado a través de una función no lineal especial, la función logística o función
sigmoidea, para producir la salida y.
Aquí, la salida es binaria o en forma de 0/1 o ­1/1.

y = logístico(c + x1 w1 + x2 w2 + ....xn wn)

y = 1/(1 + e[−(c + x1 w1 + x2 w2 + ....xn wn)]

La función sigmoidea/logística viene dada por la siguiente ecuación:

y = 1/(1+e −x )

Como puede ver en el gráfico, es una curva en forma de S que se acerca a 1 a medida que
el valor de la variable de entrada aumenta por encima de 0, y se acerca a 0 a medida que
la variable de entrada disminuye por debajo de 0. La salida de la función sigmoidea es 0,5
cuando la variable de entrada es 0.

98
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

Así, si la salida es mayor que 0,5, podemos clasificar el resultado como 1 (o positivo) y si es
menor que 0,5, podemos clasificarlo como 0 (o negativo).

Ahora tenemos una intuición básica sobre la regresión logística y la función sigmoidea.
Aprenderemos a implementar la regresión logística en Python y a predecir el movimiento del
precio de las acciones utilizando la condición anterior.

10.1 Regresión logística en Python


Comenzaremos importando las librerías necesarias.

[1]: # Manipulación de datos import


numpy como np import
pandas como pd

# Indicadores técnicos
importar talibán como ta

# Trazando los gráficos import


[Link] as plt %matplotlib inline
[Link]('seaborn­
darkgrid')

# Aprendizaje automático
desde sklearn.linear_model Importación LogisticRegression desde sklearn
Importación de métricas

Importar conjunto de datos Utilizaremos los mismos datos que usamos en la segunda parte
del libro.

99
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

[2]: # Los datos se almacenan en el directorio 'data_modules' path = "../


data_modules/"

#Leer los datos


datos = pd.read_csv(ruta + 'JPM_2017_2019.csv', index_col=0) datos.índice =
pd.to_datetime(datos.índice)

[Link](figsize=(8,5), color='b') [Link](' Precio de


cierre') [Link]('Fecha') [Link]()

Definir objetivo, características y dividir los datos

Hemos creado funciones para las tareas estándar, como la creación del objetivo y las
características. Esto te permite importar el módulo y realizar las tareas fácilmente sin tener
que escribir el código cada vez. Encontrarás el módulo de utilidades, así como la información
relacionada, en la página de GitHub.

Tenga en cuenta que esto no está disponible como una 'instalación pip' estándar.

[3]: importar sys


[Link]("..")

desde data_modules.utility importar get_target_features

100
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

y, X = obtener_características_objetivo(datos)

dividir = int(0.8*len(X))
X_tren, X_prueba, y_tren, y_prueba = X[:dividir], X[dividir:], \
y[:dividir], y[dividir:]

Escala de características Otro paso importante en el preprocesamiento de datos es estandarizar


el conjunto de datos. Este proceso hace que la media de todas las características de entrada
igual a cero y también convierte su varianza a 1. Esto garantiza que no haya
No hay sesgo durante el entrenamiento del modelo debido a las diferentes escalas de todas las entradas.
características. Si esto no se hace, la red neuronal puede confundirse y
Dar un mayor peso a aquellas características que tienen un valor promedio más alto
que otros.

Implementamos este paso importando el método StandardScaler desde el


Biblioteca de preprocesamiento sklearn. Creamos una instancia de la variable sc con la
función StandardScaler(). Después de lo cual usamos la función fittransform para implementar
estos cambios en los conjuntos de datos Xtrain y Xtest. Las funciones ytrain y
Los conjuntos de pruebas y_test no necesitan estandarizarse.

[4]: desde [Link] importa StandardScaler


sc = Escalador estándar ()
X_test_original = X_test.copia()
X_tren = sc.fit_transform(X_tren)
Prueba_X = [Link](Prueba_X)

Instancia de la regresión logística

Instanciaremos la regresión logística en Python usando la función 'LogisticRegres­sion' y


ajustaremos el modelo al conjunto de datos de entrenamiento usando la función 'fit'.

[5]: modelo = Regresión logística()


modelo = [Link](X_tren,y_tren)

Examinar los coeficientes

[6]: [Link](zip([Link], [Link](modelo.coef_)))

[6]: 0 1
0% de cambio 1% [0,015386536081786702]
de cambio2 2% de [­0,08026259453839425]
cambio5 3 rsi [0,024335207683013463]
[0,00528661227807867]
4 anuncio [0,013464920611383472]

101
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

5 corr [­0,0016395252591729392]
volatilidad [0,016321785785599726] 6

Calcular probabilidades de clase

Calcularemos las probabilidades de la clase para el conjunto de datos de prueba utilizando


la función 'pre­dict_proba'.

[7]: probabilidad = modelo.predict_proba(X_test) print(probabilidad)

[[0,50948029 0,49051971]
[0,51218059 0,48781941]
[0,51603258 0,48396742]
...
[0,51860144 0,48139856]
[0,52032489 0,47967511]
[0,52745957 0,47254043]]

Predecir etiquetas de clase

A continuación, predeciremos las etiquetas de clase utilizando la función de predicción para el conjunto de datos
de prueba.

Si imprime la variable 'predicción', observará que el clasificador predice 1, cuando la


probabilidad en la segunda columna de la variable 'probabilidad' es mayor que 0,5. Cuando la
probabilidad en la segunda columna es menor que 0,5, entonces el clasificador predice ­1.

[8]: predicho = [Link](X_test)

Evaluar el modelo

Imprimiremos la matriz de confusión, así como el informe de clasificación y la puntuación.

[9]: desde data_modules.utility importar get_metrics get_metrics(y_test,


predicho)

102
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

precisión Recordar el soporte de f1­score

0 0,51 0,78 0,61 1936


1 0,52 0,24 0,33 1928

exactitud 0,51 3864

promedio macro 0,51 0,51 0,47 3864

promedio ponderado 0,51 0,51 0,47 3864

Crear una estrategia comercial utilizando el modelo Predeciremos la señal en


el conjunto de datos de prueba. Calcularemos el rendimiento acumulado de la estrategia en función de
la señal predicha por el modelo en el conjunto de datos de prueba. También trazaremos la
rendimientos acumulados

[10]: # Calcular el cambio porcentual


datos_de_estrategia = X_prueba_original[['pct_change']].copiar()

# Predecir las señales


datos_de_estrategia['señal_predicha'] = [Link](X_test)

103
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

# Calcular los retornos de la estrategia


strategy_data['strategy_returns'] = \
strategy_data['predicted_signal'].shift(1) * \ strategy_data['pct_change']

# Descartar los valores faltantes


strategy_data.dropna(inplace=True)

[11]: desde data_modules.utility importar get_performance


get_performance(strategy_data)

La caída máxima es del ­3,80%.

104
Machine Translated by Google

CAPÍTULO 10. REGRESIÓN LOGÍSTICA

El ratio de Sharpe es 2,75.

Se puede observar que el modelo de regresión logística en Python genera


Rendimientos decentes. Ahora es tu turno de jugar con el código modificando parámetros y crear
una estrategia de trading basada en él.

La probabilidad juega un papel clave en la creación de una estrategia comercial. En el próximo


capítulo, analizaremos el teorema de Naive Bayes y cómo se puede utilizar en
aprendizaje automático.

105
Machine Translated by Google

11
Modelo Bayes ingenuo

¿Has oído hablar de la navaja de Occam?

En pocas palabras, Guillermo de Ockham afirmó que “las soluciones más simples
son casi siempre las mejores soluciones”.

Pero en un artículo sobre Naive Bayes, ¿por qué hablamos de navajas? En realidad,
Naive Bayes incorpora implícitamente esta creencia, porque realmente es un modelo
simple. Veamos cómo se puede utilizar un modelo simple como el modelo Naive
Bayes en el trading.

¿Qué es Naive Bayes?

Hagamos un pequeño desvío para entender qué significa el "Bayes" en Naive Bayes.
Básicamente, existen dos escuelas de pensamiento en lo que respecta a las
probabilidades. Una escuela sugiere que la probabilidad de un evento se puede
deducir calculando las probabilidades de todos los eventos probables y luego
calculando la probabilidad del evento en el que estás interesado.

Por ejemplo, en el caso del experimento del lanzamiento de una moneda, sabes que la
probabilidad de que salga cara es ½ porque aquí solo hay dos posibilidades, cara o cruz.

La otra escuela de pensamiento sugiere que la probabilidad depende más de la información


previa y de otros factores. Por ejemplo, si la probabilidad de que una persona diga que el rojo
es su color favorito es del 30 %, pero del 50 % si está casada por amor, entonces el resultado
será diferente en función de su estado civil.

Esto se conoce como inferencia bayesiana, donde se intenta calcular la probabilidad


en función de una determinada condición.

¿Y cómo se calcula esta probabilidad condicional? Veamos en el siguiente


Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

sección.

Ecuación del teorema de Bayes

P(B|A) P(A)
P(A|B) =
P(B)

Digamos que A es el evento en el que una persona dice que el rojo es su color favorito.
Ahora, sea B el evento en el que la persona se casa.

Por lo tanto, P(A | B) es la probabilidad de que A diga que el rojo es su color favorito cuando
la persona está casada.

Ésta es la probabilidad condicional que tenemos que encontrar.

En un sentido similar, P(B | A) es la probabilidad de que una persona esté casada cuando
dice que su color favorito es el rojo.

P(A) y P(B) es la probabilidad respectiva.

¿Cómo nos ayuda esto en el trading?

Supongamos que conocemos el valor RSI de una acción.

Ahora bien, ¿qué sucede si desea determinar la probabilidad de que el precio suba al día
siguiente de que el RSI baje de 40? Piense en esto: si el RSI baja de 40 el martes, querrá
comprar el miércoles con la esperanza de que el precio suba.

Esto se puede encontrar utilizando el teorema de Bayes.

Sea P(A) la probabilidad de que el precio aumente y P(B) la probabilidad de que el RSI
estuviera por debajo de 40 el día anterior.

Ahora, encontraremos la probabilidad de que el precio suba al día siguiente si el RSI está por
debajo de 40 mediante la misma fórmula.

Aquí, B es similar a la característica que definimos en el aprendizaje automático. También se


puede llamar evidencia.

Pero, ¡un momento! ¿Qué pasa si queremos comprobar cuándo el RSI está por debajo de 40 y,
al mismo tiempo, el “slow k” del oscilador estocástico es mayor que su “slow d”?

Técnicamente, podemos tener múltiples condiciones en el teorema de Bayes para mejorar


nuestro modelo de probabilidad. Si P(C) es la probabilidad de que “la lenta k” pase a “la lenta
d”, entonces el teorema de Bayes se escribiría como:

P(B|A)P(C|A)P(A)
P(A|B, C) =
P(B)P(C)

107
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

Si bien esto parece bastante sencillo de calcular, si se agregan más características al modelo,
la complejidad aumenta. Aquí es donde entra en escena la parte ingenua del modelo
bayesiano ingenuo.

Supuesto del modelo Naive Bayes El modelo Naive Bayes supone que tanto B como C son
eventos independientes. Además, también se elimina el denominador.

Esto simplifica el modelo en gran medida y podemos escribir la ecuación simplemente como:

P(A|B, C) = P(B|A) P(C|A) P(A)

Debes recordar que esta suposición puede ser incorrecta en la vida real. Lógicamente
hablando, tanto el RSI como los indicadores estocásticos se calculan utilizando la misma
variable, es decir, los datos de precios. Por lo tanto, no son exactamente independientes.

Sin embargo, la belleza del modelo Naive Bayes es que, aunque esta suposición no es cierta,
el modelo aún funciona bien en varios escenarios.

Espera, ¿existe solo un tipo de modelo Naive Bayes? En realidad, hay tres.
Descubrámoslo en la siguiente sección.

Tipos de modelos Naive Bayes Según el requisito, puede elegir el modelo correspondiente.
Estos modelos se basan en los datos de entrada con los que está trabajando:

Multinomial: Este modelo se utiliza cuando tenemos datos discretos y estamos trabajando en
su clasificación. Un ejemplo sencillo es que podemos tener el clima (nublado, soleado, lluvioso)
como entrada y queremos ver en qué clima se juega un partido de tenis.

Gaussiano: Como su nombre indica, en este modelo trabajamos con datos continuos que
siguen una distribución gaussiana. Un ejemplo sería la temperatura del estadio donde se
juega el partido.

Binomial: ¿Qué sucede si tenemos los datos de entrada como simplemente sí o no, es decir,
un valor booleano? En este caso, utilizaremos el modelo binomial.

Lo mejor de Python es que la biblioteca sklearn incorpora todos estos modelos. ¿Probamos a
usarla para crear nuestro propio modelo Naive Bayes? ¿Por qué no lo intentamos?

108
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

11.1 Modelo Bayesiano Naive en Python

Comenzaremos nuestra estrategia importando primero las bibliotecas y el conjunto de datos.

[1]: # Manipulación de datos import


numpy como np import
pandas como pd

# Indicadores técnicos
importar talibán como ta

# Trazando los gráficos import


[Link] as plt import seaborn as sns
%matplotlib inline
[Link]('seaborn­
darkgrid')

desde sklearn.naive_bayes importar BernoulliNB

[2]: # Los datos se almacenan en el directorio 'data_modules' path = "../


data_modules/"

#Leer los datos


datos = pd.read_csv(ruta + 'JPM_2017_2019.csv', index_col=0) datos.índice =
pd.to_datetime(datos.índice)

[Link](figsize=(8,5), color='b') [Link](' Precio de


cierre') [Link]('Fecha') [Link]()

109
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

Calcularemos los indicadores así como sus valores de señal.

[3]: importar sys


[Link]("..")

desde data_modules.utility importar get_target_features y, X =


get_target_features(datos)

dividir = int(0.8*len(X))
X_tren, X_prueba, y_tren, y_prueba = X[:dividir], X[dividir:], \
y[:dividir], y[dividir:]

Y ahora utilizamos el modelo Naive Bayes de Bernoulli para el análisis binomial.

[4]: modelo = BernoulliNB().fit(X_train, y_train)


# Ajuste el modelo al conjunto de datos del tren

[Link](X_train, y_train) predicho =


[Link](X_test)

¿Cuál fue la precisión de nuestro modelo? Vamos a averiguarlo.

[5]: desde data_modules.utility importar get_metrics get_metrics(y_test,


predicho)

110
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

precisión Recordar el soporte de f1­score

0 0,51 0,64 0,56 1936


1 0,51 0,38 0,44 1928

exactitud 0,51 3864

promedio macro 0,51 0,51 0,50 3864

promedio ponderado 0,51 0,51 0,50 3864

[6]: # Calcular el cambio porcentual


datos_de_estrategia = X_test[['pct_change']].copy()

# Predecir las señales


datos_de_estrategia['señal_predicha'] = [Link](X_test)

# Calcular el rendimiento de la estrategia


datos_de_estrategia['rendimiento_de_estrategia'] = \
datos_de_estrategia['señal_predicha'].shift(1) * \
datos_de_estrategia['pct_change']

111
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

# Descarta los valores faltantes


estrategia_data.dropna(inplace=True)

datos_de_estrategia[['retornos_de_estrategia']].head()

[6]: estrategia_devoluciones
28/05/2019 [Link]+00:00 0,000732
28/05/2019 [Link]+00:00 ­0.000000
28/05/2019 [Link]+00:00 0.000000
28/05/2019 [Link]+00:00 0.000000
28/05/2019 [Link]+00:00 ­0.000000

[7]: desde data_modules.utility importa get_performance


obtener_rendimiento(datos_de_estrategia)

La caída máxima es del ­7,04%.

112
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

El ratio de Sharpe es 1,91.

Obviamente, hay margen de mejora, pero esto fue solo una demostración de cómo funciona
un modelo Naive Bayes. Pero ¿existen ocasiones especiales en las que se debería utilizar el
modelo? Averigüémoslo en la siguiente sección.

Ventajas del modelo Naive Bayes

• La principal ventaja del modelo Naive Bayes es su simplicidad y su rápido tiempo de


cálculo. Esto se debe principalmente a su fuerte suposición de que todos los eventos son
independientes entre sí.
• También pueden trabajar con datos limitados. • Su
cálculo rápido se aprovecha en el análisis en tiempo real cuando se realizan cálculos rápidos.
Se requieren respuestas.

Aunque esta velocidad tiene un precio. Veamos cómo en la siguiente sección.

Desventajas del modelo Naive Bayes

• Dado que Naive Bayes supone que todos los eventos son independientes entre sí, no
puede calcular la relación entre los dos eventos. • El modelo Naive Bayes es rápido,
pero tiene un costo de precisión.
A veces se dice que el método Bayes ingenuo es un mal estimador.
• La ecuación de Naive Bayes muestra que estamos multiplicando las distintas probabilidades.
Por lo tanto, si una característica devolvió una probabilidad 0, podría convertir todo el
resultado en 0. Sin embargo, existen varios métodos para

113
Machine Translated by Google

CAPÍTULO 11. MODELO BAYES INGENUO

Superar esta situación. Una de las más famosas es la llamada corrección de Laplace.
En este método, se combinan las características o se establece la probabilidad en 1,
lo que garantiza que no obtengamos una probabilidad cero.

Conclusión El modelo Naive Bayes, a pesar de ser ingenuo, es bastante simple y efectivo en
una gran cantidad de casos de uso en la vida real. Si bien se utiliza principalmente para el
análisis de texto, se ha utilizado como herramienta de verificación en el campo del comercio.

El modelo Naive Bayes también se puede utilizar como un trampolín hacia modelos de
aprendizaje automático basados en una clasificación más precisa y compleja.

114
Machine Translated by Google

12
Árboles de decisión

Los árboles de decisión son un método de aprendizaje automático supervisado utilizado en


problemas de clasificación y regresión, también conocidos como CART.

Recuerde que un problema de clasificación intenta clasificar elementos desconocidos en una


clase o categoría; los resultados son siempre variables categóricas.
(es decir, sí/no, arriba/abajo, rojo/azul/amarillo, etc.).

Un problema de regresión intenta pronosticar un número como el rendimiento de la


Al día siguiente. Aunque los problemas de clasificación y regresión tienen objetivos diferentes,
los árboles tienen la misma estructura:

• El nodo raíz está en la parte superior y no tiene vías entrantes.


• Los nodos internos o nodos de prueba están en el medio y pueden estar en diferentes
niveles o subespacios, y tienen vías de entrada y salida.
• Los nodos de hoja o nodos de decisión están en la parte inferior, tienen rutas de entrada
pero no rutas de salida y aquí podemos encontrar lo esperado.
Salidas.
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

Gracias a la biblioteca Sklearn de Python, el árbol se crea automáticamente para nosotros.


Se necesita un punto de partida como las variables predictoras que hipotéticamente pensamos que son
responsables del resultado que estamos buscando.

Crearemos un árbol de decisión de clasificación en Python para pronosticar si el instrumento financiero


que vamos a analizar subirá o bajará al día siguiente.

También crearemos un árbol de decisiones para pronosticar el rendimiento concreto del activo
al día siguiente.

Construir un árbol de decisión Construir un árbol de decisión de clasificación o un árbol de decisión de


regresión es muy similar en lo que respecta a la forma en que organizamos los datos de entrada y las
variables predictoras. Luego, al llamar a las funciones correspondientes, se creará automáticamente el
árbol de decisión de clasificación o el árbol de decisión de regresión. Por supuesto, tenemos que
especificar algunos criterios que son condiciones simples.

Los pasos principales para construir un árbol de decisiones son:

1. Recupere los datos del mercado de un instrumento financiero.


2. Introduzca las variables predictoras (es decir, indicadores técnicos, sentimiento, etc.)
indicadores, indicadores de amplitud, etc.).
3. Configure la variable de destino o la salida deseada.
4. Divida los datos entre datos de entrenamiento y datos de prueba.
5. Genere el árbol de decisión después de entrenar el modelo.
6. Probar y analizar el modelo.

Si observamos los primeros cuatro pasos, son operaciones comunes para el procesamiento de datos.

116
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

Los pasos 5 y 6 están relacionados con los algoritmos de ML para los árboles de decisión
específicamente. Como veremos, la implementación en Python será bastante sencilla.
Sin embargo, es fundamental comprender bien la parametrización y el análisis de los
resultados.

Obtención de los datos La materia prima de cualquier algoritmo son los datos. En nuestro
caso, serían las series temporales de instrumentos financieros, como índices, acciones, etc.,
y suelen contener detalles como el precio de apertura, el máximo, el mínimo, el precio de
cierre y el volumen.

Existen múltiples fuentes de datos para descargar los datos, gratuitos y premium.
Las fuentes más comunes de datos diarios gratuitos son Quandl, Yahoo, Google o cualquier
otra fuente de datos en la que confiemos.

Para mantener la uniformidad, vamos a utilizar el mismo conjunto de datos que utilizamos en
la parte anterior del libro. Esto nos ayuda porque no tenemos que dedicar tiempo a obtener
los datos, sino que podemos centrarnos en el algoritmo de aprendizaje automático y su
funcionamiento.

[1]: # Manipulación de datos import


numpy como np import
pandas como pd

# Indicadores técnicos
importar talibán como ta

# Trazado de gráficos
import [Link] como plt import
seaborn como sns %matplotlib
inline [Link]('seaborn­
darkgrid')

[2]: # Los datos se almacenan en el directorio 'data_modules' path = "../


data_modules/"

#Leer los datos


datos = pd.read_csv(ruta + 'JPM_2017_2019.csv', index_col=0) datos.índice =
pd.to_datetime(datos.índice)

[Link](figsize=(8,5), color='b') [Link](' Precio de


cierre') [Link]('Fecha') [Link]()

117
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

[3]: importar sys


[Link]("..")

desde data_modules.utility importar get_target_features y, X =


get_target_features(datos)

dividir = int(0.8*len(X))
X_tren, X_prueba, y_tren, y_prueba = X[:dividir], X[dividir:], \
y[:dividir], y[dividir:]

12.0.1 Árboles de decisión para la clasificación

Ahora vamos a crear el árbol de decisiones de clasificación utilizando la función


DecisionTreeClassifier de la biblioteca [Link].

Si bien la función DecisionTreeClassifier tiene muchos parámetros que te invitamos a conocer


y experimentar (help(DecisionTreeClassifier)), aquí veremos lo básico para crear el árbol de
decisión de clasificación.

DecisionTreeClassifier(peso_clase=Ninguno, criterio='gini', profundidad_máxima=3,


max_features=Ninguno, max_leaf_nodes=Ninguno,
min_samples_leaf=5, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=Ninguno, splitter='best')

Básicamente, se refieren a los parámetros con los que el algoritmo debe construir el

118
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

árbol porque sigue un enfoque recursivo para construir el árbol, por lo que debemos establecer
algunos límites para crearlo.

Criterio: Para los árboles de decisión de clasificación, podemos optar por Gini o Entropía y
Ganancia de Información, estos criterios hacen referencia a la función de pérdida para evaluar
el rendimiento de un algoritmo de aprendizaje automático, y son los más utilizados cuando se
trata de algoritmos de clasificación. Aunque queda fuera del alcance de este capítulo, nos sirve
para ajustar la precisión del modelo, y del algoritmo para construir el árbol. También deja de
evaluar las ramas en las que no se obtiene ninguna mejora según la función de pérdida.

max_depth: Número máximo de niveles que tendrá el árbol.

min_samples_leaf: Este parámetro es optimizable e indica el número mínimo de muestras que


queremos tener en las hojas.

[4]: desde [Link] importa DecisionTreeClassifier


modelo = DecisionTreeClassifier(criterio='gini', profundidad_máxima=3,
muestras_mínimas_hoja=5)
modelo = [Link](X_train, y_train)

Ahora necesitamos hacer pronósticos con el modelo sobre datos desconocidos. Para ello,
utilizaremos el 30% de los datos que habíamos reservado para pruebas y, por último,
evaluaremos el rendimiento del modelo. Pero primero, echemos un vistazo gráfico al árbol de
decisión de clasificación que el algoritmo ML ha creado automáticamente para nosotros.

Visualizar Árboles de Decisión para Clasificación Tenemos a nuestra disposición una


herramienta muy potente que nos ayudará a analizar gráficamente el árbol que el algoritmo ML
ha creado automáticamente. El gráfico muestra los nodos más significativos que maximizan el
resultado y nos ayudará a determinar, en su caso, algunas reglas de trading útiles.

La biblioteca graphviz nos permite graficar el árbol que la función DecisionTreeClassifier ha


creado automáticamente con los datos de entrenamiento. Puedes usar el comando conda forge
en el prompt de anaconda para instalarlo en tu sistema local.
Enlace:
[Link]

[ ]: del árbol de importación de sklearn


importar graphviz
dot_data = árbol.export_graphviz(modelo,
out_file=Ninguno,
lleno=Verdadero,

119
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

nombres_de_características=X_train.columns)
# Para crear el gráfico, puedes descomentar # la siguiente
línea de código y ejecutarla # [Link](dot_data)

Nótese que el gráfico solo muestra los nodos más significativos. En este gráfico podemos ver
toda la información relevante de cada nodo:

1. La variable predictora utilizada para dividir el conjunto de datos.


2. El valor de la impureza de Gini.
3. El número de puntos de datos disponibles en ese nodo.
4. El número de puntos de datos de la variable objetivo que pertenecen a cada clase, 1
y 0.

Podemos observar un par de nodos puros que nos permiten deducir posibles reglas de
negociación. Por ejemplo, se puede ver cómo se dividen los nodos en función de los valores
de las características a las que el algoritmo ha dado más preferencia.

Pronóstico

Ahora hagamos predicciones con conjuntos de datos que fueron reservados para pruebas,
esta es la parte que nos permitirá saber si el algoritmo es confiable con datos desconocidos
en el entrenamiento.

[5]: predicho = [Link](X_test)

[6]: desde data_modules.utility importar get_metrics get_metrics(y_test,


predicho)

120
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

precisión Recordar el soporte de f1­score

0 0,51 0,81 0,62 1936


1 0,52 0,21 0,30 1928

exactitud 0,51 3864

promedio macro 0,52 0,51 0,46 3864

promedio ponderado 0,52 0,51 0,46 3864

Análisis del rendimiento Finalmente, solo podemos evaluar el rendimiento de


el algoritmo sobre datos desconocidos comparándolo con el resultado obtenido en
El proceso de formación.

[7]: # Calcular el cambio porcentual


datos_de_estrategia = X_test[['pct_change']].copy()

# Predecir las señales


datos_de_estrategia['señal_predicha'] = [Link](X_test)

# Calcular el rendimiento de la estrategia

121
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

datos_de_estrategia['rendimiento_de_estrategia'] = \
datos_de_estrategia['señal_predicha'].shift(1) * \
datos_de_estrategia['pct_change']

# Descarta los valores faltantes


estrategia_data.dropna(inplace=True)

datos_de_estrategia[['retornos_de_estrategia']].head()

[7]: estrategia_devoluciones
28/05/2019 [Link]+00:00 0.0
28/05/2019 [Link]+00:00 ­0.0
28/05/2019 [Link]+00:00 0.0
28/05/2019 [Link]+00:00 0.0
28/05/2019 [Link]+00:00 ­0.0

[8]: desde data_modules.utility importa get_performance


obtener_rendimiento(datos_de_estrategia)

La caída máxima es del ­3,80%.

122
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

El ratio de Sharpe es 2,46.

Árboles de decisión para regresión Ahora vamos a crear el árbol de decisión de regresión
utilizando la función DecisionTreeRegressor de la biblioteca [Link].

Si bien la función DecisionTreeRegressor tiene muchos parámetros que te invitamos a conocer


y experimentar (help(DecisionTreeRegressor)), aquí veremos lo básico para crear el árbol de
decisión de regresión.

DecisionTreeRegressor(criterio='mse',
profundidad_máxima=Ninguna,
disminución_mínima_de_impurezas=0,0,
división_mínima_de_impurezas=Ninguna , muestras_hoja_mínimas=400,
muestras_división_mínima=2, fracción_mínima_de_peso_hoja=0,0, preordenación=Falso, estado_aleatorio=N

Básicamente se refiere a los parámetros con los que el algoritmo debe construir el árbol, debido
a que sigue un enfoque recursivo para construir el árbol, debemos establecer algunos límites
para crearlo.

Criterio: Para los árboles de decisión de clasificación, podemos elegir Error Absoluto Medio
(MAE) o Error Cuadrático Medio (MSE). Estos criterios están relacionados con la función de
pérdida para evaluar el rendimiento de un algoritmo de máquina de aprendizaje y son los más
utilizados para los algoritmos de regresión. Básicamente nos sirve para ajustar la precisión del
modelo, el algoritmo para construir el árbol y deja de evaluar las ramas en las que no se obtiene
ninguna mejora según la función de pérdida. Aquí, dejamos el parámetro por defecto a

123
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

Error cuadrático medio (MSE).

max_depth: Número máximo de niveles que tendrá el árbol. Lo hemos dejado con el parámetro
predeterminado 'none'.

min_samples_leaf: Este parámetro es optimizable e indica el número mínimo de hojas que


queremos que tenga el árbol.

[9]: # Modelo de árbol de regresión de


[Link] import DecisionTreeRegressor dtr =
DecisionTreeRegressor(min_samples_leaf = 200)

Ahora vamos a entrenar el modelo con los conjuntos de datos de entrenamiento.

[10]: y = X['pct_change'].shift(­1)

dividir = int(0.8*len(X))
X_tren, X_prueba, y_tren, y_prueba = X[:dividir], X[dividir:], \
y[:dividir], y[dividir:]

modelo = [Link](X_tren, y_tren)

Visualizar el modelo Para visualizar el árbol, utilizamos nuevamente la biblioteca graphviz que
nos brinda una descripción general del árbol de decisión de regresión para el análisis.

[ ]: del árbol de importación de sklearn


importar graphviz
dot_data = tree.export_graphviz(dtr,

archivo_de_salida=Ninguno, relleno=Verdadero, nombres_de_funciones=X_train.colum


# Para crear el gráfico, puedes descomentar # la siguiente
línea de código y ejecutarla # [Link](dot_data)

En el gráfico podemos ver toda la información relevante de cada nodo:

1. La variable predictora utilizada para dividir el conjunto de datos.


2. El valor de MSE.
3. La cantidad de puntos de datos disponibles en ese nodo

Conclusión Los árboles de decisión son fáciles de crear y es fácil extraer algunas reglas que
prometen ser útiles, pero la verdad es que para crear árboles de decisión es necesario
parametrizarlos y estos parámetros pueden y deben optimizarse.

124
Machine Translated by Google

CAPÍTULO 12. ÁRBOLES DE DECISIÓN

A veces, se pueden combinar distintos modelos para crear un algoritmo de conjunto.


Existen dos tipos de métodos de conjunto, principalmente:

Métodos de conjuntos paralelos o métodos de promedio Se crean varios modelos


mediante un algoritmo y el pronóstico es el promedio de todos los modelos.
Algunos ejemplos incluyen:

1. Bagging 2.
Subespacio aleatorio 3.
Bosque aleatorio

Métodos de conjunto secuencial o métodos de refuerzo

El algoritmo crea modelos secuenciales que se refinan en cada nuevo modelo para
reducir el sesgo del anterior. Los ejemplos incluyen

1. AdaBoosting
2. Aumento de gradiente

Veamos el algoritmo del bosque aleatorio en el próximo capítulo.

125
Machine Translated by Google

13
Algoritmo de bosque aleatorio

Los árboles de decisión tienen una estructura jerárquica o arborescente con ramas que actúan
como nodos. Podemos llegar a una decisión determinada al atravesar estos nodos, que se
basan en las respuestas obtenidas de los parámetros relacionados con los nodos.

Sin embargo, los árboles de decisión sufren un problema de sobreajuste, que consiste
básicamente en aumentar la especificidad dentro del árbol para llegar a una determinada
conclusión añadiendo cada vez más nodos al árbol y, a partir de ahí, aumentando la
profundidad del árbol y haciéndolo más complejo.

Una de las soluciones para superar este problema es utilizar Random Forest. Veamos cómo.

¿Qué es un bosque aleatorio? Un bosque aleatorio es un algoritmo de aprendizaje automático


de clasificación supervisada que utiliza el método de conjunto. En pocas palabras, un bosque
aleatorio se compone de numerosos árboles de decisión y ayuda a abordar el problema del
sobreajuste en los árboles de decisión. Estos árboles de decisión se construyen aleatoriamente
seleccionando características aleatorias del conjunto de datos dado.

El bosque aleatorio llega a una decisión o predicción en función del número máximo de votos
recibidos de los árboles de decisión. El resultado al que se llega, un número máximo de veces
a través de los numerosos árboles de decisión, se considera como el resultado final por el
bosque aleatorio.

Funcionamiento de Random Forest Los bosques aleatorios se basan en técnicas de


aprendizaje por conjuntos. Conjunto significa simplemente un grupo o una colección, que en
este caso es una colección de árboles de decisión, en conjunto llamados bosque aleatorio.
La precisión de los modelos de conjunto es mejor que la precisión de los modelos individuales
debido al hecho de que compila los resultados de los modelos individuales y proporciona un
resultado final.
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

¿Cómo seleccionar características del conjunto de datos para construir árboles de decisión para el
Bosque aleatorio?

Las características se seleccionan aleatoriamente mediante un método conocido como agregación


bootstrap o bagging. A partir del conjunto de características disponibles en el conjunto de datos, se
crean varios subconjuntos de entrenamiento eligiendo características aleatorias con reemplazo. Esto
significa que una característica puede repetirse en diferentes subconjuntos de entrenamiento al
mismo tiempo.

Por ejemplo, si un conjunto de datos contiene 20 características y se deben seleccionar subconjuntos


de 5 características para construir diferentes árboles de decisión, entonces estas 5 características
se seleccionarán aleatoriamente y cualquier característica puede ser parte de más de un subconjunto.
Esto garantiza la aleatoriedad, haciendo que la correlación entre los árboles sea menor y superando
así el problema del sobreajuste.

Una vez seleccionadas las características, se construyen los árboles en función de la mejor división.
Cada árbol proporciona un resultado que se considera un "voto" de ese árbol para el resultado dado.
El resultado que recibe la mayor cantidad de "votos" es elegido por el bosque aleatorio como
resultado/resultado final o, en el caso de variables continuas, el promedio de todos los resultados
se considera como resultado final.

Por ejemplo, en el diagrama anterior, podemos observar que cada árbol de decisión ha votado o
predicho una clase específica. El resultado o clase final seleccionado por el Bosque Aleatorio será la
Clase N, ya que tiene mayoría de votos o es el resultado predicho por dos de los cuatro árboles de
decisión.

13.1 Bosque aleatorio en el trading

En este código, crearemos un clasificador de bosque aleatorio y lo entrenaremos para proporcionar


retornos diarios.

Importando las bibliotecas

127
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

[1]: # Manipulación de datos import


numpy como np import
pandas como pd

# Indicadores técnicos
importar talibán como ta

# Trazado de gráficos
import [Link] como plt import seaborn
como sns %matplotlib inline
[Link]('seaborn­
darkgrid')

desde sklearn importar métricas desde


[Link] importar RandomForestClassifier

[2]: # Los datos se almacenan en el directorio 'data_modules' path = "../data_modules/"

#Leer los datos


datos = pd.read_csv(ruta + 'JPM_2017_2019.csv', index_col=0) datos.índice =
pd.to_datetime(datos.índice)

[Link](figsize=(8,5), color='b') [Link](' Precio de


cierre') [Link]('Fecha') [Link]()

128
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

Creación de conjuntos de datos de entrada y salida

En este paso, utilizaremos las mismas variables objetivo y característica que hemos utilizado en
los capítulos anteriores.

[3]: importar sys


[Link]("..")

desde data_modules.utility importar get_target_features y, X =


get_target_features(datos)

dividir = int(0.8*len(X))
X_tren, X_prueba, y_tren, y_prueba = X[:dividir], X[dividir:], \
y[:dividir], y[dividir:]

Entrenamiento del modelo de aprendizaje automático ¡Todo listo con los datos! Entrenemos un
modelo clasificador de árbol de decisión. La función RandomForestClassifier del árbol se almacena
en la variable clf y luego se llama a un método de ajuste con los conjuntos de datos X_train e
y_train como parámetros para que el modelo clasificador pueda aprender la relación entre la
entrada y la salida.

[4]: clf = RandomForestClassifier(estado_aleatorio=5, profundidad_máxima=3,


características_máximas=3)
# Crear el modelo en el conjunto de datos de tren

modelo = [Link](X_tren, y_tren)

129
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

predicho = [Link](X_test)

[5]: matriz_de_confusión_datos = métricas.matriz_de_confusión(prueba_y, predicho)

# Graficar los datos

fig, ax = [Link](figsize=(6, 4))


[Link](datos_de_matriz_de_confusión, fmt="d",
cmap='Blues', cbar=Falso, annot=Verdadero, ax=ax)

# Establezca las etiquetas de los ejes y el título

ax.set_xlabel(' Etiquetas previstas', fontsize=12) ax.set_ylabel('


Etiquetas reales ', fontsize=12) ax.set_title(' Matriz de confusión ',
fontsize=14) [Link].set_ticklabels(['Sin posición', 'Posición larga'])
[Link].set_ticklabels(['Sin posición', 'Posición larga'])

# Mostrar la gráfica
[Link]()

imprimir(metrics.classification_report(y_test, predicho))

130
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

precisión Recordar el soporte de f1­score

0 0,51 0,76 0,61 1936


1 0,52 0,26 0,35 1928

exactitud 0,51 3864

promedio macro 0,51 0,51 0,48 3864

promedio ponderado 0,51 0,51 0,48 3864

La estrategia vuelve

[6]: # Calcular el cambio porcentual


datos_de_estrategia = X_test[['pct_change']].copy()

# Predecir las señales


datos_de_estrategia['señal_predicha'] = [Link](X_test)

# Calcular el rendimiento de la estrategia


datos_de_estrategia['rendimiento_de_estrategia'] = \
datos_de_estrategia['señal_predicha'].shift(1) * \
datos_de_estrategia['pct_change']

# Descarta los valores faltantes


estrategia_data.dropna(inplace=True)

datos_de_estrategia[['retornos_de_estrategia']].head()

[6]: estrategia_devoluciones
28/05/2019 [Link]+00:00 0.0
28/05/2019 [Link]+00:00 ­0.0
28/05/2019 [Link]+00:00 0.0
28/05/2019 [Link]+00:00 0.0
28/05/2019 [Link]+00:00 ­0.0

[7]: desde data_modules.utility importa get_performance


obtener_rendimiento(datos_de_estrategia)

131
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

La caída máxima es del ­7,42%.

El ratio de Sharpe es 1,63.

La salida muestra los retornos de la estrategia y los retornos diarios según el código del clasificador
de bosque aleatorio. En el próximo capítulo, veremos el algoritmo XGBoost, que es el arma
preferida por la mayoría de las máquinas.

132
Machine Translated by Google

CAPÍTULO 13. ALGORITMO DE BOSQUE ALEATORIO

Tanto para entusiastas del aprendizaje como para ganadores de concursos.

133
Machine Translated by Google

14
Algoritmo XGBoost

XGBoost significa eXtreme Gradient Boosting y está desarrollado en el marco de la optimización


de gradientes. ¡Nos gusta cómo suena eso, extremo!
En realidad suena más como un superdeportivo que como un modelo ML.

Pero eso es exactamente lo que hace: aumenta el rendimiento de un modelo de aumento de


gradiente regular.

“XGBoost utilizó una formalización de modelo más regularizada para controlar el


sobreajuste, lo que le proporciona un mejor rendimiento”.

­Tianqi Chen, autor de XGBoost

Analicemos el nombre para entender qué hace XGBoost.

¿Qué es el boosting? El método de conjunto secuencial, también conocido como "boosting", crea
una secuencia de modelos que intenta corregir los errores de los modelos anteriores en la
secuencia. El primer modelo se construye a partir de datos de entrenamiento, el segundo modelo
mejora el primero, el tercer modelo mejora el segundo, y así sucesivamente.
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

En el ejemplo de la imagen anterior, el conjunto de datos de entrenamiento se pasa al


clasificador 1. El fondo amarillo indica que el clasificador predijo un guion y el fondo azul indica
que predijo un signo más. El modelo del clasificador 1 predice incorrectamente dos guiones y
un signo más. Estos se resaltan con un círculo. Los pesos de estos puntos de datos predichos
incorrectamente se incrementan y se envían al siguiente clasificador, es decir, al clasificador 2.

El clasificador 2 predice correctamente los dos guiones, algo que el clasificador 1 no pudo
hacer. Pero el clasificador 2 también comete otros errores. Este proceso continúa y tenemos
un clasificador final combinado que predice todos los puntos de datos correctamente.

Se pueden agregar modelos clasificadores hasta que todos los elementos del conjunto de datos de
entrenamiento se predigan correctamente o hasta que se agregue un número máximo de modelos clasificadores.
El número máximo óptimo de modelos clasificadores a entrenar se puede determinar
mediante el ajuste de hiperparámetros.

Vayamos paso a paso y entendamos dónde encaja XGBoost en el esquema más amplio de
las cosas.

En pocas palabras Con los modelos de árboles de decisión, bayesianos y similares, nos
topamos con un obstáculo. La tasa de predicción para ciertos enunciados de problemas era
pésima cuando utilizábamos un solo modelo. Aparte de eso, en el caso de los árboles de
decisión, nos dimos cuenta de que teníamos que vivir con sesgos, varianzas y ruido en los modelos.
Esto dio lugar a la idea de combinar modelos, lo que se denominaba y se denomina
"aprendizaje en conjunto". Pero en este caso, podemos utilizar mucho más de un modelo para
crear un conjunto. El aumento de gradiente fue uno de esos métodos de aprendizaje en conjunto.

¿Qué es el aumento de gradiente? En el aumento de gradiente, al combinar el modelo, la


función de pérdida se minimiza mediante el descenso de gradiente.

135
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Hablando en términos generales, una función de pérdida se puede definir como un error, es decir,
la diferencia entre el valor predicho y el valor real. Por supuesto, cuanto menor sea el error, mejor
será el modelo de aprendizaje automático.

El aumento de gradiente es un enfoque en el que se crean nuevos modelos que predicen los
residuos o errores de modelos anteriores y luego se suman para hacer la predicción final.

El objetivo del modelo XGBoost se da como:

Obj = L + Ω

Donde L es la función de pérdida que controla el poder predictivo y Ω es el componente de


regularización que controla la simplicidad y el sobreajuste.

La función de pérdida (L) que necesita optimizarse puede ser el error cuadrático medio para
la regresión, Logloss para la clasificación binaria o mlogloss para la clasificación multiclase.

El componente de regularización (Ω) depende de la cantidad de hojas y del puntaje de predicción


asignado a las hojas en el modelo de conjunto de árboles.

Se denomina potenciación de gradiente porque utiliza un algoritmo de descenso de gradiente para


minimizar la pérdida al agregar nuevos modelos. El algoritmo de potenciación de gradiente admite
problemas de modelado predictivo de regresión y clasificación.

Bien, hemos entendido cómo el aprendizaje automático evolucionó desde modelos simples a una
combinación de modelos. De alguna manera, los humanos no pueden estar satisfechos por mucho
tiempo, y a medida que los enunciados de los problemas se volvieron más complejos y el conjunto
de datos más grande, nos dimos cuenta de que debíamos ir un paso más allá. Esto nos lleva a
XGBoost.

¿Por qué XGBoost es tan bueno? XGBoost fue escrito en C++, que, si lo piensas, es realmente
rápido en lo que respecta al tiempo de cálculo. Lo bueno de XGBoost es que se puede importar
fácilmente en Python y, gracias al contenedor sklearn, podemos usar los mismos nombres de
parámetros que se usan en los paquetes de Python.

Si bien la lógica real es algo larga de explicar, una de las principales ventajas de XGBoost es que
ha podido paralelizar el componente de construcción de árboles del algoritmo de refuerzo. Esto
genera una ganancia espectacular en términos de tiempo de procesamiento, ya que podemos
utilizar más núcleos de una CPU o incluso continuar y utilizar también la computación en la nube.

Si bien los algoritmos de aprendizaje automático tienen soporte para ajustes y pueden funcionar
con programas externos, XGBoost tiene parámetros integrados para regularización.

136
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

ción y validación cruzada para garantizar que tanto el sesgo como la varianza se mantengan al
mínimo. La ventaja de los parámetros incorporados es que conducen a una implementación más
rápida.

Analicemos uno de estos casos en la siguiente sección.

Importancia de las características de XGBoost A veces, no nos conformamos con saber qué tan
bueno es nuestro modelo de aprendizaje automático. Nos gustaría saber qué característica tiene
más poder predictivo. Existen varias razones por las que conocer la importancia de las características
puede ayudarnos. A continuación, enumeraremos algunas:

1. Si sabes que una determinada característica es más importante que otras, le prestarás más
atención y tratarás de ver si puedes mejorar aún más tu modelo.

2. Después de ejecutar el modelo, verá si eliminar algunas características lo mejora.

3. Inicialmente, si el conjunto de datos es pequeño, el tiempo que lleva ejecutar un modelo no es


un factor significativo mientras diseñamos un sistema. Pero si la estrategia es compleja y
requiere un gran conjunto de datos para ejecutarse, entonces los recursos informáticos y el
tiempo que lleva ejecutar el modelo se convierten en un factor importante.

4. Lo bueno de XGBoost es que contiene una función incorporada para calcular la importancia
de la característica y no tenemos que preocuparnos por codificarla en el modelo.

A continuación se muestra un ejemplo de cómo XGBoost representa la importancia de las


características:

137
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Muy bien, antes de pasar al código, asegurémonos de que todos tenemos XG­Boost en
nuestro sistema.

¿Cómo instalar XGBoost en Anaconda? Simplemente puedes abrir el cuaderno Jupyter e


ingresar lo siguiente: !pip install XGBoost

Eso es todo. ¡Genial! Ahora pasemos a lo real, es decir, el código Python de XGBoost.

XGBoost en Python Resumamos el modelo de aprendizaje automático XGBoost antes de


profundizar en él. Usamos los datos de precios de las acciones tecnológicas estadounidenses
en Estados Unidos, como Apple, Amazon, Netflix, Nvidia y Microsoft, durante los últimos
dieciséis años, y entrenamos el modelo XGBoost para predecir si los rendimientos del día
siguiente son positivos o negativos.

Importar bibliotecas
[1]: advertencias de
importación [Link]('ignore')

# Importar XGBoost
importar xgboost

# Clasificador XGBoost de
xgboost importar XGBClassifier

# Informe de clasificación y matriz de confusión from


[Link] import classification_report from [Link] import
confusion_matrix

# Yahoo finance para obtener los datos de


importación de yfinance como yf

# Para trazar los gráficos,


importe [Link] como plt import
seaborn como sns %matplotlib
inline [Link]('seaborn­
darkgrid')

# Para la manipulación de datos,


importe pandas como pd,
importe numpy como np

138
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Definir parámetros Hemos definido la lista de stock, la fecha de inicio y la fecha de finalización
con las que trabajaremos en este capítulo.

[2]: # Establecer la lista de existencias


lista_de_stock = ['AAPL', 'AMZN', 'NFLX', 'WMT', 'MSFT']

# Establezca la fecha de inicio y la fecha de finalización


fecha_inicio = '2004­1­1' fecha_final
= '2021­10­1'

Obtener los datos, crear características y variables de destino Definimos una lista de
características de las cuales el modelo seleccionará las mejores. Aquí, tenemos el cambio
porcentual y la desviación estándar con diferentes períodos de tiempo como características.

La variable objetivo es el retorno del día siguiente. Si el retorno del día siguiente es positivo, lo
etiquetamos como 1, y si es negativo, lo etiquetamos como ­1. También puede intentar crear las
variables objetivo con tres etiquetas, como 1, 0 y ­1 para posiciones largas, sin posición y cortas
respectivamente.

Veamos el código ahora.

[3]: # Crea un marcador de posición para almacenar los datos de stock


diccionario_de_datos_de_stock = {}

para stock_name en stock_list:

# Obtener los datos df

= [Link](stock_name, start_date, end_date, auto_adjust=True, progress=False)

# Calcular el cambio porcentual diario


df['daily_pct_change'] = df['Close'].pct_change()

# Crea las características


predictor_list = [] para r en
el rango (10, 60, 5):
df['pct_change_'+str(r)] = \
df.daily_pct_change.rolling(r).sum() df['std_'+str(r)] =
df.daily_pct_change. \ rolling(r).std()

lista_de_predictores.append('pct_change_'+str(r))
lista_de_predictores.append('std_'+str(r))

139
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

# Variable de destino
df['return_next_day'] = df.daily_pct_change.shift(­1) df['actual_signal'] =
[Link](df.return_next_day > 0, 1, ­1)

df = [Link]()

# Agrega los datos al diccionario


stock_data_dictionary.update({stock_name: df})

Antes de pasar a la implementación del modelo Python XGBoost, primero grafiquemos los
retornos diarios de Apple almacenados en el diccionario para ver si todo está funcionando
bien.

[4]: # Acceda al marco de datos de AAPL desde el diccionario # y luego calcule


y grafique los retornos
(stock_data_dictionary['AAPL'].daily_pct_change+1). \
cumprod().plot(figsize=(8,5), color='azul')

# Establecer el título, las etiquetas de los ejes y la cuadrícula


del gráfico [Link](' Retornos acumulados AAPL ')
[Link]('Retornos acumulados') [Link]()

140
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Dividir los datos en entrenamiento y prueba Dado que XGBoost es, después de todo, un modelo de aprendizaje
automático, dividiremos el conjunto de datos en un conjunto de prueba y un conjunto de entrenamiento.

[5]: # Crea un marcador de posición para los datos divididos de prueba y entrenamiento
X_train = [Link]()
X_prueba = [Link]()
y_tren = [Link]() y_prueba =
[Link]()

para stock_name en stock_list:


# Obtener funciones
X = diccionario_de_datos_de_stock[nombre_de_stock][lista_de_predictores]

# Obtener la variable de destino y =


stock_data_dictionary[stock_name].actual_signal

# Dividir el conjunto de datos en entrenamiento y prueba

longitud_del_tren = int(len(X)*0.80)
X_tren = X_tren.append(X[:longitud_tren])
X_prueba = X_prueba.append(X[longitud_entrenamiento:])
y_entrenamiento = y_entrenamiento.append(y[:longitud_entrenamiento])
y_prueba = y_prueba.append(y[longitud_entrenamiento:])

Inicialización del modelo de aprendizaje automático de XGBoost Inicializaremos el modelo de


clasificador. Estableceremos dos hiperparámetros, a saber, max_depth y n_estimators. Estos se
establecen en el lado inferior para reducir el sobreajuste.

[6]: # Inicialice el modelo y establezca los valores de los hiperparámetros model =


XGBClassifier(max_depth=2, n_estimators=30, )

Crear el modelo Entrenaremos el clasificador XGBoost utilizando el método de ajuste.

[7]: # Ajustar el modelo


[Link](X_train, y_train) print('El modelo
está entrenado')

[Link] ADVERTENCIA: /
opt/concourse/worker/volumes/live/
→7a2b9f41­3287­451b­6691­43e9a6c0910f/volume
/xgboost­split_1619728204606/work/src/learner.[Link]
→Inicio en XGBoost

141
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

1.3.0, la métrica de evaluación predeterminada utilizada con el objetivo →'binary:logistic'

Se cambió de 'error' a 'logloss'. Establezca explícitamente →eval_metric si desea restaurar el


comportamiento anterior.

El modelo está entrenado

Dado que utilizamos la mayoría de los parámetros predeterminados, es posible que reciba
ciertas advertencias según las actualizaciones en la biblioteca XGBoost.

Importancia de las características Hemos trazado las 7 características principales y las hemos
ordenado según su importancia.

[8]: xgboost.plot_importance(modelo, número_máximo_de_características=7,


→color='verde')
[Link]()

Eso es interesante. El modelo Python de XGBoost nos dice que pct_change_10 es la


característica más importante que otras. Como mencionamos que solo necesitamos 7
características, recibimos esta lista. Aquí hay una idea interesante: ¿por qué no aumentas el
número y ves cómo se acumulan las otras características en lo que respecta a su puntuación
f? También puedes eliminar las características que no son importantes y luego volver a
entrenar el modelo. ¿Aumentaría esto la precisión del modelo? Te dejo eso para que lo
verifiques.

142
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

De cualquier modo, ¡seguimos adelante!

Predecir la señal
[9]: # Predecir la señal comercial en el conjunto de datos de prueba
y_pred = [Link](X_test)

Informe de clasificación
[10]: # Obtener el informe de clasificación
imprimir(informe_de_clasificación(prueba_y, y_pred))

precisión Recordar el soporte de f1­score

­1 0,50 0,18 0,26 2051


1 0,54 0,84 0,66 2364

exactitud 0,53 4415

promedio macro 0,52 0,51 0,46 4415

promedio ponderado 0,52 0,53 0,48 4415

¡Espera! Ya casi llegamos. Veamos qué nos dice XGBoost ahora mismo.

Eso es interesante. La puntuación f1 para el lado largo es mucho más potente.


En comparación con el lado corto, podemos modificar el modelo y convertirlo en una estrategia de
compraventa únicamente.

Probemos otra forma de formular el rendimiento de XGBoost.

Matriz de confusión
[11]: matriz_confusión_datos = matriz_confusión(prueba_y, predicción_y)

# Graficar los datos

fig, ax = [Link](figsize=(6, 4))


[Link](datos_de_la_matriz_de_confusión, fmt="d",
cmap='Blues', cbar=Falso, annot=Verdadero, ax=ax)
# Establezca las etiquetas de los ejes y el título

ax.set_xlabel(' Etiquetas previstas', fontsize=12)


ax.set_ylabel(' Etiquetas reales', tamaño de fuente=12)
ax.set_title(' Matriz de confusión', tamaño de fuente=14)
[Link].set_ticklabels(['Sin posición', 'Posición larga'])
[Link].set_ticklabels(['Sin posición', 'Posición larga'])
# Mostrar la gráfica
[Link]()

143
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Rendimiento de las acciones individuales Veamos cómo se comportaron los rendimientos de la


estrategia basada en XGBoost frente a los rendimientos diarios normales, es decir, la estrategia
de comprar y mantener. Trazaremos un gráfico comparativo entre los rendimientos de la estrategia
y los rendimientos diarios de todas las empresas que mencionamos anteriormente. El código es el
siguiente:

[18]: # Crea un marco de datos vacío para almacenar los retornos de la estrategia de
# acciones individuales
cartera = [Link](columnas=lista_de_stocks)

# Para cada acción en la lista de acciones, grafica los retornos de la estrategia # y los retornos
de compra y retención para stock_name
en stock_list:

# Obtener los datos


df = diccionario_de_datos_de_stock[nombre_de_stock]
# Almacenar las características en X
X = df[lista de predictores]

# Define el conjunto de datos de entrenamiento y


prueba train_length = int(len(X)*0.80)

144
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

# Predecir la señal y almacenarla en la columna de señal predicha


df['predicted_signal'] = [Link](X)

# Calcular los retornos de la estrategia


df['strategy_returns'] = df.return_next_day \ * df.predicted_signal

# Agregue los retornos de la estrategia al marco de datos de la cartera


portfolio[stock_name] = df.strategy_returns[train_length:]

[Link](tamaño de figura=(8,5))

# Calcule los retornos acumulados de la estrategia y grafique


(df.strategy_returns[train_length:]+1).cumprod().
→plot(color=[[Link](3,)])

# Calcule los retornos acumulados de la estrategia de compra y retención


(stock_data_dictionary[stock_name][train_length:]. \
daily_pct_change+1).cumprod().plot( color='blue')

# Establecer el título, la etiqueta y la


cuadrícula [Link](stock_name + ' Returns')
[Link]('Cumulative Returns')
[Link](labels=['Strategy Returns', \ 'Buy and Hold
Returns'])
[Link]()

145
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

146
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

147
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Rendimiento de la cartera

[13]: # Descarta los valores faltantes


[Link](inplace=True)

# Calcule los rendimientos acumulados de la cartera asumiendo una asignación


igual a las acciones
([Link](axis=1)+1).cumprod().plot(
tamaño de la figura=(8,5), color='verde')

# Establecer el título y la etiqueta del gráfico


[Link]('Retornos de la estrategia de cartera')
[Link]('Retornos acumulados') [Link]()

148
Machine Translated by Google

CAPÍTULO 14. ALGORITMO XGBOOST

Conclusión Comenzamos con el surgimiento de los algoritmos de aprendizaje automático y


pasamos al aprendizaje conjunto. Aprendimos sobre los árboles potenciados y cómo nos ayudan
a hacer mejores predicciones. Finalmente, llegamos al modelo de aprendizaje automático de
XGBoost y cómo es mejor que un algoritmo potenciado normal. Luego revisamos un código
Python simple de XGBoost y creamos una cartera basada en las señales comerciales creadas
por el código. En el medio, también enumeramos la importancia de las características, así como
ciertos parámetros incluidos en XGBoost.

Veamos ahora otro concepto interesante, llamado redes neuronales en el próximo capítulo.

149
Machine Translated by Google

15
Redes neuronales

Los estudios sobre redes neuronales se iniciaron con el objetivo de mapear el cerebro humano
y comprender cómo toman decisiones los seres humanos. Pero el trading algorítmico intenta
eliminar por completo las emociones humanas del aspecto comercial. ¿Por qué deberíamos
aprender sobre redes neuronales entonces?

A veces no nos damos cuenta de que el cerebro humano es posiblemente la máquina más
compleja del mundo y se sabe que es bastante eficaz a la hora de llegar a conclusiones en un
tiempo récord.

Piénselo. Si pudiéramos aprovechar la forma en que funciona nuestro cerebro y aplicarla en el


ámbito del aprendizaje automático (las redes neuronales son, después de todo, un subconjunto
del aprendizaje automático), podríamos dar un gran salto en términos de capacidad de
procesamiento y recursos informáticos.

Antes de profundizar en los detalles del trading con redes neuronales, debemos comprender
el funcionamiento del componente principal, es decir, la red neuronal.
ron.
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

Una neurona consta de tres componentes: las dendritas, el axón y el cuerpo principal de la
neurona. Las dendritas son las receptoras de la señal y el axón es el transmisor. Una neurona
sola no es de mucha utilidad, pero cuando está conectada a otras neuronas, realiza varios
cálculos complejos y ayuda a operar la máquina más complicada de nuestro planeta, el cuerpo
humano.

Perceptrón: la neurona de la computadora Un perceptrón, es decir, una neurona de la


computadora, está diseñado de manera similar, como se muestra en el diagrama.

Hay entradas a la neurona marcadas con líneas azules, y la neurona emite una señal de salida
después de algún cálculo.

La capa de entrada se asemeja a las dendritas de la neurona y la señal de salida es el axón.

A cada señal de entrada se le asigna un peso, wi. Este peso se multiplica por el valor de
entrada y la neurona almacena la suma ponderada de todas las variables de entrada.

Estos pesos se calculan en la fase de entrenamiento del aprendizaje de la red neuronal a


través de conceptos llamados descenso de gradiente y retropropagación, temas que
abordaremos más adelante.

Luego se aplica una función de activación a la suma ponderada, lo que da como resultado la
señal de salida de la neurona.

Las señales de entrada son generadas por otras neuronas, es decir, la salida de otras
neuronas, y la red está construida para hacer predicciones/cálculos en esta
manera.

Ésta es la idea básica de una red neuronal.

151
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

Entendiendo una red neuronal Tomemos un ejemplo para entender el funcionamiento de las
redes neuronales.

La capa de entrada está formada por los parámetros que nos ayudarán a llegar a un valor de
salida o a hacer una predicción. Nuestro cerebro tiene básicamente cinco parámetros de
entrada básicos, que son nuestros sentidos del tacto, el oído, la vista, el olfato y el gusto.

Las neuronas de nuestro cerebro crean parámetros más complejos, como emociones y
sentimientos, a partir de estos parámetros de entrada básicos. Y nuestras emociones y
sentimientos nos hacen actuar o tomar decisiones, que son básicamente el resultado de la
red neuronal de nuestro cerebro.

Por lo tanto, en este caso hay dos capas de cálculos antes de tomar una decisión.

La primera capa toma los cinco sentidos como entradas y da como resultado emociones y
sentimientos, que son las entradas a la siguiente capa de cálculos, donde el resultado es una
decisión o una acción.

Por lo tanto, en este modelo extremadamente simplista del funcionamiento del cerebro
humano, tenemos una capa de entrada, dos capas ocultas y una capa de salida.
Por supuesto, por nuestra experiencia, todos sabemos que el cerebro es mucho más
complicado que esto, pero esencialmente así es como se realizan los cálculos en nuestro
cerebro.

Red neuronal en el trading: un ejemplo Para comprender el funcionamiento de una red


neuronal en el trading, consideremos un ejemplo simple de predicción del precio de una
acción, donde los valores OHLCV (Apertura­Máximo­Mínimo­Cierre­Volumen) son los
parámetros de entrada, hay una capa oculta y la salida consiste en la predicción del precio de
la acción.

152
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

En el diagrama que se muestra arriba, hay cinco parámetros de entrada como se muestra
en el diagrama.

La capa oculta consta de 3 neuronas y el resultado en la capa de salida es la predicción


del precio de las acciones.

Las tres neuronas de la capa oculta tendrán pesos diferentes para cada uno de los cinco
parámetros de entrada y podrían tener funciones de activación diferentes, que activarán
los parámetros de entrada de acuerdo con varias combinaciones de las entradas.

Por ejemplo, la primera neurona podría analizar el volumen y la diferencia entre el precio
de cierre y el precio de apertura, y también podría ignorar los precios máximo y mínimo.
En este caso, los pesos de los precios máximo y mínimo serán cero.

En función de los pesos que el modelo se ha entrenado a sí mismo para alcanzar, se


aplicará una función de activación a la suma ponderada en la neurona, esto dará como
resultado un valor de salida para esa neurona en particular.

De manera similar, las otras dos neuronas generarán un valor de salida basado en sus
funciones de activación y pesos individuales. Finalmente, el valor de salida o el valor
predicho del precio de las acciones será la suma de los tres valores de salida de cada
neurona. Así es como funcionará la red neuronal para predecir los precios de las acciones.

Ahora que entiendes el funcionamiento de una red neuronal, pasaremos al meollo del
asunto de este capítulo, que es aprender cómo la Red Neuronal Artificial se entrenará a sí
misma para predecir el movimiento del precio de una acción.

Entrenando la red neuronal Para simplificar las cosas en las redes neuronales, podemos decir
que hay dos formas de codificar un programa para realizar una tarea específica.

1. Defina todas las reglas que requiere el programa para calcular el resultado dada una
determinada entrada al programa.

2. Desarrollar el marco en el que el código aprenderá a realizar la tarea específica. Esta


tarea se lleva a cabo entrenándose a sí mismo en un conjunto de datos y ajustando el
resultado que calcula para que sea lo más cercano posible a los resultados reales que
se han observado.

El segundo proceso se denomina entrenamiento del modelo, y es en lo que nos


centraremos. Veamos cómo se entrenará nuestra red neuronal para predecir los precios
de las acciones.

A la red neuronal se le proporcionará el conjunto de datos, que consta de OHLCV

153
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

datos como entrada, así como la salida, que es el precio de cierre del día siguiente. Esta
variable de salida es el valor que queremos que nuestro modelo aprenda a predecir. El valor
real de la salida estará representado por 'y' y el valor predicho estará representado por yˆ.

El entrenamiento del modelo implica ajustar los pesos de las variables para todas las diferentes
neuronas presentes en la red neuronal. Esto se hace minimizando la "función de costo". La
función de costo, como sugiere el nombre, es el costo de hacer una predicción utilizando la
red neuronal. Es una medida de qué tan lejos está el valor predicho, yˆ, del valor real u
observado, y.

Hay muchas funciones de costo que se utilizan en la práctica, la más popular se calcula como
la mitad de la suma de las diferencias al cuadrado entre los valores reales y previstos para el
conjunto de datos de entrenamiento.

C = ∑1/2(yˆ − y)2

La red neuronal se entrena a sí misma calculando primero la función de costo para el conjunto
de datos de entrenamiento para un conjunto determinado de pesos para las neuronas. Luego,
vuelve atrás y ajusta los pesos, seguido por el cálculo de la función de costo para el conjunto
de datos de entrenamiento en función de los nuevos pesos.

El proceso de enviar los errores de vuelta a la red para ajustar los pesos se llama
retropropagación.

Esto se repite varias veces hasta que se minimiza la función de costo. A continuación, veremos
con más detalle cómo se ajustan los pesos y se minimiza la función de costo.

Los pesos se ajustan para minimizar la función de costo. Una forma de hacerlo es mediante la
fuerza bruta.

Supongamos que tomamos 1000 valores para los pesos y evaluamos la función de costo para
estos valores.

Cuando graficamos la función de costo, llegaremos a un gráfico como el que se muestra a


continuación.

El mejor valor para los pesos sería la función de costo correspondiente a los mínimos de este
gráfico.

154
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

Este enfoque podría tener éxito para una red neuronal que involucra un solo peso que necesita
ser optimizado.

Sin embargo, a medida que aumenta el número de pesos a ajustar y el número de capas
ocultas, el número de cálculos necesarios aumentará drásticamente.

El tiempo que se necesitará para entrenar un modelo de este tipo será extremadamente largo,
incluso en la supercomputadora más rápida del mundo. Por este motivo, es esencial
desarrollar una metodología mejor y más rápida para calcular los pesos de la red neuronal.

Este proceso se denomina descenso de gradiente. Analizaremos este concepto en la siguiente


parte.

Descenso de gradiente El descenso de gradiente implica analizar la pendiente de la curva de


la función de costo. En función de la pendiente, ajustamos los pesos para minimizar la función
de costo en pasos en lugar de calcular los valores para todas las combinaciones posibles.

La visualización del descenso del gradiente se muestra en los diagramas siguientes. El primer
gráfico es un valor único de pesos y, por lo tanto, es bidimensional. Se puede ver que la bola
roja se mueve en zigzag para llegar al mínimo de la función de costo.

En el segundo diagrama, tenemos que ajustar dos pesos para minimizar la función de costo.

Por lo tanto, podemos visualizarlo como un contorno, como se muestra en el gráfico, donde
nos movemos en la dirección de la pendiente más pronunciada, para alcanzar los mínimos en
el menor tiempo posible. Con este enfoque, no tenemos que hacer muchos cálculos y, como
resultado, los cálculos no toman mucho tiempo, lo que hace que el entrenamiento del modelo
sea una tarea factible.

155
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

El descenso de gradiente se puede realizar de tres maneras posibles:

1. Descenso de gradiente por lotes: en el descenso de gradiente por lotes, la función de costo se
calcula sumando todas las funciones de costo individuales en el conjunto de datos de
entrenamiento y luego calculando la pendiente y ajustando los pesos.

2. Descenso de gradiente estocástico: la pendiente de la función de costo y los ajustes de


ponderaciones se realizan después de cada entrada de datos en el conjunto de datos de
entrenamiento. Esto es extremadamente útil para evitar quedarse atascado en un mínimo
local si la curva de la función de costo no es estrictamente convexa. Cada vez que ejecute el
descenso de gradiente estocástico, el proceso para llegar a los mínimos globales será diferente.
El descenso de gradiente por lotes puede resultar en quedarse atascado con un resultado
subóptimo si se detiene en los mínimos locales.

3. Descenso de gradiente por minilotes: es una combinación de los métodos por lotes y

estocásticos. Aquí, creamos diferentes lotes agrupando varias entradas de datos en un lote.
Esto básicamente da como resultado la implementación del descenso de gradiente estocástico
en lotes más grandes de entradas de datos en el conjunto de datos de entrenamiento.

Si bien podemos profundizar en el descenso de gradientes, nos tememos que quedará fuera de lugar.

156
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

Fuera del alcance de este capítulo, avancemos y comprendamos cómo funciona la


retropropagación para ajustar los pesos de acuerdo con el error que se generó.

Retropropagación La retropropagación es un algoritmo avanzado que nos permite


actualizar todos los pesos de la red neuronal simultáneamente.

Esto reduce drásticamente la complejidad del proceso para ajustar los pesos.

Si no utilizáramos este algoritmo, tendríamos que ajustar cada peso individualmente


para determinar qué impacto tiene ese peso en particular en el error de la predicción.

Veamos los pasos involucrados en el entrenamiento de la red neuronal con


Descenso de gradiente estocástico:

1. Inicialice los pesos a números pequeños muy cercanos a 0 (pero no 0).


2. Propagación hacia adelante: las neuronas se activan de izquierda a derecha, utilizando la
primera entrada de datos en nuestro conjunto de datos de entrenamiento, hasta que
llegamos al resultado previsto y.
3. Mida el error que se generará.
4. Retropropagación: El error generado se retropropagará de derecha a izquierda
y los pesos se ajustarán de acuerdo con el aprendizaje.
tasa.
5. Repita los tres pasos anteriores: propagación hacia adelante, cálculo de errores
y retropropagación en todo el conjunto de datos de entrenamiento.

Esto marcaría el final de la primera época, las épocas sucesivas comenzarán con los
valores de peso de las épocas anteriores, podemos detener este proceso cuando la
función de costo converja dentro de un cierto límite aceptable.

Ahora aprenderemos cómo desarrollar nuestra propia Red Neuronal Artificial para
predecir el movimiento del precio de una acción.

Entenderás cómo codificar una estrategia utilizando las predicciones de una red neuronal que
construiremos desde cero.

15.1 Redes neuronales en el trading


Importación de bibliotecas Comenzaremos importando algunas bibliotecas, las demás
se importarán a medida que se utilicen en el programa en diferentes etapas.
Por ahora, importaremos las bibliotecas que nos ayudarán a importar y preparar el
conjunto de datos para entrenar y probar el modelo.

157
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

[ ]: # Manipulación de datos import


numpy como np import
pandas como pd

# Indicadores técnicos
importar talibán como ta

# Trazado de gráficos
import [Link] como plt import
seaborn como sns %matplotlib
inline [Link]('seaborn­
darkgrid')

desde métricas de importación de sklearn

# Establecer la semilla aleatoria en un número fijo import


random
[Link](42)

Se utilizará random para inicializar la semilla a un número fijo, de modo que cada vez que
ejecutemos el código comencemos con la misma semilla.

Importar conjunto
de datos [ ]: # Los datos se almacenan en el directorio 'data_modules' path = "../
data_modules/"

#Leer los datos


datos = pd.read_csv(ruta + 'JPM_2017_2019.csv', index_col=0) datos.índice =
pd.to_datetime(datos.índice)

[Link](figsize=(8,5), color='b') [Link](' Precio de


cierre') [Link]('Fecha') [Link]()

Definir objetivo, características y dividir los datos [ ]:


import sys
[Link]("..")

desde data_modules.utility importar get_target_features y, X =


get_target_features(datos)

158
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

dividir = int(0.8*len(X))
X_tren, X_prueba, y_tren, y_prueba = X[:dividir], X[dividir:], \ y[:dividir], y[dividir:]

Escalado de características

[ ]: desde [Link] importar StandardScaler sc = StandardScaler()

X_test_original = X_test.copia()
X_tren = sc.fit_transform(X_tren)
Prueba_X = [Link](Prueba_X)

Otro paso importante en el preprocesamiento de datos es estandarizar el conjunto de datos.


Este proceso hace que la media de todas las características de entrada sea igual a cero y
también convierte su varianza en 1. Esto garantiza que no haya sesgo durante el entrenamiento
del modelo debido a las diferentes escalas de todas las características de entrada. Si esto no
se hace, la red neuronal podría confundirse y dar un mayor peso a aquellas características
que tienen un valor promedio más alto que otras.

Implementamos este paso importando el método StandardScaler de la biblioteca


[Link]. Creamos una instancia de la variable sc con la función StandardScaler().
Después, usamos la función fit_transform para implementar estos cambios en los conjuntos
de datos X_train y X_test.
Los conjuntos y_train e y_test contienen valores binarios, por lo que no es necesario
estandarizarlos. Ahora que los conjuntos de datos están listos, podemos proceder a construir
la red neuronal artificial utilizando la biblioteca Keras.

Construyendo la red neuronal artificial [ ]: #


Construyendo la red neuronal artificial from [Link] import
Sequential from [Link] import Dense from
[Link] import Dropout

Ahora importaremos las funciones que se utilizarán para construir la red neuronal artificial.
Importamos el método secuencial de la biblioteca [Link]. Este se utilizará para construir
secuencialmente las capas de aprendizaje de la red neuronal. El siguiente método que
importaremos será la función densa de la biblioteca [Link].

Este método se utilizará para construir las capas de nuestra Red Neuronal Artificial.

[ ]: clasificador = secuencial()

159
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

Instanciamos la función Sequential() en el clasificador de variables. Esta variable se utilizará


luego para construir las capas del aprendizaje de la Red Neuronal Artificial en Python.

[ ]: [Link](Dense( unidades
= 128,
inicializador_del_núcleo = 'uniforme',
activación = 'relu',
dimensión_de_entrada =
[Link][1] ))

Para agregar capas a nuestro clasificador, utilizamos la función add(). El argumento de la


función add es la función Dense(), que a su vez tiene los siguientes argumentos:

Unidades: Esto define la cantidad de nodos o neuronas en esa capa en particular.


Hemos establecido este valor en 128, lo que significa que habrá 128 neuronas en nuestra
capa oculta.

Kernel_initializer: define los valores iniciales de los pesos de las diferentes neuronas en la
capa oculta. Hemos definido este parámetro como "uniforme", lo que significa que los pesos
se inicializarán con valores de una distribución uniforme.

Activación: Esta es la función de activación de las neuronas en la capa oculta en particular.


Aquí definimos la función como la función de unidad lineal rectificada o "relu".

Input_dim: define la cantidad de entradas a la capa oculta. Hemos definido este valor para que
sea igual a la cantidad de columnas de nuestro marco de datos de características de entrada.
Este argumento no será necesario en las capas posteriores, ya que el modelo sabrá cuántas
salidas produjo la capa anterior.

[ ]: [Link](Dense( unidades = 128,


inicializador_kernel
= 'uniforme', activación = 'relu'

))

Luego añadimos una segunda capa, con 128 neuronas, con un inicializador de núcleo
uniforme y "relu" como función de activación. En esta red neuronal solo estamos construyendo
dos capas ocultas.

[ ]: [Link](Dense( unidades
= 1,

160
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

kernel_initializer = 'uniforme', activación =


'sigmoide' ))

La siguiente capa que construimos será la capa de salida, de la que requerimos una única
salida. Por lo tanto, las unidades que se pasan son 1 y se elige la función de activación como
función sigmoidea porque queremos que la predicción sea una probabilidad de que el mercado
se mueva hacia arriba.

[ ]: [Link]( optimizador
= 'adam', pérdida =
'error_cuadrático_medio', métricas =
['precisión'] )

Finalmente, compilamos el clasificador pasando los siguientes argumentos:

Optimizador: Se elige como optimizador 'adam', que es una extensión del descenso de
gradiente estocástico.

Pérdida: define la pérdida que se debe optimizar durante el período de entrenamiento.


Definimos esta pérdida como el error cuadrático medio.

Métricas: define la lista de métricas que evaluará el modelo durante la fase de prueba y
entrenamiento. Hemos elegido la precisión como métrica de evaluación.

[ ]: [Link](X_train, y_train, tamaño_lote = 20, épocas = 7)

Ahora necesitamos ajustar la red neuronal que hemos creado a nuestros conjuntos de datos de
entrenamiento.

Esto se hace pasando X_train, y_train, el tamaño del lote y el número de épocas en la función
fit().

El tamaño del lote se refiere a la cantidad de puntos de datos que el modelo utiliza para
calcular el error antes de retropropagar los errores y realizar modificaciones en los pesos.

El número de épocas representa la cantidad de veces que se realizará el entrenamiento del


modelo en el conjunto de datos de entrenamiento.

Con esto nuestra Red Neuronal Artificial en Python ha sido compilada y está lista para realizar
predicciones.

Predicción del movimiento de las acciones

161
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

[ ]: predicho = [Link](X_test) predicho =


[Link](predicho>0.5,1,0)

[ ]: desde data_modules.utility importar get_metrics


get_metrics(y_test, predicho)

Estrategia de cálculo de retornos

[ ]: # Calcular el cambio porcentual strategy_data =


X_test_original[['pct_change']].copy()

# Predecir las señales


strategy_data['predicted_signal'] = predicted

# Calcular los retornos de la estrategia


strategy_data['strategy_returns'] = \
strategy_data['predicted_signal'].shift(1) * \
strategy_data['pct_change']

# Descartar los valores faltantes


strategy_data.dropna(inplace=True)

[ ]: desde data_modules.utility importar get_performance


get_performance(strategy_data)

¡Esto es interesante! Si bien los rendimientos de la estrategia fueron menores que los del
índice de referencia, debe tener en cuenta que el porcentaje de reducción es relativamente menor.
Sin embargo, la estrategia de la red neuronal se puede mejorar permitiendo que el
algoritmo procese más datos para mejorar sus puntuaciones de rendimiento.

Hasta ahora hemos analizado los algoritmos de aprendizaje supervisado. En la siguiente


parte, analizaremos el aprendizaje no supervisado y sus algoritmos.

Lectura adicional

1. Comprensión del análisis de regresión lineal en finanzas ­


[Link]
2. Regresión lineal sobre datos de mercado: Implementada desde cero en Python
y R ­ [Link]

3. Predicción del precio del oro mediante aprendizaje automático en Python: https://
[Link]/gold­price­prediction­using­machine­

162
Machine Translated by Google

CAPÍTULO 15. REDES NEURONALES

aprendiendo­python/
4. Comercio con aprendizaje automático: Regresión [Curso] ­
[Link]

5. Regresión lineal Regresión logística [Link]


contra
­

logistic­regression­in­machine­learning

6. Utiliza el análisis de regresión logística para explorar entre


La relación entre las crisis financieras y la reformulación de los estados financieros en
el marco de la transformación digital ­
[Link]
de
7. Predicción del rendimiento de las acciones en el mercado en el En­

de valores indio mediante regresión logística [Link] ­

paper/Prediction­of­Stock­Performance­in­the­Indian­Stock­Dutta­
Bandopadhyay/082826e9adf1c3ce3ff9f70491566719772fdc8a

8. Predecir tendencias futuras en el mercado de valores mediante decisiones


Sistema híbrido basado en el desbaste de árboles con HHMM ­
[Link]
set_based_hybrid_system_with_HHMM
9. Entendiendo el método Bayes ingenuo ­ [Link]
Bayes ingenuo
10. Decisión Árboles en ­
Comercio [Curso]
[Link]

11. Comprensión de las redes LSTM: [Link]


08­Entendiendo­LSTMs/
12. Una introducción sencilla a los gradientes explosivos en redes neuronales: https://
[Link]/exploding­gradients­in­neural­networks/

13. CÓMO FUNCIONA EL ALGORITMO XGBOOST DE KAGGLE WINNERS ­ [Link]

xgboost­algorithm/
14. Aprendizaje en conjunto para mejorar los resultados del aprendizaje automático ­
[Link]
Tácticomediante métodos de aprendizaje conjunto
15. Asignación cuantitativa de activos A nosotros­

Máquina ­
[Link]

163
Machine Translated by Google

Parte IV

Aprendizaje no supervisado,
Procesamiento del lenguaje natural
y aprendizaje por refuerzo
Machine Translated by Google

16
Aprendizaje no supervisado

En los capítulos anteriores, analizamos en detalle algoritmos de aprendizaje


supervisado como la clasificación y la regresión. El elemento común de estos
algoritmos es que se conocen las etiquetas y la variable de destino en los modelos
de aprendizaje supervisado.

Pero si lo piensas, los humanos también tienen otro enfoque para aprender. Un bebé
comienza sin ningún conocimiento de lo que lo rodea y se le presenta a sus padres,
que son humanos. Aunque el bebé no pueda hablar, sabe cómo diferenciar las cosas.
Cuando ve un perro, primero pensará si se trata de algún otro ser, diferente de sus
padres. Cuando ve otro perro, ve que este perro tiene más cosas en común, como la
cola, con el primer perro que con un humano. De esta manera, aunque no sepa que
está viendo un "perro", ha aprendido a poner a los perros en una categoría diferente
a la de los humanos.

Repite el mismo proceso cuando ve un gato. Sabe que es diferente tanto de los
perros como de los humanos. Este proceso, cuando se replica en el aprendizaje
automático, se denomina agrupamiento, que es parte del aprendizaje no supervisado.

Los algoritmos de aprendizaje no supervisado también pueden ayudar a descubrir


patrones ocultos en el conjunto de datos. Pueden ayudarle a agrupar o agrupar
puntos de datos similares. Luego, puede analizar estos grupos y extraer información de ellos.
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

Veamos cómo se puede aplicar esto en el trading.

Supongamos que desea analizar las acciones que componen el índice S&P 500 y encontrar
dos acciones similares. Esto le ayudará a aplicar una estrategia de negociación de pares en
las acciones similares identificadas. Pero analizar las 500 acciones
datos fundamentales y de precios, y encontrar similitudes es una tarea muy tediosa y
Tarea que consume mucho tiempo.

Aquí puede utilizar un algoritmo de aprendizaje no supervisado. Simplemente pase los datos
relevantes de 500 acciones al algoritmo. A cambio, agrupará los datos similares.
acciones juntas. Por ejemplo, creará un grupo de Google y Facebook, y otro grupo de
Citigroup y Bank of America, y así sucesivamente.
Luego puede elegir un par de Citigroup y Bank of America y crear un
Estrategia comercial de arbitraje estadístico.

Esto puede funcionar no solo en 500 acciones, sino también en acciones de diferentes
geografías o incluso de diferentes clases de activos como divisas, materias primas o
bonos. El algoritmo no supervisado los agrupará en un asunto
de segundos.

Esto es útil no solo para el trading de pares, sino que también puede utilizar estos grupos para
Cree carteras diversificadas. Recuerde que los valores que son similares
entre sí se colocan juntos en un solo grupo. Y la seguridad en uno
El clúster es diferente a la seguridad en otro clúster.

Puede elegir el valor de mayor rendimiento de cada grupo y crear una cartera diversificada.
Por ejemplo, puede elegir Bank of America, Facebook, Gold
ETF, EURUSD y bonos del Tesoro de EE. UU. y crea una cartera diversificada.

Tomemos un pequeño ejemplo para ilustrar este punto.

Nombre de la Empresa Sector


Facebook Tecnología

Banco de América Banco

166
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

Nombre de la Empresa Sector

Amazon Tecnología

Google Tecnología

Microsoft Tecnología

Ford Auto

JP Morgan Banco

Wells Fargo Banco


Intel Tecnología

Tesla Auto

Quiere dividir estas empresas en dos grupos. Uno de los muchos


Las posibles formas de hacerlo pueden ser las que se muestran a continuación:

• Grupo 1: Facebook, Amazon, Google, Microsoft, Intel, Apple


• Grupo 2: Bank of America, JP Morgan, Wells Fargo, Ford, Tesla

¿Puedes pensar en cómo se realizó esta agrupación?

El grupo 1 comprende todas las empresas tecnológicas de la lista. Y el grupo 2 comprende


Todas las empresas no tecnológicas.

De manera similar, si tuviera que dividir estas empresas en tres grupos, podría ser:
hecho como se muestra:

• Grupo 1: Amazon, Google, Microsoft, Facebook, Apple


• Grupo 2: Bank of America, JP Morgan, Wells Fargo
• Grupo 3: Ford, Tesla

Aquí, el grupo 1 comprende las empresas tecnológicas, el grupo 2 son los bancos y el grupo
3 son automóviles. De estas agrupaciones, se puede concluir que las acciones
Dentro de un grupo son similares entre sí y difieren entre sí.
grupos. Cada grupo se llama clúster.

La siguiente pregunta que surge es ¿qué pasa si en lugar de diez, tienes una lista de
¿Miles de empresas? ¿Y si, además del sector, tienes muchas otras?
¿Características en el conjunto de datos?

Puede leer los datos fila por fila y crear los grupos. Pero, como el tamaño
A medida que aumenten los datos, la creación de grupos con intervención humana será imposible.

Puede utilizar el algoritmo de agrupamiento para realizar esta tarea. El agrupamiento es una técnica
para dividir los datos en grupos similares. Solo necesita pasar datos significativos para todas las
empresas y el algoritmo de agrupamiento creará
grupos para ti.

167
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

En el conjunto de datos dado, la característica es el sector. Por lo tanto, el algoritmo de


agrupamiento crea los grupos en función de los sectores. También puede pasar los datos
históricos, los datos fundamentales, etc. para una agrupación más detallada. No tiene que
especificar ninguna regla para crear los grupos, los grupos se crean en función de la similitud.
La similitud entre los puntos dentro de un grupo no se conoce, tiene que analizar cada grupo
y agregarles una etiqueta significativa.

Por ejemplo, analizamos el grupo anterior y descubrimos que los grupos se crearon en función
de los sectores. Observe también que la única característica que se pasó al algoritmo de
agrupamiento fue el sector. Eso significa que el resultado generado por el algoritmo se basa
en la entrada proporcionada al algoritmo.

Seguramente se te habrá ocurrido algo. En los capítulos anteriores, analizamos el aprendizaje


supervisado, que incluye la clasificación. ¿Es similar a la agrupación en clústeres? En cierto
modo, sí, pero hay ciertas diferencias.

Consideremos un escenario para entender estas diferencias en detalle. Usted ha decidido


utilizar un algoritmo de aprendizaje automático que predecirá si debe comprar acciones de
Apple o no. Una opción es utilizar un algoritmo de clasificación.
Veamos los pasos necesarios para hacerlo.

Obtendrá los datos históricos. Para entrenar un modelo de clasificación, debe etiquetar los
datos históricos. Para los días en los que los retornos del día siguiente son positivos, los
etiqueta como compra. Y los días en los que los retornos del día siguiente son negativos, los
etiqueta como sin posición. También utiliza dos características como entrada para el modelo
de aprendizaje automático. La imagen muestra un diagrama de dispersión de estas dos
características. Los puntos azules corresponden a una señal de compra y los verdes a ninguna posición.

El modelo de clasificación creará un límite para separar los puntos azules de los puntos verdes.
Luego, utilizará este límite para predecir si es mejor comprar o no comprar.

168
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

Posición en los datos no vistos o en los puntos de datos futuros. Si un punto de datos
cae en la región izquierda, se clasificará como una señal de compra. Y si cae en la región
derecha, se clasificará como No comprar, lo que significa que no se toma ninguna posición.

Aquí se puede ver que algunos puntos se encuentran en la región incorrecta, lo que
significa que estos puntos están mal clasificados.

Además, es muy difícil crear el límite si las clases no están bien separadas. Veamos
ahora cómo podemos abordar el mismo problema con un algoritmo de agrupamiento.

En la agrupación, simplemente pasarás las características al algoritmo sin ningún


resultado esperado, como comprar o no posicionar nada.

169
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

Es decir, el algoritmo de agrupamiento solo tiene acceso a las características y no conoce los
grupos en los que debe clasificar los datos. Como no hay etiquetas separadas para comprar,
el algoritmo no creará ningún límite para separar comprar y no comprar, pero creará grupos
de puntos de datos similares.

Puede analizar los grupos e identificar en qué grupo comprará el activo. Según su análisis,
puede comprar acciones de Apple si los puntos de datos se encuentran en el grupo 1.

170
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

Como puede ver, todos los puntos de datos que caen en el grupo 1 son de color azul.
indicando que los retornos del día siguiente son positivos.

Una limitación de la agrupación en clústeres es que no tienes ningún control sobre los clústeres.
creado por el algoritmo. Algunos de los clústeres creados podrían no ser útiles.
para nosotros, mientras que otros podrían serlo. Por ejemplo, el grupo 2 y el grupo 3 tienen
una combinación de compra y ninguna posición, lo que dificulta la incorporación de una
etiqueta significativa para ello.

Eso fue todo acerca de las diferencias clave entre clasificación y agrupamiento.
Vamos a resumirlos.

Agrupamiento de clasificación

Naturaleza de la clase/etiqueta Conocido No se sabe


Naturaleza de la clasificación En las etiquetas Sobre la similitud
Control sobre el resultado esperado Sí No

¿Cuándo utilizamos algoritmos no supervisados? El aprendizaje no supervisado es


utilizado en las siguientes condiciones:

• No tienes los datos de salida/objetivo.


• No sabes exactamente lo que estás buscando y quieres el ma­
China para descubrir patrones/conocimientos en los datos.
• Desea conservar únicamente la información esencial de un gran conjunto de datos.

Existen diferentes algoritmos de agrupamiento, como el agrupamiento k­means, el agrupamiento


jerárquico, DBSCAN, OPTICS, etc., que agrupan los datos según
a sus propias definiciones de similitud entre los puntos de datos.

Veamos un algoritmo de agrupamiento, llamado algoritmo de agrupamiento K­means

171
Machine Translated by Google

CAPÍTULO 16. APRENDIZAJE NO SUPERVISADO

en el próximo capítulo.

172
Machine Translated by Google

17

Agrupamiento de K­medias

El agrupamiento de k­medias se utiliza cuando tenemos datos sin etiquetar, es decir, datos sin
categorías o grupos definidos. Este algoritmo encuentra grupos o conglomerados en los datos,
con la cantidad de grupos representados por la variable 'k' (de ahí el nombre).

Lo bueno de k­means es que simplemente le damos los datos al algoritmo y la cantidad de grupos
que se deben formar. ¡Y luego le decimos que comience a funcionar! Eso es todo lo que obtiene
el algoritmo.

El algoritmo trabaja iterativamente para asignar cada observación a uno de los k grupos en función
de la similitud de las características proporcionadas.

Las entradas del algoritmo k­means son los datos/características (X) y el valor de 'k' (número de
clústeres que se formarán).

Los pasos se pueden resumir así:

1. El algoritmo comienza con la elección aleatoria de 'K' puntos de datos como 'centroides',
donde cada centroide define un grupo.
2. Cada punto de datos se asigna a un grupo definido por un centroide de modo que la distancia
entre ese punto de datos y el centroide del grupo sea mínima.

3. Los centroides se vuelven a calcular tomando la media de todos los puntos de datos que se
asignaron a ese grupo en el paso anterior. El algoritmo itera entre los pasos (ii) y (iii) hasta
que se cumple un criterio de detención, como alcanzar un número máximo predefinido de
iteraciones o hasta que los puntos de datos dejan de cambiar los grupos.

Veamos esto en acción ahora. A menudo, los operadores e inversores quieren agrupar acciones
en función de similitudes en determinadas características.

Por ejemplo, un comerciante que desea operar con una estrategia de negociación de pares, donde
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

Ella toma simultáneamente una posición larga y corta en dos acciones similares, idealmente querría
escanear todas las acciones y encontrar aquellas que sean similares entre sí en términos de industria,
sector, capitalización de mercado, volatilidad o cualquier otra característica.

Ahora consideremos un escenario en el que un comerciante desea agrupar acciones de 12 empresas

estadounidenses basándose en dos características:

1. Rentabilidad sobre el capital (ROE) = Ingresos netos/Patrimonio total del accionista, y 2. La beta
de la acción.

Los inversores y operadores utilizan el ROE para medir la rentabilidad de una empresa en relación
con el capital de los accionistas. Por supuesto, es preferible invertir en una empresa con un ROE alto.
Por otro lado, el beta representa la volatilidad de las acciones en relación con el mercado en general
(representado por un índice como el S&P 500 o el DJIA).

Revisar manualmente cada una de las acciones y luego formar grupos es un proceso tedioso y que
requiere mucho tiempo. En su lugar, se podría utilizar un algoritmo de agrupamiento, como el algoritmo
de agrupamiento k­means, para agrupar o agrupar las acciones en función de un conjunto determinado
de características.

Implementemos un algoritmo k­means para agrupar estas acciones en Python.

17.1 K­Means en el trading


Comenzamos importando las bibliotecas necesarias y obteniendo los datos requeridos utilizando los
siguientes comandos.

Importar conjunto de datos Usaremos el conjunto de datos que contiene los datos de 12 empresas y
que está almacenado en el archivo sample_stocks.csv. Puede descargar este archivo desde el enlace
de GitHub que se proporciona en la sección “Acerca del libro” de este libro.

[1]: # Importando las librerias necesarias import pandas as pd

# Trazado
import [Link] como plt import seaborn
como sns %matplotlib inline
[Link]('seaborn­
darkgrid')

advertencias de importación

174
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

[Link]('ignorar')

# Los datos se almacenan en el directorio 'data_modules'


ruta = "../módulos_de_datos/"

#Leer los datos


datos = pd.read_csv(ruta + 'sample_stocks.csv',
índice_col=0)
datos

[1]: ROE (%) Beta


ADBE 28,84 0,96
AEP 10,27 0,26
Director Ejecutivo de la OCDE 22,53 0,89
EXCª 8,57 0,43
pensión completa 22,18 1,29
GOOGL 15.19 1.00
INTC 23,77 0,59
LNT 10,90 0,33
MSFT 34,74 0,78
STLD 21,34 1,45
Universidad Estatal de Texas 12,13 0,56
XEL 10,20 0,30

Como se ve arriba, hemos descargado con éxito los datos de las 12 acciones.

Ahora crearemos una copia (df) de los datos originales y trabajaremos con ellos.
El primer paso es preprocesar los datos para que se puedan introducir en un algoritmo de
agrupamiento de k­medias. Esto implica convertir los datos en un formato de matriz NumPy.
y escalarlo.

La escala equivale a restar la media de la columna y dividirla por la desviación estándar de la columna
de cada punto de datos de esa columna.

Para escalar, utilizamos la clase StandardScaler de la biblioteca scikit­learn de la siguiente manera:

[2]: # Escalado de datos


desde [Link] importar StandardScaler

escalador = StandardScaler()
datos_escalados = escalador.ajuste_transformado([Link])

# Impresión de datos preprocesados

175
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

imprimir(datos_escalados)

[[1,29583307 0,59517359]
[­1.00653849 ­1.27029587]
[ 0,51349787 0,40862664 ]
[­1,21731025 ­0,81725329]
[ 0,47010369 1,4746092 ]
[­0,39654021 0,70177185]
[ 0,66723728 ­0,39086027]
[­0,92842895 ­1,08374893]
[ 2.02733507 0.11548144 ]
[ 0,36595764 1,90100222 ]
[­0,77592938 ­0,47080896]
[­1.01521733 ­1.16369762]]

El siguiente paso es importar la clase 'KMeans' de scikit­learn y ajustarla.


modelo con el valor del hiperparámetro 'K' (que se llama n_clusters en
scikit­learn) establecido en 2 (elegido aleatoriamente) al que ajustamos nuestro preprocesado
datos 'df_values'.

[3]: desde [Link] importe KMeans


km_modelo = KMeans(n_clústeres=2).fit(datos_escalados)

¡Eso es todo! 'km_model' ahora está entrenado y podemos extraer el clúster que tiene
asignado a cada acción de la siguiente manera:

[4]: clústeres = km_model.labels_


datos['cluster'] = clústeres
datos

[4]: ROE(%) Clúster beta


ADBE 28,84 0,96 0
AEP 10,27 0,26 1
Director Ejecutivo de la OCDE 22,53 0,89 0
EXCª 8,57 0,43 1
pensión completa 22,18 1,29 0
GOOGL 15.19 1.00 0
INTC 23,77 0,59 0
LNT 10,90 0,33 1
MSFT 34,74 0,78 0
STLD 21,34 1,45 0
Universidad Estatal de Texas 12,13 0,56 1
XEL 10,20 0,30 1

176
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

Ahora que tenemos los clústeres asignados, los visualizaremos utilizando las bibliotecas
matplotlib y seaborn de la siguiente manera:

[5]: # Establecer el tamaño del


gráfico [Link](figsize=(8, 5))

# Establecer las etiquetas de los


ejes x e y ax = [Link](y="ROE(%)", x="Beta", edgecolor='face',
tono="clúster", datos=datos,
→paleta='brillante',
(s=60)

# Dibuje el gráfico
[Link]('Beta')
[Link]('ROE(%)')
[Link](ax.get_legend().get_texts(), fontsize='15')
[Link](ax.get_legend().get_title(), fontsize='15') [Link]('CLUSTERS del
algoritmo k­means con k = 2', fontsize='x­large')

# Etiquetar elementos individuales

para i en rango(0, [Link][0]):


[Link]([Link][i]+0.07, datos['ROE(%)'][i]+0.01, datos.índice[i],
alineación
horizontal='derecha', alineación
vertical='inferior', tamaño='pequeño', color='negro',
peso='seminegrita')

177
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

Podemos ver claramente la diferencia entre los dos grupos en el gráfico anterior.

¿Puedes hacer un análisis de este grupo? El grupo 1 está compuesto en gran parte por todas
las empresas de servicios públicos que tienen un ROE bajo y una beta baja en comparación con
las empresas tecnológicas de alto crecimiento del grupo 0.

Aunque no le dijimos al algoritmo k­means a qué sectores industriales pertenecían las acciones,
pudo descubrir esa estructura en los datos mismos. Ahí radica el poder y el atractivo del
aprendizaje no supervisado.

La siguiente pregunta que surge es ¿cómo decidir el valor del hiperparámetro k antes de ajustar
el modelo?

Pasamos el valor del hiperparámetro k=2 de forma aleatoria mientras ajustábamos el modelo.

¿Qué pasaría si hubiéramos aumentado el número de clusters?

Digamos que tomaste k = 8. Ahora, el algoritmo k­means intentará crear obligatoriamente 8


clústeres. Pero sabes que tu conjunto de datos contiene 12 empresas, lo que significa que
algunos clústeres tendrán solo una empresa.

¿Cómo encontrar un número óptimo de clusters?

Una de las formas de hacer esto es comprobar la "inercia" del modelo, que representa

178
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

representa la distancia de los puntos de un grupo desde su centroide. A medida que se


añaden más grupos, la inercia sigue disminuyendo, creando lo que se llama una "curva de
codo". Seleccionamos el valor de k más allá del cual no vemos mucho beneficio (es decir,
disminución) en el valor de la inercia. Piénselo, si hubiera 8 grupos, entonces en el grupo con
una empresa, la inercia sería 0 y no tendría sentido tener ese grupo.

A continuación graficamos los valores de inercia para los modelos k­mean con diferentes valores
de 'k':

[6]: # Cálculo de la inercia para modelos k­means


# con diferentes valores de 'k' inercia = []
k_range =
range(1,10) para k en k_range:
model =
KMeans(n_clusters=k)
[Link](data[['ROE(%)','Beta']])
[Link](model.inertia_)

# Trazado de la 'curva del codo'


[Link](figsize=(8,5)) [Link]('
valor k ') [Link](' Inercia del
modelo ') [Link](k_range,inertia,color='blue')
[Link]()

179
Machine Translated by Google

CAPÍTULO 17. AGRUPAMIENTO DE K­MEANS

Como podemos ver que el valor de inercia muestra una disminución marginal después de k =
3, un modelo k­medias con k = 3 (tres clústeres) es el más adecuado para esta tarea.
Puedes intentar ejecutar el mismo algoritmo pero cambiar el parámetro a 3 y ver cómo cambia.

En el próximo capítulo, veremos otro algoritmo de agrupamiento, es decir, el algoritmo de


agrupamiento jerárquico.

180
Machine Translated by Google

18
Agrupamiento jerárquico

En el capítulo anterior analizamos la agrupación de K­means, pero ¿se dio cuenta de una
limitación de K­means?

Al comienzo del algoritmo, debemos decidir el número de clústeres.


Sin embargo, no sabríamos cuántos clústeres necesitamos al principio. Es cierto
que descubrimos el número óptimo de clústeres utilizando el concepto de inercia,
pero ¿qué pasa si no necesitamos definir el número de clústeres al principio?

La agrupación jerárquica es uno de esos algoritmos que nos ayuda en este sentido.
Veamos cómo funciona.

En esencia, existen dos tipos de agrupamiento jerárquico:

• Agrupamiento jerárquico aglomerativo •


Agrupamiento jerárquico divisivo

Agrupamiento jerárquico aglomerativo El agrupamiento jerárquico aglomerativo es


el tipo más común de agrupamiento jerárquico utilizado para agrupar objetos en
grupos según su similitud. Es un enfoque de abajo hacia arriba en el que cada
observación comienza en su propio grupo y los pares de grupos se fusionan a
medida que uno asciende en la jerarquía.

¿Cómo funciona la agrupación jerárquica aglomerativa? Supongamos que tiene


puntos de datos que desea agrupar en grupos similares.
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

Paso 1: El primer paso es considerar cada punto de datos como un grupo.

Paso 2: Identificar dos grupos que sean similares y convertirlos en un solo grupo.

Paso 3: Repita el proceso hasta que sólo quede un solo grupo.

182
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

¿Cómo identificar si dos grupos son similares? Una de las formas de hacerlo es encontrar la
distancia entre los grupos.

Medida de distancia (similitud) La distancia entre dos grupos se puede calcular en función de
la longitud de la línea recta trazada de un grupo a otro. Esto se conoce comúnmente como
distancia euclidiana.

La distancia euclidiana entre dos puntos, ya sea en el plano o en el espacio tridimensional,


mide la longitud de un segmento que conecta los dos puntos. Es la forma más obvia de
representar la distancia entre dos puntos.

Si (x1, y1) y (x2, y2) son puntos en el espacio bidimensional, entonces la distancia euclidiana entre ellos
es:

2
(x2 ­ x1) − (y2 − y1) 2

Además de la distancia euclidiana, se han desarrollado otras métricas para medir la distancia,
como la distancia de Hamming, la distancia de Manhattan (taxi o manzana de la ciudad) y la
distancia de Minkowski.

La elección de las métricas de distancia debe basarse en el campo de estudio o el problema


que se intenta resolver. Por ejemplo, si se intenta medir la distancia entre objetos en una
cuadrícula uniforme, como un tablero de ajedrez o las manzanas de una ciudad, la distancia
de Manhattan sería una opción adecuada.

Criterio de vinculación Después de seleccionar una métrica de distancia, es necesario


determinar a partir de dónde se calcula la distancia. Algunos de los métodos de vinculación
más comunes son:

Enlace simple: el enlace simple o enlace más cercano es la distancia más corta entre un par
de observaciones en dos grupos.

183
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

Enlace completo: el enlace completo o enlace más lejano es la distancia más lejana
entre un par de observaciones en dos grupos.

Vinculación promedio: la vinculación promedio es el promedio de la distancia entre cada


observación en un grupo y cada observación en el otro grupo.

Enlace centroide: el enlace centroide es la distancia entre los centroides de dos grupos.
En este caso, es necesario encontrar el centroide de dos grupos y luego calcular la
distancia entre ellos antes de fusionarlos.

Vinculación de Ward: el método de Ward o método de varianza mínima, o método de


agrupamiento de varianza mínima de Ward, calcula la distancia entre dos conglomerados
cuando hay un aumento en la suma de cuadrados del error después de fusionar dos
conglomerados en un solo conglomerado. Este método busca elegir los pasos sucesivos
de agrupamiento de modo de minimizar el aumento en la suma de cuadrados del error
en cada paso.

La elección del criterio de vinculación se basa en la aplicación del dominio. La


vinculación promedio y la vinculación completa son las dos métricas de distancia más
populares en la agrupación jerárquica. Sin embargo, cuando no existen justificaciones
teóricas claras para la elección del criterio de vinculación, el método de Ward es la
opción predeterminada.

¿Cómo elegir el número de clústeres? Para elegir el número de clústeres en el agrupamiento


jerárquico, utilizamos el concepto llamado dendrograma.

¿Qué es un dendrograma? Un dendrograma es un diagrama en forma de árbol que


muestra la relación jerárquica entre las observaciones. Contiene la memoria de los
algoritmos de agrupamiento jerárquico.

Con sólo observar el dendrograma se puede ver cómo se forma el cúmulo.


Veamos cómo formar el dendrograma para los siguientes puntos de datos.

184
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

Las observaciones E y F son las más cercanas entre sí por cualquier otro punto. Por lo tanto,
se combinan en un grupo y, además, la altura del vínculo que las une es la más pequeña.
Las siguientes observaciones que están más cerca entre sí son A y B, que se combinan.

Esto también se puede observar en el dendrograma, ya que la altura del bloque entre A y B
es ligeramente mayor que la de E y F. De manera similar, D se puede fusionar en los grupos
E y F y luego C se puede combinar con este. Finalmente, A y B se combinan en C, D, E y F
para formar un solo grupo.

Los puntos importantes a tener en cuenta al leer el dendrograma son que:

1. La altura de los bloques representa la distancia entre los grupos.


2. La distancia entre observaciones representa disimilitudes.

Pero la pregunta sigue siendo la misma: ¿cómo encontramos el número de grupos utilizando
un dendrograma o dónde debemos dejar de fusionar los grupos?

Si lo piensas, puedes ver que, si bien A y B pueden estar en un grupo, están lejos del otro
grupo formado por C, D, E y F. Esto se ve en el dendrograma, ya que la altura de la línea
que une estos dos grupos es la más larga. Por lo tanto, podrías dividir estos puntos en dos
grupos.

Las observaciones se asignan a los grupos trazando una línea horizontal a través del
dendrograma.

185
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

Agrupamiento jerárquico divisivo El agrupamiento jerárquico divisivo no se utiliza mucho para


resolver problemas del mundo real. Funciona de forma opuesta al agrupamiento aglomerativo. En
este caso, comenzamos con todos los puntos de datos como un solo grupo.

En cada iteración, separamos los puntos o grupos más alejados que no son similares hasta que
cada punto de datos se considera un grupo individual. Aquí dividimos los grupos individuales en n
grupos, de ahí el nombre de agrupamiento divisivo.

18.1 Agrupamiento jerárquico en el comercio

Comenzaremos nuestra estrategia importando primero las bibliotecas y el conjunto de datos.

[1]: # Manipulación de datos import


numpy como np import
pandas como pd

# Trazado de gráficos
import seaborn como sns import
[Link] como plt %matplotlib inline
[Link]('seaborn­
darkgrid')

# Aprendizaje automático
# Escalado de datos desde
[Link] import StandardScaler

importar [Link] como sc desde


[Link] importar AgglomerativeClustering

# Los datos se almacenan en el directorio 'data_modules'

186
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

ruta = "../módulos_de_datos/"

#Leer los datos

datos = pd.read_csv(ruta + 'sample_stocks.csv', index_col=0)

[Link]()

[1]: ROE (%) Beta


ADBE28,840,96
AEP 10,27 0,26
CSCO22,530,89
EXCª 8,57 0,43
pensión completa 22,18 1,29

También escalaremos los datos.

[2]: datos_escalados = StandardScaler().fit_transform(datos)


# Impresión de datos escalados
print(data_scaled)

[[ 1.29583307 0.59517359] [­1.00653849


­1.27029587] [ 0.51349787 0.40862664]
[­1.21731025 ­0.81725329] [ 0.47010369
1,4746092 ] [­0,39654021 0,70177185]
[ 0,66723728 ­0,39086027] [­0,92842895
­1,08374893] [ 2,02733507 0,11548144]
[ 0,36595764 1,90100222] [­0,77592938
­0,47080896] [­1,01521733 ­1,16369762]]

Crear un dendrograma Comenzamos importando la biblioteca que nos ayudará a crear dendrogramas.
El dendrograma nos ayuda a darnos una idea aproximada de la cantidad de clústeres.

[3]: # Trazar un dendrograma


[Link](figsize=(8, 5))
[Link]("Dendrogramas")

# Crear un dendrograma

187
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

[Link]([Link](datos, método='ward'),etiquetas=datos.
→índice)

[Link]('Dendrograma')
[Link]('Acciones')
[Link]('Distancia euclidiana ') [Link]()

Al observar el dendrograma anterior, dividimos los datos en dos grupos.

Ajuste del modelo Creamos una instancia de AgglomerativeClustering. Luego pasaremos la


distancia euclidiana como medida de la distancia entre puntos y el enlace de Ward para calcular la
proximidad de los clústeres. Luego ajustamos el modelo a nuestros puntos de datos. Finalmente,
devolvemos una matriz de números enteros donde los valores corresponden a las distintas
categorías utilizando la propiedad lables_.

[4]: # Instanciar el algoritmo de agrupamiento cluster =


AgglomerativeClustering( n_clusters=2,
affinity='euclidean', linkage='ward')

# Uso de la función de ajuste


[Link](data_scaled) data['labels']
= cluster.labels_

188
Machine Translated by Google

CAPÍTULO 18. AGRUPAMIENTO JERÁRQUICO

datos

[4]: ROE(%) Etiquetas beta


ADBE 28,84 0,96 0
AEP 10,27 0,26 1
Director Ejecutivo de la OCDE 22,53 0,89 0
EXCª 8,57 0,43 1
pensión completa 22,18 1,29 0
GOOGL 15.19 1.00 0
INTC 23,77 0,59 0
LNT 10,90 0,33 1
MSFT 34,74 0,78 0
STLD 21,34 1,45 0
Universidad Estatal de Texas 12,13 0,56 1
XEL 10,20 0,30 1

Pros y contras de la agrupación jerárquica

1. Al igual que en el agrupamiento K­means, no necesitamos especificar la cantidad de clústeres


necesarios para el algoritmo.

2. No funciona bien en un conjunto de datos grande. Generalmente se aplica a


Un conjunto de datos más pequeño. Si tiene un conjunto de datos grande, puede resultar difícil
determinar el número correcto de grupos mediante el dendrograma.

3. En comparación con K­means, la agrupación jerárquica es computacionalmente


Pesado y tarda más tiempo en ejecutarse.

Conclusión A pesar de las limitaciones de la agrupación jerárquica cuando se


Cuando se trata de grandes conjuntos de datos, sigue siendo una gran herramienta para trabajar con conjuntos de datos pequeños y medianos.

conjunto de datos y encontrar patrones en ellos. En el próximo capítulo, veremos los


concepto de reducción de dimensionalidad.

189
Machine Translated by Google

19
Análisis de componentes principales

Ya sabes que un algoritmo de agrupamiento calcula la distancia entre los puntos y forma grupos
de puntos que están más cerca unos de otros. Por ejemplo, tomemos los valores RSI de JP
Morgan.

Se puede ver fácilmente que aquí se pueden formar dos grupos.

¿Qué sucede si agrega otra función, digamos ADX?

Fecha Indicadores RSI y ADX

9 de agosto de 2021 40 25
10 de agosto de 2021 42 62
11 de agosto de 2021 60 25
12 de agosto de 2021 65 50

Se agrega un nuevo eje para capturar los valores ADX. El gráfico se convierte en un gráfico 2D
con RSI como eje x y ADX como eje y.
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

Se puede ver que, debido a la adición de ADX, los puntos de datos se alejaron.
Es difícil agrupar estos puntos de datos en dos grupos, por lo que se los agrupa en
cuatro grupos diferentes.

¿Por qué aumentó el número de clústeres? Al principio, habíamos calculado solo un


valor de característica, que era el RSI. Luego, agregamos más información en forma de
valores ADX. Por lo tanto, los puntos que eran similares y estaban agrupados se
distanciaron debido a la incorporación de nuevas características.
De la misma manera, cuando añadimos más características, la información aumenta y
los puntos pueden alejarse.

¿Pero cuál es el problema en agregar más información y crear más clústeres?

En el ejemplo de RSI y ADX, terminamos creando 4 clústeres. Cada clúster tenía solo 1
punto de datos. Básicamente, terminamos con lo que habíamos comenzado.
Comenzamos con 4 puntos y terminamos con 4 grupos. No hubo agrupación de estos 4
puntos. Para generalizar, demasiadas dimensiones o características hacen que cada
punto parezca equidistante de otros puntos. Si las distancias son todas aproximadamente
iguales, entonces todas las observaciones parecen igualmente iguales (así como
igualmente diferentes) y no se pueden formar grupos significativos.

Esto se llama la maldición de la dimensionalidad.

¿Cómo superar la maldición de la dimensionalidad?

Una forma es eliminar las dimensiones, ¿o son las características?

191
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

Pero eso conlleva una pérdida de información. Tomemos otro ejemplo.

Los valores RSI y ADX de un activo se muestran a continuación.

Fecha Indicadores RSI y ADX

9 de agosto de 2021 40 20
10 de agosto de 2021 45 25
11 de agosto de 2021 60 45
12 de agosto de 2021 65 50
13 de agosto de 2021 40 25
14 de agosto de 2021 45 20
15 de agosto de 2021 60 50
16 de agosto de 2021 65 45
17 de agosto de 2021 44 30
18 de agosto de 2021 65 55

Si dibuja un diagrama de dispersión para estos valores, se verá como se muestra a continuación:

La forma más sencilla de reducir las dimensiones es eliminar una de ellas. Por ejemplo,
eliminar ADX o eliminar los valores RSI. Pero eso provocaría una pérdida de información.

Si solo se mantuviera el RSI, los puntos de datos (40, 20) y (40, 25) se unirían.
Antes, los dos puntos estaban a una distancia de 5 unidades entre sí, pero ahora parece que son
el mismo punto, por lo que se pierde la información de que estos dos puntos son diferentes y no
iguales.

192
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

¿Existe una mejor manera de reducir la dimensión manteniendo al mínimo la pérdida de


información? Sí. Dibuje una línea que esté entre los dos ejes y luego junte todos los puntos en
esta línea.

Puede ver que, aunque los puntos están más cerca en el nuevo eje, todavía se pueden ver
claramente. Simplemente gire o enderece esta línea para convertir los puntos de datos en una
sola dimensión. Y logró conservar parte de la información de ambas dimensiones. Esto es
esencialmente lo que hace el análisis de componentes principales, es decir, la reducción de la
dimensionalidad.

El análisis de componentes principales crea una nueva variable que contiene la mayor parte
de la información de las variables originales. Un ejemplo sería que nos dieran 5 años de datos
de precios de cierre de 10 empresas, es decir, aproximadamente (1265 * 10) puntos de datos.
Buscaríamos reducir este número de tal manera que se conserve la información.

Por supuesto, en el mundo real, habría alguna pérdida de información y

193
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

Por lo tanto, utilizamos el análisis de componentes principales para asegurarnos de que se mantenga.
un mínimo.

Eso suena realmente interesante, pero ¿cómo lo hacemos exactamente?

La respuesta es valores propios. Bueno, esa no es la respuesta completa, pero en cierto modo lo
es. Antes de entrar en el tema matemático, refresquemos nuestros conceptos sobre la matriz (¡no,
no la película!).

19.1 Vectores propios y matriz de covarianza


Una de las principales aplicaciones de los vectores propios y los valores propios es la
transformación de imágenes. Recordemos que podemos inclinar una imagen en cualquiera de las
aplicaciones de edición de fotografías. Pues bien, los valores propios y los vectores propios nos
ayudan en este sentido.

Supongamos que tenemos dos características, mostradas en dos dimensiones, x e y.


Básicamente, creamos nuevos ejes, u y v, y luego proyectamos los puntos en uno de los ejes,
donde obtenemos la máxima dispersión. Esto se hace multiplicando un vector por la matriz de
características. Así que, formalmente, esto es lo que sucede al transformar la matriz A y un vector
v:

Av = λv

El conjunto de vectores que no cambian de dirección al multiplicarse por una matriz se denomina
vectores propios. El cambio de magnitud correspondiente se denomina valor propio. Se representa
aquí con λ .

Recuerde que dijimos que el objetivo último del análisis de componentes principales es reducir el
número de variables. Bueno, los vectores propios y los valores propios ayudan en este sentido.
Una cosa que hay que tener en cuenta es que los vectores propios son para una matriz cuadrada,
es decir, una matriz con un número igual de filas y columnas. Pero también se pueden calcular
para matrices rectangulares.

Digamos que tenemos una matriz A, que consta de los siguientes elementos:

Matriz A

2 8
6 10

Ahora, tenemos que encontrar los vectores propios y los valores propios de tal manera que:

194
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

Av = λv

Dónde,

• v es una matriz que consta de vectores propios.

• λ es el valor propio.

Si bien puede parecer desalentador, existe un método simple para encontrar los vectores propios y
los valores propios.

Modifiquemos la ecuación a la siguiente:

Av = λIv (Sabemos que AI = A)

Si llevamos los valores del lado derecho al lado izquierdo, entonces,

Av − λIv = 0

Ahora, supongamos que la matriz de vectores propios no es cero. Por lo tanto, podemos hallar λ
hallando el determinante.

Por lo tanto, |A − λI| = 0

(2 − λ)(10 − λ) − (8 6) = 0

2 20 − 2λ − 10λ + λ − 48 = 0

−28 − 12λ + λ 2=0

2 λ − 12λ − 28 = 0

(λ − 14)(λ + 2) = 0

λ = 14, −2

Por lo tanto, podemos decir que los valores propios son 14, ­2.

Tomando el valor λ como ­2, hallaremos ahora la matriz de vectores propios.

Recordemos que, Av = λv.

268
A=
10

incógnita

v=
y

Por lo tanto,

195
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

(2x + 6y) = ­2x

(8x + 10y) = ­2y

(4x + 6y) = 0

(8x + 12y) = 0

Como son similares, al resolverlos obtenemos:

2x + 3y = 0, x = (­3/2)y

x = ­3, y = 2

Por lo tanto, la matriz de vectores propios es:

­3
2

De manera similar, para λ = 14, los vectores propios son x = 1, y = 2.

¡Eso es genial! Hemos entendido cómo se forman los vectores y valores propios.

Ahora que sabemos cómo encontrar los valores propios y los vectores propios, hablemos
de sus propiedades.

En nuestro ejemplo anterior, teníamos una matriz de 2 x 2. Esta puede considerarse


bidimensional. Una de las ventajas de los vectores y valores propios es que se utilizan
para “transformaciones ortogonales”, que es una palabra elegante para decir que las
variables se desplazan en otro eje sin cambiar la dirección. Veamos un ejemplo visual
de esto.

Digamos que tenemos un gráfico con ciertos puntos mapeados en los ejes x e y.
Ahora puedes localizarlos dando las coordenadas (x, y) de un punto, pero nos damos
cuenta de que puede haber otra forma eficiente de mostrarlos de manera significativa.

¿Qué sucedería si trazáramos una línea de tal manera que pudiéramos ubicarlos usando
solo la distancia entre un punto en esta nueva línea y los puntos? Probemos eso ahora.

196
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

Digamos que las líneas verdes representan la distancia desde cada punto hasta la nueva
línea. Además, la distancia desde el primer punto de la línea proyectada, es decir, A, hasta
la proyección del último punto en la nueva línea, es decir, B, se denomina aquí dispersión. En
la figura anterior, se denota como la línea roja. La importancia de la dispersión es que nos
brinda información sobre cuán variado es el conjunto de datos. Cuanto mayor sea el valor,
más fácil será para nosotros diferenciar entre dos puntos de datos individuales.

Debemos tener en cuenta que si tuviéramos variables en dos dimensiones, obtendríamos dos
conjuntos de valores propios y vectores propios. La otra línea sería perpendicular a la primera.

Ahora tenemos un nuevo eje de coordenadas que se adapta mucho más a los puntos,
¿verdad?

Como estamos acostumbrados a ver los ejes de una manera particular, los rotaremos y los
mantendremos como se muestra en el siguiente diagrama.

Si tuviéramos que explicar los vectores propios y los valores propios mediante un diagrama,

197
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

Se puede decir que los vectores propios nos dan la dirección en la que se estira o transforma
y los valores propios son el valor en el que se estira. En ese sentido, los puntos proyectados
sobre la línea horizontal nos dan más información en cuanto a la extensión que los puntos
proyectados sobre la línea vertical.

Pero ¿por qué es importante entender esto?

Cuando dijimos que los valores propios nos dan el valor por el cual se estiran los puntos,
deberíamos agregar además que los valores propios con el número mayor correspondiente
nos dan más información que aquel con el valor propio de menor valor.

¡Ah, espera! Este capítulo habla sobre el análisis de componentes principales. Bueno, los
valores propios y los vectores propios son en realidad los componentes de los datos.

Pero todavía falta una pieza del rompecabezas. Como hemos visto en la ilustración, los
puntos de datos estaban agrupados y, por lo tanto, la distancia entre ellos no era tan
significativa.

Pero ¿qué sucedería si intentáramos comparar los precios de las acciones, una cuyo valor
fuera inferior a 10 dólares y otra cuyo valor fuera superior a 500 dólares? Obviamente, la
variación en el precio en sí llevaría a un resultado diferente. Por lo tanto, tratamos de encontrar
una forma de estandarizar los datos. Y como estamos tratando de encontrar la diferencia,
podemos utilizar la matriz de covarianza.

Antes de pasar a la covarianza, veamos qué es la varianza.

19.1.1 ¿Qué es la varianza?

La varianza nos dice qué tan lejos están los valores del valor medio o promedio.

La fórmula para la varianza se da como:

198
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

norte 2
2 i (xi − x¯)
Varianza(σ ∑)=
norte

Por ejemplo, hay tres puntos, 155, 146, 152.

El promedio de estos tres puntos es 151. Usando la fórmula, la varianza es:

2 2 2
2 (155 − 151) ) + (146 − 151) + (152 − 151)
Varianza(σ = = 14
3

¿Por qué elevamos la diferencia al cuadrado?

La primera razón es que si simplemente hubiéramos tomado la diferencia, el numerador sería 0.


Además, elevar al cuadrado la diferencia nos ayuda a dar más peso a los puntos que están más
alejados de la media. Así, el punto 146 está a 5 puntos de 151 y eso nos lleva al valor 25.

Considerando que 152 está a sólo un punto de distancia y, por lo tanto, su cuadrado es sólo 1.

Otra razón es que elevar al cuadrado nos ayuda a dar la misma ponderación a los puntos que
están por encima o por debajo de la media. Un punto de datos que está a 2 unidades de la
media debería tener la misma ponderación independientemente de si está por encima o por
debajo del precio medio. Elevar al cuadrado la diferencia nos ayuda a lograrlo.

19.1.2 Covarianza

La covarianza se calcula utilizando la siguiente fórmula:

∑i (xi − Xmedia)(yi − Ymedia)


Cov(X,Y) =
norte

Cov (X, Y) = Covarianza entre X e Y

Xi = Varias observaciones de X

Xmedia = Valor promedio de X

Yi = Varias observaciones de Y

Ymean = Valor medio de Y

N = Número de observaciones

En la matriz de covarianza resultante, los elementos diagonales representan la varianza de


las acciones.

Además, la matriz de covarianza es simétrica a lo largo de la diagonal, lo que significa:

199
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

σ21 = σ12

De esta manera podemos encontrar tanto la varianza como la covarianza de un conjunto de


datos.

Supongamos que tuviéramos dos características, RSI y ADX. La matriz de covarianza se


representaría de la siguiente manera:

Indicadores RSI y ADX

Índice de fuerza relativa 120­142

Adx 142 190

Muy bien. Sabemos que el análisis de componentes principales actúa como una herramienta
de compresión y busca reducir las dimensiones de los datos para facilitar el cálculo. También
vimos cómo los vectores propios y los valores propios simplifican la matriz original. Además,
sabemos que la covarianza simplifica en gran medida todo el aspecto de encontrar valores
propios y vectores propios.

Ahora bien, recuerda que al principio hablamos de cómo el análisis de componentes principales
busca reducir las dimensiones convirtiendo dos variables en una, creando una nueva
característica. ¿Ves una imagen formándose en tu cabeza sobre cómo podemos usarlo en el
trading?

Supongamos que encontramos los valores propios y los vectores propios de la matriz de
covarianza; diremos que el valor propio más grande tiene la mayor información sobre la matriz
de covarianza. Por lo tanto, podemos conservar la mayoría de los valores propios y sus
vectores propios correspondientes y aún así poder contener la mayor parte de la información
que estaba presente en la matriz de covarianza.

Si hubiéramos seleccionado 4 Autovalores y sus correspondientes Autovectores, diremos que


hemos elegido 4 Componentes Principales.

Eso es todo. Si tomamos el ejemplo anterior, si hubiéramos elegido el valor propio 14,
perderíamos algo de información, pero simplificaría mucho el cálculo y, en ese sentido,
habríamos reducido la dimensión de las variables.

¡Uf! Hemos entendido cómo funciona el análisis de componentes principales. Si tenemos que
añadir otra nota aquí e intentar reforzar el uso de vectores propios en el análisis de
componentes principales, podemos ver que la suma de los valores propios de la matriz de
covarianza es aproximadamente igual a la suma de la varianza total en nuestra matriz original.

Pero todavía queda una pregunta en mente.

200
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

¿Cuándo utilizar el análisis de componentes principales? Supongamos que está trabajando


con un gran conjunto de datos que requiere un gran esfuerzo computacional, en cuyo caso
puede utilizar el análisis de componentes principales. De hecho, podría ayudarnos mucho en
la estrategia para operar con pares. Probemos eso, ¿le parece?

19.2 Análisis de componentes principales en el trading

Afortunadamente para nosotros, no tenemos que codificar toda la lógica del análisis de
componentes principales en Python. Simplemente importaremos la biblioteca sklearn y
usaremos la función PCA ya definida.

Como buscamos una implementación global, utilizaremos las acciones que cotizan en la Bolsa
de Nueva York.

Dado que trabajaremos con los datos de muchas empresas, hemos creado un archivo csv que
contiene los tickers de 20 empresas que cotizan en la Bolsa de Nueva York. Por el momento,
importaremos su precio de cierre ajustado. El código es el siguiente:

[22]: # Manipulación de datos import


numpy como np import
pandas como pd

# Trazando los gráficos import


[Link] como plt

# Importación de las bibliotecas de aprendizaje automático


desde [Link] import PCA import
[Link] as sc

# Los datos se almacenan en el directorio 'data_modules' path = "../


data_modules/"

# Importar el conjunto de
datos df = pd.read_csv(path + "[Link]", index_col=0) [Link]

[22]: (502, 20)

[23]: # Acciones
columnas df

201
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

[23]: Índice(['GOOG', 'GOOGL', 'AMZN', 'MA', 'BA', 'C', 'ABT',


→'CRM', 'COSTO', 'ACN',
'AVGO', 'MMM', 'CVS', 'FIS', 'SYK', 'MDLZ', 'CI', →'CME', 'ISRG', 'COP'],
dtype='object')

Contamos con 502 días de datos para 20 acciones. Calcularemos los rendimientos diarios.

[24]: datos_devoluciones_diarias = df.pct_change().dropna()


datos_devoluciones_diarias.shape

[24]: (501, 20)

La agrupación en clústeres con más de 500 dimensiones de datos da como resultado un resultado
deficiente. Utilizaremos una técnica de reducción de dimensiones (PCA) para reducir las dimensiones
de más de 500 a solo 12. Es decir, los retornos de 500 días estarán representados por solo 12
números. El número 12 se eligió solo con fines ilustrativos.

[43]: # Establezca la cantidad de dimensiones requeridas


N_PRIN_COMPONENTS = 12
pca = PCA(n_components=N_PRIN_COMPONENTS)
[Link](data_daily_returns)

[43]: PCA(copia=Verdadero, potencia_iterada='auto', n_componentes=12,


→random_state=Ninguno,
svd_solver='auto', tol=0.0, whiten=Falso)

Puede comprobar el número de filas y columnas de la matriz con el comando “forma”.

[44]: pca.componentes_.forma

[44]: (12, 20)

Como puede ver, hemos reducido los datos de 501 dimensiones a solo 12 dimensiones. Podemos
agrupar estas 20 acciones utilizando estas 12 dimensiones.

[47]: # Trazar un dendrograma


[Link](figsize=(14, 5))
[Link]("Dendrogramas")

# Crear un dendrograma
[Link]([Link](pca.components_.T,
→method='ward'),labels=[Link])

202
Machine Translated by Google

CAPÍTULO 19. ANÁLISIS DE COMPONENTES PRINCIPALES

[Link]('Dendrograma')
[Link]('Acciones')
[Link]('Distancia euclidiana ') [Link]()

Se puede ver que el algoritmo agrupó a GOOG y GOOGL, como era de esperar. Además,
podemos ver que Abbott Labs (ABT) y Stryker Corp (SYK), las dos empresas médicas, están
más cerca una de la otra y forman parte del mismo grupo.

Una vez que se forman estos grupos, se puede crear una cartera de activos diferentes.
Puede leer sobre la paridad de riesgo jerárquica para saber cómo hacerlo.

¡Genial! No solo hemos visto dos algoritmos no supervisados, sino que también hemos visto
cómo superar la maldición de la dimensionalidad. En los próximos capítulos, nos relajaremos
un poco e intentaremos comprender los conceptos de procesamiento del lenguaje natural y
aprendizaje por refuerzo.

203
Machine Translated by Google

20

Procesamiento del lenguaje natural

El procesamiento del lenguaje natural o PNL tiene una amplia variedad de aplicaciones.
Veámoslos ahora.

1. Traducción automática: A medida que aumenta la cantidad de información disponible en


línea, la necesidad de acceder a ella se vuelve cada vez más importante. La traducción
automática nos ayuda a superar las barreras lingüísticas al traducir manuales técnicos,
contenido de soporte o catálogos a un costo significativamente reducido.

2. Resumen automático: el segundo subconjunto de la PNL es el resumen automático. La


sobrecarga de información es un problema cuando necesitamos acceder a una pieza
específica de información de una enorme base de conocimiento.
El resumen automático es relevante no sólo para resumir el significado de los
documentos y la información, sino también para comprender los significados emocionales
dentro de la información.
3. Análisis de sentimientos: el objetivo del análisis de sentimientos es identificar
sentimientos entre varias publicaciones o incluso en la misma publicación donde la
emoción no se expresa explícitamente.
4. Clasificación de texto: Permite asignar categorías predefinidas a un documento y
organizarlo para ayudarte a encontrar la información que necesitas o simplificar algunas
actividades.
5. Respuesta a preguntas: una aplicación de respuesta a preguntas es capaz de responder
de forma coherente a una solicitud humana. A medida que la tecnología de comprensión
del habla y las aplicaciones de entrada de voz mejoren, aumentará la necesidad de
PNL. El control de calidad se está volviendo popular gracias a aplicaciones como Siri,
OK Google, Alexa, cuadros de chat y asistentes virtuales. Puede usarse como una
interfaz de solo texto o como un sistema de diálogo hablado.

¿Cómo se puede utilizar la PNL en el trading? La PNL en el trading se utiliza principalmente


para medir el sentimiento del mercado a través de feeds de Twitter, artículos de periódicos y RSS.
Machine Translated by Google

CAPÍTULO 20. PROCESAMIENTO DEL LENGUAJE NATURAL

Feeds y comunicados de prensa. En este capítulo, cubriremos la estructura básica necesaria para resolver
el problema de PNL desde la perspectiva de un trader.

Noticias y PNL Cualquiera que haya negociado algún tipo de instrumento financiero sabe que los
mercados tienen en cuenta constantemente todas las noticias que llegan a través de diversas fuentes.

La relación de causa y efecto entre las noticias impactantes y los movimientos del mercado se puede
observar directamente cuando uno intenta operar en el mercado durante la publicación de noticias
importantes, como los datos de nóminas no agrícolas.

Antes de que las redes sociales se convirtieran en una de las principales fuentes de información, los
comerciantes solían depender de los anuncios de radio o televisión para obtener la información más reciente.
ción.

Pero desde que Twitter se convirtió en una fuente de noticias que mueven el mercado (gracias a los
líderes políticos), a los operadores les resulta difícil rastrear manualmente toda la información que se
origina en diferentes cuentas de Twitter. Para evitar este problema, los operadores pueden usar paquetes
de procesamiento del lenguaje natural (PLN) para leer múltiples fuentes de noticias en un corto período
de tiempo y tomar una decisión rápida.

20.1 PNL en el trading


A continuación se muestran los pasos que se deben seguir para utilizar PNL para el trading:

• Obtener los datos

• Preprocesar los datos •


Convertir el texto en una puntuación de sentimiento •

Generar un modelo comercial • Realizar


una prueba retrospectiva del modelo

Obtener los datos Para crear un modelo de PNL para el trading, es necesario contar con una fuente de
datos confiable. Existen múltiples proveedores para este propósito.

¿Cómo conseguir titulares de noticias sobre una empresa específica?

En el texto del titular de la noticia, puedes buscar el símbolo o el nombre de la empresa para obtener el
titular de la noticia relacionado con ella. Por ejemplo, para obtener el titular de la noticia específico de
Apple Inc, puedes buscar AAPL o Apple. También puedes considerar incluir titulares de noticias que
mencionen productos de Apple, como el iPhone o Mac. Sin embargo, es posible que te pierdas noticias
que hagan referencia indirecta a Apple. Por ejemplo, "La mayor caída de precio observada en el teléfono
inteligente más vendido en los EE. UU."

205
Machine Translated by Google

CAPÍTULO 20. PROCESAMIENTO DEL LENGUAJE NATURAL

¿Cómo obtener los últimos datos de titulares de noticias y la puntuación de sentimiento sobre ellos?
Puede obtener los datos de titulares de noticias más recientes en [Link]. Proporciona una API
de Python para extraer los titulares de las noticias.

Dividamos los datos en dos tipos y tratemos de abordar cada uno de ellos de forma diferente.

Los datos estructurados son aquellos que se publican en un formato predeterminado o consistente.
El lenguaje también es muy consistente.

Por ejemplo, un comunicado de prensa sobre las actas de la Reserva Federal o los resultados de una
empresa pueden considerarse datos estructurados. En este caso, la longitud del texto suele ser muy
grande.

Por el contrario, los datos no estructurados son aquellos en los que ni el lenguaje ni el formato son
uniformes. Por ejemplo, los feeds de Twitter, los blogs y los artículos pueden considerarse parte de
ellos. Estos textos suelen tener un tamaño limitado.

Preprocesamiento de datos Los datos no estructurados, como los feeds de Twitter, están compuestos
por muchos datos no textuales, como hashtags y menciones. Estos deben eliminarse antes de medir
el sentimiento del texto.

En el caso de los datos estructurados, el tamaño del texto puede fácilmente empañar su esencia.
Para solucionarlo, es necesario dividir el texto en oraciones individuales o aplicar

206
Machine Translated by Google

CAPÍTULO 20. PROCESAMIENTO DEL LENGUAJE NATURAL

técnicas como la frecuencia de términos­frecuencia de documentos inversa (tf­idf) para estimar


la importancia de las palabras.

Convertir el texto en una puntuación numérica Convertir los datos de texto en una puntuación
numérica es una tarea complicada. Para textos no estructurados, puede utilizar paquetes
preexistentes como VADER para estimar el sentimiento de las noticias. Si el texto es un blog o
un artículo, puede intentar descomponerlo para que VADER le dé sentido.

En el caso de textos estructurados, no hay bibliotecas preexistentes que puedan ayudarte a


convertir el texto en una puntuación positiva o negativa, por lo que tendrás que crear una
biblioteca propia.

Al construir una biblioteca de datos estructurados relevantes, se debe tener cuidado de considerar
textos de fuentes similares y las correspondientes reacciones del mercado a estos datos textuales.

Por ejemplo, si la Reserva Federal publica una declaración que dice que “las expectativas de
inflación están firmemente ancladas” y la cambia a “las expectativas de inflación son estables”,
entonces bibliotecas como VADER no podrán notar la diferencia, pero el mercado reaccionará
de manera significativa.

Para comprender la puntuación del sentimiento de dicho texto es necesario desarrollar un


modelo de palabra a vector o un modelo de árbol de decisión utilizando la matriz tf­idf.

Generar un modelo comercial Una vez que tenga los puntajes de sentimiento del texto, puede
combinarlos con algún tipo de indicadores técnicos para filtrar el ruido y generar las señales de
compra y venta.

¿Qué papel juega el aprendizaje automático en este paso?

La parte esencial del procesamiento del lenguaje natural es convertir texto o información en un
número objetivo que pueda utilizarse para crear señales comerciales.

207
Machine Translated by Google

CAPÍTULO 20. PROCESAMIENTO DEL LENGUAJE NATURAL

Una vez que tenga las puntuaciones de sentimiento, puede utilizar un modelo ML para generar señales
comerciales.

Realizar pruebas retrospectivas del modelo Una vez que el modelo esté listo, debe realizar pruebas
retrospectivas con los datos anteriores para verificar si el rendimiento del modelo se encuentra dentro
de los límites de riesgo. Durante las pruebas retrospectivas, asegúrese de no utilizar los mismos datos
que se utilizan para entrenar el modelo de árbol de decisiones.

Si el modelo confirma su criterio de gestión de riesgos, entonces puede implementarlo en operaciones


en vivo.

El aprendizaje automático tiene diversas aplicaciones en el comercio y se puede utilizar según sus
necesidades. En el próximo capítulo, veamos algo que el mundo llama el futuro del aprendizaje
automático, es decir, el aprendizaje por refuerzo.

208
Machine Translated by Google

21
Aprendizaje por refuerzo

Al principio, utilizábamos el aprendizaje automático y la IA para simular cómo piensan los


humanos, ¡solo que mil veces más rápido! El cerebro humano es complejo, pero tiene una
capacidad limitada. Esta simulación fue la fuerza impulsora inicial de la investigación en IA.
Pero hoy hemos llegado a un punto en el que los humanos se sorprenden de cómo “piensa” la
IA.

Una cita lo resume perfectamente: “AlphaZero, un algoritmo de aprendizaje de refuerzo


desarrollado por DeepMind AI de Google, nos enseñó que estábamos jugando mal al
ajedrez”.

Aunque la mayoría de los jugadores de ajedrez saben que el objetivo final del ajedrez
es ganar, aun así intentan mantener la mayoría de las piezas en el tablero. Pero
AlphaZero entendió que no necesitaba todas sus piezas mientras pudiera tomar al rey
del oponente. Por lo tanto, sus movimientos se perciben como bastante arriesgados,
pero en última instancia, darían buenos resultados.

AlphaZero comprendió que para cumplir el objetivo a largo plazo del jaque mate, tendría
que sufrir pérdidas en el juego. A esto lo llamamos gratificación retrasada.
Lo que es impresionante es que antes de AlphaZero, a pocas personas se les ocurría
jugar de esta manera. Desde entonces, diversos expertos de diversas disciplinas han
estado trabajando en formas de adaptar el aprendizaje por refuerzo en sus investigaciones.
Este emocionante logro de AlphaZero despertó nuestro interés en explorar el uso del
aprendizaje de refuerzo para el trading.

El objetivo es describir las aplicaciones del aprendizaje de refuerzo en el comercio y


discutir el problema que el RL puede resolver, lo que podría ser imposible mediante un
enfoque de aprendizaje automático tradicional.

¿Qué es el aprendizaje por refuerzo? El aprendizaje por refuerzo puede sonar exótico
y avanzado, pero el concepto subyacente de esta técnica es bastante
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

¡Es muy sencillo! ¡De hecho, todo el mundo lo sabe desde la infancia!

Cuando éramos niños, siempre nos daban una recompensa por destacar en los deportes o en los estudios.
También te regañaban o regañaban por hacer algo malo, como romper un jarrón. Esta era una forma de
cambiar tu comportamiento. Supón que te regalaran una bicicleta o una PlayStation por ser el primero,
practicarías mucho para ser el primero. Y como sabías que romper un jarrón significaba problemas,
tendrías cuidado con él. Esto se llama aprendizaje por refuerzo. La recompensa servía como refuerzo
positivo, mientras que el castigo servía como refuerzo negativo. De esta manera, tus mayores moldeaban
tu aprendizaje.

De manera similar, el algoritmo RL puede aprender a operar en los mercados financieros por sí solo
observando las recompensas o los castigos recibidos por las acciones.

Como humanos, nuestros agentes aprenden por sí mismos a lograr estrategias exitosas
que conducen a las mayores recompensas a largo plazo.
Este paradigma de aprendizaje por ensayo y error, únicamente a partir de recompensas
o castigos, se conoce como aprendizaje de refuerzo (LR).

­Buscar en Google Deepmind

¿Cómo aplicar el aprendizaje por refuerzo en el trading? En el ámbito del trading, el problema se puede
plantear de múltiples formas, como maximizar las ganancias, reducir las pérdidas o asignar la cartera. El
algoritmo de aprendizaje por refuerzo aprenderá la estrategia para maximizar las recompensas a largo
plazo.

Por ejemplo, el precio de las acciones de Amazon se mantuvo prácticamente estable desde finales de 2018
hasta principios de 2020. La mayoría de nosotros pensaría que una estrategia de reversión a la media
funcionaría mejor en este caso.

210
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

Pero si nos fijamos en los inicios de 2020, el precio subió y empezó a marcar tendencia.
Por lo tanto, desde principios de 2020, la implementación de una estrategia de reversión a la
media habría resultado en pérdidas. Si se observan las condiciones del mercado de reversión a la
media del año anterior, la mayoría de los operadores habrían salido del mercado cuando comenzó
a marcar una tendencia.

Pero si hubieras apostado a largo plazo y hubieras mantenido la acción, te habría beneficiado a
largo plazo. En este caso, habrías renunciado a tu recompensa actual a cambio de futuras
ganancias a largo plazo. Este comportamiento es similar al concepto de gratificación diferida del
que hablamos al principio del artículo.

El modelo RL puede captar patrones de precios de los años 2017 y 2018 y, teniendo en mente un
panorama más amplio, el modelo puede seguir manteniendo una acción para obtener ganancias
descomunales en el futuro. ¿En qué se diferencia el aprendizaje por refuerzo de los algoritmos de
aprendizaje automático tradicionales?

Como puede ver en el ejemplo anterior, no es necesario proporcionar etiquetas en cada paso de
tiempo al algoritmo RL. El algoritmo RL aprende inicialmente a operar mediante prueba y error, y
recibe una recompensa cuando se cierra la operación. Y luego optimiza la estrategia para
maximizar las recompensas. Esto es diferente de los algoritmos ML tradicionales que requieren
etiquetas en cada paso de tiempo o con una frecuencia determinada.

Por ejemplo, la etiqueta de destino puede ser el cambio porcentual después de cada hora. Los
algoritmos de ML tradicionales intentan clasificar los datos. Por lo tanto, el problema de la
gratificación retrasada sería difícil de resolver mediante algoritmos de ML convencionales.

Componentes del aprendizaje por refuerzo

Con el panorama más amplio en mente de lo que el algoritmo RL intenta resolver, aprendamos
los componentes básicos del modelo de aprendizaje de refuerzo.

211
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

Acciones Las acciones pueden pensarse en qué problema está resolviendo el algoritmo RL. Si el
algoritmo RL está resolviendo el problema del trading, entonces las acciones serían
Comprar, vender y mantener. Si el problema es la gestión de cartera, las acciones serían asignaciones
de capital a cada una de las clases de activos. ¿Cómo funciona el
¿El modelo RL decide qué acción tomar?

Política Hay dos métodos o políticas que ayudan al modelo RL a tomar


las acciones. Inicialmente, cuando el agente de la vida real no sabe nada sobre el juego,
El agente RL puede decidir acciones aleatoriamente y aprender de ello. Esto se llama
una política de exploración. Más tarde, el agente RL puede usar experiencias pasadas para mapear
Estado que maximiza las recompensas a largo plazo. Esto se llama política de explotación.

Estado El modelo RL necesita información significativa para tomar acciones.


La información significativa es el estado. Por ejemplo, tienes que decidir
Si comprar acciones de Apple o no. Para eso, ¿qué información sería necesaria?
¿Te resulta útil? Bueno, puedes decir que necesito algunos indicadores técnicos, datos históricos de
precios, datos de sentimientos y datos fundamentales. Toda esta información
El conjunto de datos reunidos se convierte en el estado. Depende del diseñador decidir qué datos
Debería constituir el Estado.

Pero para un análisis y una ejecución adecuados, los datos deben ser débilmente predictivos y
débilmente estacionarios. Es bastante fácil entender que los datos deben ser débilmente predictivos,
pero ¿qué quiere decir con débilmente estacionarios?
Débilmente estacionario significa que los datos deben tener una media constante y
varianza. Pero, ¿por qué es importante? La respuesta corta es que la máquina
Los algoritmos de aprendizaje funcionan bien con datos estacionarios. ¡Muy bien! ¿Cómo funciona el
¿El modelo RL aprende a mapear el estado a la acción a tomar?

Recompensas Una recompensa puede considerarse como el objetivo final que desea alcanzar.
que se desea alcanzar con el sistema de vida real. Por ejemplo, el objetivo final sería

212
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

para crear un sistema de trading rentable. Entonces, su recompensa se convierte en ganancias. O


pueden ser los mejores retornos ajustados al riesgo, entonces su recompensa se convierte en un índice
de Sharpe.

Definir una función de recompensa es fundamental para el rendimiento de un modelo RL.


Las siguientes métricas se pueden utilizar para definir la recompensa.

• Beneficio por tick •


Ratio de Sharpe •
Beneficio por operación

Entorno El entorno es el mundo que permite al agente RL observar el estado. Cuando el


agente RL aplica la acción, el entorno actúa sobre esa acción, calcula las recompensas y pasa
al siguiente estado. Por ejemplo, el entorno puede considerarse como un juego de ajedrez o
una operación bursátil de acciones de Apple.

Agente RL El agente es el modelo RL que toma las características/estados de entrada y


decide la acción a tomar. Por ejemplo, el agente RL toma el RSI y los retornos de los últimos
10 minutos como entrada y nos dice si debemos comprar acciones de Apple o cerrar la
posición larga si ya estamos en una posición larga.

Pongamos todo junto y veamos cómo funciona.

Paso 1

• Estado y acción: supongamos que el precio de cierre de Apple fue $92 el 24 de julio de
2020. Según el estado (RSI y retornos de 10 días), el agente dio una señal de compra.

• Entorno: Para simplificar, decimos que la orden se realizó al inicio del siguiente día de
negociación, que es el 27 de julio. La orden se ejecutó a $92. Por lo tanto, el entorno
nos indica que tiene una posición larga en una acción de Apple a $92.

• Recompensa: Y no se da ninguna recompensa ya que todavía estamos en el negocio.

Paso 2

• Estado y acción: obtiene el siguiente estado del sistema creado con los últimos datos de
precios disponibles. Al cierre del 27 de julio, el precio había alcanzado los 94 dólares.
El agente analizaría el estado y daría la siguiente acción, por ejemplo, vender al entorno.

213
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

• Entorno: Se colocará una orden de venta que cuadrará el


Posición larga.

• Recompensa: Se otorga una recompensa del 2,1% al agente.

Fecha Precio de cierre Acción Recompensa

24 de julio $92 Comprar Na


27 de julio $94 Vender 2.1

¡Genial! Hemos entendido cómo se combinan los diferentes componentes del modelo RL. Ahora,
intentemos entender la intuición de cómo el agente RL realiza la acción.

Tabla Q y aprendizaje Q

La tabla Q y el aprendizaje Q pueden parecer sofisticados, pero es un concepto muy simple.

En cada paso de tiempo, el agente de RL debe decidir qué acción tomar. ¿Qué sucedería si el
agente de RL tuviera una tabla que le indicara qué acción le dará la máxima recompensa? Luego,
simplemente seleccione esa acción. Esta tabla es la tabla Q.

En la tabla Q, las filas son los estados (en este caso, los días) y las acciones son las columnas
(en este caso, mantener y vender). Los valores de esta tabla se denominan valores Q.

Fecha Vender Mantener

23­07­2020 0,954 0,966


24­07­2020 0,954 0,985
27­07­2020 0,954 1,005
28­07­2020 0,954 1,026
29­07­2020 0,954 1,047
30­07­2020 0,954 1,068
31­07­2020 0,954 1,090

De la tabla Q anterior, el 23 de julio, ¿qué acción tomaría el agente de RL? Sí, así es. Se tomaría
una acción de "mantener", ya que tiene un valor Q de 0,966, que es mayor que el valor Q de
0,954 para la acción de venta.

Pero, ¿cómo crear la tabla Q? Vamos a crear una tabla Q con la ayuda de un ejemplo. Para
simplificar, tomemos el mismo ejemplo de datos de precios del 22 al 31 de julio de 2020. Hemos
agregado los rendimientos porcentuales y

214
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

rendimientos acumulados como se muestra a continuación:

Fecha Precio de cierre Porcentaje de retorno Retornos acumulados


22­07­2020 97.2
23­07­2020 92.8 ­4,53% 0,95
24­07­2020 92.6 ­0,22% 0,95
27­07­2020 94.8 2,38% 0,98
28­07­2020 93.3 ­1,58% 0,96
29­07­2020 95 1,82% 0,98
30­07­2020 96,2 1,26% 0,99
31­07­2020 106,3 10,50% 1.09

Compraste una acción de Apple hace unos días y no tienes más.


capital restante. Las únicas dos opciones para usted son “mantener” o “vender”. Como primer paso,
Necesitas crear una tabla de recompensas simple.

Si decidimos mantenerlo, no recibiremos ninguna recompensa hasta el 31 de julio y al final,


obtenemos una recompensa de 1,09. Y si decidimos vender cualquier día, entonces la recompensa
serán los rendimientos acumulados hasta ese día. La tabla de recompensas (tabla R) se ve
como se muestra a continuación. Si dejamos que el modelo RL elija de la tabla de recompensas, el RL
El modelo venderá las acciones y obtendrá una recompensa de 0,95.

Estado/Acción Vender Mantener

22­07­2020 0 0
23­07­2020 0,95 0
24­07­2020 0,95 0
27­07­2020 0,98 0
28­07­2020 0,96 0
29­07­2020 0,98 0
30­07­2020 0,99 0
31­07­2020 1.09 1.09

Pero se espera que el precio aumente a $106 el 31 de julio, lo que resultará en una ganancia.
del 9%. Por lo tanto, conviene conservar las acciones hasta entonces. Tenemos que
representar esta información de tal manera que el agente RL pueda retenerla en lugar de
que vender. ¿Cómo hacerlo? Para ayudarnos con esto, necesitamos crear una Q
tabla. Puedes comenzar copiando la tabla de recompensas en la tabla Q y luego
Calcular la recompensa implícita utilizando la ecuación de Bellman para cada día.
Mantener la acción.

215
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

La ecuación de Bellman

Q(st , yo
soy ) = R(st , yo
soy )+γ Máx[Q(st+1, at+1)]

En esta ecuación, s es el estado, a es un conjunto de acciones en el momento t y ai es una acción


específica del conjunto. R es la tabla de recompensas. Q es la tabla de acciones de estado, pero se
actualiza constantemente a medida que aprendemos más sobre nuestro sistema a través de la
experiencia. γ es la tasa de aprendizaje.

Primero comenzaremos con el valor q para la acción Hold del 30 de julio. La primera parte es la
recompensa por realizar esa acción. Como se ve en la tabla R, es 0. Supongamos que γ = 0,98. El valor
Q máximo para las acciones de venta y retención del día siguiente, es decir, el 31 de julio, es 1,09. Por
lo tanto, el valor q para la acción Hold del 30 de julio es 0 + 0,98 (1,09) = 1,06.

De esta manera rellenaremos los valores de las demás filas de la columna Hold para completar la tabla
Q.

Estado/Acción Vender Mantener

23­07­2020 0,95 0,966 0,95


24­07­2020 0,985 0,98
27­07­2020 1,005 0,96
28­07­2020 1,026 0,98
29­07­2020 1,047 0,99
30­07­2020 1,068 1,09 1,090
31­07­2020

El modelo RL ahora seleccionará la acción de retención para maximizar el valor Q.


Esta era la intuición detrás de la tabla Q. Este proceso de actualización de la tabla Q se llama
aprendizaje Q. Por supuesto, habíamos tomado un escenario con acciones y estados limitados. En
realidad, tenemos un gran espacio de estados y, por lo tanto, construir una tabla Q demandará mucho
tiempo y será una limitación de recursos.

Para superar este problema, se pueden utilizar redes neuronales profundas, también llamadas redes Q
profundas o DQN. Las redes Q profundas aprenden la tabla Q a partir de experiencias pasadas y,
cuando se les da un estado como entrada, pueden proporcionar el valor Q para cada una de las
acciones. Podemos seleccionar la acción a realizar con el valor Q máximo.

¿Cómo entrenar redes neuronales artificiales? Usaremos el concepto de repetición de experiencias.


Puedes almacenar las experiencias pasadas del agente en un búfer de repetición o memoria de
repetición. En lenguaje sencillo, esto almacenará el estado, la experiencia y la memoria.

216
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

acción tomada y recompensa recibida por ella. Y use esta combinación para entrenar la red
neuronal.

Problemas en el aprendizaje por refuerzo Hay dos cuestiones principales que se deben tener
en cuenta al crear el modelo de aprendizaje por refuerzo. Son las siguientes:

Caos tipo 2 Puede parecer un concepto de ciencia ficción, pero es muy real. Mientras estamos
entrenando el modelo RL, estamos trabajando de forma aislada. Aquí, el modelo RL no está
interactuando con el mercado. Pero una vez que se implementa, no sabemos cómo afectará
al mercado. El caos tipo 2 se produce esencialmente cuando el observador de una situación
tiene la capacidad de influir en la situación. Este efecto es difícil de cuantificar mientras se
entrena el propio modelo RL. Sin embargo, se puede suponer razonablemente que el modelo
RL sigue aprendiendo incluso cuando se implementa y, por lo tanto, podrá corregirse a sí
mismo en consecuencia.

Ruido en los datos financieros Hay situaciones en las que el modelo RL podría detectar ruido
aleatorio que suele estar presente en los datos financieros y considerarlo como una entrada
sobre la que se debe actuar. Esto podría generar señales comerciales inexactas. Si bien
existen formas de eliminar el ruido, debemos tener cuidado con el equilibrio entre eliminar el
ruido y perder datos importantes.

Si bien estos problemas definitivamente no son algo que se pueda ignorar, hay varias
soluciones disponibles para reducirlos y crear un mejor modelo RL en el trading.

Conclusión

Hemos tocado apenas la superficie del aprendizaje por refuerzo con la introducción de los
componentes que conforman el sistema de aprendizaje por refuerzo. A medida que profundice,
podrá comprender los parámetros correctos que se deben utilizar y crear un modelo con
mayor exactitud y precisión.

Esto nos lleva a la parte no tan importante de este libro, es decir, su conclusión.

Hemos recorrido un largo camino juntos ¿no es así?

Desde comprender las tareas básicas del aprendizaje automático hasta examinar cómo
funcionan los diferentes algoritmos de aprendizaje automático, los humanos tenemos esta
propensión a intentar crear algo que lo explique todo. Si analizamos la física, siempre veremos
a los científicos intentando encontrar una ecuación que lo explique todo.

De manera similar, se esperaba que existiera un único sistema de aprendizaje automático o


inteligencia artificial capaz de hacerlo todo. Es un sueño que merece la pena tener. Y el
aprendizaje por refuerzo podría ser la respuesta.

217
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

Pero en este momento, tenemos diferentes algoritmos de ML que se utilizan para diferentes
propósitos, cada uno con sus propias fortalezas y debilidades. Esperamos que
Disfruté de este viaje y adquirí algunos conocimientos con este libro. También esperamos
Te hizo sentir curiosidad por saber qué más hay en el mundo del ML y sus
Aplicación en el comercio.

Así que sigue aprendiendo y adquiriendo conocimientos.

Como nota de despedida, déjanos saber qué te pareció dejando un comentario en


contact@[Link]. Nos ayudaría a mejorar aún más el libro.

Lectura adicional

1. El algoritmo de paridad de riesgo jerárquico: una introducción ­


[Link]
algorithm/
2. Algoritmo de agrupamiento K­Means para selección de pares en Python ­
[Link]

3. Jerárquico grupo ­
Análisis [Capítulo] http://
[Link]/~michael/stanford/[Link]
4. Selección de cartera propia: un enfoque sólido para Sharpe
Maximización de ratios ­ [Link]
finance/actuarial­science/seminar­series/documents/[Link]

5. Procesamiento del lenguaje natural en el trading [Curso] ­


[Link]
trading
6. Aprendizaje de refuerzo profundo en el trading [Curso] ­
[Link]

218
Machine Translated by Google

Referencias

Al crear este libro electrónico, hemos recurrido a varios recursos para hacer...
Por supuesto, si quieres mudarte, asegúrate de que los conocimientos que te brindan sean profundos.
Más adelante en su viaje hacia el aprendizaje automático en el comercio, puede ir
a través de estos recursos mencionados a continuación.

¿Puede un algoritmo de IA ayudar a acabar con los préstamos injustos? Esta empresa dice que sí
[Link]

El auge de las máquinas: los fondos de inteligencia artificial superan a los fondos de cobertura
Punto de referencia: [Link]
funds­are­outperforming­the­hedge­fund­benchmark

El próximo gran proyecto de inteligencia artificial de Facebook consiste en entrenar a sus máquinas
con vídeos públicos de los usuarios: [Link]
training­ai­public­videos­digital­memories

IA vs ML: ¿Cuál es la diferencia entre inteligencia artificial y aprendizaje automático?


¿Aprendizaje automático? ­ [Link]
automatico­de­fuente­abierta­por­facebook­siempre/

en ­
Python para aprendizaje automático https:// Finanzas[Curso]
[Link]/course/python­machine­learning

Introducción a la ciencia de datos en Quantra[Curso]

Formule su problema: un problema de aprendizaje


como automático https://
­

[Link]/machine­learning/problem­framing/formulate

Cómo hacerlo Defina su problema de aprendizaje automático ­


[Link]

Su modelo ML con Etiquetas ­


Mejorar Mejor [Link]
para­el­aprendizaje­automatico­financiero­6eeac691e660
Machine Translated by Google

CAPÍTULO 21. APRENDIZAJE POR REFUERZO

Las 10 principales métricas de evaluación para modelos de clasificación ­


[Link]
modelos/

a
Cómo realizar pruebas retrospectivas a ­
Comercio Estrategia
[Link]

Codifique y automatice sus estrategias https:// en Python ­


[Link]/
­
¿Cuáles son los conceptos básicos de la psicología del trading? https://
[Link]/markets/insights/what­are­the­basics­of­trading­psychology/

Explicación del descenso de gradiente: [Link]


explained­9b953fc0d2c

Chan, Ernest P. (2017): Comercio de máquinas: implementación de algoritmos informáticos


Para conquistar los mercados. Wiley Trading

Marcos López de Prado (2018): Avances en aprendizaje automático financiero.


Wiley
en ­
Trading con aprendizaje de refuerzo profundo [Curso] [Link]
course/deep­reinforcement­learning­trading

220
Machine Translated by Google

También podría gustarte