
Todos los selectores de acciones con IA te prometen la próxima NVIDIA.
Ninguno te enseña por qué.
Te dan una nota del 1 al 10, una etiqueta verde y un "Comprar". Lo que no te dan son los datos que hay detrás, los pesos del modelo ni una forma de comprobar si simplemente está persiguiendo lo que más subió el último trimestre.
Si:
Esto te interesa.
Las apps más conocidas funcionan igual. Danelfin, Kavout y Prospero.ai cogen miles de acciones, las pasan por un modelo propietario y te devuelven un ranking.
Es útil. Pero tiene límites:
La alternativa que casi todo el mundo prueba después es peor: abrir ChatGPT y preguntar "¿cuáles son las mejores acciones para comprar ahora?"
El modelo responde con total seguridad. A veces los PER que cita son de 2023. A veces, inventados.
Ninguna de las dos opciones te da un sistema que puedas auditar.
Quita el marketing y cualquier AI stock picker hace tres cosas:
Todo el mundo habla del modelo. Lo que se rompe son los datos.
Elegir acciones no necesita más inteligencia. Necesita mejores datos de entrada.
Antes de escribir código, conviene ser honesto con lo que ganas y lo que pierdes.
| Opción | Datos que ves | ¿Puedes cambiar el modelo? | Coste |
|---|---|---|---|
| Danelfin | Nota + factores principales | No | Plan gratuito + planes de pago |
| Kavout | Nota sobre más de 9.000 acciones de EE. UU. | No | Plan gratuito + planes de pago |
| Prospero.ai | Señales en una app | No | App gratuita |
| ChatGPT a secas | Lo que recuerde | Solo el prompt | Gratis / Plus |
| Hazlo tú con EODHD + LLM | Todos los números | Sí, por completo | Plan de la API + unos céntimos de LLM |
Para quién es cada uno: si quieres una app lista para usar, elige una de las tres primeras. Si quieres saber exactamente por qué una acción sale la número 1, y poder cambiarlo, constrúyelo tú.
Es lo que vamos a hacer.
Uso EODHD APIs para este tipo de proyectos porque con una sola API key tengo todo lo que necesita el selector:
Mismo formato JSON, misma autenticación, mismos límites.
👉 Puedes conseguir tu API key de EODHD aquí y seguir el tutorial.
Instala las dependencias:
pip install requests pandas python-dotenv openai
Crea un archivo .env con tus claves:
EODHD_API_KEY=your_eodhd_key
OPENAI_API_KEY=your_openai_key
Y una pequeña función para llamar a cualquier endpoint de EODHD:
import os, json
from datetime import date, timedelta
import requests
import pandas as pd
from dotenv import load_dotenv
load_dotenv(override=True)
EODHD_KEY = os.environ["EODHD_API_KEY"]
BASE = "https://eodhd.com/api"
def get(path, **params):
params.update(api_token=EODHD_KEY, fmt="json")
r = requests.get(f"{BASE}/{path}", params=params, timeout=30)
r.raise_for_status()
return r.json()
Empezamos con las 200 mayores empresas de EE. UU. con más de 10.000 millones de dólares de capitalización. La Screener API devuelve hasta 100 filas por llamada, así que paginamos.
def build_universe(n=200):
rows = []
for offset in range(0, n, 100):
rows += get(
"screener",
filters=json.dumps([
["market_capitalization", ">", 10_000_000_000],
["exchange", "=", "us"],
]),
sort="market_capitalization.desc",
limit=100,
offset=offset,
)["data"]
df = pd.DataFrame(rows)[["code", "name", "sector", "market_capitalization", "adjusted_close"]]
return df.drop_duplicates("code").reset_index(drop=True)
Cinco variables por acción. Cada una corresponde a un factor clásico:
| Variable | Factor | Fuente |
|---|---|---|
| ROE (TTM) | Calidad | Fundamentals API |
| Crecimiento de ingresos interanual | Crecimiento | Fundamentals API |
| PER frente a la mediana del sector | Valor | Fundamentals API |
| Rentabilidad 6-1 meses | Momentum | EOD API |
| Sentimiento de noticias a 30 días | Sentimiento | Sentiment API |
def fundamentals(ticker):
h = get(f"fundamentals/{ticker}.US", filter="Highlights")
return {
"roe": h.get("ReturnOnEquityTTM"),
"rev_growth": h.get("QuarterlyRevenueGrowthYOY"),
"margin": h.get("ProfitMargin"),
"pe": h.get("PERatio"),
}
def momentum(ticker):
"""6-month return, skipping the most recent month (classic 6-1 momentum)."""
start = (date.today() - timedelta(days=200)).isoformat()
px = pd.DataFrame(get(f"eod/{ticker}.US", **{"from": start}))["adjusted_close"]
if len(px) < 130:
return None
return px.iloc[-22] / px.iloc[-130] - 1
def sentiment(tickers):
"""Average news sentiment over the last 30 days."""
start = (date.today() - timedelta(days=30)).isoformat()
out = {}
for i in range(0, len(tickers), 20):
batch = [f"{t}.US" for t in tickers[i:i + 20]]
data = get("sentiments", s=",".join(batch), **{"from": start})
for sym, days in data.items():
if days:
out[sym.split(".")[0]] = sum(d["normalized"] for d in days) / len(days)
return out
¿Por qué saltarse el último mes en el momentum? Porque los movimientos a muy corto plazo tienden a revertirse. La ventana 6-1 es la forma estándar de captar la tendencia sin ese ruido.
Esta es la salida real de los pasos 1 y 2:

