Capítulo 1. Por qué Python para las finanzas

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Los bancos son esencialmente empresas tecnológicas.

Hugo Banziger

El lenguaje de programación Python

Python es un lenguaje de programación polivalente de alto nivel que se utiliza en una amplia gama de dominios y campos técnicos. En el sitio web de Python encontrarás el siguiente resumen ejecutivo:

Python es un lenguaje de programación interpretado, orientado a objetos, de alto nivel y con semántica dinámica. Sus estructuras de datos incorporadas de alto nivel, combinadas con la tipificación dinámica y la vinculación dinámica, lo hacen muy atractivo para el Desarrollo Rápido de Aplicaciones, así como para su uso como lenguaje de scripting o pegamento para conectar componentes existentes entre sí. La sintaxis sencilla y fácil de aprender de Python enfatiza la legibilidad y, por tanto, reduce el coste de mantenimiento de los programas. Python admite módulos y paquetes, lo que fomenta la modularidad del programa y la reutilización del código. El intérprete de Python y la extensa biblioteca estándar están disponibles gratuitamente en forma de código fuente o binario para las principales plataformas, y pueden distribuirse libremente.

Esto describe bastante bien por qué Python se ha convertido en uno de los principales lenguajes de programación actuales. Hoy en día, Python es utilizado tanto por el programador principiante como por el desarrollador experto altamente cualificado, en escuelas, en universidades, en empresas web, en grandes corporaciones e instituciones financieras, así como en cualquier campo científico.

Entre otras características, Python es:

Código abierto

Python y la mayoría de las bibliotecas y herramientas de apoyo disponibles son de código abierto y, por lo general, vienen con licencias bastante flexibles y abiertas.

Interpretado

La implementación CPython de referencia es un intérprete del lenguaje que traduce el código Python en tiempo de ejecución a código byte ejecutable.

Multiparadigma

Python admite distintos paradigmas de programación e implementación, como la orientación a objetos y la programación imperativa, funcional o procedimental.

Multiusos

Python se puede utilizar tanto para el desarrollo rápido e interactivo de código como para crear grandes aplicaciones; se puede utilizar tanto para operaciones de sistemas de bajo nivel como para tareas analíticas de alto nivel.

Plataforma cruzada

Python está disponible para los sistemas operativos más importantes, como Windows, Linux y macOS. Se utiliza tanto para crear aplicaciones web como de escritorio, y se puede utilizar en los clústeres más grandes y en los servidores más potentes, así como en dispositivos tan pequeños como la Raspberry Pi.

Tipado dinámicamente

En general, los tipos en Python se deducen en tiempo de ejecución y no se declaran estáticamente como en la mayoría de los lenguajes compilados.

Consciente de la indentación

A diferencia de la mayoría de los demás lenguajes de programación, Python utiliza la indentación para marcar bloques de código en lugar de paréntesis, corchetes o punto y coma.

Recogida de basuras

Python ha automatizado la recogida de basura, evitando que el programador tenga que gestionar la memoria.

Cuando se trata de la sintaxis de Python y de lo que es Python, Python Enhancement Proposal 20 -es decir, el llamado "Zen de Python"- proporciona las directrices principales. Se puede acceder a él desde cualquier shell interactivo con el comando import this :

In [1]: import this
        The Zen of Python, by Tim Peters

        Beautiful is better than ugly.
        Explicit is better than implicit.
        Simple is better than complex.
        Complex is better than complicated.
        Flat is better than nested.
        Sparse is better than dense.
        Readability counts.
        Special cases aren't special enough to break the rules.
        Although practicality beats purity.
        Errors should never pass silently.
        Unless explicitly silenced.
        In the face of ambiguity, refuse the temptation to guess.
        There should be one-- and preferably only one --obvious way to do it.
        Although that way may not be obvious at first unless you're Dutch.
        Now is better than never.
        Although never is often better than *right* now.
        If the implementation is hard to explain, it's a bad idea.
        If the implementation is easy to explain, it may be a good idea.
        Namespaces are one honking great idea -- let's do more of those!

Breve historia de Python

Aunque Python pueda seguir teniendo el atractivo de algo nuevo para algunas personas, existe desde hace bastante tiempo. De hecho, los esfuerzos de desarrollo comenzaron en los años 80 por Guido van Rossum, de Holanda. Sigue activo en el desarrollo de Python y la comunidad Python le ha concedido el título de Dictador Benevolente Vitalicio. En julio de 2018, van Rossum abandonó este cargo tras décadas de ser un activo impulsor de los esfuerzos de desarrollo del núcleo de Python. Los siguientes pueden considerarse hitos en el desarrollo de Python:

  • Python 0.9.0 publicado en 1991 (primera versión)

  • Python 1.0 publicado en 1994

  • Python 2.0 publicado en 2000

  • Python 2.6 publicado en 2008

  • Python 3.0 publicado en 2008

  • Python 3.1 publicado en 2009

  • Python 2.7 publicado en 2010

  • Python 3.2 publicado en 2011

  • Python 3.3 publicado en 2012

  • Python 3.4 publicado en 2014

  • Python 3.5 publicado en 2015

  • Python 3.6 publicado en 2016

  • Python 3.7 publicado en junio de 2018

Resulta sorprendente, y a veces confuso para los recién llegados a Python, que haya dos versiones principales disponibles, aún en desarrollo y, lo que es más importante, en uso paralelo desde 2008. En el momento de escribir esto, probablemente seguirá así durante un tiempo, ya que toneladas de código disponible y en producción sigue siendo Python 2.6/2.7. Mientras que la primera edición de este libro se basaba en Python 2.7, esta segunda edición utiliza Python 3.7 en todo el libro.

El ecosistema Python

Una característica importante de Python como ecosistema , en comparación con ser sólo un lenguaje de programación, es la disponibilidad de un gran número de paquetes y herramientas. Estos paquetes y herramientas generalmente tienen que importarse cuando se necesitan (por ejemplo, una biblioteca de trazado) o tienen que iniciarse como un proceso independiente del sistema (por ejemplo, un entorno de desarrollo interactivo de Python). Importar significa poner un paquete a disposición del espacio de nombres actual y del proceso actual del intérprete de Python.

El propio Python ya viene con un gran conjunto de paquetes y módulos que mejoran el intérprete básico en diferentes direcciones, conocido como Biblioteca Estándar de Python. Por ejemplo, los cálculos matemáticos básicos pueden realizarse sin necesidad de importarlos, mientras que las funciones matemáticas más especializadas deben importarse a través del módulo math:

In [2]: 100 * 2.5 + 50
Out[2]: 300.0

In [3]: log(1)  1

        -----------------------------------------------------------------
        NameError                       Traceback (most recent call last)
        <ipython-input-3-74f22a2fd43b> in <module>
        ----> 1 log(1)  1

        NameError: name 'log' is not defined

In [4]: import math  2

In [5]: math.log(1)  2
Out[5]: 0.0
1

Sin más importaciones, se produce un error.

2

Tras importar el módulo math, se puede ejecutar el cálculo.

Aunque math es un módulo estándar de Python disponible con cualquier instalación de Python, hay muchos más paquetes que se pueden instalar opcionalmente y que se pueden utilizar del mismo modo que los módulos estándar. Dichos paquetes están disponibles en distintas fuentes (web). Sin embargo, en general es aconsejable utilizar un gestor de paquetes de Python que se asegure de que todas las bibliotecas son coherentes entre sí (para más información sobre este tema, consulta el Capítulo 2 ).

Los ejemplos de código de presentados hasta ahora utilizan entornos interactivos de Python: IPython y Jupyter, respectivamente. Estos son probablemente los entornos interactivos de Python más utilizados en el momento de escribir estas líneas. Aunque IPython empezó siendo sólo un intérprete de comandos interactivo de Python mejorado, hoy en día tiene muchas funciones que suelen encontrarse en los entornos de desarrollo integrados (IDE), como el soporte para la creación de perfiles y la depuración. Las funciones que faltan en IPython suelen ofrecerlas los editores avanzados de texto/código, como Vim, que también puede integrarse con IPython. Por lo tanto, no es raro combinar IPython con el editor de texto/código de tu elección para formar la cadena de herramientas básica de un proceso de desarrollo de Python.

