1. Introducción: El Fallo del Criterio de Kelly Escalar en Apuestas Concurrentes
En el análisis cuantitativo de apuestas deportivas y el trading algorítmico, el histórico artículo de John L. Kelly Jr. de 1956, "A New Interpretation of Information Rate", sentó las bases matemáticas definitivas para la gestión óptima del capital. La fórmula clásica del Criterio de Kelly escalar determina la fracción precisa del bankroll que maximiza la tasa de crecimiento geométrico asintótico a largo plazo para una apuesta analizada de forma aislada:
Donde representa la probabilidad subjetiva real de victoria, la probabilidad de pérdida, el beneficio neto decimal y la cuota decimal cotizada por la casa de apuestas. Cuando las apuestas se ejecutan de manera estrictamente secuencial —es decir, cuando cada apuesta se resuelve y se liquida en el capital antes de colocar la siguiente—, el modelo escalar garantiza matemáticamente el crecimiento asintótico óptimo con probabilidad teórica nula de quiebra total.
Las posiciones simultáneas usan el mismo capital antes de liquidar. Las fracciones escalares pueden sumar más de uno según probabilidades y precios, no un número semanal típico. Revise viabilidad y capital conjunto; sumar menos de uno no garantiza el óptimo logarítmico.
Además, las proposiciones que ocurren de forma simultánea a menudo no son estadísticamente independientes. Apostar por la victoria simple en el mercado 1X2, por el hándicap asiático y por el Over 2.5 en un mismo partido introduce una fuerte covarianza cruzada. Tratar esas selecciones como independientes infravalora los riesgos extremos de la cartera.
Por consiguiente, es imperativo pasar del enfoque escalar tradicional a la optimización multivariada de carteras mediante el Criterio de Kelly simultáneo. Este tratado expone el marco matemático riguroso, analiza la covarianza en mercados correlacionados y ofrece soluciones computacionales para la gestión institucional del riesgo.
2. Formulación Matemática: Maximizando el Crecimiento Logarítmico
Sea el capital total disponible al inicio. En el momento , disponemos de oportunidades concurrentes. El inversor selecciona un vector de asignación , donde es la fracción del capital invertida en la apuesta . La fracción restante permanece en liquidez sin riesgo con rendimiento cero.
Existen estados conjuntos de resultados posibles en el espacio muestral , con probabilidades conjuntas tales que . Para cada estado , definimos el vector de retornos brutos , donde representa el beneficio neto por unidad arriesgada:
El multiplicador de capital final del portafolio en el estado es:
El objetivo consiste en maximizar el crecimiento logarítmico esperado:
El programa cuadrático siguiente aproxima el objetivo con A. Las condiciones KKT caracterizan una solución bajo las cualificaciones habituales de restricciones. La semidefinición positiva aporta concavidad del crecimiento aproximado, no un tiempo medido ni éxito automático. El objetivo exacto es cóncavo; la unicidad estricta requiere que los vectores con probabilidad positiva distingan direcciones factibles. Las posiciones redundantes pueden compartir un óptimo.
3. Estados independientes y aproximación cuadrática
La independencia permite factorizar las probabilidades conjuntas, pero no separa el logaritmo de la riqueza total en logaritmos individuales. El capital se compromete simultáneamente, por lo que el óptimo exacto resuelve el objetivo conjunto. Para dos apuestas binarias independientes a cuota 2 y probabilidad 0.6, Kelly escalar es 0.2 en cada una, mientras el simultáneo exacto es 5/26, aproximadamente 0.1923076923. Dos derrotas tienen probabilidad 0.16 y riqueza 1-2f; los estados mixtos tienen riqueza 1, y dos victorias probabilidad 0.36 y riqueza 1+2f. La derivada produce el óptimo indicado.
La expansión de Taylor de segundo orden utiliza la matriz de segundos momentos A, no solo la covarianza C. El producto exterior de las medias no es cero si las ventajas son distintas de cero. Incluso con independencia, A tiene elementos fuera de la diagonal mu_i mu_j. Usar solo covarianza diagonal añade otra aproximación para medias pequeñas. Su precisión depende de que los retornos posibles de la cartera sean suficientemente pequeños para la expansión logarítmica. Un punto estacionario sin restricciones puede violar el presupuesto o exigir posiciones negativas y no debe usarse entonces como asignación.
El escalado proporcional conserva las razones entre fracciones escalares no negativas y respeta un presupuesto elegido. Es una heurística factible, no la solución general del objetivo exacto o cuadrático con restricciones. Un límite 0.20 es una elección ilustrativa, no una norma institucional universal ni garantía de drawdown. Cuotas y probabilidades diferentes no requieren una reducción óptima común.
4. Covarianza, dependencia e inversa
En una cartera fija no negativa, la covarianza positiva aumenta la varianza frente a covarianza cero. No implica que toda posición de una cartera reoptimizada deba disminuir. La inversa siguiente resuelve el sustituto de covarianza C f=mu. Es álgebra lineal exacta para ese sustituto, no una fórmula exacta de Kelly logarítmico. C debe ser no singular; resultados negativos también incumplen una política sin posiciones cortas.
Con C=[[4,0.6],[0.6,1]] y mu=(0.4,0.2), el determinante es 3.64 y la solución(0.0769230769,0.1538461538). Multiplicar C por el vector recupera mu. Medias y varianzas iguales dan mu/(sigma²(1+rho)) en este sustituto; rho 0.5 reduce esta aproximación concreta un tercio. No es un porcentaje universal del problema exacto.
Para un par binario ilustrativo O1=1.90,p1=0.55,O2=2.05,p2=0.52,p12=0.35, las probabilidades conjuntas son 0.35,0.20,0.17,0.28. La covarianza es 0.24928 y la correlación aproximadamente 0.25750. No determinan una reducción universal de apuestas. Se necesita una distribución conjunta válida; la matriz de covarianza por sí sola no especifica todos los estados logarítmicos.
5. Restricciones y aceptación numérica
El código evalúa el objetivo exacto de estados binarios independientes. Su número crece como 2^n, así que el ejemplo educativo acepta hasta 12 apuestas. Un límite inferior a1 mantiene riqueza positiva en cada estado. Comprueba entradas finitas, éxito de optimización, no negatividad y presupuesto antes de retornar. Correlaciones, devoluciones, medias victorias, comisiones y anulaciones requieren ampliar explícitamente los estados conjuntos.
6. Ejemplo Numérico: Jornada de Sábado con 5 Apuestas
Las cinco filas siguientes son victorias binarias hipotéticas independientes, incluida victoria simple de Inter, no DNB. Las probabilidades son supuestos, no pronósticos medidos. Las fracciones escalares suman 0.4836491228; el límite elegido es 0.20. Los vectores usan precisión completa antes del redondeo. Crecimiento significa logaritmo esperado de riqueza por ronda, no ROI realizado ni previsión de drawdown.
| ID | Mercado / Selección | Cuota () | Prob. () | Ventaja | Kelly Escalar | Importe Escalar |
|---|---|---|---|---|---|---|
| 1 | Arsenal (Victoria Local) | 1.95 | 55.0% | +7.25% | 7.63% | $7,632 |
| 2 | Liverpool -1.5 Hándicap | 2.25 | 48.0% | +8.00% | 6.40% | $6,400 |
| 3 | Real Madrid Over 2.5 | 1.80 | 60.0% | +8.00% | 10.00% | $10,000 |
| 4 | Bayern Múnich ML | 1.50 | 71.0% | +6.50% | 13.00% | $13,000 |
| 5 | Inter win (binary) | 1.75 | 62.0% | +8.50% | 11.33% | $11,333 |
Escalado y optimización exacta producen vectores distintos. Bajo la distribución especificada, el crecimiento escalado es 0.0120732581703 y el optimizado 0.0121349525481. La diferencia pequeña refuta que el escalado proporcional sea un óptimo exacto. No se demuestra retención del 82% del crecimiento ni reducción del 60% del drawdown. Cambios de dependencia o probabilidades requieren recalcular.
7. Implementación en Python
El código disponible en la versión en inglés de esta guía utiliza scipy.optimize.minimize con el método SLSQP para encontrar la solución numérica óptima en milisegundos bajo restricciones de liquidez y presupuesto.
8. Kelly Fraccional en Portafolios Multivariados
Para protegerse de la incertidumbre en las probabilidades estimadas por los modelos estadísticos, los fondos profesionales emplean Medio Kelly (Half-Kelly, ):
Los resultados de rondas repetidas requieren distribución estable y log-retornos integrables. No demuestran superioridad en toda trayectoria ni vector único con retornos redundantes. Las razones de crecimiento Half/Quarter dependen de la distribución;75%/43.75% solo surgen de una expansión cuadrática alrededor de un óptimo interior. El drawdown necesita horizonte y una barrera fija o definición respecto al pico. El código no calcula esas probabilidades.
10. Regularización y fracciones
Añadir lambda I a un sustituto de segundo momento o covarianza cambia sus autovalores de manera diferente. No equivale en general a multiplicar las apuestas por un factor Half-Kelly o Quarter-Kelly. Una conclusión bayesiana requiere prior y verosimilitud explícitos; una penalización ridge es una elección de modelo. Ante ventaja incierta, reducir posiciones puede ayudar sin garantizar crecimiento positivo. Reevalúe el objetivo exacto ante cambios plausibles de probabilidades y dependencia.
9. Preguntas Frecuentes
Código Completo en Python y Análisis de Algoritmos
A continuación se presenta la arquitectura computacional en Python para resolver la optimización de carteras bajo el criterio de Kelly simultáneo utilizando scipy.optimize.minimize y el método SLSQP:
import numpy as np
from scipy.optimize import minimize
def solve_simultaneous_kelly(odds, true_probs, max_bankroll_fraction=0.25):
"""Illustrative exact state objective for at most 12 independent binary bets."""
odds = np.asarray(odds, dtype=float)
probs = np.asarray(true_probs, dtype=float)
cap = float(max_bankroll_fraction)
if (odds.ndim != 1 or probs.shape != odds.shape or not 1 <= odds.size <= 12
or not np.all(np.isfinite(odds)) or np.any(odds <= 1)
or not np.all(np.isfinite(probs)) or np.any((probs < 0) | (probs > 1))
or not np.isfinite(cap) or not 0 <= cap < 1):
raise ValueError("Require 1..12 binary bets, finite odds>1, p in [0,1], cap in [0,1).")
n = odds.size
states = ((np.arange(1 << n)[:, None] >> np.arange(n)) & 1).astype(float)
weights = np.prod(np.where(states == 1, probs, 1-probs), axis=1)
returns = states * odds - 1
def loss(f):
wealth = 1 + returns @ f
if np.any(wealth <= 0):
return np.inf
return -float(weights @ np.log(wealth))
def gradient(f):
return -(weights / (1 + returns @ f)) @ returns
scalar = np.maximum(0, (probs * odds - 1) / (odds - 1))
total = scalar.sum()
initial = scalar * min(1, cap / total) if total else scalar
if cap == 0:
return {"optimal_fractions": np.zeros(n), "total_allocation": 0.0,
"expected_growth_rate_per_round": 0.0, "success": True}
result = minimize(loss, initial, jac=gradient, method="SLSQP",
bounds=[(0, cap)] * n,
constraints=[{"type": "ineq", "fun": lambda f: cap-f.sum(),
"jac": lambda f: -np.ones(n)}],
options={"ftol": 1e-13, "maxiter": 1000})
if not result.success:
raise RuntimeError("Optimizer did not converge.")
f = np.asarray(result.x)
if (not result.success or not np.all(np.isfinite(f))
or np.min(f) < -1e-10 or f.sum() > cap + 1e-10
or np.any(1 + returns @ f <= 0) or not np.isfinite(loss(f))):
raise RuntimeError("Optimizer failed or returned an infeasible allocation.")
return {"optimal_fractions": f, "total_allocation": float(f.sum()),
"expected_growth_rate_per_round": -loss(f), "success": True}
