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 nominalEse 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.