IPython mejora el shell interactivo estándar de muchas maneras. Entre otras cosas, proporciona funciones mejoradas de historial de la línea de comandos y permite inspeccionar objetos fácilmente. Por ejemplo, el texto de ayuda (docstring) de una función se imprime con sólo añadir un ? antes o después del nombre de la función (si añades ?? obtendrás aún más información).

IPython existía originalmente en dos versiones populares: una versión shell y una versión basada en navegador (el Cuaderno). La variante del Cuaderno resultó tan útil y popular que evolucionó hasta convertirse en un proyecto independiente e independiente del lenguaje, ahora llamado Jupyter. Teniendo en cuenta estos antecedentes, no es de extrañar que Jupyter Notebook herede la mayoría de las características beneficiosas de IPython, y ofrezca mucho más, por ejemplo en lo que se refiere a la visualización.

Consulta VanderPlas (2016, Capítulo 1) para más detalles sobre el uso de IPython.

El espectro de usuarios de Python

Python no sólo es atractivo para los desarrolladores de software profesionales; también es útil para el desarrollador ocasional, así como para los expertos en la materia y los desarrolladores científicos.

Los desarrolladores profesionales de software encuentran en Python todo lo que pueden necesitar para construir eficientemente grandes aplicaciones. Se admiten casi todos los paradigmas de programación; hay potentes herramientas de desarrollo disponibles; y cualquier tarea puede, en principio, abordarse con Python. Este tipo de usuarios suelen construir sus propios marcos de trabajo y clases, también trabajan en la pila fundamental de Python y científica, y se esfuerzan por aprovechar al máximo el ecosistema.

Los desarrolladores científicos o expertos en el dominio suelen ser grandes usuarios de determinados paquetes y marcos de trabajo, han creado sus propias aplicaciones que mejoran y optimizan con el tiempo, y adaptan el ecosistema a sus necesidades específicas. Estos grupos de usuarios también suelen participar en sesiones interactivas más largas, prototipando rápidamente nuevo código, así como explorando y visualizando sus conjuntos de datos de investigación y/o de dominio.

Alos programadores ocasionales les gusta utilizar Python en general para problemas específicos en los que saben que Python tiene sus puntos fuertes. Por ejemplo, visitar la página de la galería de matplotlib, copiar un determinado fragmento de código de visualización proporcionado allí y ajustar el código a sus necesidades específicas podría ser un caso de uso beneficioso para los miembros de este grupo.

También hay otro grupo importante de usuarios de Python: los programadores principiantes, es decir, los que están empezando a programar. Hoy en día, Python se ha convertido en un lenguaje muy popular en universidades, institutos e incluso escuelas para introducir a los estudiantes en la programación.1 Una de las principales razones es que su sintaxis básica es fácil de aprender y de entender, incluso para los no programadores. Además, es útil que Python admita casi todos los estilos de programación.2

La pila científica

En existe un determinado conjunto de paquetes que se denomina colectivamente pila científica. Esta pila comprende, entre otros, los siguientes paquetes:

NumPy

NumPy proporciona un objeto matriz multidimensional para almacenar datos homogéneos o heterogéneos; también proporciona funciones/métodos optimizados para operar con este objeto matriz.

SciPy

SciPy es una colección de subpaquetes y funciones que implementan importantes funcionalidades estándar necesarias a menudo en ciencia o finanzas; por ejemplo, se encuentran funciones para la interpolación de splines cúbicos, así como para la integración numérica.

matplotlib

Este es el paquete de trazado y visualización más popular para Python, y proporciona capacidades de visualización tanto en 2D como en 3D.

pandas

pandas construye sobre NumPy y proporciona clases más ricas para la gestión y el análisis de series temporales y datos tabulares; está estrechamente integrado con matplotlib para el trazado y con PyTables para el almacenamiento y la recuperación de datos.

scikit-learn

scikit-learn es un popular paquete de aprendizaje automático (AM) que proporciona una interfaz de programación de aplicaciones (API) unificada para muchos algoritmos de AM diferentes, como para la estimación, la clasificación o la agrupación.

PyTables

PyTables es una popular envoltura para el paquete de HDF5 paquete de almacenamiento de datos; es un paquete para implementar operaciones de E/S optimizadas, basadas en disco y en un formato de base de datos/archivo jerárquico.

Dependiendo del dominio o problema concreto, esta pila se amplía con paquetes adicionales, que la mayoría de las veces tienen en común que se construyen sobre uno o varios de estos paquetes fundamentales. Sin embargo, el mínimo común denominador o los bloques de construcción básicos en general son la clase NumPy ndarray (véase el Capítulo 4) y la clase pandas DataFrame (véase el Capítulo 5).

Tomando Python únicamente como lenguaje de programación, hay otros lenguajes disponibles que probablemente puedan estar a la altura de su sintaxis y elegancia. Por ejemplo, Ruby es un lenguaje popular que a menudo se compara con Python. El sitio web del lenguaje describe Ruby como:

Un lenguaje de programación dinámico y de código abierto centrado en la sencillez y la productividad. Tiene una sintaxis elegante que es natural de leer y fácil de escribir.

La mayoría de las personas que utilizan Python probablemente también estarían de acuerdo con la misma afirmación que se hace sobre el propio Python. Sin embargo, lo que distingue a Python para muchos usuarios de lenguajes igualmente atractivos como Ruby es la disponibilidad de la pila científica. Esto hace que Python no sólo sea un lenguaje bueno y elegante de usar, sino también capaz de sustituir a lenguajes y conjuntos de herramientas específicos de un dominio como Matlab o R. También proporciona por defecto todo lo que esperarías, por ejemplo, como desarrollador web experimentado o administrador de sistemas. Además, Python es bueno en la interfaz con lenguajes específicos del dominio, como R, de modo que la decisión normalmente no es sobre Python u otra cosa,sino sobre qué lenguaje debe ser el principal.

La tecnología en las finanzas

Con estas "ideas aproximadas" de lo que es Python, tiene sentido retroceder un poco y contemplar brevemente el papel de la tecnología en las finanzas. Esto nos pondrá en situación de juzgar mejor el papel que Python ya desempeña y, lo que es aún más importante, el que probablemente desempeñará en la industria financiera del futuro.

En cierto sentido, la tecnología per se no es nada especial para las instituciones financieras (en comparación, por ejemplo, con las empresas de biotecnología) ni para la función financiera (en comparación con otras funciones empresariales, como la logística). Sin embargo, en los últimos años, espoleados por la innovación y también por la regulación, los bancos y otras instituciones financieras, como los fondos de alto riesgo, han evolucionado cada vez más hasta convertirse en empresas tecnológicas, en lugar de ser meros intermediarios financieros. La tecnología se ha convertido en un activo importante para casi cualquier institución financiera del mundo, con potencial para generar ventajas competitivas y también desventajas. Algunos antecedentes pueden arrojar luz sobre las razones de esta evolución.

Gasto en tecnología

Bancos e instituciones financieras forman juntos el sector que más gasta anualmente en tecnología. Por tanto, la siguiente afirmación demuestra no sólo que la tecnología es importante para el sector financiero, sino que el sector financiero también es realmente importante para el sector tecnológico:

FRAMINGHAM, Massachusetts, 14 de junio de 2018 - El gasto mundial en tecnologías de la información (TI) de las empresas de servicios financieros será de casi 500.000 millones de dólares en 2021, frente a los 440.000 millones de dólares de 2018, según los nuevos datos de una serie de Guías de Gasto en TI de Servicios Financieros de International Data Corporation (IDC).

IDC

En particular, los bancos y otras instituciones financieras están inmersos en una carrera por convertir en digitales sus modelos empresariales y operativos:

Se prevé que el gasto bancario en nuevas tecnologías ascenderá a 19.900 millones de dólares estadounidenses en 2017 en Norteamérica.

Los bancos desarrollan los sistemas actuales y trabajan en nuevas soluciones tecnológicas para aumentar su competitividad en el mercado global y atraer a clientes interesados en las nuevas tecnologías online y móviles. Es una gran oportunidad para las empresas fintech globales que aportan nuevas ideas y soluciones de software para el sector bancario.

Statista

En la actualidad, los grandes bancos multinacionales suelen emplear a miles de desarrolladores para mantener los sistemas existentes y crear otros nuevos. Los grandes bancos de inversión con grandes requisitos tecnológicos suelen tener presupuestos tecnológicos de varios miles de millones de USD al año.

La tecnología como facilitadora

El desarrollo tecnológico de también ha contribuido a innovaciones y mejoras de la eficiencia en el sector financiero. Normalmente, los proyectos en este ámbito se engloban bajo el paraguas de la digitalización.

