Saltar a contenido

Stop-loss design per-position

¿Cada holding necesita stop-loss individual? Resuelve SR-02. Decisión: sí, ATR-based trailing de 2.5 ATR. Evidencia (Han 2015): cuadriplica Sharpe en crash scenarios; monthly max loss baja de -49.79% a -11.34% con 10% stop.

El problema

La strategy rebalancea mensualmente. Entre rebalances, un holding puede:

  • Gapear -20% por un earnings disaster.
  • Colapsar por news ruin (fraude descubierto, CEO fuera).
  • Flash crash o event catastrophic.

Sin stop, un -30% overnight en un holding = -3% portfolio (10% weight). Con 10 holdings, 2-3 eventos así al año podrían sumar -10% evitable.

4 opciones

A. Sin stop (rebalance-only)

  • Holdings salen por ranking (caen del top 10).
  • Pro: zero fricción adicional, deja que momentum haga su trabajo.
  • Con: exposed a idiosyncratic blow-ups.

B. Fixed percentage stop (ej. -15% del entry)

  • Si el holding cae 15% desde entry → exit.
  • Pro: simple.
  • Con: no adapta a volatilidad. Un stock volátil triggea stop por noise normal. Un stock estable tolera mucho más loss antes de señal real.

C. ATR-based trailing stop (recomendado)

  • Stop = price - k × ATR(20), con k = 2-3.
  • Se recalcula diario; trailing: solo sube, nunca baja.
  • Pro: adapta a volatilidad del stock. Volátil → stop más ancho; estable → más tight.
  • Con: computacionalmente más caro; requiere ATR data.

D. Volatility-targeted stop (post-MVP)

  • Scale stop por realized vol del portfolio (ver analysis/momentum-crash-risk).
  • Combinado con portfolio-level vol targeting.
  • Pro: optimal risk management.
  • Con: complejidad alta; implement post-MVP.

Evidencia académica

Han et al. 2015 — "Taming Momentum Crashes: A Simple Stop-Loss Strategy"

  • Monthly losses del equal-weighted momentum strategy caen de -49.79% a -11.34% con stop-loss 10%.
  • Average returns y Sharpe ratios MÁS QUE DUPLICAN con stops.
  • Most effective on momentum-type strategies (como la del user).

Individual stock stops — Lei & Li

  • Stops "tight" (2-5%) underperform buy-and-hold en individual stocks por transaction costs.
  • Stops "wide" (10-15%+) son efectivos stopping catastrophic losses.
  • Mean-variance framework: stops no ayudan al expected return, sí ayudan al risk-adjusted return.

Trailing vs fixed

  • ATR-based trailing +15% performance vs fixed percentage (avg studies).
  • 1.5-2.0 ATR para short-term momentum; 2.5-3.0 ATR para swing.

Behavioral

  • Stops combaten disposition effect (retail que holds losers too long esperando recovery).
  • El user + agente LLM son vulnerables a este bias sin stops.

Decisión para el proyecto

ATR-based trailing stop, 2.5 ATR wide, recalculado diario.

Formula

# Per position, daily
atr_20 = calculate_atr(price_history, period=20)
highest_since_entry = max(close_prices_since_entry)
stop_price = highest_since_entry - 2.5 * atr_20

# Trailing: stop only goes UP, never down
stop_price = max(previous_stop_price, stop_price)

# Check
if current_close < stop_price:
    trigger_sell(ticker)

Interaction con rebalance mensual

  • Stop-loss puede triggerar antes del monthly rebalance.
  • Cuando triggea:
  • Sell inmediato (next trading day close o intraday según fase del user).
  • Position va a cash temporal.
  • Next monthly rebalance, el slot se llena con el siguiente en ranking.
  • NO re-entrar inmediatamente al mismo ticker si triggea — add al blocklist por 1 mes minimum.

Stop-loss y fees RACIONAL

⚠️ Con el spread 0.99% de RACIONAL, cada stop triggeado = ~2% round-trip (el ticker sale, en próximo rebalance se reemplaza).

  • Esperar 1-2 stops por año × 10 holdings = ~10-20 eventos/año.
  • Fricción adicional: ~20 trades × 1% = 2-3% annualized.

Trade-off realista: aceptar 2-3% annualized de fricción adicional para evitar catastrophic -10%+ events. Es ganancia esperada positiva.

Execution per phase

Fase 1 HITL

Agent notifica stop triggered → user ejecuta manualmente next morning.

Fase 2/3 (Chrome automation)

Routine daily 15:50 ET verifica todos los holdings contra stop; si triggered, schedule sell para 09:30 next day.

Edge cases

  • Gap overnight -30%: el stop no limita el loss del gap; solo el continuation. OK — es riesgo inherente.
  • Stop triggers same day user rebalances: rebalance wins, stop se cancela para ese ticker.
  • Trending stock: ATR trailing sube con el precio, lock in gains progresivamente.
  • Stock con big news up +50%: trailing stop sube con precio; si corrige -20%, salida con gain preservado.

Gaps

  • Calibrar el k = 2.5 con backtest sobre la strategy específica del user.
  • Test 2.0 vs 2.5 vs 3.0 ATR — cuál optimiza Sharpe.
  • Si RACIONAL no permite stop-limit orders nativos, el user/agent debe simular vía monitoreo + market sell trigger.

Relaciones