Falló un ticker: VTI. Es un ETF, así que no tiene fundamentales de empresa. El try/except lo saltó y la ejecución siguió con 199 acciones.
Aquí no hay red neuronal. Cada variable se convierte en un percentil (de 0 a 1) y se multiplica por un peso. La suma da una nota de 0 a 100.
WEIGHTS = {"momentum": 0.25, "quality": 0.25, "growth": 0.20, "value": 0.15, "sentiment": 0.15}
def score(df):
df = df[df["pe"].fillna(0) > 0].copy() # drop loss-makers and missing P/E
df["rel_pe"] = df["pe"] / df.groupby("sector")["pe"].transform("median")
ranks = pd.DataFrame({
"momentum": df["momentum"].rank(pct=True),
"quality": df["roe"].rank(pct=True),
"growth": df["rev_growth"].rank(pct=True),
"value": (-df["rel_pe"]).rank(pct=True),
"sentiment": df["sentiment"].rank(pct=True),
}).fillna(0.5)
for f, w in WEIGHTS.items():
df[f"s_{f}"] = ranks[f] * w * 100
df["score"] = df[[f"s_{f}" for f in WEIGHTS]].sum(axis=1).round(1)
return df.sort_values("score", ascending=False).reset_index(drop=True)
Aquí hay dos decisiones de diseño importantes:
Este es el resultado. 194 acciones pasaron el filtro de PER:

Y el mismo ranking en un gráfico, para ver qué factor empuja cada nota:

SanDisk y Micron llegan arriba siendo fuertes en todos los factores. Recruit Holdings (RCRUY) es el caso contrario: momentum y sentimiento de primera, pero casi nada en valor. Su PER es 3,16 veces la mediana de su sector.
Eso es justo lo que nunca ves con una nota única.
Aquí es donde fallan casi todos los tutoriales de "AI stock picker": le piden al LLM que elija las acciones.
Nosotros hacemos lo contrario. El modelo ya ha elegido. ChatGPT solo recibe los números de una acción y escribe la tesis.
from openai import OpenAI
def explain(row):
facts = {
"ticker": row["code"], "name": row["name"], "sector": row["sector"],
"score": row["score"],
"momentum_6_1": round(row["momentum"], 3),
"roe_ttm": row["roe"], "revenue_growth_yoy": row["rev_growth"],
"profit_margin": row["margin"], "pe": row["pe"],
"pe_vs_sector_median": round(row["rel_pe"], 2),
"news_sentiment_30d": round(row["sentiment"], 3) if pd.notna(row["sentiment"]) else None,
}
prompt = (
"You are an equity analyst. Using ONLY the data below, write a 4-sentence "
"investment thesis: why the model ranks this stock highly, and the main risk. "
"Do not use any number that is not in the data. Ratios are decimals "
"(0.25 = 25%): write them as percentages.\n\n" + json.dumps(facts, indent=2)
)
resp = OpenAI().responses.create(model="gpt-5.4-mini", input=prompt)
return resp.output_text
La salida real para el top 3:

Léela con atención, porque tiene lección.
Las tesis se apoyan en datos reales. Todos los números salen de nuestros datos. Pero el LLM cometió dos pequeños errores:
Ni un PER inventado. Ni un beneficio alucinado. Solo fallos de formato que un revisor detecta en segundos.
Limita el LLM a tus datos y sus errores pasan de peligrosos a cosméticos.
Lo más útil no fue la acción número 1. Fue este gráfico:

Tecnología es el 20,6 % del universo. Y el 85 % del top 20 (17 de 20).
El modelo no está roto. Ahora mismo, las empresas de memoria, almacenamiento y equipos de semiconductores lideran a la vez en momentum, crecimiento y sentimiento. Un modelo de factores premia exactamente eso.
Pero si compraras el top 20 a ciegas no tendrías una cartera diversificada. Tendrías una sola apuesta grande por el ciclo del hardware de IA.
Hay una segunda trampa, más pequeña. ASML aparece dos veces en el top 20: ASML (la cotización en EE. UU.) y ASMLF (la línea OTC). La misma empresa con dos tickers. Quitar duplicados por empresa es una línea de código, una vez que lo ves.
Un AI stock picker de caja negra no te habría enseñado ninguno de los dos problemas.
A partir de aquí puedes construir:
❓ ¿Existe algún AI stock picker gratis? ✅ Sí. Prospero.ai tiene una app gratuita, y Danelfin y Kavout tienen planes gratuitos con rankings limitados. Si quieres control total, el script de Python de este artículo es gratis de ejecutar. Solo pagas la API de datos y unos céntimos de LLM.
❓ ¿Puede ChatGPT elegir acciones? ✅ No de forma fiable por sí solo. Sin datos en tiempo real, ChatGPT puede citar números desactualizados o inventados. Funciona bien como capa de explicación cuando le das datos reales y actuales de una API, como hemos hecho en el paso 4.
❓ ¿Son precisos los selectores de acciones con IA? ✅ Ninguno puede garantizar rentabilidad. Los modelos de factores como este ordenan las acciones según características que históricamente han importado (momentum, calidad, valor), pero la única forma de medir su precisión es un backtest bien hecho con datos point-in-time.
❓ ¿Qué datos necesita un selector de acciones con IA? ✅ Como mínimo: histórico de precios para el momentum, fundamentales (ROE, crecimiento, valoración) y, a ser posible, sentimiento de noticias. EODHD los cubre todos con una sola API key.
La mayoría de los inversores no necesita un AI stock picker más listo.
Necesita uno por dentro del que pueda ver.
En el siguiente artículo de la serie pasamos de ordenar cientos de acciones a analizar una a fondo: análisis de acciones con IA usando un LLM y estados financieros reales.
👉 Empieza a construir con EODHD APIs: Screener, Fundamentals, precios EOD y News Sentiment con una sola clave. Usa el código KEVIN10 al pagar para tener un 10 % de descuento.
Aviso: este artículo es solo educativo y no es una recomendación de inversión. Los rankings que aparecen son el resultado de un modelo de ejemplo a 1 de noviembre de 2026.
¿Buscas contenido técnico para tu empresa? Te puedo ayudar: LinkedIn · kevinmenesesgonzalez@gmail.com