El sector de los servicios financieros ha experimentado cambios drásticos impulsados por la tecnología en los últimos años. Muchos ejecutivos esperan que sus departamentos de TI mejoren la eficiencia y faciliten una innovación que cambie las reglas del juego, al tiempo que reducen los costes y siguen apoyando los sistemas heredados. Mientras tanto, las nuevas empresas FinTech están invadiendo los mercados establecidos, liderando con soluciones fáciles de usar para el cliente, desarrolladas desde cero y sin el lastre de los sistemas heredados.

19ª Encuesta Anual Global de CEOs 2016 de PwC

Como efecto secundario de la creciente eficacia, a menudo hay que buscar ventajas competitivas en productos o transacciones cada vez más complejos. Esto, a su vez, aumenta intrínsecamente los riesgos y hace que la gestión del riesgo, así como la supervisión y la regulación, sean cada vez más difíciles. La crisis financiera de 2007 y 2008 cuenta la historia de los peligros potenciales derivados de tales desarrollos. En una línea similar, los "algoritmos y ordenadores enloquecidos" representan un riesgo potencial para los mercados financieros; esto se materializó dramáticamente en el llamado flash crash de mayo de 2010, en el que la venta automatizada provocó grandes caídas intradía en determinadas acciones e índices bursátiles. La Parte IV trata temas relacionados con la negociación algorítmica de instrumentos financieros.

La tecnología y el talento como barreras de entrada

En por un lado, los avances tecnológicos reducen los costes con el tiempo, ceteris paribus. Por otro, las instituciones financieras siguen invirtiendo mucho en tecnología, tanto para ganar cuota de mercado como para defender sus posiciones actuales. Ser activo hoy en día en determinadas áreas de las finanzas a menudo conlleva la necesidad de inversiones a gran escala tanto en tecnología como en personal cualificado. Como ejemplo, consideremos el espacio del análisis de derivados:

Agregadas a lo largo del ciclo de vida total del software, las empresas que adopten estrategias internas para la fijación de precios [de derivados] OTC necesitarán inversiones de entre 25 y 36 millones de dólares sólo para crear, mantener y mejorar una biblioteca completa de derivados.

Ding (2010)

No sólo es costoso y lleva mucho tiempo crear una biblioteca completa de análisis de derivados, sino que además necesitas tener suficientes expertos para hacerlo. Y estos expertos tienen que disponer de las herramientas y tecnologías adecuadas para realizar sus tareas. Con el desarrollo del ecosistema Python, estos esfuerzos se han hecho más eficientes y los presupuestos en este sentido pueden reducirse significativamente hoy en día en comparación con, digamos, hace 10 años. La Parte V cubre el análisis de derivados y construye una biblioteca de precios de derivados pequeña pero potente y flexible, sólo con Python y los paquetes estándar de Python.

Otra cita sobre los primeros días de Long-Term Capital Management (LTCM), antiguamente uno de los fondos de cobertura cuantitativa más respetados -que, sin embargo, quebró a finales de la década de 1990- apoya aún más esta idea sobre la tecnología y el talento:

Meriwether se gastó 20 millones de dólares en un sistema informático de última generación y contrató a un equipo de ingenieros financieros de primera para dirigir el espectáculo en el LTCM, que se estableció en Greenwich, Connecticut. Era gestión de riesgos a nivel industrial.

Patterson (2010)

La misma potencia informática que Meriwether tuvo que comprar por millones de dólares está hoy probablemente disponible por miles o puede alquilarse a un proveedor de la nube según un plan de tarifas flexible. El Capítulo 2 muestra cómo configurar una infraestructura en la nube para el análisis financiero interactivo, el desarrollo de aplicaciones y la implementación con Python. Los presupuestos para una infraestructura profesional de este tipo empiezan en unos pocos USD al mes. Por otra parte, la negociación, la fijación de precios y la gestión de riesgos se han vuelto tan complejas para las grandes instituciones financieras que hoy necesitan desplegar infraestructuras informáticas con decenas de miles de núcleos de cálculo.

Velocidades, frecuencias y volúmenes de datos cada vez mayores

En una de las dimensiones de la industria financiera que más se ha visto influida por los avances tecnológicos es la velocidad y frecuencia con que se deciden y ejecutan las operaciones financieras. Lewis (2014) describe en la denominada negociación flash-es decir, la negociación a las velocidades más altas posibles- con todo lujo de detalles.

Por un lado, la creciente disponibilidad de datos en escalas de tiempo cada vez más pequeñas hace necesario reaccionar en tiempo real. Por otra, la creciente velocidad y frecuencia de las operaciones hace que los volúmenes de datos aumenten aún más. Esto conduce a procesos que se refuerzan mutuamente y empujan la escala temporal media de las transacciones financieras sistemáticamente hacia abajo. Se trata de una tendencia que ya había comenzado hace una década:

El fondo Medallion de Renaissance ganó un asombroso 80% en 2008, aprovechando la extrema volatilidad del mercado con sus veloces ordenadores. Jim Simons fue la persona que más ganó en el mundo de los fondos de alto riesgo durante el año, embolsándose la friolera de 2.500 millones de dólares.

Patterson (2010)

Treinta años de datos diarios sobre la cotización de una sola acción representan aproximadamente 7.500 cotizaciones de cierre. En este tipo de datos se basa la mayor parte de la teoría financiera actual. Por ejemplo, la teoría de la cartera moderna o de la varianza media (MPT), el modelo de valoración de activos de capital (CAPM) y el valor en riesgo (VaR) se basan en los datos diarios de las cotizaciones bursátiles.

En comparación, en un día típico de negociación, durante una sola hora de negociación, el precio de las acciones de Apple Inc. (AAPL) puede cotizarse unas 15.000 veces, aproximadamente el doble del número de cotizaciones en comparación con las cotizaciones de cierre disponibles al final del día durante 30 años (véase el ejemplo en "Finanzas impulsadas por los datos y la IA"). Esto conlleva una serie de retos:

Tratamiento de datos

No basta con considerar y procesar las cotizaciones al final del día de las acciones u otros instrumentos financieros; ocurren "demasiadas cosas" durante el día, y para algunos instrumentos durante las 24 horas de los 7 días de la semana.

Velocidad de análisis

A menudo, las decisiones deben tomarse en milisegundos o incluso más rápido, por lo que es necesario crear las respectivas capacidades analíticas y analizar grandes cantidades de datos en tiempo real.

Fundamentos teóricos

Aunque las teorías y conceptos tradicionales de las finanzas distan mucho de ser perfectos, han sido bien probados (y a veces bien rechazados) a lo largo del tiempo; para las escalas de milisegundos y microsegundos importantes a día de hoy, siguen faltando conceptos y teorías financieras consistentes en el sentido tradicional que hayan demostrado cierta solidez a lo largo del tiempo.

En general, todos estos retos sólo pueden abordarse mediante la tecnología moderna. Algo que también puede resultar un poco sorprendente es que la falta de teorías coherentes a menudo se aborda mediante enfoques tecnológicos, en el sentido de que los algoritmos de alta velocidad explotan los elementos de la microestructura del mercado (por ejemplo, el flujo de órdenes, los diferenciales entre oferta y demanda) en lugar de basarse en algún tipo de razonamiento financiero.

El auge de la analítica en tiempo real

En hay una disciplina que ha experimentado un fuerte aumento de importancia en la industria financiera: la analítica financiera y de datos. Este fenómeno guarda una estrecha relación con la idea de que las velocidades, frecuencias y volúmenes de datos aumentan a un ritmo vertiginoso en el sector. De hecho, la analítica en tiempo real puede considerarse la respuesta del sector a esta tendencia.

En términos generales,, la "analítica financiera y de datos" se refiere a la disciplina de aplicar software y tecnología en combinación con algoritmos y métodos (posiblemente avanzados) para recopilar, procesar y analizar datos con el fin de obtener información, tomar decisiones o cumplir requisitos normativos, por ejemplo. Algunos ejemplos podrían ser la estimación del impacto en las ventas inducido por un cambio en la estructura de precios de un producto financiero en la sucursal minorista de un banco, o el cálculo a gran escala y de un día para otro de los ajustes de valoración del crédito (CVA) para carteras complejas de operaciones con derivados de un banco de inversión.

