Objetivo de volatilidad explicado

Los tamaños de posición fijos ignoran las condiciones del mercado. El objetivo de volatilidad ajusta cuánto inviertes según la volatilidad actual del mercado.

Última actualización 2026-09
Puntos clave
  • El objetivo de volatilidad hace que el tamaño de posición se mueva de forma inversa a la volatilidad realizada: si el mercado está más ruidoso que tu objetivo inviertes menos, si está más tranquilo inviertes más, hasta un límite.
  • Dos pasos: primero la desviación estándar móvil de los retornos logarítmicos, anualizada, da la volatilidad realizada; después se multiplica la señal por target_vol ÷ realized_vol y se recorta con vol_cap.
  • Los valores por defecto son target_vol=0.30, vol_cap=2.0, lookback=720, periods_per_year=8760, calibrados para una estrategia de 1h: si cambias el intervalo hay que recalcularlos.
  • Regla práctica: target_vol ≈ MDD aceptable ÷ 2. El 30% por defecto corresponde a un MDD típico de alrededor de −60%.
  • Ajusta el tamaño de la posición, no la dirección de la señal; cuando la señal se equivoca, solo decide cuánto te equivocas.

La misma estrategia resulta tan aburrida durante los meses tranquilos que te dan ganas de apagarla; y luego, en la semana en que el mercado empieza a moverse con violencia, sufre un drawdown mucho más profundo de lo que sugería la media del backtest. La señal no cambió, cambió el mercado, y el tamaño de cada apuesta que pones siguió siendo el mismo.

Qué es el objetivo de volatilidad

El objetivo de volatilidad consiste en mover el tamaño de posición de forma inversa a la volatilidad realizada del mercado: si la volatilidad está por encima de tu objetivo inviertes menos, si está por debajo inviertes más, hasta un límite.

Una estrategia básica de Tipo A genera una señal de 1.0 (largo) o 0.0 (plano). El runner despliega todo el capital asignado cuando la señal es 1.0. Esto funciona, pero tiene un problema oculto: la estrategia realiza una apuesta del mismo tamaño sin importar si el mercado está tranquilo o caótico.

En un período de baja volatilidad, un movimiento diario del 1% es grande. En un período de alta volatilidad, un movimiento del 1% es ruido. Si tu estrategia entra con el mismo tamaño de posición en ambos entornos, tu riesgo real en dólares oscila drásticamente, y tus drawdowns en períodos volátiles serán mucho mayores de lo que sugiere el promedio de tu backtest.

La señal dice "compra", no dice "cuánto".
Una posición fija equivale a dar por supuesto que el mercado está igual de ruidoso todos los días: la misma orden son dos riesgos distintos en un periodo tranquilo y en una crisis.

La fórmula

Blave Agent implementa el objetivo de volatilidad en dos pasos:

Paso 1 — Medir la volatilidad realizada

log_return = log(Close / Close.shift(1))
realized_vol = log_return.rolling(lookback).std() * sqrt(periods_per_year)

Esto calcula la desviación estándar móvil de los retornos logarítmicos y luego la anualiza multiplicándola por sqrt(periods_per_year). El resultado es la volatilidad realizada anualizada, la misma unidad que la volatilidad del ratio de Sharpe.

Valores por defecto: lookback=720 barras, periods_per_year=8760. Están calibrados para una estrategia de intervalo de 1h: 720 barras = 30 días × 24 horas; 8760 = 24 × 365.

Paso 2 — Escalar la señal

scale = (target_vol / realized_vol).clip(upper=vol_cap)
scaled_signal = signal * scale

La señal (1.0 = largo completo) se multiplica por el ratio de volatilidad, limitado a vol_cap. El resultado es un tamaño de posición fraccional.

Valores por defecto: target_vol=0.30 (30% anualizado), vol_cap=2.0 (apalancamiento máximo de 2×).

Ejemplos concretos

Volatilidad realizada (anual.)Volatilidad objetivoEscala brutaTras el límiteTamaño de posición
10%30%3.0×2.0× (limitado)200% de la asignación
20%30%1.5×1.5×150% de la asignación
30%30%1.0×1.0×100% — base
60%30%0.5×0.5×50% de la asignación
90%30%0.33×0.33×33% de la asignación

Con un 30% de volatilidad realizada, la estrategia opera a tamaño completo. Durante una crisis, cuando la volatilidad realizada se dispara al 90%, la estrategia recorta automáticamente a un tercio de la posición. En un período tranquilo con un 10% de volatilidad, escala hasta el límite de 2×.

Ajustar para diferentes intervalos

Los valores por defecto (lookback=720, periods_per_year=8760) son para una estrategia de 1h. Para otros intervalos, ambos valores deben recalcularse:

Intervaloperiods_per_yearlookback (ventana de 30 días)
5min105,120 (12 × 24 × 365)8,640 barras
1h (por defecto)8,760720 barras
4h2,190180 barras
8h1,09590 barras
1d36530 barras
Para estrategias diarias, un lookback de 30 barras es corto. Considera usar un lookback más largo, como 252 barras (un año), para capturar una estimación de volatilidad más estable y evitar reaccionar en exceso a picos de corto plazo.

Cómo añadirlo a una estrategia

