Quant500 Academy

3. Costes reales: comisiones, slippage y tamaño de posición

Nivel 12: Backtesting y Métricas de Riesgo Reales

En el Nivel 5 hiciste un backtest deliberadamente ingenuo: sin comisiones, sin slippage, entrando y saliendo al precio de cierre exacto. Te avisamos entonces de que aquello no era un resultado, era un boceto. Este módulo cierra esa deuda.

Las comisiones

En Backtrader se configuran en una línea:

cerebro.broker.setcommission(commission=0.001)  # 0,1% sobre el nominal

Ese 0,1% parece inofensivo. Haz la cuenta: se aplica a la compra y a la venta, de modo que cada operación completa cuesta un 0,2% del nominal movido. Una estrategia que hace 250 operaciones completas al año sobre todo el capital paga un 50% anual en comisiones. No hay ventaja estadística razonable que sobreviva a eso. La rotación es una variable de diseño de primer orden, no un detalle de implementación.

Para acciones de EE. UU. suele ser más realista un esquema por acción con mínimo:

class ComisionPorAccion(bt.CommInfoBase):
    params = (
        ('commission', 0.005),   # dólares por acción
        ('stocklike', True),
        ('commtype', bt.CommInfoBase.COMM_FIXED),
    )

    def _getcommission(self, size, price, pseudoexec):
        return max(abs(size) * self.p.commission, 1.0)  # mínimo 1 dólar

cerebro.broker.addcommissioninfo(ComisionPorAccion())

El slippage

La comisión es el coste visible; el slippage es el invisible y casi siempre el mayor. Es la diferencia entre el precio que tu backtest asume y el precio al que realmente se cruza tu orden: la horquilla que pagas, el impacto que tu propio volumen provoca y el movimiento del precio entre que decides y ejecutas.

cerebro.broker.set_slippage_perc(perc=0.0005)   # 0,05% por operación
# o en valor absoluto:
# cerebro.broker.set_slippage_fixed(fixed=0.02)

Hay una asimetría cruel que conviene interiorizar. Las estrategias de reversión a la media compran cuando el precio cae y venden cuando sube; están dando liquidez, y el mercado suele cobrarles ese servicio justo cuando más se mueve. Las estrategias de momentum persiguen el precio, es decir, consumen liquidez y pagan la horquilla completa. En ambos casos el slippage real tiende a ser peor que el promedio histórico precisamente en los días de más volatilidad, que son los días en los que la estrategia genera más señales.

Una regla práctica: si el retorno medio por operación de tu estrategia es del mismo orden de magnitud que la horquilla media del activo, la estrategia no existe. Es ruido decorado con una curva de capital.

El tamaño de posición

cerebro.addsizer(bt.sizers.FixedSize, stake=1000)

Este sizer compra 1000 acciones siempre. Con un capital inicial de 100.000 y un precio de 180 dólares por acción, cada orden pretende mover 180.000 dólares: más que todo el capital. El bróker simulado rechazará la orden por margen insuficiente y tu backtest hará muchas menos operaciones de las que crees, sin avisar. El problema inverso también existe: si el activo cotiza a 8 dólares, cada operación mueve el 8% del capital y la estrategia queda infrainvertida.

Alternativas más sensatas:

cerebro.addsizer(bt.sizers.PercentSizer, percents=95)

O un sizer propio que dimensione por riesgo: fijar cuánto estás dispuesto a perder por operación (por ejemplo, el 1% del capital) y dividir esa cantidad por la distancia al stop en euros por acción. Así el tamaño se adapta a la volatilidad del activo en vez de al azar del precio nominal.

Una comprobación rápida y muy reveladora: corre el mismo backtest con costes cero y con costes realistas. Si la diferencia entre ambos resultados es mayor que el beneficio del segundo, lo que tenías no era una estrategia.

El resto de Quant500

Lo que estás aprendiendo, aplicado al índice todos los días:

La cartera del modelo, cada semana en tu correo

Cada sábado, su semana en un minuto: cómo fue, lo mejor y lo peor, y qué directivos compraron con su dinero. Y el día que el modelo se rehace, qué entra y qué sale. Es una simulación, no un consejo. Como mucho un correo a la semana, sin publicidad y sin cuenta; te das de baja con un clic. Lo hace una persona: Pol Gracia.

Cartera modelo con resultados simulados, no una recomendación personalizada. Tu correo se usa solo para esto: privacidad.

Detrás de la Academia y del resto de Quant500 hay una sola persona: Pol Gracia Serrahima.