Hay dos grandes retos a los que se enfrentan las instituciones financieras en este contexto:

Grandes datos

Bancos y otras instituciones financieras tenían que tratar con cantidades masivas de datos incluso antes de que se acuñara el término "big data"; sin embargo, la cantidad de datos que hay que procesar durante las tareas analíticas individuales ha aumentado enormemente con el tiempo, exigiendo tanto una mayor potencia informática como capacidades de memoria y almacenamiento cada vez mayores.

Economía en tiempo real

En el pasado, los responsables de la toma de decisiones podían confiar en una planificación estructurada y periódica, así como en procesos de decisión y gestión (de riesgos), mientras que hoy se enfrentan a la necesidad de ocuparse de estas funciones en tiempo real; varias tareas de las que se ocupaban en el pasado mediante procesos por lotes nocturnos en el back office se han trasladado ahora al front office y se ejecutan en tiempo real.

Una vez más, se observa una interacción entre los avances tecnológicos y la práctica financiera/empresarial. Por un lado, existe la necesidad de mejorar constantemente los enfoques analíticos en términos de velocidad y capacidad mediante la aplicación de tecnologías modernas. Por otro lado, los avances tecnológicos permiten nuevos enfoques analíticos que se consideraban imposibles (o inviables por limitaciones presupuestarias) hace un par de años o incluso meses.

Una tendencia importante en el espacio analítico ha sido la utilización de arquitecturas paralelas en el lado de la unidad central de procesamiento (CPU) y arquitecturas masivamente paralelas en el lado de la unidad de procesamiento gráfico de propósito general (GPGPU). Las GPGPU actuales tienen miles de núcleos de cálculo, lo que hace necesario un replanteamiento a veces radical de lo que puede significar el paralelismo para los distintos algoritmos. Lo que sigue siendo un obstáculo a este respecto es que, por lo general, los usuarios tienen que aprender nuevos paradigmas y técnicas de programación para aprovechar la potencia de dicho hardware.

Python para Finanzas

En la sección anterior de se han descrito algunos aspectos que caracterizan el papel de la tecnología en las finanzas:

  • Costes de la tecnología en el sector financiero

  • La tecnología como facilitadora de nuevos negocios e innovación

  • La tecnología y el talento como barreras de entrada en el sector financiero

  • Velocidades, frecuencias y volúmenes de datos cada vez mayores

  • El auge del análisis en tiempo real

Esta sección analiza cómo Python puede ayudar a afrontar varios de los retos que esto implica. Pero primero, a un nivel más fundamental, un breve análisis de Python para las finanzas desde el punto de vista del lenguaje y la sintaxis.

Finanzas y sintaxis de Python

La mayoría de las personas de que dan sus primeros pasos con Python en un contexto financiero pueden atacar un problema algorítmico. Esto es similar a un científico que, por ejemplo, quiere resolver una ecuación diferencial, evaluar una integral o simplemente visualizar algunos datos. En general, en esta fase, se piensa poco en temas como un proceso de desarrollo formal, pruebas, documentación o implementación. Sin embargo, ésta parece ser especialmente la etapa en la que la gente se enamora de Python. Una de las principales razones podría ser que la sintaxis de Python suele ser bastante parecida a la sintaxis matemática utilizada para describir problemas científicos o algoritmos financieros.

Este puede ilustrarse mediante un algoritmo financiero, concretamente la valoración de una opción de compra europea mediante simulación de Montecarlo. El ejemplo considera una configuración Black-Scholes-Merton (BSM) en la que el factor de riesgo subyacente de la opción sigue un movimiento browniano geométrico.

Asume los siguientes valores numéricos de los parámetros para la valoración:

  • Nivel inicial del índice bursátil S0 = 100

  • Precio de ejercicio de la opción de compra europea K = 105

  • Plazo de vencimiento T = 1 año

  • Constante, tipo a corto sin riesgo r = 0,05

  • Volatilidad constante σ = 0.2

En el modelo BSM, el nivel del índice en la madurez es una variable aleatoria dada por la Ecuación 1-1, siendo z una variable aleatoria estándar distribuida normalmente.

Ecuación 1-1. Nivel del índice Black-Scholes-Merton (1973) al vencimiento
S T = S 0 exp r - 1 2 σ 2 T + σ T z

A continuación se describe algorítmicamente el procedimiento de valoración de Montecarlo:

  1. Extrae I números pseudoaleatorios z ( i ) , i { 1 , 2 , . . . , I } de la distribución normal estándar.

  2. Calcula todos los niveles de índice resultantes al vencimiento S T ( i ) para una z(i) dada y la ecuación 1-1.

  3. Calcula todos los valores internos de la opción al vencimiento como hT(i) = max(ST(i) - K, 0).

  4. Estima el valor actual de la opción mediante el estimador de Montecarlo, como se indica en la Ecuación 1-2.

Ecuación 1-2. Estimador de Monte Carlo para la opción europea
C 0 e -rT 1 I I h T ( i )

Ahora hay que traducir este problema y este algoritmo a Python. El siguiente código implementa los pasos necesarios:

In [6]: import math
        import numpy as np  1

In [7]: S0 = 100.  2
        K = 105.  2
        T = 1.0  2
        r = 0.05  2
        sigma = 0.2  2

In [8]: I = 100000  2

In [9]: np.random.seed(1000)  3

In [10]: z = np.random.standard_normal(I)  4

In [11]: ST = S0 * np.exp((r - sigma ** 2 / 2) * T + sigma * math.sqrt(T) * z)  5

In [12]: hT = np.maximum(ST - K, 0)  6

In [13]: C0 = math.exp(-r * T) * np.mean(hT)  7

In [14]: print('Value of the European call option: {:5.3f}.'.format(C0))  8
         Value of the European call option: 8.019.
1

NumPy se utiliza aquí como paquete principal.

2

Se definen los valores de los parámetros del modelo y de la simulación.

3

El valor semilla del generador de números aleatorios es fijo.

4

Se extraen números aleatorios estándar distribuidos normalmente.

5

Los valores de final de periodo son simulados.

6

Se calculan los pagos de la opción al vencimiento.

7

Se evalúa el estimador de Montecarlo.

8

Se imprime la estimación del valor resultante.

Merece la pena destacar tres aspectos:

Sintaxis

De hecho, la sintaxis de Python se parece bastante a la sintaxis matemática, por ejemplo, en lo que se refiere a la asignación de valores a los parámetros.

Traducción

Toda afirmación matemática y/o algorítmica puede traducirse generalmente en una sola línea de código Python.

Vectorización

Uno de los puntos fuertes de NumPy es su sintaxis compacta y vectorizada, que permite, por ejemplo, realizar 100.000 cálculos en una sola línea de código.

Este código puede utilizarse en un entorno interactivo como IPython o Jupyter Notebook. Sin embargo, el código destinado a ser reutilizado regularmente suele organizarse en los llamados módulos (o scripts), que son archivos Python individuales (técnicamente archivos de texto) con el sufijo .py. En este caso, un módulo de este tipo podría tener el aspecto del Ejemplo 1-1 y podría guardarse como un archivo llamado bsm_mcs_euro.py.

Ejemplo 1-1. Valoración Monte Carlo de una opción de compra europea
#
# Monte Carlo valuation of European call option
# in Black-Scholes-Merton model
# bsm_mcs_euro.py
#
# Python for Finance, 2nd ed.
# (c) Dr. Yves J. Hilpisch
#
import math
import numpy as np

# Parameter Values
S0 = 100.  # initial index level
K = 105.  # strike price
T = 1.0  # time-to-maturity
r = 0.05  # riskless short rate
sigma = 0.2  # volatility

I = 100000  # number of simulations

# Valuation Algorithm
z = np.random.standard_normal(I)  # pseudo-random numbers
# index values at maturity
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * math.sqrt(T) * z)
hT = np.maximum(ST - K, 0)  # payoff at maturity
C0 = math.exp(-r * T) * np.mean(hT)  # Monte Carlo estimator

# Result Output
print('Value of the European call option %5.3f.' % C0)

El ejemplo algorítmico de esta subsección ilustra que Python, con su propia sintaxis, es muy adecuado para complementar al dúo clásico de lenguajes científicos, el inglés y las matemáticas. Parece que añadir Python al conjunto de lenguajes científicos lo hace más completo. Así pues:

  • Inglés para escribir y hablar de problemas científicos, financieros, etc.

  • Matemáticas para describir y modelar de forma concisa y exacta aspectos abstractos, algoritmos, cantidades complejas, etc.

  • Python para modelar e implementar técnicamente aspectos abstractos, algoritmos, cantidades complejas, etc.

