Publicado originalmente en medium.com

La cartera nunca fue el mayor riesgo.
La fecha sí lo era.
Hace tres semanas le pedí a Claude que construyera una asignación de $10.000 para una amiga que llevaba ocho meses con efectivo parado en una cuenta de ahorros. Cinco posiciones, cada una respaldada por números reales extraídos de un feed de datos en vivo. El artículo funcionó bien. Las respuestas eran casi todas la misma pregunta, dicha de cincuenta formas distintas:
"Vale, ¿pero habría funcionado?"
Mi amiga hizo una versión más afilada. Se dedica a construir modelos financieros, así que fue directo al punto débil:
"¿Y si hubiera hecho esto en enero de 2022, justo antes de que todo se cayera?"
Pregunta justa. Así que corrí un backtest de market timing. La misma cartera, los mismos $10.000, pero en vez de una fecha de inicio probé 105: cada mes desde enero de 2015 hasta septiembre de 2023, cada una mantenida durante tres años.
Luego comparé cada ejecución contra el S&P 500, un fondo clásico 60/40, y la cartera que la mayoría realmente quiere tener ahora mismo: las Magnificent 7.
Si eres:
esto vale tus diez minutos.
Y la persona que lo escribió eligió esa fecha.
Ese es el problema silencioso de la mayoría del contenido tipo "invertí $X en Y". Un punto de entrada. Un punto de salida. Un número al final que parece evidencia.
No lo es. Es una anécdota con un gráfico pegado.
Mueve el inicio seis meses y la misma estrategia puede verse brillante o rota. La mayoría de los autores no lo hacen a propósito. Eligen una fecha redonda como el 1 de enero, corren los números una vez, y publican lo que salga.
Esta es la parte incómoda: cuando corres la cartera del primer artículo desde enero de 2019, $10.000 se convierten en $19.135 en tres años. Empiézala en enero de 2022 y la misma asignación exacta termina en $12.382.
Las mismas acciones. Los mismos pesos. La misma regla de rebalanceo.
$6.753 de diferencia, y nada de eso vino de la cartera.

La solución se llama backtesting de ventana móvil (rolling-window).
En vez de preguntar "¿qué retorno dio esta cartera?", preguntas "¿qué retorno dio esta cartera para cada fecha de entrada posible?". Obtienes una distribución en vez de un número. Y una distribución te dice tres cosas que un solo backtest no puede:
Ese tercer punto resultó ser toda la historia.
Cuatro carteras, $10.000 cada una, rebalanceadas a los pesos objetivo cada 12 meses:

Fechas de inicio: el primer día hábil de cada mes desde enero de 2015 hasta septiembre de 2023. Son 105 puntos de entrada, y cada ventana cierra antes de septiembre de 2026.
Los datos vienen de la API end-of-day de EODHD, usando el campo adjusted_close. Eso importa más de lo que suena. Los precios ajustados incorporan dividendos y splits, así que el yield del 2-3% de JNJ y los splits de acciones de NVDA y TSLA quedan reflejados correctamente. Usar precios de cierre sin ajustar subestimaría silenciosamente a las acciones que pagan dividendos y arruinaría las que hicieron split.
Una sola API key cubrió los doce tickers hasta 2014, en el mismo endpoint y con la misma forma de JSON.
→ Si quieres reproducir esto, el nivel gratuito de EODHD alcanza para empezar.
Unas 50 líneas. Una función descarga precios, otra simula una cartera desde cualquier fecha de inicio, y un loop corre las 105 ventanas.
pip install requests pandas
import os
import requests
import pandas as pd
API_TOKEN = os.environ["EODHD_API_KEY"]
PORTFOLIOS = {
"Claude": {"VOO": .35, "MSFT": .20, "JNJ": .20, "GLD": .15, "SHY": .10},
"Mag7": {t: 1/7 for t in ["AAPL", "MSFT", "NVDA", "AMZN", "GOOGL", "META", "TSLA"]},
"VOO": {"VOO": 1.0},
"60/40": {"AOR": 1.0},
}
YEARS = 3
def get_prices(ticker):
url = f"https://eodhd.com/api/eod/{ticker}.US"
params = {"api_token": API_TOKEN, "fmt": "json", "from": "2014-01-01"}
df = pd.DataFrame(requests.get(url, params=params).json())
return df.set_index(pd.to_datetime(df["date"]))["adjusted_close"]
tickers = {t for w in PORTFOLIOS.values() for t in w}
prices = pd.DataFrame({t: get_prices(t) for t in tickers}).dropna()
def simulate(weights, start, capital=10_000):
"""Buy on `start`, rebalance every 12 months, hold YEARS years."""
window = prices.loc[start:start + pd.DateOffset(years=YEARS), list(weights)]
cuts = [window.index.searchsorted(start + pd.DateOffset(years=y)) for y in range(YEARS)]
cuts.append(len(window) - 1)
value, path = capital, []
for a, b in zip(cuts, cuts[1:]):
seg = window.iloc[a:b + 1]
shares = pd.Series(weights) * value / seg.iloc[0]
curve = (seg * shares).sum(axis=1)
path.append(curve if not path else curve.iloc[1:])
value = curve.iloc[-1]
return pd.concat(path)
rows = []
for start in pd.date_range("2015-01-01", "2023-09-01", freq="MS"):
for name, weights in PORTFOLIOS.items():
curve = simulate(weights, start)
rows.append({
"start": start.date(),
"portfolio": name,
"final": round(curve.iloc[-1]),
"max_drawdown": round((curve / curve.cummax() - 1).min() * 100, 1),
})
results = pd.DataFrame(rows)
final = results.pivot(index="start", columns="portfolio", values="final")
print(final.describe(percentiles=[.1, .5, .9]).T.round(0))
print("Claude beats VOO in", f"{(final['Claude'] > final['VOO']).mean():.0%}", "of start dates")
Resultado:
count mean std min 10% 50% 90% max
portfolio
60/40 105.0 12326.0 1261.0 10387.0 10779.0 12187.0 14190.0 15312.0
Claude 105.0 15055.0 1662.0 12382.0 12936.0 14879.0 17207.0 19135.0
Mag7 105.0 27870.0 8738.0 16639.0 18374.0 25574.0 39156.0 59977.0
VOO 105.0 14920.0 1764.0 11098.0 13109.0 14473.0 17526.0 20004.0
Claude beats VOO in 54% of start dates
Hay un detalle en simulate() fácil de hacer mal. Si el aniversario cae en fin de semana, el rebalanceo tiene que pasar en el siguiente día hábil, y el valor de la cartera tiene que medirse ese mismo día. Mide el valor el viernes y compra a precios del lunes, y silenciosamente pierdes un día de retornos en cada rebalanceo. Mi primera versión tenía exactamente ese bug. Movió algunos resultados por más de $1.000.
Desde aquí puedes construir:
Antes de la distribución completa, aquí están las fechas que la gente realmente pregunta. Valor de $10.000 después de tres años, con la peor caída de pico a valle en el camino:

Lee la columna de Claude de arriba a abajo. La misma cartera va de $12.382 a $17.839 dependiendo solo del mes en que hiciste clic en "comprar".
Ahora lee cualquier fila de forma horizontal. Claude vs. el S&P 500 suele estar a unos cientos de dólares de distancia.
El mes importó mucho más que la cartera.
En las 105 ventanas, la brecha mediana entre la cartera de Claude y el S&P 500 fue de $637.
La brecha entre la mejor y la peor fecha de inicio de Claude fue de $6.753.
Esa proporción es el titular. Si pasas tres semanas optimizando qué comprar y cero minutos pensando en cómo manejarás una mala entrada, pusiste el esfuerzo en el lugar equivocado.
Terminó por delante de VOO en el 54% de las fechas de inicio. Valor final mediano: $14.879 vs. $14.473.
Eso no es una ventaja. Es ruido.
Si el único objetivo fuera "ganarle al S&P 500", la conclusión honesta sería: simplemente compra VOO.
Aquí es donde las dos carteras dejan de parecerse.

La cartera de Claude entregó aproximadamente el mismo retorno que el S&P 500 con caídas cerca de un tercio más pequeñas. Su peor entrada todavía terminó más alta que la peor entrada de VOO.
Eso es lo que estaban haciendo el oro, JNJ y los bonos del tesoro a corto plazo. No añadieron retorno. Hicieron que las malas fechas de inicio fueran menos malas.
Y eso importa más de lo que parece en una hoja de cálculo. Una caída del -34% es el punto donde la gente de verdad vende. Una caída del -23% es el punto donde se quejan y aguantan.
El fondo 60/40 funcionó como un control interesante. En esta década en particular, nunca le ganó al S&P 500 en una ventana de 3 años, y su drawdown típico (-21,7%) fue más profundo que el de Claude (-17,7%). El crash de bonos de 2022 lo golpeó por los dos lados.

La cartera Magnificent 7 le ganó al S&P 500 en el 100% de las fechas de inicio. Valor final mediano: $25.574. Mejor caso, empezando en enero de 2019: $59.977.
Antes de vender todo y comprar siete tickers, mira dos números.
El rango. Las mismas siete acciones, los mismos pesos. Empezar en enero de 2019 te daba $59.977. Empezar en febrero de 2021 te daba $16.639. Eso es una diferencia de $43.339 impulsada solo por el mes de entrada. Cuanto más concentrada la cartera, más decide el calendario tu resultado.
Las caídas. La ventana mediana incluyó una caída del -36%. La peor incluyó -50,7%. La mitad de tu dinero, perdido en el papel, al menos una vez. La mayoría de la gente que dice que aguantaría eso no ha tenido que hacerlo.
Luego está el problema que ningún backtest arregla por sí solo: el sesgo de mirada retrospectiva (look-ahead bias).
Nadie llamaba a estas siete empresas "las Magnificent 7" en 2015. Ese nombre es de 2023. Yo las elegí en 2026 porque ganaron. Correrlas hacia atrás hasta 2015 es como apostar en una carrera después de leer los resultados.
La misma advertencia aplica, de forma más leve, a la cartera de Claude. MSFT y el oro también se eligieron con la información de hoy. Un backtest de ventana móvil elimina el sesgo de fecha de inicio. No elimina el sesgo de selección.
Si la fecha de entrada es el riesgo, la reacción natural es repartirla. En vez de invertir $10.000 el primer día, invertir $1.667 al mes durante seis meses.
Corrí eso también, sobre la cartera de Claude, con el efectivo no invertido ganando cero:

