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:
- Liquidez suficiente: todos >$20B cap, bid-ask <0.1%.
- Universe grande para ranking: top 10 del composite sale de 100 candidates → ranking significance OK.
- Spread tolerable con RACIONAL: evita los peor de top 200+ donde la liquidity kills the edge.
- Alineado con S&P500 mega-cap weighting: ~80% del market cap del index está en top 100.
- 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¶
- Resuelve: SR-01.
- Usado por: concepts/agent-prompts (Data Agent + Strategy Agent filtran universe).
- Relacionado con: concepts/data-sources-for-backtest (constituents point-in-time).
- Contrasta: analysis/small-caps-alpha-exception (alpha extra en small-caps pero inaccesible).