Matemáticas y sintaxis de Python

En no hay casi ningún lenguaje de programación que se acerque tanto a la sintaxis matemática como Python. Por lo tanto, en general es sencillo traducir los algoritmos numéricos de la representación matemática a la implementación pitónica. Esto hace que la creación de prototipos, el desarrollo y el mantenimiento del código en finanzas sean bastante eficientes con Python.

En algunas áreas, es práctica común utilizar pseudocódigo y con ello introducir un cuarto miembro de la familia del lenguaje. La función del pseudocódigo es representar, por ejemplo, algoritmos financieros de una forma más técnica que se acerque tanto a la representación matemática como a la aplicación técnica. Además del propio algoritmo, el pseudocódigo tiene en cuenta cómo funcionan en principio los ordenadores.

Esta práctica suele tener su causa en el hecho de que, con la mayoría de los lenguajes de programación (compilados), la implementación técnica está bastante "lejos" de su representación formal, matemática. La mayoría de los lenguajes de programación obligan a incluir tantos elementos que sólo son técnicamente necesarios que resulta difícil ver la equivalencia entre las matemáticas y el código.

Hoy en día, Python se utiliza a menudo en forma de pseudocódigo, ya que su sintaxis es casi análoga a la matemática y la "sobrecarga" técnica se mantiene al mínimo. Esto se consigue gracias a una serie de conceptos de alto nivel incorporados al lenguaje que no sólo tienen sus ventajas, sino que en general también conllevan riesgos y/u otros costes. Sin embargo, se puede afirmar que con Python puedes, siempre que surja la necesidad, seguir las mismas prácticas estrictas de implementación y codificación que otros lenguajes podrían exigir desde el principio. En ese sentido, Python puede ofrecer lo mejor de ambos mundos: abstracción de alto nivel e implementación rigurosa.

Eficacia y productividad mediante Python

En un nivel alto, los beneficios de utilizar Python pueden medirse en tres dimensiones:

Eficacia

¿Cómo puede ayudar Python a obtener resultados más rápidamente, a ahorrar costes y a ahorrar tiempo?

Productividad

¿Cómo puede ayudar Python a hacer más con los mismos recursos (personas, activos, etc.)?

Calidad

¿Qué permite hacer Python que no permitan otras tecnologías alternativas?

Un debate sobre estos aspectos no puede ser, por naturaleza, exhaustivo. Sin embargo, puede destacar algunos argumentos como punto de partida.

Resultados en menos tiempo

Un campo de en el que la eficacia de Python resulta bastante obvia es el análisis interactivo de datos. Se trata de un campo que se beneficia enormemente de herramientas tan potentes como IPython, Jupyter Notebook y paquetes como pandas.

Considera a un estudiante de finanzas que está escribiendo su tesis de máster y está interesado en los valores del índice S&P 500. Quiere analizar los niveles históricos del índice durante, digamos, unos cuantos años para ver cómo ha fluctuado la volatilidad del índice a lo largo del tiempo y espera encontrar pruebas de que la volatilidad, en contraste con algunos supuestos típicos de los modelos, fluctúa con el tiempo y dista mucho de ser constante. Los resultados también deben visualizarse. El alumno debe hacer principalmente lo siguiente

  • Recuperar datos a nivel de índice de la web

  • Calcula la desviación típica rodante anualizada de los rendimientos logarítmicos (volatilidad)

  • Traza los datos del nivel del índice y los resultados de la volatilidad

Estas tareas son lo suficientemente complejas como para que no hace mucho tiempo se hubiera considerado que eran algo sólo para analistas financieros profesionales. Hoy en día, incluso el estudiante de finanzas puede enfrentarse fácilmente a estos problemas. El código siguiente muestra cómo funciona exactamente, sin preocuparse por ahora de los detalles de sintaxis (todo se explica detalladamente en capítulos posteriores):

In [16]: import numpy as np  1
         import pandas as pd  1
         from pylab import plt, mpl  2

In [17]: plt.style.use('seaborn')  2
         mpl.rcParams['font.family'] = 'serif'  2
         %matplotlib inline

In [18]: data = pd.read_csv('../../source/tr_eikon_eod_data.csv',
                           index_col=0, parse_dates=True)  3
         data = pd.DataFrame(data['.SPX']) 4
         data.dropna(inplace=True)  4
         data.info()  5
         <class 'pandas.core.frame.DataFrame'>
         DatetimeIndex: 2138 entries, 2010-01-04 to 2018-06-29
         Data columns (total 1 columns):
         .SPX    2138 non-null float64
         dtypes: float64(1)
         memory usage: 33.4 KB

In [19]: data['rets'] = np.log(data / data.shift(1))  6
         data['vola'] = data['rets'].rolling(252).std() * np.sqrt(252)  7

In [20]: data[['.SPX', 'vola']].plot(subplots=True, figsize=(10, 6));  8
1

Esto importa NumPy y pandas.

2

Importa matplotlib y configura el estilo y el enfoque de trazado para Jupyter.

3

pd.read_csv() permite recuperar conjuntos de datos almacenados a distancia o localmente en forma de valores separados por comas (CSV).

4

Se elige un subconjunto de datos y se eliminan los valores NaN ("no es un número").

5

Muestra información sobre el conjunto de datos.

6

Los retornos logarítmicos se calculan de forma vectorizada ("sin bucles" en el nivel Python).

7

Se obtiene la volatilidad rodante anualizada.

8

Por último, traza las dos series temporales.

La Figura 1-1 muestra el resultado gráfico de esta breve sesión interactiva. Puede considerarse casi asombroso que unas pocas líneas de código basten para implementar tres tareas bastante complejas que suelen darse en el análisis financiero: recopilación de datos, cálculos matemáticos complejos y repetidos, así como visualización de los resultados. El ejemplo ilustra que pandas hace que trabajar con series temporales completas sea casi tan sencillo como hacer operaciones matemáticas con números en coma flotante.

Trasladado a un contexto financiero profesional, el ejemplo implica que los analistas financieros pueden -cuando aplican las herramientas y paquetes Python adecuados que proporcionan abstracciones de alto nivel- centrarse en su dominio y no en los intríngulis técnicos. Los analistas también pueden reaccionar con mayor rapidez, proporcionando información valiosa casi en tiempo real y asegurándose de ir un paso por delante de la competencia. Este ejemplo de mayor eficacia puede traducirse fácilmente en efectos medibles en los resultados finales.

pff2 0101
Figura 1-1. Valores de cierre del S&P 500 y volatilidad anualizada

Garantizar un alto rendimiento

En general, se acepta que Python tiene una sintaxis bastante concisa y que es relativamente eficiente para codificar con él. Sin embargo, debido a la propia naturaleza de Python como lenguaje interpretado, persiste el prejuicio de que Python suele ser demasiado lento para tareas de cálculo intensivo en finanzas. Efectivamente, dependiendo del enfoque específico de implementación, Python puede ser realmente lento. Pero no tiene por qué ser lento:puede tener un alto rendimiento en casi cualquier área de aplicación. En principio, se pueden distinguir al menos tres estrategias diferentes para mejorar el rendimiento:

Modismos y paradigmas

En general, muchas formas distintas pueden conducir al mismo resultado en Python, pero a veces con características de rendimiento bastante diferentes; "simplemente" elegir la forma correcta (por ejemplo, un enfoque de implementación específico, como el uso juicioso de estructuras de datos, evitar los bucles mediante la vectorización, o el uso de un paquete específico como pandas) puede mejorar los resultados de forma significativa.

Compilando

Hoy en día, existen varios paquetes de rendimiento que proporcionan versiones compiladas de funciones importantes o que compilan el código Python estática o dinámicamente (en tiempo de ejecución o de llamada) a código máquina, lo que puede hacer que dichas funciones sean órdenes de magnitud más rápidas que el código Python puro; los más populares son Cython y Numba.

Paralelización

Muchas tareas computacionales, en particular en finanzas, pueden beneficiarse significativamente de la ejecución paralela; esto no es nada especial de Python, sino algo que puede conseguirse fácilmente con él.

Computación de alto rendimiento con Python