El promediado de costo (DCA) ganó en solo el 22% de las fechas de inicio. Ayudó cuando empezabas justo en un pico: unos $400 mejor en febrero de 2020 y en enero de 2022. Promediado sobre las 10 peores fechas de inicio de inversión única, sin embargo, los dos quedaron prácticamente empatados ($12.555 vs. $12.564). Y costó dinero real en las ventanas donde los mercados simplemente subieron.
Esto coincide con lo que Vanguard y otros han publicado durante décadas: la inversión de una sola vez gana cerca de dos tercios de las veces porque los mercados suben más seguido de lo que bajan. En esta década ganó incluso más seguido.
El DCA no es una estrategia de retorno. Es una estrategia de arrepentimiento. Si invertir $10.000 el día antes de un crash te haría vender todo, la versión de seis meses vale su costo. Si no, no lo vale.
Sí, más de lo que la mayoría espera en horizontes de 3 a 5 años. En un backtest de ventana móvil de 105 fechas de inicio entre 2015 y 2023 usando datos de precios de EODHD, la misma cartera de $10.000 terminó entre $12.382 y $19.135 después de tres años, dependiendo solo del mes de entrada. El efecto se reduce en horizontes más largos, pero no desaparece.
En esta prueba, el timing de entrada cambió los resultados a 3 años hasta en $6.753 en una cartera diversificada de $10.000, y hasta en $43.339 en una cartera concentrada tipo Magnificent 7. La diferencia entre la cartera diversificada y el S&P 500 fue mucho menor: una mediana de $637.
Generalmente, sí. En este backtest, invertir $10.000 de una vez le ganó a un plan de DCA a 6 meses en el 78% de las fechas de inicio. El DCA solo ayudó cuando la inversión de una vez caía justo antes de un crash, como febrero de 2020 o enero de 2022. Reduce el arrepentimiento más de lo que mejora los retornos.
Sí. De 2015 a 2026, una cartera Magnificent 7 con pesos iguales le ganó al S&P 500 en cada ventana de 3 años probada, con un valor final mediano de $25.574 vs. $14.473 por cada $10.000. Pero el resultado tiene un fuerte sesgo de mirada retrospectiva: el grupo se seleccionó por haber ganado ya, y sufrió caídas de hasta -50,7%.
Entre 2015 y 2026, un fondo 60/40 (AOR) nunca le ganó al S&P 500 en una ventana de 3 años, y la caída de bonos de 2022 dejó su drawdown mediano (-21,7%) más profundo que el de una cartera cargada a acciones con oro y bonos del tesoro a corto plazo (-17,7%). Su valor está en menor volatilidad en la mayoría de los períodos, no en mayores retornos.
Descarga precios diarios ajustados (por ejemplo del endpoint /api/eod/ de EODHD), escribe una función que simule la cartera desde una fecha de inicio dada, y luego córrela en un loop sobre cada fecha de inicio mensual, recolectando el valor final y la caída máxima. Usa precios ajustados para que los dividendos y splits queden incluidos, y rebalancea en el primer día hábil en o después de cada aniversario.
Claude puede escribir y ejecutar el código de backtesting, y con una conexión a datos de mercado como el servidor MCP o la API REST de EODHD, puede trabajar con precios históricos reales en vez de recordados. El resultado es tan confiable como los datos y supuestos detrás de él, así que pídele que muestre los números y fechas de inicio exactos que usó.
Mi amiga leyó los resultados y dijo algo que no esperaba:
"O sea que llevo ocho meses esperando el momento correcto, y el momento importa más que cualquier cosa que estuviera investigando."
Sí. Y es exactamente por eso que esperar no lo resuelve. Nadie sabe qué mes será el enero de 2019 y cuál será el enero de 2022.
Lo que sí puedes elegir es una cartera cuya peor fecha de inicio puedas tolerar.
Corre el backtest tú mismo con la API de EODHD. El nivel gratuito cubre cada endpoint usado aquí, incluyendo precios de cierre ajustados con más de 30 años de historial.
Esto no es asesoría financiera, y no soy asesor financiero. El rendimiento pasado, en 105 fechas de inicio o en una sola, no garantiza resultados futuros.
Este artículo corrió 420 backtests antes de escribir una sola afirmación. Así es como escribo para empresas fintech y de API: llamadas reales, datos reales, números que tus lectores pueden reproducir.
Ve más de mi trabajo en mi sitio web
¿Buscas contenido técnico para tu empresa? Puedo ayudarte — LinkedIn · kevinmenesesgonzalez@gmail.com