Tutorial/Predicción de tipos de cambio
Tutorial

¿Puedes vencer a un paseo aleatorio en la predicción de tipos de cambio? Corre la prueba en 30 líneas

El resultado clásico dice que un pronóstico de "sin cambio" vence a cualquier modelo fuera de muestra. Aquí está el código para poner eso a prueba tú mismo, contra tipos diarios en vivo.

MMexchangerate.dev·Jul 6, 2026·7 min de lectura

La barra que cualquier pronóstico de tipo de cambio debe superar es el paseo aleatorio: el pronóstico de no hacer nada, que dice que el tipo de mañana será igual al de hoy. Desde Meese y Rogoff (1983), casi nada lo vence a horizontes cortos, y un working paper de la Reserva Federal de 2025 lo reconfirmó para el machine learning moderno. Este es el complemento práctico de el muro de cuarenta años: unas 30 líneas de Python que traen los datos, construyen la referencia y evalúan un modelo con honestidad.

Key points
La referencia que todo pronóstico FX debe vencer es el paseo aleatorio: el tipo de mañana es igual al de hoy. En pares principales diarios es extraordinariamente difícil de vencer.
Puedes correr toda la prueba en el plan gratuito: trae la serie, construye la referencia de sin-cambio y evalúa con R² fuera de muestra más una prueba de Clark-West.
Descarta las filas rellenadas hacia adelante de fines de semana y feriados (el indicador is_forward_filled) o tu modelo aprenderá silenciosamente de domingos planos.
Añadir complejidad al modelo empeora la precisión fuera de muestra, no la mejora. Ves el sobreajuste ocurrir en tiempo real.
La publicación complementaria corre esto en cinco pares de divisas y muestra qué tan fácilmente un par de decisiones defendibles pueden fabricar una ventaja "significativa".

La referencia: "mañana es igual a hoy"

En 1983, Meese y Rogoff mostraron que ningún modelo macro podía superar en pronóstico a un modelo que dice que el tipo de cambio de mañana será el mismo que hoy. Diferenciales de tasas de interés, oferta monetaria, paridad de poder adquisitivo: nada de eso ayudó. Ese "modelo" es el paseo aleatorio, y cuarenta años de economía cada vez más ingeniosa mayormente ha rebotado contra él. Cubrimos por qué en ¿Puedes predecir los tipos de cambio? Esta guía es la mitad práctica: el código para comprobar la afirmación tú mismo.

En septiembre de 2025, un economista de la Fed sometió el machine learning moderno a la misma prueba. El paper, *Virtue or Mirage? Complexity in Exchange Rate Prediction* (Rehim Kılıç, FEDS 2025-089), enfrentó una regresión Ridge sobre Random Fourier Features contra el paseo aleatorio, evaluado por R² fuera de muestra y las pruebas de Clark-West y Diebold-Mariano. El veredicto fue cauteloso: la complejidad dio "solo ganancias modestas y localizadas" que eran "frágiles y raramente estadísticamente significativas", y nunca se tradujo en una ventaja sistemática sobre el paseo aleatorio.

Qué podemos y no podemos reproducir
El paper usa fundamentos macro mensuales que una API de tipos no ofrece, así que no podemos replicarlo exactamente. Pero sí podemos poner a prueba la pregunta de fondo, la que la mayoría de los desarrolladores realmente enfrentan: usando solo el historial de precios, ¿puede un modelo entrenado vencer a "mañana es igual a hoy"?

Trae los datos

Cinco años de EUR/USD diario desde el endpoint /v1/range. El plan gratuito no necesita clave para empezar.

python — fetch a daily seriescopy
import requests, numpy as np, pandas as pd

def fetch_range(base, symbol, start, end, key=None):
    rows, cursor = [], None
    headers = {"Authorization": f"Bearer {key}"} if key else {}
    while True:
        p = {"base": base, "symbols": symbol, "start_date": start, "end_date": end}
        if cursor: p["cursor"] = cursor
        d = requests.get("https://api.exchangerate.dev/v1/range",
                         params=p, headers=headers, timeout=30).json()
        rows += [{"date": r["date"], "rate": r["rates"][symbol]} for r in d["data"]]
        if not d.get("has_more"): break
        cursor = d["next_cursor"]
    df = pd.DataFrame(rows).drop_duplicates("date")
    df["date"] = pd.to_datetime(df["date"])
    return df.sort_values("date").set_index("date")

fx = fetch_range("EUR", "USD", "2021-01-01", "2026-01-01")