Python per se no es una tecnología informática de alto rendimiento. Sin embargo, Python se ha convertido en una plataforma ideal para acceder a las tecnologías de rendimiento actuales. En ese sentido, Python se ha convertido en algo así como un lenguaje pegamento para las tecnologías de computación de alto rendimiento.

Esta subsección se ciñe a un ejemplo sencillo, pero realista, que aborda las tres estrategias (en capítulos posteriores se ilustran las estrategias en detalle). Una tarea bastante común en el análisis financiero es evaluar expresiones matemáticas complejas en grandes matrices de números. Para ello, el propio Python proporciona todo lo necesario:

In [21]: import math
         loops = 2500000
         a = range(1, loops)
         def f(x):
             return 3 * math.log(x) + math.cos(x) ** 2
         %timeit r = [f(x) for x in a]
         1.59 s ± 41.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

En este caso, el intérprete de Python necesita aproximadamente 1,6 segundos para evaluar la función f() 2.500.000 veces. La misma tarea puede implementarse utilizando NumPy, que proporciona funciones optimizadas (es decir, precompiladas) para manejar tales operaciones basadas en matrices:

In [22]: import numpy as np
         a = np.arange(1, loops)
         %timeit r = 3 * np.log(a) + np.cos(a) ** 2
         87.9 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Utilizar NumPy reduce considerablemente el tiempo de ejecución a unos 88 milisegundos. Sin embargo, existe incluso un paquete dedicado específicamente a este tipo de tareas. Se llama numexpr, de "expresiones numéricas". Compila la expresión para mejorar el rendimiento de la funcionalidad general de NumPy evitando, por ejemplo, las copias en memoria de objetos de ndarray por el camino:

In [23]: import numexpr as ne
         ne.set_num_threads(1)
         f = '3 * log(a) + cos(a) ** 2'
         %timeit r = ne.evaluate(f)
         50.6 ms ± 4.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

El uso de este enfoque más especializado reduce aún más el tiempo de ejecución a unos 50 milisegundos. Sin embargo, numexpr también tiene capacidades incorporadas para paralelizar la ejecución de la operación respectiva. Esto nos permite utilizar varios hilos de una CPU:

In [24]: ne.set_num_threads(4)
         %timeit r = ne.evaluate(f)
         22.8 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

La paralelización reduce aún más el tiempo de ejecución, por debajo de 23 milisegundos en este caso, con cuatro hilos utilizados. En conjunto, se trata de una mejora del rendimiento de más de 90 veces. Observa, en particular, que este tipo de mejora es posible sin alterar el problema/algoritmo básico y sin conocer ningún detalle sobre los enfoques de compilación o paralelización. Las capacidades son accesibles desde un alto nivel incluso para los no expertos. Sin embargo, hay que ser consciente, por supuesto, de qué capacidades y opciones existen.

Este ejemplo muestra que Python ofrece varias opciones para aprovechar mejor los recursos existentes, es decir, para aumentar la productividad. Con el enfoque paralelo, se pueden realizar tres veces más cálculos en el mismo tiempo que con el enfoque secuencial, en este caso simplemente diciéndole a Python que utilice varios subprocesos de CPU disponibles en lugar de sólo uno.

Del prototipo a la producción

Eficacia en el análisis interactivo y rendimiento en lo que respecta a la velocidad de ejecución son, sin duda, dos ventajas de Python a tener en cuenta. Sin embargo, otra gran ventaja del uso de Python para las finanzas podría parecer a primera vista algo más sutil; a segunda vista, podría presentarse como un importante factor estratégico para las instituciones financieras. Se trata de la posibilidad de utilizar Python de principio a fin, desde la creación de prototipos hasta la producción.

La práctica actual en las instituciones financieras de todo el mundo, en lo que se refiere a los procesos de desarrollo financiero, sigue caracterizándose a menudo por un proceso separado de dos pasos. Por un lado, están los analistas cuantitativos ("quants") responsables del desarrollo de modelos y la creación de prototipos técnicos. Les gusta utilizar herramientas y entornos como Matlab y R, que permiten un desarrollo de aplicaciones rápido e interactivo. En esta fase de los esfuerzos de desarrollo, cuestiones como el rendimiento, la estabilidad, la implementación, la gestión del acceso y el control de versiones, entre otras, no son tan importantes. Se busca principalmente una prueba de concepto y/o un prototipo que muestre las principales características deseadas de un algoritmo o de toda una aplicación.

Una vez terminado el prototipo, los departamentos de TI con sus desarrolladores toman el relevo y se encargan de traducir el código existente del prototipo en un código de producción fiable, mantenible y de alto rendimiento. Normalmente, en esta fase se produce un cambio de paradigma, ya que se utilizan lenguajes compilados, como C++ o Java, para cumplir los requisitos de implementación y producción. Además, suele aplicarse un proceso de desarrollo formal con herramientas profesionales, control de versiones, etc.

Este planteamiento en dos fases tiene una serie de consecuencias generalmente imprevistas:

Ineficiencias

El código del prototipo no es reutilizable; los algoritmos tienen que implementarse dos veces; los esfuerzos redundantes consumen tiempo y recursos; surgen riesgos durante la traducción

Habilidades diversas

Diferentes departamentos muestran diferentes conjuntos de habilidades y utilizan diferentes lenguajes para implementar "las mismas cosas"; la gente no sólo programa sino que también habla diferentes idiomas

Código heredado

El código está disponible y debe mantenerse en diferentes idiomas, a menudo utilizando diferentes estilos de implementación

Utilizar Python, en cambio, permite agilizar el proceso de principio a fin, desde los primeros pasos interactivos de creación de prototipos hasta un código de producción altamente fiable y eficientemente mantenible. La comunicación entre los distintos departamentos se hace más fácil. La formación de los trabajadores también es más ágil, ya que sólo hay un lenguaje principal que cubre todas las áreas de la creación de aplicaciones financieras. También evita las ineficiencias y redundancias inherentes al uso de distintas tecnologías en diferentes pasos del proceso de desarrollo. En definitiva, Python puede proporcionar un marco tecnológico coherente para casi todas las tareas de análisis financiero, desarrollo de aplicaciones financieras e implementación de algoritmos.

Finanzas basadas en datos y en la IA

Básicamente, todas las observaciones sobre la relación de la tecnología y la industria financiera formuladas por primera vez en 2014 para la primera edición de este libro siguen pareciendo bastante actuales e importantes en agosto de 2018, en el momento de actualizar este capítulo para la segunda edición del libro. Sin embargo, en esta sección se comentan dos grandes tendencias de la industria financiera que están a punto de remodelarla de forma fundamental. Estas dos tendencias han cristalizado principalmente en los últimos años.

Finanzas basadas en datos

Algunas de las teorías financieras más importantes, como la MPT y el CAPM, se remontan a los años 50 y 60. Sin embargo, siguen representando una piedra angular en la formación de los estudiantes de campos como la economía, las finanzas, la ingeniería financiera y la administración de empresas. Esto puede resultar sorprendente, ya que el apoyo empírico de la mayoría de estas teorías es escaso en el mejor de los casos, y las pruebas a menudo contrastan totalmente con lo que las teorías sugieren e implican. Por otra parte, su popularidad es comprensible, ya que se aproximan a las expectativas humanas sobre cómo podrían comportarse los mercados financieros y porque son elegantes teorías matemáticas que descansan en una serie de supuestos atractivos, aunque en general demasiado simplistas.

El método científico, por ejemplo en física, comienza con datos, por ejemplo de experimentos u observaciones, y pasa a hipótesis y teorías que luego se contrastan con los datos. Si las pruebas son positivas, las hipótesis y las teorías pueden refinarse y redactarse adecuadamente, por ejemplo, en forma de artículo de investigación para su publicación. Si las pruebas son negativas, las hipótesis y teorías se rechazan y comienza de nuevo la búsqueda de otras que se ajusten a los datos. Dado que las leyes físicas son estables a lo largo del tiempo, una vez descubierta y bien probada una ley de este tipo, suele estar ahí para quedarse, en el mejor de los casos, para siempre.

