Del efectivo a las acciones: mira tu cartera en acción
Este es el capítulo 5 de mi serie Construyendo Stocksimpy, donde creo desde cero una librería ligera en Python para backtesting de acciones.
En la entrega anterior expliqué por qué quiero que Stocksimpy se mantenga simple: cada clase con un propósito claro, en lugar de volcarlo todo en una única clase de backtester gigante.
Por eso creé StockData para gestionar el histórico de precios. Pero conocer solo los precios no basta: necesitaba registrar el efectivo disponible, las operaciones y las posiciones. Ahí entra Portfolio.
¿Por qué una clase de cartera?
Los indicadores no sirven sin una cuenta que registre tus operaciones; por eso construí Portfolio.
Portfolio es, esencialmente, el contable que sigue cada flujo de dinero. Podrías llevarlo en un DataFrame dentro del bucle de backtesting, sí. Entonces, ¿por qué usar Portfolio? Por el principio DRY, No te repitas. Si puedes encapsular la misma lógica y reutilizarla, tu código es más limpio, menos propenso a errores y más fácil de mantener.
Además, contar con Portfolio me permitió separar el flujo de caja de la lógica del backtesting. En vez de mezclarlo todo, cada pieza hace su trabajo. De lo contrario, terminarías reescribiendo la lógica de compra y venta una y otra vez; y corregir un detalle menor en muchos sitios es la receta perfecta para errores sutiles.
Tres responsabilidades clave
Cuando piensas en una cartera de trading, piensas en dinero total, acciones y otros activos. Eso es exactamente lo que hace Portfolio, y también todo lo relacionado con el flujo y el registro de ese dinero y posiciones.
Almacenamiento de efectivo y posiciones
En su núcleo, Portfolio mantiene tu efectivo disponible con self.cash y todas tus posiciones con self.holdings. Suena simple, pero tener esta información en un único lugar evita errores y mantiene el código ordenado.
Operaciones de compra y venta
No quería que el bucle de backtesting accediera directamente al efectivo y a las posiciones. Así que la segunda responsabilidad son las operaciones de compra y venta. Comprar y vender exige que Portfolio conozca el precio actual del activo, lo que podría acoplarlo a StockData, algo que quería evitar para poder usar Portfolio de forma independiente.
¿La solución? Añadí un parámetro price al método exec_trade, de manera que el precio pueda suministrarlo el bucle de backtesting o el propio usuario. Toda la modificación real de efectivo y posiciones se realiza a través de exec_trade.
Seguimiento del historial
Puede parecer que Portfolio ya está completo, pero falta una tercera responsabilidad crítica: registrar el historial. El usuario debe poder consultar los cambios cuando la simulación compra o vende, y ver la valoración total. Esto se resolvió con _log_trade, que registra cada operación en self.trade_log.
Ejemplo rápido: empiezas con 10000, compras 10 acciones de NVDA a 170 en una fecha concreta, llamas a Portfolio.exec_trade con symbol NVDA, trade_type Buy, price 170, shares 10 y date la fecha actual. La cartera descuenta el efectivo, incrementa las acciones de NVDA y deja constancia en el registro de operaciones.
Un bug interesante: Python no permite incrementar el valor de una clave que aún no existe en un diccionario. Solución elegante: usar defaultdict(int) del módulo collections, que inicializa nuevas claves a 0 automáticamente.
¿Y ahora qué?
Portfolio está diseñado para funcionar de forma independiente, así que puedes integrarlo en bucles de backtesting personalizados. Ya maneja múltiples símbolos sin problema, aunque la primera versión del Backtester quizás no los exprima al máximo. Lo siguiente: la lógica de backtesting.
Acerca de Q2BSTUDIO
En Q2BSTUDIO desarrollamos aplicaciones a medida y software a medida que aplican los mismos principios de arquitectura limpia y separación de responsabilidades que ves en Stocksimpy. Integramos inteligencia artificial e IA para empresas con agentes IA para automatizar decisiones, ofrecer analítica avanzada y acelerar el time to market. También ayudamos con ciberseguridad, servicios cloud AWS y Azure, servicios inteligencia de negocio, cuadros de mando con Power BI y automatización de procesos, para que tus soluciones sean seguras, escalables y orientadas a resultados.
¿Sugerencias para Stocksimpy? Me encantará leer tus ideas y mejoras para que esta librería sea útil a quien empieza en finanzas cuantitativas.
Antes de irte, si te gustó: deja una estrella a StockSimPy en Github, sígueme en Twitter X y en Bluesky, explora más artículos en Medium o conectemos en LinkedIn.