VOL_TARGETING    = True
TARGET_VOL       = 0.30   # 30% annualized target
VOL_CAP          = 2.0    # max 2× leverage
VOL_LOOKBACK     = 720    # bars in lookback window
PERIODS_PER_YEAR = 8760   # for 1h interval

def fetch_data(hdrs):
    from lib.data import fetch_kline
    from lib.strategy import add_realized_vol
    df = fetch_kline(SYMBOL, INTERVAL, START, END, hdrs)
    if VOL_TARGETING:
        add_realized_vol(df, VOL_LOOKBACK, PERIODS_PER_YEAR)
    return df

def compute_signals(df):
    from lib.strategy import apply_vol_scaling
    signal = pd.Series(np.nan, index=df.index)
    # ... your signal logic here ...
    if VOL_TARGETING:
        return apply_vol_scaling(signal, df, TARGET_VOL, VOL_CAP)
    return signal
ParámetroPor defectoQué significaCuándo cambiarlo
TARGET_VOL0.30Volatilidad objetivo anualizada del 30%Según el MDD que puedas aceptar ÷ 2
VOL_CAP2.0Apalancamiento máximo de 2×Si no quieres apalancamiento alguno, pon 1.0
VOL_LOOKBACK720Longitud de la ventana de estimación de volatilidad (en barras)Recalcular al cambiar de intervalo, véase la tabla de arriba
PERIODS_PER_YEAR8760Periodos por año usados para anualizar (intervalo de 1h)Recalcular al cambiar de intervalo, véase la tabla de arriba

Ten en cuenta que add_realized_vol debe llamarse en fetch_data (antes de calcular las señales), porque apply_vol_scaling lee df['realized_vol'], que la primera función establece in situ.

El vol_cap: por qué 2× y no más

El límite existe porque el objetivo de volatilidad puede generar un apalancamiento extremo en entornos de volatilidad persistentemente baja. Si la volatilidad realizada cae al 5%, la escala sin límite sería de 6×, tres veces la asignación. Ante un movimiento adverso de un día, esto puede provocar un drawdown catastrófico incluso con una señal fundamentalmente sólida.

El límite por defecto de 2× restringe a la estrategia a desplegar como máximo el doble del capital asignado. Para estrategias en las que quieras evitar cualquier apalancamiento, configura vol_cap=1.0. Esto convierte el objetivo de volatilidad en un dimensionamiento de posición puramente ajustado por volatilidad y sin apalancamiento: el tamaño de la posición solo se reduce en alta volatilidad, nunca se expande más allá del tamaño completo.

Volatilidad objetivo y MDD implícito

Una regla práctica útil: target_vol ≈ MDD aceptable ÷ 2. Esto proviene de la relación empírica entre la volatilidad anualizada y el drawdown máximo en estrategias de seguimiento de tendencia.

target_volMDD típico implícitoCaso de uso
10%~−20%Conservador, prioridad en la preservación del capital
20%~−40%Moderado
30% (por defecto)~−60%Agresivo — presupuesto de riesgo completo

Cómo saber si tus parámetros están bien puestos

1

¿Tu periods_per_year encaja con el intervalo? El valor por defecto 8760 es para 1h. Es 105,120 para 5min, 2,190 para 4h, 1,095 para 8h y 365 para 1d. Si te equivocas aquí, el paso de anualización sale mal, y con él todas las celdas posteriores.

2

¿Tu lookback sigue siendo de 30 días? 720 barras = 1h × 30 días. Hay que cambiarlo con el intervalo: 8,640 barras para 5min, 180 para 4h, 90 para 8h, 30 para 1d. En velas diarias, 30 se queda corto: puedes plantearte 252 (un año) para una estimación más estable.

3

¿Tu target_vol encaja con el MDD que puedes aceptar? La regla práctica es target_vol ≈ MDD aceptable ÷ 2: 10% para alrededor de −20%, 20% para alrededor de −40%, y el 30% por defecto para alrededor de −60%. (Cómo leer el MDD, en Cómo leer un backtest.)

4

¿Te da vol_cap el apalancamiento que quieres? El valor por defecto 2.0 significa como mucho el doble del capital asignado. Si lo pones en 1.0, solo reducirá la posición cuando la volatilidad sea alta, y nunca la ampliará por encima de la asignación completa cuando sea baja.

5

¿El TARGET_VOL de la estrategia individual es coherente con el target_vol_pct del Manager de cartera? El Manager decide el apalancamiento global con esa misma lógica (apalancamiento = target_vol ÷ volatilidad realizada de la cartera). Si ambos no coinciden, combinar varias estrategias cuenta el riesgo por duplicado.

Lo que el objetivo de volatilidad no va a hacer por ti

  • Ajusta el tamaño de la posición, no si la señal es correcta. El escalado multiplica a la señal: cuando la señal se equivoca, solo decide cuánto te equivocas.
  • target_vol ≈ MDD aceptable ÷ 2 es una relación empírica observada en estrategias de seguimiento de tendencia, no una garantía. La tabla dice MDD "típico", no máximo.
  • La volatilidad realizada se calcula con las últimas lookback barras: cuanto más larga es la ventana, más estable es la estimación y más lenta su reacción; cuanto más corta, más se pasa de frenada ante un pico puntual. Ninguna de las dos te avisa por adelantado de que la volatilidad va a saltar.