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.5con 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¶
- Resuelve: SR-02.
- Complementa: concepts/trading-guardrails (kill switches de portfolio vs stop-loss de position).
- Protege: analysis/momentum-crash-risk — stops aceleran el exit en bad regimes.
- Se combina con: concepts/earnings-management — si earnings blow-up, stop triggers next day.
- Implementación en: concepts/agent-prompts (Risk Agent daily check).