La historia de las finanzas (cuantitativas) contradice en gran parte el método científico. En muchos casos, se han desarrollado teorías y modelos "desde cero" sobre la base de supuestos matemáticos simplificadores con el objetivo de descubrir respuestas elegantes a problemas centrales de las finanzas. Entre otros, los supuestos populares en finanzas son los rendimientos distribuidos normalmente para los instrumentos financieros y las relaciones lineales entre las cantidades de interés. Dado que estos fenómenos apenas se dan en los mercados financieros, no debería sorprender que a menudo falten pruebas empíricas de las teorías elegantes. Muchas teorías y modelos financieros se han formulado, probado y publicado primero y sólo después se han probado empíricamente. Hasta cierto punto, esto se debe, por supuesto, al hecho de que los datos financieros de los años 50 a los 70, o incluso más tarde, no estaban disponibles en la forma en que lo están hoy, incluso para los estudiantes que se inician en la licenciatura de finanzas.

La disponibilidad de estos datos para las instituciones financieras ha aumentado drásticamente desde principios y mediados de los 90, y hoy en día incluso los particulares que realizan investigaciones financieras o se dedican a la negociación algorítmica tienen acceso a enormes cantidades de datos históricos hasta el nivel de tick, así como a datos de tick en tiempo real a través de servicios de streaming. Esto nos permite volver al método científico, que comienza en general con los datos antes de concebir ideas, hipótesis, modelos y estrategias.

Un breve ejemplo de ilustrará lo sencillo que resulta hoy en día recuperar datos profesionales a gran escala incluso en una máquina local, haciendo uso de Python y de una suscripción de datos profesionales a las API de datos de Eikon. El siguiente ejemplo recupera datos de ticks de las acciones de Apple Inc. durante una hora de un día normal de negociación. Se recuperan unas 15.000 cotizaciones de tick, incluida la información de volumen. Mientras que el símbolo de la acción es AAPL, el Código de Instrumento Reuters (RIC) es AAPL.O:

In [26]: import eikon as ek  1

In [27]: data = ek.get_timeseries('AAPL.O', fields='*',
                                  start_date='2018-10-18 16:00:00',
                                  end_date='2018-10-18 17:00:00',
                                  interval='tick')  2

In [28]: data.info()  2
         <class 'pandas.core.frame.DataFrame'>
         DatetimeIndex: 35350 entries, 2018-10-18 16:00:00.002000 to 2018-10-18
          16:59:59.888000
         Data columns (total 2 columns):
         VALUE     35285 non-null float64
         VOLUME    35350 non-null float64
         dtypes: float64(2)
         memory usage: 828.5 KB

In [29]: data.tail()  3
Out[29]: AAPL.O                    VALUE  VOLUME
         Date
         2018-10-18 16:59:59.433  217.13    10.0
         2018-10-18 16:59:59.433  217.13    12.0
         2018-10-18 16:59:59.439  217.13   231.0
         2018-10-18 16:59:59.754  217.14   100.0
         2018-10-18 16:59:59.888  217.13   100.0
1

El uso de la API de Datos de Eikon requiere una suscripción y una conexión API.

2

Recupera los datos de tick de las acciones de Apple Inc. (AAPL.O).

3

Muestra las cinco últimas filas de datos de ticks.

Las API de datos de Eikon dan acceso no sólo a datos financieros estructurados, como datos históricos de precios, sino también a datos no estructurados, como artículos de noticias. El siguiente ejemplo recupera los metadatos de una pequeña selección de artículos de noticias y muestra el principio de uno de los artículos como texto completo:

In [30]: news = ek.get_news_headlines('R:AAPL.O Language:LEN',
                                  date_from='2018-05-01',
                                  date_to='2018-06-29',
                                  count=7)  1

In [31]: news  1
Out[31]:
                                     versionCreated  \
    2018-06-28 23:00:00.000 2018-06-28 23:00:00.000
    2018-06-28 21:23:26.526 2018-06-28 21:23:26.526
    2018-06-28 19:48:32.627 2018-06-28 19:48:32.627
    2018-06-28 17:33:10.306 2018-06-28 17:33:10.306
    2018-06-28 17:33:07.033 2018-06-28 17:33:07.033
    2018-06-28 17:31:44.960 2018-06-28 17:31:44.960
    2018-06-28 17:00:00.000 2018-06-28 17:00:00.000

                                                                          text  \
    2018-06-28 23:00:00.000  RPT-FOCUS-AI ambulances and robot doctors: Chi...
    2018-06-28 21:23:26.526  Why Investors Should Love Apple's (AAPL) TV En...
    2018-06-28 19:48:32.627  Reuters Insider - Trump: We're reclaiming our ...
    2018-06-28 17:33:10.306  Apple v. Samsung ends not with a whimper but a...
    2018-06-28 17:33:07.033  Apple's trade-war discount extended for anothe...
    2018-06-28 17:31:44.960  Other Products: Apple's fast-growing island of...
    2018-06-28 17:00:00.000  Pokemon Go creator plans to sell the tech behi...

                                                                  storyId  \
    2018-06-28 23:00:00.000  urn:newsml:reuters.com:20180628:nL4N1TU4F8:6
    2018-06-28 21:23:26.526  urn:newsml:reuters.com:20180628:nNRA6e2vft:1
    2018-06-28 19:48:32.627  urn:newsml:reuters.com:20180628:nRTV1vNw1p:1
    2018-06-28 17:33:10.306  urn:newsml:reuters.com:20180628:nNRA6e1oza:1
    2018-06-28 17:33:07.033  urn:newsml:reuters.com:20180628:nNRA6e1pmv:1
    2018-06-28 17:31:44.960  urn:newsml:reuters.com:20180628:nNRA6e1m3n:1
    2018-06-28 17:00:00.000  urn:newsml:reuters.com:20180628:nL1N1TU0PC:3

                            sourceCode
    2018-06-28 23:00:00.000    NS:RTRS
    2018-06-28 21:23:26.526  NS:ZACKSC
    2018-06-28 19:48:32.627    NS:CNBC
    2018-06-28 17:33:10.306  NS:WALLST
    2018-06-28 17:33:07.033  NS:WALLST
    2018-06-28 17:31:44.960  NS:WALLST
    2018-06-28 17:00:00.000    NS:RTRS

In [32]: story_html = ek.get_news_story(news.iloc[1, 2])  2

In [33]: from bs4 import BeautifulSoup  3

In [34]: story = BeautifulSoup(story_html, 'html5lib').get_text()  4

In [35]: print(story[83:958])  5
         Jun 28, 2018 For years, investors and Apple AAPL have been beholden to
          the iPhone, which is hardly a negative since its flagship product is
          largely responsible for turning Apple into one of the world's biggest
          companies. But Apple has slowly pushed into new growth areas, with
          streaming television its newest frontier. So let's take a look at what
          Apple has planned as it readies itself to compete against the likes of
          Netflix NFLX and Amazon AMZN in the battle for the new age of
          entertainment.Apple's second-quarter revenues jumped by 16% to reach
          $61.14 billion, with iPhone revenues up 14%. However, iPhone unit sales
          climbed only 3% and iPhone revenues accounted for over 62% of total Q2
          sales. Apple knows this is not a sustainable business model, because
          rare is the consumer product that can remain in vogue for decades. This
          is why Apple has made a big push into news,
1

Recupera los metadatos de una pequeña selección de artículos de noticias.

2

Recupera el texto completo de un único artículo, entregado como documento HTML.

3

Importa el paquete de análisis HTML BeautifulSoup y ...

4

... extrae el contenido como texto plano (un objeto str ).

5

Imprime el comienzo de la noticia.

Aunque sólo son un rasguño en la superficie, estos dos ejemplos ilustran que los datos financieros históricos estructurados y no estructurados están disponibles de forma estandarizada y eficiente a través de paquetes envolventes de Python y servicios de suscripción de datos. En muchas circunstancias, los particulares que utilizan, por ejemplo, plataformas de negociación como la de FXCM Group, LLC, que se presenta en el Capítulo 14 y también se utiliza en el Capítulo 16, pueden acceder gratuitamente a conjuntos de datos similares. Una vez que los datos están en el nivel de Python -independientemente de la fuente original- se puede aprovechar toda la potencia del ecosistema de análisis de datos de Python.

Finanzas basadas en datos

Los datos son el motor de las finanzas hoy en día. Incluso algunos de los mayores y a menudo más exitosos fondos de cobertura se llaman a sí mismos "impulsados por los datos" en lugar de "impulsados por las finanzas". Cada vez hay más ofertas que ponen enormes cantidades de datos a disposición de grandes y pequeñas instituciones y particulares. Python suele ser el lenguaje de programación elegido para interactuar con las API y para procesar y analizar los datos.

AI-First Finanzas

