Saltar a contenido

Universe selection — top N market cap S&P500

¿Cuántos stocks considerar en el universe? Resuelve SR-01. Decisión: top 100 del S&P500 por market cap. Balance entre alpha disponible, costos de ejecución, y liquidez en RACIONAL.

El trade-off

Universe Pros Cons
Top 50 Max liquidez, min spread, min noise Universe chico reduce spread top-bottom del composite
Top 100 ← recomendado Balance Algunos nombres menos líquidos
Top 200 Más candidatos en top 10 Incluye mid-caps con más spread en RACIONAL
Top 500 (full S&P) Max ranking granularity Incluye <$5B caps ilíquidas para retail

Qué dice la evidencia

Jegadeesh-Titman 1993

Usaron TODAS las NYSE/AMEX stocks. Pero eso era 1990, con data de brokers que no cobraban spread 1%.

Para retail en 2026 con spread alto

La liquidez importa mucho más. Con spread 0.99% en RACIONAL:

  • Top 50 S&P500: todos con >$50B market cap, bid-ask <0.05% (spreads adicionales mínimos).
  • Top 100: $20B-$50B, bid-ask ~0.05-0.1%.
  • Top 200: $5B-$20B, bid-ask ~0.1-0.3%.
  • Below top 200: $<5B, bid-ask puede ser >0.5%, very liquid solo ciertos times del día.

Alpha vs universe size

  • Momentum effect más fuerte en small-caps (menos eficiente). Pero los small-caps no están accesibles al user (ya discutido en analysis/small-caps-alpha-exception).
  • En mega-caps (top 10), momentum es más débil porque están over-analyzed.
  • Sweet spot: large-caps pero no mega-caps = S&P500 ranks 20-150.

Decisión: Top 100

Razones:

  1. Liquidez suficiente: todos >$20B cap, bid-ask <0.1%.
  2. Universe grande para ranking: top 10 del composite sale de 100 candidates → ranking significance OK.
  3. Spread tolerable con RACIONAL: evita los peor de top 200+ donde la liquidity kills the edge.
  4. Alineado con S&P500 mega-cap weighting: ~80% del market cap del index está en top 100.
  5. Suficiente diversificación sectorial: 100 stocks cubren 11 sectors GICS, permitiendo diversification en the top 10.

Implementación

def select_universe(as_of_date):
    constituents = get_sp500_as_of(as_of_date)  # point-in-time
    # Market cap ranking
    market_caps = get_market_caps(constituents, as_of_date)
    top_100 = sorted(market_caps, reverse=True)[:100]
    # Filter: liquidity minimum
    top_100_liquid = [
        s for s in top_100
        if get_avg_daily_volume(s, as_of_date, period=20) > 1_000_000_usd
    ]
    return top_100_liquid

Tip: el filter de liquidez (>$1M daily volume) es secondary; dentro de top 100 casi todos cumplen.

Por qué NO top 50

  • Universe chico aumenta variance del ranking. Top 10 de 50 = 20% del universe, ranking less differentiating.
  • Si un stock grande gapea, afecta desproporcionadamente el top decile.
  • Menos diversificación sectorial dentro del top 10.

Por qué NO top 200

  • Mid-cap spread en RACIONAL puede comer 1-2% adicional por trade.
  • Fricción × 4-5% winners del año = alpha decay propio.
  • No compensa con mayor alpha de mid-caps porque ése alpha es comido por la fricción.

Cambios de universe

Periódicos:

  • Rebalance constituents: al inicio de cada mes (o quarter), actualizar el top 100 as-of-date. S&P500 membership cambia; los caps cambian diario.
  • Persistency check: si un holding sale del top 100 (fell from top 80 to rank 120), evaluar: ¿vender por ranking change antes del next monthly rebalance?
  • Opción A: NO (rebalance mensual normal, dejar que el monthly screen lo saque).
  • Opción B: SÍ (sell next day). Mayor fricción pero reduce risk de holding a falling name.
  • Recomendación: opción A — momentum strategy by design rides declining names hasta el rebalance.

Edge cases

  • Recién-IPOed: si un stock sube al top 100 recién, excluir hasta 12 meses de trading history (momentum needs the lookback).
  • Post-merger: acqs cambian el universe. Treat as new stock si la ticker cambia.
  • Delisted: excluir al detectar delisting notice.

Gaps

  • Backtest con top 50 vs top 100 vs top 200 sobre 2007-2026 para calibrar empírico.
  • Filter adicional de ADV (average daily volume) en USD puede mejorar vs simple market cap.
  • Considerar filter de "price <$5" — penny stocks nunca deberían entrar.

Relaciones