Ejemplo público de research — demostración interna

Estrategia de estructura temporal de volatilidad

Un ejemplo transparente de asignación sobre SPY que combina un filtro de estructura temporal de VIX con lag, un objetivo de volatilidad realizada, límites de apalancamiento y costes explícitos de turnover.

Esto no es un caso de estudio de cliente. Es una estrategia deliberadamente simple, construida internamente, para mostrar cómo se puede documentar y revisar una estrategia cuantitativa de forma transparente — no es evidencia de un sistema de trading validado o rentable.

Ver el repositorio en GitHub (se abre en una pestaña nueva)

Resumen de la estrategia

La estrategia asigna a SPY utilizando otros dos instrumentos públicos como inputs: el índice VIX y el índice VIX3M.

Mantiene SPY solo cuando el ratio de estructura temporal VIX3M/VIX con lag está por encima de 1,0 — un filtro de régimen simple para condiciones de volatilidad más tranquilas.

Cuando el filtro de régimen está activo, la exposición se dimensiona para un objetivo de volatilidad anualizada del 10%, utilizando una estimación de volatilidad realizada con una ventana móvil de 20 días de negociación, con un tope máximo de apalancamiento de 2x.

Se aplica un coste lineal simplificado de 1 punto básico por unidad de turnover en cada cambio de exposición.

Convención de timing

La convención causal es explícita y está cubierta por tests unitarios en el repositorio:

  • Las dos features de la señal — el ratio VIX3M/VIX y la volatilidad realizada — llevan un lag de una observación de negociación.
  • La exposición en la fila t se calcula, por tanto, con información disponible únicamente hasta t-1.
  • Esa exposición se aplica al retorno close-to-close de SPY de la fila t.
  • La implementación de referencia publicada no aplica ningún desplazamiento adicional de ejecución.
term_structure_lag[t] = (VIX3M / VIX)[t-1]
realized_vol_lag[t]   = std(SPY returns, 20 days)[t-1] * sqrt(252)
exposure[t]           = 1(term_structure_lag[t] > 1.0)
                        * min(0.10 / realized_vol_lag[t], 2.0)
strategy_return[t]    = exposure[t] * SPY_return[t]
                        - turnover[t] * 1 bp

Métricas del snapshot

Muestra: 2013-02-01 a 2026-07-17 — 3.384 observaciones de negociación alineadas.

Estrategia frente a comprar y mantener SPY

MétricaEstrategiaComprar y mantener SPY
CAGR8,13%14,62%
Volatilidad anualizada10,60%16,86%
Sharpe (tipo libre de riesgo del 0%)0,7910,894
Drawdown máximo-17,17%-33,72%
Retorno total185,81%525,23%

Diagnósticos adicionales

DiagnósticoValor
Retorno activo anualizado-6,69%
Information ratio-0,554
Correlación con SPY0,701
Beta frente a SPY0,441
Exposición media a SPY85,1%
Turnover anualizado17,15x
Régimen activo92,6% de las observaciones

Las métricas son historia descriptiva del snapshot del repositorio, no una promesa de rendimiento futuro.

Gráficos

Gráfico de líneas del crecimiento de $1 invertido desde 2013 en la estrategia frente a comprar y mantener SPY, en escala logarítmica.
Crecimiento de $1
Gráfico de líneas que compara el drawdown de la estrategia con el drawdown de comprar y mantener SPY a lo largo del tiempo, mostrando un drawdown máximo menor para la estrategia.
Drawdowns de la estrategia y de SPY
Tres paneles apilados que muestran el ratio de estructura temporal VIX3M/VIX con lag, la estimación de volatilidad realizada con lag, y la exposición a SPY resultante a lo largo del tiempo.
Estructura temporal con lag, volatilidad realizada y exposición a SPY

Qué demuestra este ejemplo

  • Las convenciones de timing explícitas importan: indicar exactamente qué información utiliza cada fila de exposición, y cuándo, es lo que hace auditable un backtest.
  • El volatility targeting puede reducir la volatilidad realizada y el drawdown histórico frente a un benchmark de comprar y mantener.
  • Un menor riesgo no implica automáticamente superar al benchmark — este ejemplo tuvo peor CAGR y retorno total que comprar y mantener SPY durante la muestra.
  • Un benchmark claro y comparable evita confundir la reducción de riesgo con alpha.
  • El código reproducible, las métricas machine-readable y los datos derivados hacen que un resultado sea inspeccionable, en lugar de pedir confianza.

Reproducibilidad

  • Construido y probado con Python 3.12.
  • Dependencias de primer nivel fijadas (pinned), listadas en el archivo de requirements del repositorio.
  • Un script de análisis independiente reproduce las métricas, el CSV derivado y los tres gráficos con un único comando.
  • Las métricas machine-readable se versionan junto con el código, junto con la configuración exacta de la estrategia utilizada.
  • El CSV derivado de retornos y exposición alineados se versiona y queda vinculado al archivo de métricas mediante un hash SHA-256, de modo que el snapshot no puede desviarse silenciosamente de las cifras mostradas aquí.
  • Tests unitarios con datos sintéticos cubren el timing de las features, los límites de exposición y la contabilidad de costes.
  • Un workflow de GitHub Actions ejecuta la suite de tests en cada cambio.

Ver el código fuente en GitHub (se abre en una pestaña nueva)

Limitaciones

  • Yahoo Finance es una fuente de datos pública conveniente, no un archivo institucional point-in-time — las observaciones históricas pueden revisarse.
  • VIX y VIX3M son indicadores de régimen; la estrategia no opera directamente productos sobre VIX.
  • El backtest no modela spreads bid/ask, market impact, impuestos, financiación, restricciones de borrow ni ejecución intradía.
  • El modelo de costes es un coste lineal simplificado por unidad de turnover.
  • Los parámetros se eligieron con fines demostrativos y no se presentan como universalmente óptimos.
  • Este es un ejemplo histórico, no asesoramiento de inversión ni una previsión.