Algo que vale la pena hacer bien: cada fila lleva un indicador is_forward_filled y un campo source. Los fines de semana y feriados se rellenan hacia adelante, así que un estudio serio descarta esas filas. No quieres que tu modelo "aprenda" de un domingo plano, una versión pequeña de las trampas de look-ahead cubiertas en Rellenar datos sin sesgo de look-ahead.

Construye la referencia y un retador

El paseo aleatorio predice un retorno cero cada día (la martingala sin deriva que usaron Meese y Rogoff). Dale al retador cada ventaja barata que se pueda sacar solo de la serie de precios, momentum, reversión a la media, volatilidad realizada, y deja que Ridge (el propio estimador del paper) prediga el retorno de mañana.

python — features and a Ridge modelcopy
from sklearn.linear_model import Ridge

fx["ret"] = np.log(fx["rate"]).diff()
f = pd.DataFrame(index=fx.index)
for lag in (1, 2, 3, 5, 10): f[f"lag{lag}"] = fx["ret"].shift(lag)
f["mom5"], f["mom20"] = fx["ret"].rolling(5).sum().shift(1), fx["ret"].rolling(20).sum().shift(1)
f["vol10"], f["y"] = fx["ret"].rolling(10).std().shift(1), fx["ret"]
f = f.dropna()

split = int(len(f) * 0.7)
X = [c for c in f.columns if c != "y"]
m = Ridge(alpha=1.0).fit(f.iloc[:split][X], f.iloc[:split]["y"])
pred, y = m.predict(f.iloc[split:][X]), f.iloc[split:]["y"].values

Evalúalo con honestidad

R² fuera de muestra contra el paseo aleatorio (positivo significa que ganaste), más la prueba de Clark-West, la correcta cuando el paseo aleatorio está anidado dentro de tu modelo.

python — out-of-sample R² and Clark-Westcopy
from scipy import stats
r2 = 1 - np.sum((y - pred)**2) / np.sum(y**2)
f_hat = y**2 - ((y - pred)**2 - pred**2)
t = f_hat.mean() / (f_hat.std(ddof=1) / np.sqrt(len(f_hat)))
print(f"OOS R2 {r2:+.4%} | Clark-West t {t:+.2f} p {1-stats.norm.cdf(t):.3f}")

Corre esto en EUR/USD, GBP/USD, USD/JPY y algunas ventanas. El patrón es terco. El R² fuera de muestra se sitúa en cero o por debajo, desde aproximadamente plano hasta un par de puntos porcentuales negativos, lo que significa que el modelo entrenado normalmente lo hizo peor que asumir que no hay ningún cambio. El estadístico de Clark-West rara vez alcanza significancia, y las celdas que coquetean con ella se mueven cuando ajustas el split o los errores estándar. Aumenta el número de features para añadir "complejidad" y lo de fuera de muestra solo empeora. Estás viendo el sobreajuste ocurrir en tiempo real. Corrimos la prueba completa en cinco pares y publicamos cada número.

Por qué esto importa si estás construyendo

Si lanzas una función de "tipo predicho", la referencia que tienes que vencer es devolver el tipo de hoy, y en datos diarios de pares principales esa referencia es extraordinariamente difícil de vencer. Un endpoint de pronóstico que silenciosamente lo hace peor es un número confiadamente equivocado sentado en el flujo de pago de alguien o en un panel de tesorería.

El valor defendible está en otra parte. Sirve el nivel con precisión y rapidez, ya que el mejor pronóstico puntual para el próximo tipo realmente es el actual. Cuantifica la incertidumbre en lugar de pronosticar un punto: la volatilidad y las bandas de confianza son genuinamente útiles y no requieren vencer al paseo aleatorio. Y sé honesto sobre el horizonte, porque la predictibilidad es prácticamente nula día a día y solo aumenta poco a poco a lo largo de meses, que es donde la literatura encuentra la poca ventaja que existe.

Esa línea plana del paseo aleatorio es información. Es el mercado diciendo que el precio de hoy ya contiene la mayor parte de lo que se puede saber sobre el de mañana. Para un proveedor de datos, la jugada ganadora es publicar ese precio con más precisión y más rápido que nadie, y ser directo sobre los límites de la predicción.

MM
exchangerate.dev
Guías de datos FX para desarrolladores que construyen con tipos indicativos.

Keep reading

BlogIntentamos vencer al paseo aleatorio en cinco paresRead Guide¿Puedes predecir los tipos de cambio? El muro de cuarenta añosRead GuideRellena tipos FX sin sesgo de look-aheadRead