Los parametros fundamentales utilizados han sido definidos en este documento sobre Valoracion de empresas. Con el fin de obtener los datos fundamentales disponibles de todos los tickers del sp500 de forma programatica, vamos a utilizar la api de yfinance:

ticker = yf.Ticker('AAPL')
ticker.quarterly_income_stmt
ticker.income_stmt

Esto descargara los datos de la pestania “income statements” correspondiente a datos economicos, la cual incluye los parametros que son interesantes de cara a este experimento.

https://finance.yahoo.com/quote/AAPL/financials/

Los datos se pueden descargar por publicaciones anuales o por trimestres, para ambos solo 4 periodos disponibles, pero tambien esta la columna TTM, que es una suma movil de los ultimos 4 periodos, esto es, si la empresa esta a mitad de anio fiscal, se refiere al acumulado de los ultimos 4 trimestres publicados. En nuestro caso, vamos a tomar como referencia el TTM para poder hacer la construccion de la cartera en cualquier dia del anio, sin importar si todas las empresas han publicado ya su cuentas.

A continuacion, se calcula el BPA o beneficio por accion de la siguiente forma:

df['BPA'] = df['Net Income'] / df['Basic Average Shares']

Se interpreta el net income incluido en los datos descargados como beneficio neto, lo cual cuadra bastante al compararlo con el EBIT - TAX PROVISION (no se observan datos relativos a pago de intereses de la deuda)

Dicho esto, procedemos a descargar los datos de cotizacion del activo para el periodo en cuestion, esto es, el ultimo anio. En principio, se van a utilizar precios de cierres diarios pero se va a aplicar una media movil de 50 dias para suavizar fluctuaciones bruscas:

result['Earning_Yield'] = (result['BPA'] / rolling(result['Close'],50) * 100

Hecho esto, ya podemos rankear todos los tickers por earning yield y tomando el 10% superior obtenemos el siguiente listado de tickers a fecha de 2026/02/13:

Top 10% por Earning Yield (41 tickers):

  1. CMCSA 19.44%
  2. APA 16.28%
  3. MOS 14.75%
  4. EIX 13.66%
  5. T 12.35%
  6. HPQ 12.31%
  7. SYF 12.05%
  8. EG 11.53%
  9. DVN 11.11%
  10. DAL 11.06%
  11. SOLV 10.91%
  12. AES 10.31%
  13. GL 10.20%
  14. GIS 10.17%
  15. HIG 10.01%
  16. UHS 9.86%
  17. CF 9.86%
  18. FISV 9.84%
  19. VZ 9.84%
  20. TRV 9.81%
  21. EOG 9.35%
  22. VICI 9.34%
  23. GPN 9.33%
  24. UAL 9.31%
  25. FANG 9.30%
  26. PGR 9.19%
  27. TROW 9.18%
  28. PRU 9.10%
  29. OMC 8.91%
  30. PHM 8.84%
  31. USB 8.83%
  32. RF 8.56%
  33. DVA 8.52%
  34. MTB 8.48%
  35. HBAN 8.42%
  36. CB 8.28%
  37. TFC 8.21%
  38. XYZ 8.08%
  39. PNC 8.08%
  40. TGT 8.07%

Conclusiones

  • Al no disponer de un TTM anterior, por ejemplo con un anio de antiguedad, no podemos backtestear.
  • Podriamos usar datos anuales del anio pasado o anteriores, pero hay que gestionar el hecho de que el anio fiscal no tiene por que coincidir en todas las empresa y se hace dificil seleccionar un dia para rebalancear la cartera. Por esto el TTM parece mas interesante.
  • Podriamos construir un TTM manualmente usando los datos trimestrales, pero yahoo finance solo provee los del anterior ejercicio.
  • Hace falta encontrar una api que devuelva el historico de fundamentales para poder backtestear correctamente.
  • Un earning yield alto puede expresar que la empresa esta barata, pero tambien puede expresar problemas. Es por esto que habria que combinar este rankeo e incluir por ejemplo el ROCE que mide la eficiencia de la empresa (formula magica)

todo

Calcular el ROCE y rankear en base a ambos (roce y earning yield) y construir cartera en base a ambos.