Con la disponibilidad de grandes cantidades de datos financieros a través de API programáticas, se ha hecho mucho más fácil y fructífero aplicar métodos de inteligencia artificial (IA) en general y de aprendizaje automático y profundo (ML, DL) en particular a los problemas financieros, como en la negociación algorítmica.

Python también puede considerarse un ciudadano de primera clase en el mundo de la IA. A menudo es el lenguaje de programación elegido tanto por los investigadores como por los profesionales de la IA. En este sentido, el ámbito financiero se beneficia de los avances en diversos campos, a veces ni siquiera remotamente relacionados con las finanzas. Como un ejemplo, considera el paquete de código abiertoTensorFlow para el aprendizaje profundo, desarrollado y mantenido por Google Inc. y utilizado por (entre otros) su empresa matriz Alphabet Inc. en sus esfuerzos por construir, producir y vender coches autoconducidos.

Aunque seguro que no está ni remotamente relacionado con el problema de negociar acciones de forma automática y algorítmica, TensorFlow puede utilizarse, por ejemplo, para predecir los movimientos de los mercados financieros. El capítulo 15 ofrece varios ejemplos al respecto.

Uno de los paquetes de Python más utilizados para ML es scikit-learn. El código que sigue muestra cómo, de forma muy simplificada, se pueden utilizar algoritmos de clasificación de ML para predecir la dirección de los futuros movimientos de los precios del mercado y basar una estrategia algorítmica de negociación en esas predicciones. Todos los detalles se explican en el Capítulo 15, por lo que el ejemplo es bastante conciso. En primer lugar, la importación de datos y la preparación de los datos característicos (datos de rentabilidad logarítmica direccional rezagada):

In [36]: import numpy as np
         import pandas as pd

In [37]: data = pd.read_csv('../../source/tr_eikon_eod_data.csv',
                            index_col=0, parse_dates=True)
         data = pd.DataFrame(data['AAPL.O'])  1
         data['Returns'] = np.log(data / data.shift())  2
         data.dropna(inplace=True)

In [38]: lags = 6

In [39]: cols = []
         for lag in range(1, lags + 1):
             col = 'lag_{}'.format(lag)
             data[col] = np.sign(data['Returns'].shift(lag))  3
             cols.append(col)
         data.dropna(inplace=True)
1

Selecciona los datos históricos de fin de día de las acciones de Apple Inc. (AAPL.O).

2

Calcula los rendimientos del registro sobre el historial completo.

3

Genera columnas DataFrame con datos de rentabilidad logarítmica retardada direccional (+1 o -1).

A continuación, la instanciación de un objeto modelo para un algoritmo de máquina de vectores de soporte (SVM), el ajuste del modelo y el paso de predicción. La Figura 1-2 muestra que la estrategia de negociación basada en la predicción, yendo largo o corto en las acciones de Apple Inc. en función de la predicción, supera a la inversión pasiva de referencia en las propias acciones:

In [40]: from sklearn.svm import SVC

In [41]: model = SVC(gamma='auto')  1

In [42]: model.fit(data[cols], np.sign(data['Returns']))  2
Out[42]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
           decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
           max_iter=-1, probability=False, random_state=None, shrinking=True,
           tol=0.001, verbose=False)

In [43]: data['Prediction'] = model.predict(data[cols])  3

In [44]: data['Strategy'] = data['Prediction'] * data['Returns']  4

In [45]: data[['Returns', 'Strategy']].cumsum().apply(np.exp).plot(
                 figsize=(10, 6));  5
1

Instancia del objeto modelo.

2

Ajusta el modelo, dadas las características y los datos de la etiqueta (todos direccionales).

3

Utiliza el modelo ajustado para crear las predicciones (en la muestra), que son las posiciones de la estrategia de negociación en ese momento (largas o cortas).

4

Calcula los rendimientos logarítmicos de la estrategia de negociación dados los valores de predicción y los rendimientos logarítmicos de referencia.

5

Traza el rendimiento de la estrategia de negociación basada en ML comparado con el rendimiento de la inversión pasiva de referencia.

pff2 0102
Figura 1-2. Estrategia de negociación algorítmica basada en ML frente a la inversión pasiva de referencia en acciones de Apple Inc.

El enfoque simplificado adoptado aquí no tiene en cuenta los costes de transacción, ni separa el conjunto de datos en subconjuntos de entrenamiento y de prueba. Sin embargo, muestra lo sencilla que es la aplicación de algoritmos de ML a los datos financieros, al menos en un sentido técnico; en la práctica, hay que tener en cuenta una serie de temas importantes (véase López de Prado (2018)).

AI-First Finanzas

La IA remodelará las finanzas como ya lo han hecho otros campos. La disponibilidad de grandes cantidades de datos financieros a través de API programáticas funciona como un facilitador en este contexto. En el Capítulo 13 se presentan métodos básicos de IA, ML y DL, y en los Capítulos 15 y16 se aplican a la negociación algorítmica. Sin embargo, un tratamiento adecuado de las finanzas basadas en la IA requeriría un libro dedicado por completo al tema.

La IA en las finanzas, como extensión natural de las finanzas basadas en datos, es sin duda un campo fascinante y apasionante, tanto desde el punto de vista de la investigación como del profesional. Aunque este libro utiliza varios métodos de IA, ML y DL en diferentes contextos, en general se centra -de acuerdo con el subtítulo del libro- en las técnicas y enfoques fundamentales de Python necesarios para las finanzas basadas en datos. Sin embargo, son igualmente importantes para las finanzas basadas en la IA.

Conclusión

Python como lenguaje -y más aún como ecosistema- es un marco tecnológico ideal tanto para la industria financiera en su conjunto como para el individuo que trabaja en finanzas. Se caracteriza por una serie de ventajas, como una sintaxis elegante, enfoques de desarrollo eficientes y facilidad de uso tanto para la creación de prototipos como para la producción. Con su enorme cantidad de paquetes, bibliotecas y herramientas disponibles, Python parece tener respuestas a la mayoría de las cuestiones planteadas por la evolución reciente del sector financiero en términos de análisis, volumen y frecuencia de datos, cumplimiento y regulación, así como de la propia tecnología. Tiene el potencial de proporcionar un marco único, potente y coherente con el que agilizar los esfuerzos de desarrollo y producción de principio a fin, incluso en las instituciones financieras más grandes.

Además, Python se ha convertido en el lenguaje de programación preferido para la inteligencia artificial en general y el aprendizaje automático y profundo en particular. Por tanto, Python es el lenguaje adecuado para las finanzas basadas en datos, así como para las finanzas basadas en IA, dos tendencias recientes que están a punto de remodelar las finanzas y la industria financiera de forma fundamental.

Otros recursos

Los siguientes libros cubren con más detalle varios aspectos que sólo se han tocado en este capítulo (por ejemplo, herramientas Python, análisis de derivados, aprendizaje automático en general y aprendizaje automático en finanzas):

  • Hilpisch, Yves (2015). Análisis de Derivados con Python. Chichester, Inglaterra: Wiley Finance.

  • López de Prado, Marcos (2018). Avances en Aprendizaje Automático Financiero. Hoboken, NJ: John Wiley & Sons.

  • VanderPlas, Jake (2016). Manual de Ciencia de Datos en Python. Sebastopol, CA: O'Reilly.

En lo que respecta a la negociación algorítmica, la empresa del autor ofrece una serie de programas de formación en línea centrados en Python y otras herramientas y técnicas necesarias en este campo de rápido crecimiento:

Las fuentes a las que se hace referencia en este capítulo son, entre otras, las siguientes:

  • Ding, Cubillas (2010). "Optimización de la infraestructura de fijación de precios y valoración de OTC". Celent.

  • Lewis, Michael (2014). Flash Boys. Nueva York: W. W. Norton & Company.

  • Patterson, Scott (2010). Los cuantos. Nueva York: Crown Business.

1 Python, por ejemplo, es uno de los principales lenguajes utilizados en el Programa de Maestría en Ingeniería Financiera del Baruch College de la Universidad de la Ciudad de Nueva York. La primera edición de este libro se utiliza en un gran número de universidades de todo el mundo para enseñar Python para el análisis financiero y la creación de aplicaciones.

2 Consulta http://wiki.python.org/moin/BeginnersGuide, donde encontrarás enlaces a muchos recursos valiosos tanto para desarrolladores como para no desarrolladores que se inician en Python.

Get Python para Finanzas, 2ª Edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.