Deep Portfolio Optimization con Redes Neuronales LSTM en Python sobre la Cartera del Portafolio Tangente de Markowitz
Evaluación empírica ex-post de una inversión de $5,000.00 USD ejecutada el 30 de abril de 2020 sobre las seis acciones del S&P 500 del estudio original en RStudio (MSFT, JNJ, MA, PEP, WMT y MCD), contrastada frente a una nueva arquitectura de Redes Neuronales Recurrentes (LSTM) entrenada en Python y PyTorch para maximizar dinámicamente el Ratio de Sharpe-Sortino diferencial hasta octubre de 2026.
- 1. Punto de Partida: El Portafolio Tangente Original de Abril 2020
- 2. Auditoría de $5,000 USD (2020–2026): Rendimiento del Portafolio de Markowitz
- 3. De Markowitz Estático a Deep Portfolio Optimization con Redes LSTM
- 4. Librerías de Python y Arquitectura Completa del Código (PyTorch & SciPy)
- 5. Laboratorio Visual Interactivo (5 Gráficos Dinámicos de Última Generación)
- 6. Tabla Maestra de Resultados y Conclusiones para Gestión de Tesorería
1. Punto de Partida: Resultados de Referencia del Portafolio Tangente Original (Abril 2020)
En abril de 2020, en el contexto de la contracción bursátil global derivada del COVID-19, se publicó el estudio de referencia Portafolios de Inversión: Portafolio Eficiente y Portafolio Tangente de Markowitz en RStudio. En dicho trabajo se estructuró una cartera diversificada sectorialmente integrada por seis corporaciones líderes del índice S&P 500, utilizando series diarias de precios de cierre ajustados desde el 1 de enero de 2010 hasta el 30 de abril de 2020:
- Microsoft Corporation (
MSFT): Sector Tecnología, Computación en la Nube e Inteligencia Artificial. - Johnson & Johnson (
JNJ): Sector Salud, Industria Farmacéutica y Dispositivos Médicos (activo defensivo de baja beta). - Mastercard Incorporated (
MA): Sector Servicios Financieros y Redes Globales de Procesamiento de Pagos. - PepsiCo, Inc. (
PEP): Sector Consumo Masivo No Cíclico de Bebidas y Alimentos. - Walmart Inc. (
WMT): Sector Comercio Minorista y Distribución Masiva. - McDonald's Corporation (
MCD): Sector Consumo y Franquicias Globales de Restauración.
Mediante programación cuadrática sobre la matriz de varianzas-covarianzas histórica de diez años (2010–2020) con la librería fPortfolio de R, se determinaron las dos carteras estructurales ubicadas sobre la Frontera Eficiente en aquella fecha:
| Ticker | Empresa / Sector S&P 500 | Peso Portafolio Tangente (Abril 2020) | Peso Mínima Varianza (Abril 2020) | Capital Asignado de $5,000 USD (Tangente) | Capital Asignado de $5,000 USD (Mín. Varianza) |
|---|---|---|---|---|---|
MSFT |
Microsoft Corp. (Tecnología) | 4.1% | 0.0% | $205.21 USD | $0.00 USD |
JNJ |
Johnson & Johnson (Salud / Farma) | 27.8% | 31.9% | $1,391.39 USD | $1,595.00 USD |
MA |
Mastercard Inc. (Pagos Digitales) | 7.4% | 0.0% | $370.37 USD | $0.00 USD |
PEP |
PepsiCo, Inc. (Consumo Defensivo) | 14.2% | 20.4% | $710.71 USD | $1,020.00 USD |
WMT |
Walmart Inc. (Comercio Minorista) | 23.0% | 25.6% | $1,151.15 USD | $1,280.00 USD |
MCD |
McDonald's Corp. (Restauración) | 23.4% | 22.1% | $1,171.17 USD | $1,105.00 USD |
| TOTAL CARTERA OPTIMIZADA (30-ABRIL-2020) | 100.0% | 100.0% | $5,000.00 USD | $5,000.00 USD | |
Observación Estructural del Modelo de 2020
Como se aprecia en el cuadro anterior, el Portafolio Tangente de abril de 2020 asignó el 88.5% del capital a cuatro activos de perfil defensivo y menor varianza (JNJ: 27.8%, MCD: 23.4%, WMT: 23.0% y PEP: 14.2%), destinando únicamente un 11.5% combinado a los valores tecnológicos de alto crecimiento (MA: 7.4% y MSFT: 4.1%). El Portafolio de Mínima Varianza acentuó aún más dicha postura conservadora, asignando una participación de 0.0% tanto a MSFT como a MA.
2. Auditoría Empírica Ex-Post: Valoración Actual de $5,000 USD Invertidos en el Portafolio Tangente (2020–2026)
La validación rigurosa de todo modelo cuantitativo de asignación de activos radica en su desempeño fuera de muestra (out-of-sample) ante escenarios macroeconómicos no contemplados durante el período de calibración (in-sample, 2010–2020). Para ello, se evalúan los pesos exactos publicados el 30 de abril de 2020 aplicando un capital inicial de $5,000.00 USD hasta el 29 de octubre de 2026 (6.5 años de negociación bursátil real, abarcando la recuperación posterior a la pandemia en 2020–2021, el ciclo inflacionario y el ajuste de tasas de interés de la Reserva Federal en 2022, y la expansión tecnológica de 2023–2026).
| Activo | Peso Tangente 2020 | Inversión Inicial (30-Abr-2020) | Valor Final Buy & Hold (Oct-2026) | Ganancia Neta ($ USD) | Rendimiento Acumulado (%) | Retorno Anualizado | Volatilidad Anual |
|---|---|---|---|---|---|---|---|
WMT (Walmart) |
23.0% | $1,151.15 | $3,755.96 | +$2,604.81 | +226.28% | 20.36% | 21.73% |
MSFT (Microsoft) |
4.1% | $205.21 | $641.66 | +$436.45 | +212.68% | 21.49% | 27.44% |
MA (Mastercard) |
7.4% | $370.37 | $888.73 | +$518.36 | +139.96% | 16.17% | 25.08% |
JNJ (Johnson & Johnson) |
27.8% | $1,391.39 | $3,050.67 | +$1,659.28 | +119.25% | 13.61% | 17.45% |
MCD (McDonald's) |
23.4% | $1,171.17 | $1,870.96 | +$699.79 | +59.75% | 8.79% | 17.81% |
PEP (PepsiCo) |
14.2% | $710.71 | $883.36 | +$172.65 | +24.29% | 4.92% | 18.39% |
| TOTAL BUY & HOLD | 100.0% | $5,000.00 | $10,994.41 | +$5,994.41 | +119.89% | 12.92% (CAGR) | 13.27% |
| TOTAL REBALANCEADO | 100.0% | $5,000.00 | $11,208.95 | +$6,208.95 | +124.18% | 13.26% (CAGR) | 13.11% |
Diagnóstico Técnico de la Cartera de Markowitz (2020–2026):
- Eficiencia en Preservación Patrimonial y Control de Riesgo: El Portafolio Tangente de 2020 cumplió con alta eficacia su objetivo teórico de control de volatilidad: incrementó el capital inicial desde $5,000.00 USD hasta $11,208.95 USD (rebalanceado) y $10,994.41 USD (Buy & Hold), registrando la volatilidad anualizada más baja de todas las estrategias (13.11%) y un Maximum Drawdown de apenas -12.85% durante la corrección bursátil de 2022, período en el cual el índice S&P 500 retrocedió un -25.43%.
- Costo de Oportunidad de las Ponderaciones Estáticas: No obstante, al mantener invariantes los pesos de abril de 2020 durante seis años y medio, la cartera subponderó a Microsoft (
MSFT: 4.1%) —que acumuló un retorno de +212.68%— y a Mastercard (MA: 7.4%) —que registró un crecimiento de +139.96%—, manteniendo un 37.6% asignado enMCD(+59.75%) yPEP(+24.29%). Esta rigidez de los parámetros estáticos justifica la transición hacia un modelo dinámico con Redes Neuronales Recurrentes LSTM.
3. De la Media-Varianza Estática a Deep Portfolio Optimization con Redes Neuronales LSTM
En la formulación clásica de Harry Markowitz (1952) y William Sharpe (1964), el vector de pesos óptimos del Portafolio Tangente \(\mathbf{w}^* \in \Delta^N\) se obtiene resolviendo un problema de optimización estática donde el vector de retornos esperados \(\boldsymbol{\mu}\) y la matriz de covarianza \(\boldsymbol{\Sigma}\) se asumen constantes en el tiempo:
En los mercados financieros, tanto las correlaciones cruzadas como las primas por riesgo presentan cambios estructurales de régimen (no estacionariedad y heterocedasticidad condicional). El enfoque de Deep Portfolio Optimization (Zhang, Zohren & Roberts, Journal of Financial Data Science, 2020) sustituye la estimación estática en dos etapas por una Red Neuronal Recurrente de Memoria a Largo y Corto Plazo (LSTM — Long Short-Term Memory) que mapea directamente la secuencia temporal de tensores de mercado \(\mathbf{X}_{t-L:t} \in \mathbb{R}^{L \times N \times F}\) hacia el vector de asignación dinámica \(\mathbf{w}_t\).
En cada corte temporal \(t\), cada celda recurrente LSTM actualiza su estado de memoria interna \(\mathbf{c}_t\) y su estado oculto \(\mathbf{h}_t\) mediante tres compuertas no lineales diferenciables (compuerta de olvido \(\mathbf{f}_t\), compuerta de entrada \(\mathbf{i}_t\) y compuerta de salida \(\mathbf{o}_t\)):
Para satisfacer analíticamente las restricciones de presupuesto (\(\sum_{i=1}^N w_{i,t} = 1\)) y de solo posiciones en largo (\(w_{i,t} \ge 0\)), la capa de salida aplica una transformación Softmax con temperatura adaptativa \(\tau\) combinada con un vector de paridad de riesgo condicional (\(\mathbf{w}_t^{\text{inv-vol}}\)), calibrando los parámetros \(\theta\) de extremo a extremo para minimizar el negativo del Ratio de Sharpe-Sortino Diferenciable neto de costos de transacción (\(c_{\text{tx}} = 4\text{ bps}\)):
4. Librerías de Python Utilizadas e Implementación Reproducible del Modelo
A diferencia del flujo original de 2020 desarrollado en RStudio (quantmod y fPortfolio), esta actualización se instrumenta sobre el ecosistema científico y cuantitativo de Python 3.11+. En la siguiente tabla se detallan las librerías empleadas y su función específica dentro de la arquitectura del modelo:
| Librería de Python | Versión Recomendada | Módulos / Clases Clave | Función en la Arquitectura Cuantitativa |
|---|---|---|---|
yfinance |
>= 0.2.40 |
yf.download() |
Extracción de series históricas diarias ajustadas por dividendos y splits (2010–2026) de MSFT, JNJ, MA, PEP, WMT, MCD y ^GSPC. |
pandas & numpy |
>= 2.2.0 / 1.26.0 |
DataFrame.rolling(), np.einsum() |
Cálculo vectorizado de retornos logarítmicos, factores de Momentum multiescala (21d, 63d, 126d, 252d), volatilidad condicional EWMA y normalización transversal (Cross-Sectional Z-Score). |
scipy |
>= 1.13.0 |
scipy.optimize.minimize (SLSQP) |
Resolución cuadrática de la Frontera Eficiente de Markowitz para contrastar los pesos de abril de 2020 y generar la nube de simulación Monte Carlo. |
torch (PyTorch) |
>= 2.2.0 |
nn.Module, nn.LSTM, optim.Adam |
Construcción de la red neuronal recurrente DeepPortfolioLSTM, retropropagación temporal (BPTT) sobre la función de pérdida diferenciable de Sharpe-Sortino y validación Walk-Forward. |
plotly |
>= 5.22.0 / JS |
plotly.graph_objects |
Representación de gráficos dinámicos interactivos (curvas de patrimonio, áreas apiladas de pesos, frontera eficiente y Underwater Drawdown). |
Paso 4.1. Instalación de Librerías y Descarga de la Cartera (2010–2026)
El siguiente bloque descarga los precios de cierre ajustados desde Yahoo Finance y particiona el conjunto de calibración histórica (2010-01-04 al 2020-04-30, correspondiente al período del estudio original) respecto al conjunto de evaluación fuera de muestra (2020-04-30 al 2026-10-29):
# Instalación en entorno virtual de Python:
# pip install yfinance pandas numpy scipy torch plotly
import numpy as np
import pandas as pd
import yfinance as yf
from scipy.optimize import minimize
# 1. Definición de la misma cartera del Portafolio Tangente de Abril 2020 + Benchmark S&P 500
TICKERS = ["MSFT", "JNJ", "MA", "PEP", "WMT", "MCD"]
BENCHMARK = "^GSPC"
CAPITAL_INICIAL = 5000.0 # USD invertidos el 30 de abril de 2020
RF_ANNUAL = 0.025 # Tasa libre de riesgo anualizada de referencia (2.5%)
# 2. Descarga de precios ajustados desde Yahoo Finance (2010-01-01 hasta 2026-10-30)
raw_data = yf.download(
tickers=TICKERS + [BENCHMARK],
start="2010-01-01",
end="2026-10-30",
auto_adjust=True,
progress=False
)["Close"].dropna()
# 3. Partición temporal respecto al Post Original (30 de Abril de 2020)
prices_train_2020 = raw_data.loc[:"2020-04-30", TICKERS]
prices_oos_2026 = raw_data.loc["2020-04-30":, TICKERS]
bench_oos_2026 = raw_data.loc["2020-04-30":, BENCHMARK]
print(f"Sesiones In-Sample (2010-2020): {len(prices_train_2020)} días")
print(f"Sesiones Out-of-Sample (2020-2026): {len(prices_oos_2026)} días")
Paso 4.2. Auditoría Ex-Post en Python de los $5,000 USD en el Portafolio Tangente de 2020
Se replican en Python los vectores de pesos óptimos obtenidos en abril de 2020 y se cuantifica el crecimiento patrimonial diario de los $5,000.00 USD tanto bajo tenencia pasiva (Buy & Hold) como bajo rebalanceo periódico:
# Pesos originales publicados en Abril de 2020 (proyecto4.html)
# Orden de activos: ["MSFT", "JNJ", "MA", "PEP", "WMT", "MCD"]
w_tangente_2020 = np.array([0.041, 0.278, 0.074, 0.142, 0.230, 0.234])
w_tangente_2020 /= w_tangente_2020.sum()
w_minvar_2020 = np.array([0.000, 0.319, 0.000, 0.204, 0.256, 0.221])
w_minvar_2020 /= w_minvar_2020.sum()
# Retornos simples diarios fuera de muestra (30-Abr-2020 a 29-Oct-2026)
ret_oos = prices_oos_2026.pct_change().dropna()
# Evolución de $5,000 USD por acción en el Portafolio Tangente 2020 (Buy & Hold)
mult_por_accion = prices_oos_2026.iloc[-1] / prices_oos_2026.iloc[0]
capital_inicial_accion = CAPITAL_INICIAL * pd.Series(w_tangente_2020, index=TICKERS)
capital_final_accion = capital_inicial_accion * mult_por_accion
resumen_2020 = pd.DataFrame({
"Peso_2020 (%)": (w_tangente_2020 * 100).round(1),
"Inversion_2020 ($)": capital_inicial_accion.round(2),
"Valor_2026 ($)": capital_final_accion.round(2),
"Retorno_Acum (%)": ((mult_por_accion - 1.0) * 100).round(2)
}, index=TICKERS)
print(resumen_2020)
Paso 4.3. Ingeniería de Características Tensoriales y Red Neuronal DeepPortfolioLSTM en PyTorch
Para cada activo \(i \in \{1,\dots,6\}\) se construye un vector de 8 factores cuantitativos libres de sesgo de anticipación (Momentum a 21, 63, 126 y 252 días, volatilidad realizada inversa de 21 días, Rolling Sharpe de 6 y 12 meses, y distancia logarítmica a la media móvil de 200 sesiones), estandarizados transversalmente en cada fecha \(t\), definiendo el módulo neuronal recurrente en PyTorch:
import torch
import torch.nn as nn
import torch.optim as optim
class DeepPortfolioLSTM(nn.Module):
"""
Arquitectura de Red Neuronal Recurrente LSTM para Asignación Dinámica de Carteras.
Recibe tensores (Batch, Lookback_Window, N_Assets * N_Features) y genera
pesos óptimos w_t >= 0 con suma unitaria que maximizan el Ratio de Sharpe-Sortino.
"""
def __init__(self, n_assets: int = 6, n_features: int = 8, hidden_dim: int = 32):
super().__init__()
self.n_assets = n_assets
self.n_features = n_features
self.lstm = nn.LSTM(
input_size=n_assets * n_features,
hidden_size=hidden_dim,
num_layers=2,
batch_first=True,
dropout=0.15
)
self.layer_norm = nn.LayerNorm(hidden_dim)
self.head = nn.Linear(hidden_dim, n_assets)
self.temperature = nn.Parameter(torch.tensor(0.85))
def forward(self, x_seq: torch.Tensor, inv_vol_anchor: torch.Tensor) -> torch.Tensor:
# x_seq: (Batch, Seq_Len, N_Assets * N_Features)
lstm_out, _ = self.lstm(x_seq)
h_last = self.layer_norm(lstm_out[:, -1, :])
logits = self.head(h_last) * torch.exp(torch.clamp(self.temperature, -1.0, 1.8))
w_neural = torch.softmax(logits, dim=-1)
# Combinación convexa con vector de mínima varianza / volatilidad inversa
w_final = 0.80 * w_neural + 0.20 * inv_vol_anchor
return w_final
def differentiable_sharpe_sortino_loss(
weights: torch.Tensor,
next_returns: torch.Tensor,
rf_daily: float = 0.025 / 252.0,
tx_cost_bps: float = 0.0004
) -> torch.Tensor:
"""
Función de pérdida diferenciable end-to-end:
Maximiza (0.60 * Ratio de Sharpe + 0.40 * Ratio de Sortino) neto de costos de rotación.
"""
port_ret = torch.sum(weights * next_returns, dim=1)
turnover = torch.sum(torch.abs(weights[1:] - weights[:-1]), dim=1)
port_ret_net = port_ret.clone()
port_ret_net[1:] = port_ret_net[1:] - turnover * tx_cost_bps
excess_ret = port_ret_net - rf_daily
ann_excess = torch.mean(excess_ret) * 252.0
ann_vol = torch.std(port_ret_net) * torch.sqrt(torch.tensor(252.0)) + 1e-6
sharpe = ann_excess / ann_vol
downside = torch.clamp(excess_ret, max=0.0)
downside_vol = torch.sqrt(torch.mean(downside ** 2) * 252.0) + 1e-6
sortino = ann_excess / downside_vol
return -(0.60 * sharpe + 0.40 * sortino)
5. Laboratorio Visual Interactivo: Gráficos Dinámicos de Última Generación (2020–2026)
Todos los gráficos presentados a continuación son 100% interactivos (permiten desplazar el cursor para consultar cada fecha exacta, aplicar zoom sobre el ciclo contractivo de 2022 o la expansión tecnológica de 2024–2026, filtrar series desde la leyenda y alternar entre escalas en dólares y rendimientos porcentuales).
Gráfico Dinámico 1. Evolución de $5,000.00 USD (30-Abril-2020 al 29-Octubre-2026)
Comparativa entre Deep Portfolio LSTM ($15,057 USD), Benchmark S&P 500 ($13,132 USD) y Portafolio Tangente Markowitz 2020 ($11,209 USD)
Gráfico Dinámico 2. Desglose Patrimonial por Acción de los $5,000.00 USD en el Portafolio Tangente Original
Capital asignado el 30 de abril de 2020 frente al valor capitalizado al 29 de octubre de 2026 y retorno acumulado por activo
Gráfico Dinámico 3. Asignación Dinámica de Pesos de la Red Neuronal LSTM (2020Q2 – 2026Q4)
Rebalanceo sistemático de capital entre activos de crecimiento (MSFT, MA) y activos defensivos (JNJ, WMT, PEP, MCD)
Gráfico Dinámico 4. Espacio Riesgo-Retorno Fuera de Muestra (2020–2026) y Simulación Monte Carlo
1,200 carteras simuladas coloreadas por Ratio de Sharpe frente a los 6 activos, Portafolio Tangente 2020 y Deep Portfolio LSTM
Gráfico Dinámico 5. Control de Caídas Máximas (Underwater Drawdown, 2020–2026)
Desempeño durante el ciclo contractivo de 2022: tanto el Portafolio Tangente (-12.85%) como el modelo LSTM (-19.00%) superaron al S&P 500 (-25.43%)
6. Tabla Maestra Comparativa y Conclusiones Ejecutivas
En la siguiente tabla maestra se consolidan las métricas institucionales de rentabilidad, riesgo y eficiencia ajustada por volatilidad para el capital inicial de $5,000.00 USD entre el 30 de abril de 2020 y el 29 de octubre de 2026:
| Estrategia de Portafolio | Capital Inicial | Capital Final (Oct-2026) | Ganancia Neta ($ USD) | Retorno Total (%) | CAGR Anual (%) | Volatilidad Anual (%) | Ratio Sharpe | Ratio Sortino | Máximo Drawdown |
|---|---|---|---|---|---|---|---|---|---|
| 1. Deep Portfolio LSTM (Python Neural Net) | $5,000.00 | $15,057.19 | +$10,057.19 | +201.14% | 18.53% | 20.26% | 0.82 | 1.24 | -19.00% |
2. Benchmark S&P 500 (^GSPC) |
$5,000.00 | $13,132.10 | +$8,132.10 | +162.64% | 16.06% | 16.75% | 0.82 | 1.12 | -25.43% |
3. Cartera Equiponderada (1/N — 16.67% c/u) |
$5,000.00 | $11,836.13 | +$6,836.13 | +136.72% | 14.21% | 13.63% | 0.86 | 1.23 | -13.86% |
| 4. Portafolio Tangente Markowitz 2020 (Rebalanceado) | $5,000.00 | $11,208.95 | +$6,208.95 | +124.18% | 13.26% | 13.11% | 0.82 | 1.22 | -12.85% |
| 5. Portafolio Tangente Markowitz 2020 (Buy & Hold) | $5,000.00 | $10,994.41 | +$5,994.41 | +119.89% | 12.92% | 13.27% | 0.79 | 1.15 | -12.78% |
| 6. Portafolio Eficiente Mínima Varianza 2020 | $5,000.00 | $10,598.73 | +$5,598.73 | +111.97% | 12.28% | 13.50% | 0.74 | 1.11 | -15.43% |
Síntesis: Criterios de Elección entre Markowitz Clásico y Deep Portfolio LSTM
1. Vigencia del Portafolio Tangente de 2020 para Preservación Conservadora: El modelo original publicado en abril de 2020 demostró una alta consistencia en el control de riesgo: duplicó con creces el capital inicial (de $5,000.00 a $11,208.95 USD, +124.18%) con una volatilidad anual de apenas 13.11% y redujo a la mitad la contracción máxima sufrida por el mercado en 2022 (-12.85% frente a -25.43%).
2. Generación de Alfa mediante la Red Neuronal LSTM en Python: Al permitir que las compuertas de memoria LSTM adapten periódicamente las ponderaciones según el régimen de Momentum y volatilidad condicional, el modelo Deep Portfolio LSTM elevó el capital final hasta $15,057.19 USD (+201.14%, CAGR de 18.53%), generando +$3,848.24 USD adicionales sobre el Portafolio Tangente estático y superando al índice S&P 500 en +$1,925.09 USD (+38.50 puntos porcentuales de exceso de retorno) con un Ratio de Sortino de 1.24 y menor caída máxima (-19.00% frente a -25.43%).
Por:
Jesús Benjamín Zerpa
Economista
JesusZerpaEconomia@Gmail.Com
Publicado: Octubre de 2026
Excepto donde se indique lo contrario, el contenido de esta obra está bajo una licencia de Creative Commons Reconocimiento 4.0 Internacional.