Los mejores paquetes (librarias) de finanzas de Python
La popularidad del lenguaje de programación Python se debe, al menos en parte, a la versatilidad que ofrece. Además del vasto número de casos de uso en el desarrollo web y de aplicaciones, Python proporciona las herramientas para construir e implementar cualquier tipo de modelo científico o financiero, independientemente del origen o tipo de datos. Esta versatilidad se habilita gracias a la extensa biblioteca estándar que ofrece una variedad de facilidades destinadas a mejorar la funcionalidad y portabilidad del lenguaje. Para aplicaciones más específicas, el Índice de Paquetes de Python (PyPI) proporciona paquetes adicionales que amplían las capacidades de Python para satisfacer las necesidades de cada usuario.
Por estas razones, Python ha demostrado ser una herramienta formidable en el desarrollo de tecnologías financieras innovadoras. Desde procesar los números brutos hasta crear Interfaces Gráficas de Usuario (GUIs) estéticamente agradables pero intuitivas, existen numerosos paquetes para ayudar a los usuarios a construir sus propios modelos financieros. En este artículo, hablaremos de las principales librerías de Python para finanzas y modelado financiero con algunos ejemplos básicos.
Todos estos paquetes pueden encontrarse en PyPI.
Las Librerías de Python Más Útiles para Finanzas
El campo de las tecnologías financieras es vasto, abarcando desde seguros, préstamos y comercio, hasta banca electrónica y otros servicios de pago. Este artículo se centra en aplicaciones específicas para finanzas cuantitativas, que requieren tareas de programación como la importación y transformación de datos, el análisis de series temporales y riesgos, el comercio y las pruebas retrospectivas, la integración con Excel y la visualización de datos. Presento algunos de los mejores paquetes para llevar a cabo cada tarea.
NumPy
En última instancia, todos los modelos financieros se basan en procesar números. Los primeros paquetes en esta lista proporcionan el marco para hacerlo. El primero es NumPy. NumPy es el paquete más esencial para la computación científica y matemática en Python. No solo introduce arrays y matrices n-dimensionales en Python, sino que también contiene algunas funciones matemáticas básicas para manipular estas estructuras de datos. La mayoría de los paquetes de Python de nivel superior para finanzas mencionados más adelante en esta lista dependen de NumPy.
Ejemplo básico de cómo usar NumPy para crear y manipular arrays:
import numpy as np # Crear un array unidimensional array_unidimensional = np.array([1, 2, 3, 4, 5]) print("Array unidimensional:") print(array_unidimensional) # Crear un array bidimensional array_bidimensional = np.array([[1, 2, 3], [4, 5, 6]]) print("\nArray bidimensional:") print(array_bidimensional) # Operaciones básicas con arrays print("\nOperaciones básicas con arrays:") print("Suma:", array_unidimensional + 10) # Sumar 10 a cada elemento print("Multiplicación:", array_unidimensional * 2) # Multiplicar por 2 cada elemento # Funciones matemáticas print("\nFunciones matemáticas:") print("Seno:", np.sin(array_unidimensional)) print("Exponencial:", np.exp(array_unidimensional)) # Indexación y rebanado (slicing) print("\nIndexación y rebanado:") print("Primer elemento:", array_unidimensional[0]) print("Últimos dos elementos:", array_unidimensional[-2:]) print("Elementos del segundo al cuarto:", array_unidimensional[1:4]) # Operaciones con arrays bidimensionales print("\nOperaciones con arrays bidimensionales:") print("Suma por columnas:", np.sum(array_bidimensional, axis=0)) print("Media por filas:", np.mean(array_bidimensional, axis=1)) # Crear un array de números equiespaciados array_equiespaciado = np.linspace(0, 1, 5) # Crea 5 números equiespaciados entre 0 y 1 print("\nArray equiespaciado:") print(array_equiespaciado)
Este ejemplo muestra algunas operaciones básicas y funciones disponibles en NumPy.
SciPy
El paquete NumPy proporciona estructuras matemáticas básicas para manipular y almacenar datos. Pero para construir modelos sofisticados basados en estos datos, se necesita un conjunto de herramientas y operaciones estadísticas más avanzadas. Aquí entra en juego SciPy. Este paquete proporciona funciones y algoritmos fundamentales para los cálculos científicos avanzados necesarios para construir cualquier modelo estadístico. Estos incluyen algoritmos para interpolación, optimización, agrupamiento, transformación e integración de datos. Estas operaciones son esenciales al realizar cualquier tipo de análisis de datos o construir cualquier tipo de modelo predictivo.
Para demostrar la interpolación, primero uso NumPy para crear algunos puntos de datos con una función arbitraria y luego comparo diferentes métodos de interpolación:
import numpy as np import matplotlib.pyplot as plt from scipy import interpolate # Crear puntos de datos usando una función arbitraria x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 1, 4, 3, 6]) # Crear una función para la interpolación interpolation_methods = ['linear', 'quadratic', 'cubic'] x_new = np.linspace(1, 5, 1000) # Nuevos puntos de datos para la interpolación suave plt.figure(figsize=(10, 6)) # Interpolar y trazar los resultados para diferentes métodos for method in interpolation_methods: f = interpolate.interp1d(x, y, kind=method) y_new = f(x_new) plt.plot(x_new, y_new, label=f'{method} interpolation') # Trazar los puntos de datos originales plt.scatter(x, y, color='red', label='Original Data Points') plt.xlabel('X') plt.ylabel('Y') plt.title('Interpolación con Diferentes Métodos') plt.legend() plt.grid(True) plt.show()
Este código crea puntos de datos usando la matriz x y y, y luego utiliza diferentes métodos de interpolación (lineal, cuadrática y cúbica) para interpolar los datos y trazar las curvas resultantes.
Este código generará un gráfico que muestra los puntos de datos originales y las curvas de interpolación suavizadas utilizando diferentes métodos.
Pandas
NumPy y SciPy establecen las bases matemáticas. Por otro lado, el paquete Pandas establece una estructura de datos intuitiva y fácil de usar, un DataFrame, diseñado específicamente para análisis y construcción de modelos. Está basado en los arrays que introduce NumPy y está optimizado para datos tabulares, multidimensionales y heterogéneos. Las manipulaciones más comunes, como groupby, unir, combinar o llenar, reemplazar y completar valores nulos, se pueden realizar en una sola línea.
Además, el paquete proporciona funciones para importar datos desde una variedad de formatos estándar y otras para trazar rápidamente, recuperar estadísticas básicas o generar datos de salida.
import pandas as pd # Crear el primer DataFrame data1 = {'A': [1, 2, 3], 'B': [4, 5, 6]} df1 = pd.DataFrame(data1) # Crear el segundo DataFrame data2 = {'A': [7, 8, 9], 'B': [10, 11, 12]} df2 = pd.DataFrame(data2) # Concatenar los dos DataFrames result = pd.concat([df1, df2]) # Mostrar el DataFrame concatenado print("DataFrame Concatenado:") print(result) # Función para extraer filas basadas en un valor en la columna 'A' def extract_rows_by_value(df, column_name, value): extracted_rows = df[df[column_name] == value] return extracted_rows # Ejemplo de uso de la función para extraer filas con el valor 2 en la columna 'A' value_to_extract = 2 extracted_rows = extract_rows_by_value(result, 'A', value_to_extract) # Mostrar las filas extraídas print(f"\nFilas con el valor {value_to_extract} en la columna 'A':") print(extracted_rows)
Este código primero crea dos DataFrames (df1 y df2), los concatena en el DataFrame result, luego muestra el DataFrame concatenado. A continuación, hay una función llamada extract_rows_by_value que puede ser utilizada para extraer filas basadas en un valor específico en una columna particular. En el ejemplo dado, se extraen las filas con el valor 2 en la columna ‘A’. Ten en cuenta que puedes cambiar el valor y la columna según tus necesidades.
Statsmodels
SciPy proporciona una biblioteca de herramientas estadísticas que permiten a los usuarios construir un modelo, y Pandas facilita su implementación. El paquete statsmodels se basa en estos paquetes al implementar pruebas más avanzadas de diferentes modelos estadísticos. Para cualquier modelo dado, está disponible una extensa lista de estadísticas de resultados y diagnósticos para cada estimador, con el objetivo de proporcionar al usuario una imagen completa del rendimiento del modelo. Los resultados se prueban frente a paquetes estadísticos existentes para garantizar su corrección.
Como ejemplo, importamos un conjunto de datos integrado y lo sometemos a un ajuste a la distribución de Poisson:
import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt # Generar datos aleatorios que sigan una distribución de Poisson np.random.seed(0) data = np.random.poisson(lam=5, size=100) # 'lam' es el parámetro lambda de la distribución de Poisson # Ajustar los datos a una distribución de Poisson utilizando statsmodels poisson_model = sm.Poisson(data) poisson_results = poisson_model.fit() # Mostrar los resultados del ajuste print(poisson_results.summary()) # Histograma de los datos plt.hist(data, bins=np.arange(-0.5, 15.5, 1), alpha=0.7, label='Datos') plt.xlabel('Valor') plt.ylabel('Frecuencia') plt.title('Histograma de Datos y Ajuste de Poisson') plt.legend() plt.grid(True) plt.show()
El resultado debería ser algo similar a lo siguiente:
Zipline
Zipline es una biblioteca de código abierto desarrollada por Quantopian Inc. que se utiliza para el desarrollo y la ejecución de algoritmos de trading algorítmico. Está escrita en Python y proporciona una infraestructura para backtesting (pruebas retrospectivas) y ejecución en tiempo real de estrategias de trading.
Zipline permite a los desarrolladores definir estrategias de trading utilizando datos históricos y evaluar cómo habrían funcionado esas estrategias en el pasado. También es capaz de manejar eventos como órdenes de compra/venta, ejecuciones y transacciones, lo que permite a los usuarios simular el comportamiento de un algoritmo en un entorno de mercado simulado.
A continuación se muestra un ejemplo del uso de Zipline:
from zipline.api import order, record, symbol def initialize(context): pass def handle_data(context, data): order(symbol('AAPL'), 10) # Compra 10 acciones de Apple (AAPL) record(AAPL=data.current(symbol('AAPL'), 'price')) # Registra el precio de las acciones de Apple # Configuración para realizar el backtest start_date = '2010-01-01' end_date = '2023-01-01' # Importar Zipline y ejecutar el backtest from zipline import run_algorithm from zipline.utils.calendars import get_calendar if __name__ == '__main__': run_algorithm( start=start_date, end=end_date, initialize=initialize, handle_data=handle_data, capital_base=100000, # Capital inicial para el backtest data_frequency='daily', bundle='quandl', # Fuente de datos (requiere configuración adicional, consulta la documentación de Zipline) trading_calendar=get_calendar('NYSE'), )
Este ejemplo ejecutará un backtest desde el 1 de enero de 2010 hasta el 1 de enero de 2023. La estrategia de trading es muy simple: compra 10 acciones de Apple (AAPL) cada vez que se llame a la función handle_data. También registra el precio de las acciones de Apple en cada iteración.
Quandl
Hasta ahora, los paquetes que he mencionado son imparciales respecto al tipo de datos que se están considerando. Por supuesto, al considerar modelos financieros, necesitamos datos financieros. Aquí es donde Quandl entra en juego.
Quandl es una plataforma en línea que proporciona acceso a una amplia gama de datos financieros, económicos y alternativos. Reúne información de diversas fuentes, incluyendo gobiernos, organizaciones internacionales y proveedores de datos privados. Quandl es conocida por ofrecer datos de alta calidad y confiables para su uso en análisis financiero, modelado cuantitativo, investigación académica y más.
La plataforma permite a los usuarios buscar, acceder y descargar datos en varios formatos, como archivos CSV y JSON. También proporciona una API para acceder a los datos de forma programática, lo que facilita su integración en aplicaciones y análisis automatizados.
El módulo de Quandl para Python brinda a los usuarios acceso a una vasta colección de datos económicos, financieros y de mercado recopilados de bancos centrales, gobiernos, organizaciones multinacionales y muchas otras fuentes. La mayoría de los conjuntos de datos en bruto son gratuitos para acceder después del registro (necesitas una clave de API), con conjuntos de datos más avanzados y detallados disponibles a un costo.
A continuación mostramos un script que hace uso de Quandl en Python:
import quandl # Configurar tu clave de API de Quandl quandl.ApiConfig.api_key = 'TU_CLAVE_DE_API' # Obtener datos históricos de precios de Apple (AAPL) desde Quandl data = quandl.get('WIKI/AAPL', start_date='2022-01-01', end_date='2022-12-31') # Mostrar los primeros registros del conjunto de datos print(data.head())
En este ejemplo, ‘WIKI/AAPL’ representa el código de Quandl para los datos históricos de precios de las acciones de Apple. Puedes reemplazarlo con el código correspondiente a otros activos financieros que estés interesado en consultar.
Recuerda reemplazar ‘TU_CLAVE_DE_API’ con tu clave de API de Quandl para autenticarte y acceder a los datos. Además, ajusta las fechas de inicio (start_date) y fin (end_date) según el período de tiempo que desees consultar.
Este código recuperará los datos históricos de precios de las acciones de Apple para el año 2022 y mostrará los primeros registros del conjunto de datos.
Pyfolio
Pyfolio es una biblioteca de Python de código abierto diseñada para evaluar el rendimiento y el riesgo de carteras de inversión. Fue desarrollada por Quantopian, una plataforma de trading algoritmico, y está especialmente orientada hacia la evaluación y análisis de carteras creadas mediante algoritmos de trading algorítmico. Pyfolio proporciona herramientas para realizar un análisis detallado de carteras y estrategias de trading.
Algunas de las características clave de Pyfolio incluyen:
- Evaluación del Rendimiento: Pyfolio permite evaluar el rendimiento de la cartera, incluyendo medidas como el rendimiento acumulado, el rendimiento diario y las tasas de rendimiento anualizadas.
- Descomposición de Rendimientos: La biblioteca puede descomponer el rendimiento de una cartera en diferentes fuentes, como la contribución al rendimiento de cada activo individual.
- Análisis del Riesgo: Pyfolio puede ayudar a analizar el riesgo de la cartera mediante medidas como la volatilidad y el análisis de las pérdidas.
- Visualizaciones: Proporciona herramientas para crear visualizaciones gráficas que ayudan a entender el comportamiento de la cartera a lo largo del tiempo.
Es importante tener en cuenta que Pyfolio está diseñado para ser utilizado en el contexto de carteras de inversión, especialmente aquellas gestionadas algorítmicamente. Puede ser una herramienta valiosa para analizar y entender el rendimiento y el riesgo asociado con las estrategias de trading.
A continuación se muestra un ejemplo del uso de Pyfolio:
import yfinance as yf import pandas as pd import pyfolio as pf import matplotlib.pyplot as plt # Obtener datos históricos de Yahoo Finance para las acciones de Apple, Alphabet y Microsoft tickers = ['AAPL', 'GOOGL', 'MSFT'] data = yf.download(tickers, start='2020-01-01', end='2022-01-01')['Adj Close'] # Calcular los retornos diarios de las acciones returns = data.pct_change().dropna() # Crear una cartera ponderada igualmente entre las tres acciones weights = [1/3, 1/3, 1/3] portfolio_returns = returns.dot(weights) # Analizar la cartera utilizando Pyfolio pf.create_returns_tear_sheet(portfolio_returns) # Mostrar gráfico de Pyfolio plt.show()
Para utilizar Pyfolio para analizar una cartera compuesta por acciones de Apple (AAPL), Alphabet (GOOGL) y Microsoft (MSFT), primero necesitas tener datos históricos de estas acciones. En este ejemplo, usaremos la biblioteca yfinance para obtener los datos de Yahoo Finance.
Este código descarga datos históricos de las acciones de Apple, Alphabet y Microsoft desde el 1 de enero de 2020 hasta el 1 de enero de 2022. Luego, calcula los retornos diarios y crea una cartera igualmente ponderada entre las tres acciones.
Después, utiliza Pyfolio para analizar la cartera y crea un tear sheet (hoja de análisis) que muestra diversas métricas de rendimiento y riesgo, junto con visualizaciones gráficas que ayudan a entender el comportamiento de la cartera.
Ten en cuenta que este es un ejemplo básico y que Pyfolio ofrece muchas más funcionalidades para un análisis de cartera más detallado y avanzado.
Los reportes que genera son los siguientes:
Los dos siguientes paquetes son alternativas al uso de zipline y pyfolio.
TA-Lib
TA-Lib es una popular biblioteca de análisis técnico financiero. Está escrita en C pero cuenta con una envoltura (wrapper) de Python y se utiliza ampliamente en el mundo del trading y las finanzas para realizar análisis técnico en datos financieros. TA-Lib proporciona una amplia gama de herramientas y funciones para analizar series temporales financieras y generar señales de trading basadas en patrones y tendencias del mercado.
Algunas de las características clave de TA-Lib incluyen:
- Indicadores Técnicos: TA-Lib incluye una variedad de indicadores técnicos populares como medias móviles, Bandas de Bollinger, Estocásticos, RSI (Índice de Fuerza Relativa), MACD (Convergencia/Divergencia de Medias Móviles) y muchos otros.
- Patrones de Velas: Puede identificar patrones de velas japonesas comunes, como dojis, envolventes y martillos.
- Funciones de Transformación y Volatilidad: Ofrece funciones para calcular volatilidad, así como transformaciones de precio como la diferencia entre los precios de cierre.
- Interfaz con Diversos Lenguajes de Programación: Aunque está escrita en C, TA-Lib tiene envoltorios (wrappers) para varios lenguajes, incluyendo Python, lo que facilita su uso en diferentes entornos de desarrollo.
La siguiente imagen muestra cómo puede usarse este paquete para calcular la media móvil simple y el RSI:
import yfinance as yf import talib import numpy as np # Obtener datos históricos del par EUR/USD desde Yahoo Finance eurusd = yf.download('EURUSD=X', start='2022-01-01', end='2022-12-31') # Calcular la Media Móvil Simple (SMA) de 20 períodos eurusd['SMA_20'] = talib.SMA(eurusd['Close'], timeperiod=20) # Calcular el Índice de Fuerza Relativa (RSI) de 14 períodos eurusd['RSI_14'] = talib.RSI(eurusd['Close'], timeperiod=14) # Mostrar los últimos registros del DataFrame con SMA y RSI calculados print(eurusd.tail())
# Puedes también visualizar los datos y las líneas de SMA y RSI usando bibliotecas como Matplotlib
QuantLib
La segunda alternativa a zipline y pyfolio es QuantLib. Similar a TA-Lib, QuantLib está escrita en C++ y luego se exporta a Python. El proyecto QuantLib tiene como objetivo crear una biblioteca gratuita y de código abierto para modelado, trading y gestión de riesgos. El paquete contiene herramientas para diseñar e implementar algoritmos avanzados que incluyen características como convenciones de mercado, modelos de curvas de rendimiento, solucionadores, ecuaciones en derivadas parciales (PDEs), Monte Carlo y otros.
Algunas características destacadas de QuantLib incluyen:
- Valoración de Instrumentos Financieros: QuantLib permite valorar una amplia gama de instrumentos financieros, como opciones, bonos, swaps y otros derivados complejos.
- Curvas de Rendimiento: Proporciona herramientas para construir y manipular curvas de rendimiento, que son fundamentales para valorar instrumentos financieros a lo largo del tiempo.
- Modelos Estocásticos: Ofrece modelos estocásticos para simular el comportamiento futuro de los precios de los activos financieros, lo que es esencial para el cálculo del riesgo.
- Solvers y Optimización: Incluye solucionadores numéricos para resolver ecuaciones y sistemas de ecuaciones, así como algoritmos de optimización.
- Herramientas de Cálculo: Proporciona herramientas para calcular medidas de riesgo, como el Valor en Riesgo (VaR) y el Estrés de Escenarios, para evaluar la sensibilidad de las carteras financieras a diferentes situaciones del mercado.
Aquí tenemos un ejemplo básico de cómo usar QuantLib para calcular el precio de un bono:
import QuantLib as ql # Definir parámetros del bono face_value = 1000 # Valor nominal del bono coupon_rate = 0.05 # Tasa de cupón del bono (5%) maturity_date = ql.Date(15, 11, 2023) # Fecha de vencimiento del bono (15 de noviembre de 2023) issue_date = ql.Date(15, 11, 2020) # Fecha de emisión del bono (15 de noviembre de 2020) calendar = ql.UnitedStates() # Calendario para calcular los días hábiles day_count = ql.Thirty360() # Método de cálculo de intereses (30/360) # Crear objetos para el bono y la tasa de interés bond = ql.FixedRateBond(2, ql.UnitedStates(), face_value, issue_date, maturity_date, ql.Period('1Y'), [coupon_rate], day_count) interest_rate = ql.FixedRateCoupon(0, face_value, issue_date, maturity_date, ql.Period('1Y'), day_count) # Calcular el precio del bono engine = ql.DiscountingBondEngine(ql.YieldTermStructureHandle(ql.FlatForward(0, ql.NullCalendar(), ql.QuoteHandle(ql.SimpleQuote(0.05)), ql.Thirty360()))) bond.setPricingEngine(engine) price = bond.cleanPrice() accrued_interest = bond.accruedAmount() # Calcular el precio total del bono (incluyendo intereses devengados) total_price = price + accrued_interest # Imprimir el precio total del bono print("Precio total del bono: ${:.2f}".format(total_price))
En este ejemplo, se crea un bono con un valor nominal de $1000, una tasa de cupón del 5%, emitido el 15 de noviembre de 2020 y venciendo el 15 de noviembre de 2023. La biblioteca QuantLib se utiliza para calcular el precio del bono, incluyendo el interés devengado hasta la fecha actual.
Matplotlib
Los paquetes de Python mencionados anteriormente para finanzas establecen fuentes de datos financieros, estructuras de datos óptimas para datos financieros, así como modelos estadísticos y mecanismos de evaluación. Pero ninguno proporciona una de las herramientas más importantes de Python para modelado financiero: la visualización de datos (todas las visualizaciones en este artículo están impulsadas por matplotlib).
La visualización no solo es importante para entender las tendencias dentro de los datos financieros, sino también para transmitir percepciones a personas no técnicas. Existen diversos paquetes de visualización de datos en Python, cada uno con ventajas y desventajas, pero el más fácil de implementar para modelado financiero es matplotlib. Esto se debe principalmente al hecho de que muchos de los paquetes en esta lista ya dependen de matplotlib. Además, la documentación es abundante y la sintaxis es simple y directa.
Algunas de las características clave de Matplotlib incluyen:
- Variedad de Gráficos: Matplotlib permite crear una amplia variedad de gráficos, incluyendo gráficos de líneas, gráficos de dispersión, histogramas, gráficos de barras, gráficos de torta, gráficos de contorno, gráficos 3D y más.
- Personalización: Los usuarios pueden personalizar cada aspecto de un gráfico, desde el color y el estilo de línea hasta las etiquetas y leyendas. Esto proporciona un alto grado de flexibilidad en la presentación de datos.
- Interactividad: Aunque Matplotlib es conocido por crear gráficos estáticos, puede integrarse con otras bibliotecas como mplcursors y mplleaflet para agregar interactividad a los gráficos, lo que permite a los usuarios explorar datos en tiempo real.
- Amplia Integración: Matplotlib se integra bien con muchas otras bibliotecas y entornos de desarrollo en Python, lo que facilita su uso en combinación con otras herramientas para el análisis de datos y la visualización.
- Soporte para Diversos Formatos de Salida: Los gráficos creados con Matplotlib pueden guardarse en varios formatos, incluyendo PNG, PDF, SVG, y muchos otros, lo que facilita su inclusión en documentos y presentaciones.
Conclusiones
En resumen, los paquetes de análisis financiero en Python ofrecen un conjunto robusto de herramientas para profesionales en finanzas y analistas de datos. Estos paquetes permiten el acceso a datos financieros, el modelado de algoritmos complejos, la implementación de análisis estadísticos avanzados y la creación de visualizaciones impactantes.
Estos paquetes, junto con otros disponibles en el ecosistema de Python, hacen de Python una opción destacada para el análisis financiero. La combinación de su flexibilidad, versatilidad y una comunidad activa y en crecimiento, convierte a Python en un lenguaje esencial para los profesionales financieros y científicos de datos que buscan soluciones efectivas en el mundo de las finanzas y el análisis de inversiones.