Primavera de 1998, seis estudiantes de MBA en Cornell aplicaron una ecuación a los estados financieros de Enron y obtuvieron -1.89.
El límite para "esta empresa probablemente está manipulando los libros" es -2.22. Enron lo superaba. Y, de nuevo, eran estudiantes, no una firma de contabilidad forense.

Colgaron el informe en el sitio web de la escuela. Todo Wall Street aún calificaba a Enron como "comprar" en ese entonces, y la mayoría mantuvo esa recomendación hasta unas semanas antes de que la acción llegara a cero.
Era una presentación pública que cualquiera podía obtener y una fórmula que toma unos 20 minutos a mano. Eso es todo lo que te voy a mostrar, excepto que tú lo ejecutarás en segundos y podrás aplicarlo a cualquier empresa o token del planeta.
No es asesoría financiera, haz tu propia investigación. Las puntuaciones forenses son indicadores de probabilidad, no pruebas, y cada precio aquí cambia, así que verifica antes de comprometerte. Creo herramientas para traders profesionales de mercados de predicción @coldvisionXYZ
Nivel 0: La Casa de los Datos
Toda empresa pública en EE. UU. presenta informes ante la SEC, y la SEC los pone a disposición a través de una API llamada EDGAR. Accedes a una URL y obtienes cada número que una empresa haya reportado, ya estructurado.
2 cosas convierten a EDGAR en un arma:
- Búsqueda de texto completo. Indexa el texto real de cada presentación jamás realizada, así que puedes buscar una frase como "debilidad material" en todo el mercado y obtener todas las empresas que acaban de admitir en silencio que sus controles contables están rotos. Eso es una lista de vigilancia para cortos en aproximadamente un segundo.
- Estados financieros estructurados. Cada partida, cada trimestre, legible por máquina, con años de antigüedad.
edgartools es la que necesitas.

Pip install, sin clave, y analiza 10-K, 8-K, Formularios 4 de información privilegiada, tenencias de fondos 13F, todo en objetos Python limpios.
También incluye un servidor MCP, así que puedes apuntar a Claude directamente y decirle "compara el crecimiento de ingresos de Apple y Microsoft en 3 años" y realmente va y obtiene las presentaciones reales en lugar de inventar números que suenen bien.
sec-edgar-downloader es la que todos encuentran primero. Solo descarga la presentación sin procesar y te deja con un montón de HTML para analizar tú mismo. Esa era la opción hace unos años, ahora es solo una molestia. Usa edgartools.
BamSEC si solo quieres leer presentaciones sin la interfaz de EDGAR de 1998. Lector limpio, comparación lado a lado, gratis para la mayoría de lo que necesitas. Bueno para un vistazo rápido.

Ahora tienes acceso estructurado gratuito a los libros de todas las empresas públicas.
Nivel 1 - Atrapa a los Mentirosos
Tienes los números. Antes de leer una sola frase de la gerencia hablando de su "año transformador", ejecutas algunas fórmulas sobre las cifras brutas.
Los académicos construyeron estas fórmulas a partir de décadas de casos reales de fraude. Solo tienes que saber qué busca cada una.
Beneish M-Score es el de Enron.
Ocho entradas combinadas en un solo número. La entrada más importante, por mucho, son las acumulaciones totales sobre los activos totales, porque la forma más rápida de falsificar ganancias es contabilizar ingresos que nunca se materializaron en efectivo. La siguiente bandera es un crecimiento de ventas demasiado limpio para ser honesto, y esa fue la que se encendió en Enron. Por encima de -2.22, investigas. Enron obtuvo -1.89.

Altman Z-Score es tu lectura de quiebra.
Mezcla rentabilidad, apalancamiento y qué tan duro trabajan los activos en una sola puntuación de angustia. Por debajo de 1.81 es la zona de peligro.

Ratio de acumulaciones de Sloan es la calidad de las ganancias.
Las ganancias basadas en efectivo son reales, las ganancias basadas en acumulaciones se revierten. Si se desvía más o menos del 25%, las ganancias son básicamente un espejismo contable a punto de desvanecerse.

Piotroski F-Score, 9 puntos de sí/no sobre si una empresa se está fortaleciendo financieramente. 6 o más es saludable.

Lo que convierte esto de tarea en un flujo de trabajo es ejecutar los 4 a la vez en toda tu lista de vigilancia y solo leer los nombres que se marcan. Que es exactamente lo que hace el script que está más abajo.
Y por favor, no reimplementes estos desde un blog aleatorio, la mitad del código M-Score en GitHub es sutilmente incorrecto.
FinanceToolkit tiene más de 150 ratios - Beneish, Altman, Piotroski, Sloan, todos - con las fórmulas escritas abiertamente para que puedas auditar un número cuando no confíes en él.
Combínalo con una clave de FMP para los datos y estás listo. Honestamente, uno de los repositorios financieros más infravalorados, transparente y realmente mantenido.

Beneish se ejecuta con los datos del año anterior, por lo que la manipulación podría ya estar deshaciéndose para cuando la veas. Omite algunos fraudes reales y marca algunos limpios como falsos positivos. Una puntuación mala significa abrir la presentación. Nunca es, por sí sola, una razón para vender en corto.
Nivel 2: La IA Lee las Palabras por Ti
Hiciste el filtro, algo se marcó, ahora abres el 10-K, que tiene más de 100 páginas de jerga legal diseñada específicamente para ser ilegible.
Deja ese trabajo para la IA.
La forma incorrecta es:
pegar toda la presentación en un chat y preguntar "¿es una buena empresa?". Se ahoga y te dice lo que quieras escuchar.
La forma correcta es:
Pídele que compare este año con el año anterior.
Extrae la sección de Factores de Riesgo del 10-K de este año y del año pasado, entrega ambas al modelo y dale una sola tarea.
Dime solo lo que es NUEVO este año o lo que se ELIMINÓ, cita el nuevo lenguaje, ignora el texto estándar que está en ambas.
Una empresa que inserta en silencio un párrafo sobre concentración de clientes acaba de decirte que un cliente grande está tambaleándose. Una que elimina una línea sobre un proveedor clave acaba de decirte que una relación terminó. Nada de eso aparece en el comunicado de prensa. Los abogados escriben esas oraciones porque tienen miedo de ser demandados, y el miedo es información que está en texto plano que nadie lee dos veces.
El mismo diff funciona en el MD&A (la propia historia del año de la gerencia) y en las notas al pie. Todo el fraude de Enron vivía en las notas al pie sobre entidades fuera de balance. La historia era una mentira, las notas al pie no.
El repositorio edgar-crawler existe básicamente para extraer esas secciones de elementos, Factores de Riesgo y MD&A, en JSON limpio para que no tengas que usar expresiones regulares en HTML para obtenerlos. Ese es su único trabajo y lo hace bien, alimenta la salida en tu diff.
Si prefieres pagar a construir, aquí tienes un mapa honesto de quién hace esto por ti.
Hudson Labs (antes Bedrock AI)
Es la opción subestimada y por la que realmente pagaría. Hace la extracción automática de banderas rojas entre años, detecta lenguaje de empresa en funcionamiento, debilidades materiales, riesgo de partes relacionadas sin que se lo pidas. Empieza alrededor de $100/mes. Si lees presentaciones en serio, esta es la mejor relación calidad-precio de la lista.

AlphaSense
El estándar institucional, alrededor de 15-20k por asiento, así que realista solo si tu empresa paga. Es dueño de Tegus, una biblioteca de miles de entrevistas pagadas con exejecutivos y clientes. Es lo más cercano a información privilegiada legal que puedes obtener, y no puedes recrearlo gratis.

Daloopa
Extrae estados financieros listos para modelos con cada número hipervinculado a su ubicación exacta en la presentación. Esa pista de auditoría es por qué la gente que construye DCF serios lo usa. Precio empresarial, excesivo a menos que modelar sea tu trabajo real.

Fintool es primero IA, construido para acciones de EE. UU., citas en todo, más alertas permanentes como "avísame cuando cualquier empresa mencione nuevos problemas en la cadena de suministro".
Un punto medio decente si Hudson te parece demasiado forense y AlphaSense demasiado caro.

Nivel 3: Cripto
Pasamos a los tokens. Exactamente la misma idea.
En las acciones, el fraude se esconde en las acumulaciones y las notas al pie.
En cripto, se esconde en los calendarios de emisión y la concentración de tenedores, y ambos están en una cadena pública que puedes leer gratis.
Tu equivalente de EDGAR aquí es DefiLlama.

API gratuita, sin clave, cubre básicamente el TVL, comisiones, ingresos y calendario de desbloqueo de cada protocolo.
Un protocolo tiene 3 números que se corresponden directamente con una empresa normal.
- Comisiones = todo lo que pagan los usuarios. Eso es el ingreso bruto.
- Ingresos = la parte que el protocolo realmente se queda. Eso es el ingreso neto.
- Ganancias = ingresos menos los tokens que imprimió para sobornar a los usuarios a que aparecieran en primer lugar.
Token Terminal estandariza exactamente estos, comisiones, ingresos, ganancias, los equivalentes cripto de P/E, en todas las cadenas principales.
Es genuinamente el Bloomberg-de-las-cripto y la estandarización es un trabajo real que odiarías hacer a mano. Pero cuesta ~350/mes, que es mucho para una sola persona, y el nivel gratuito más DefiLlama te lleva la mayor parte del camino.

Luego los 2 asesinos, la versión cripto del cribado forense.
Primero, los calendarios de desbloqueo.
Los tokens no existen todos en el lanzamiento, las asignaciones del equipo y los VC se consolidan durante años, y cuando se desbloquean, las personas que entraron cerca de cero finalmente pueden tirarlos al mercado. Regla general, cualquier desbloqueo único superior al 5% del suministro circulante es una bandera roja. Para hacerlo real, el primer gran acantilado de Arbitrum desbloqueó, en un día, una cantidad de ARB aproximadamente igual a todo el suministro circulante en ese momento. Las ballenas que mantuvieron desde el principio pudieron salir al por menor y la fecha estaba en un calendario con meses de antelación.
Conoce las 3 formas.
- Acantilado: suelta un bloque grande en un día (violento).
- Consolidación lineal: gotea diariamente (sangrado lento que a veces puedes soportar).
- Emisiones basadas en actividad. Un acantilado hacia una billetera de VC es el que termina con las carteras.
Segundo, la concentración de tenedores. Quién posee realmente la cosa. Si un puñado de billeteras tiene la mayor parte del suministro y están etiquetadas como equipo o algún fondo de VC temprano, felicidades, eres la liquidez de salida por diseño.
Aquí es donde las herramientas de etiquetado de billeteras valen la pena, porque los datos brutos de la cadena son solo 0xxxxxxx... hasta que alguien te dice que es Jump Trading o un contrato de consolidación del equipo.
Arkham
Empieza aquí porque es gratis para individuos, que ninguna otra plataforma seria lo es. El motor de desanonimización es real, es la firma que rastreó públicamente miles de millones en bitcoins robados hasta un hack. Puedes ejecutar ese mismo rastreo de entidades en cualquier token que estés mirando. Gratis es la característica asesina, solo úsalo.
Nansen
Rastrea "dinero inteligente", billeteras con un historial de ser tempranas y correctas, en muchas cadenas. Recientemente redujo drásticamente su precio Pro a alrededor de $49/mes. Las etiquetas son todo el producto y son buenas, pero el rastro se enfría en el momento en que los fondos llegan a un exchange centralizado. Vale la pena si operas en cadena en serio.
Dune
Más de 100k paneles SQL de la comunidad que puedes bifurcar sin escribir una línea de SQL tú mismo. El nivel gratuito es suficiente para casi todos, y alguien ya construyó el panel que quieres, así que búscalo antes de construir el tuyo.
Messari tiene investigación cualitativa y calificaciones sólidas. El precio es opaco y orientado a empresas, la investigación gratuita vale la pena leerla, pero no esperes lo bueno sin una llamada de ventas.
Tokenomist (antes Token Unlocks) es el calendario de desbloqueo dedicado. DefiLlama también cubre desbloqueos, pero si el comercio de desbloqueos es todo lo tuyo, este es el especialista.
Nivel 4: Un Solo Sistema
Ya tienes las piezas, datos gratuitos en ambos lados, matemáticas forenses, el diff de documentos, el cribado en cadena. La última capa es hacer que funcione como una sola máquina en lugar de que estés copiando y pegando entre 15 pestañas.
virattt/ai-hedge-fund es un equipo de agentes de IA, cada uno modelado según la filosofía de un inversor famoso, que discuten sobre una acción y generan una recomendación. Lo de la personalidad del inversor es, honestamente, una especie de truco y definitivamente no deberías operar con él en vivo con dinero real.
Pero como una lección gratuita sobre cómo orquestar agentes de análisis, cómo encadenar un recolector de datos en un filtro en un razonador, es el mejor maestro en GitHub en este momento.

OpenBB es el terminal Bloomberg de código abierto. Conecta tus proveedores de datos una vez, úsalos en todas partes, con un servidor MCP para que un agente pueda manejar todo. Potente pero pesado, la configuración es trabajo real y la calidad de los datos depende completamente de qué proveedor gratuito conectes. Vale la pena si quieres una sola cabina de mando para todo, excesivo si solo quieres filtrar algunos nombres.

FinGPT / FinRobot son LLM financieros de código abierto que puedes ajustar de forma económica. Impresionante académicamente y sí, el ajuste fino es más barato de lo que la gente piensa.
Pero para prácticamente todos, no necesitas ajustar nada, un modelo de frontera con las indicaciones anteriores hace el trabajo.

En orden
Primero la capa de herramientas, llamadas a funciones o servidores MCP que envuelven EDGAR, FMP, DefiLlama, para que el modelo obtenga números reales y nunca los invente. No negociable, una IA que cita una cifra financiera sin fuente es un pasivo, no un analista.
Capa de filtro, las puntuaciones forenses y las comprobaciones en cadena se ejecutan automáticamente en cualquier cosa que entre en tu universo.
Capa de lectura, el diff año tras año en lo que sobrevive al filtro.
Síntesis, el modelo escribe el memorando con una cita para cada afirmación y tú lees el memorando en lugar de las 200 páginas.
Sobre los modelos, Claude o GPT funcionan. Si tocas datos sensibles y no quieres que las presentaciones salgan de tu máquina, ejecuta un modelo abierto localmente a través de Ollama. El modelo nunca fue el foso. El foso es conectarlo a datos limpios, verificados y vinculados a fuentes, y apuntarle matemáticas disciplinadas.
Nivel 5: Construye el Nivel 1
Dale un ticker, extrae las presentaciones reales de EDGAR, calcula Beneish, Altman, Piotroski y el ratio de acumulaciones, y si le das una clave, ejecuta el diff de Factores de Riesgo año tras año y te escribe un veredicto de un párrafo.
1#!/usr/bin/env python32"""3forensic_screener.py - lee cualquier empresa como un analista, en un solo comando.45configuración:6 pip install edgartools anthropic7 export SEC_IDENTITY="Tu Nombre [email protected]" # La SEC requiere este encabezado8 export ANTHROPIC_API_KEY="sk-..." # opcional, solo para el diff910ejecución:11 python forensic_screener.py AAPL12 python forensic_screener.py TSLA NVDA SMCI # filtra varias a la vez13 python forensic_screener.py SMCI --diff # añade el diff de factores de riesgo14"""1516import os, sys, argparse17from dataclasses import dataclass1819# UMBRALES - las líneas que cambian tu postura. ajústalos a tu gusto.20M_FLAG = -1.78 # Beneish por encima de esto -> riesgo de manipulación (límite clásico -2.22)21Z_DISTRESS = 1.81 # Altman por debajo de esto -> zona de angustia22Z_SAFE = 2.99 # Altman por encima de esto -> zona segura23ACCRUAL_BAD = 0.25 # |acumulaciones/activos| por encima de esto -> bandera roja de calidad de ganancias24F_STRONG = 6 # Piotroski en o por encima de esto -> fortalecimiento2526@dataclass27class YearData:28 sales: float; cogs: float; sga: float; net_income: float; cfo: float29 receivables: float; current_assets: float; current_liabilities: float30 ppe_net: float; depreciation: float; total_assets: float31 total_liabilities: float; long_term_debt: float; retained_earnings: float32 ebit: float; market_cap: float; shares: float3334def load_two_years(ticker: str):35 """devuelve (este_año, año_anterior). llama a la SEC EDGAR a través de la red."""36 from edgar import Company, set_identity37 identity = os.environ.get("SEC_IDENTITY")38 if not identity:39 sys.exit("establece SEC_IDENTITY='Tu Nombre [email protected]' - la SEC lo requiere.")40 set_identity(identity)4142 company = Company(ticker)43 fin = company.get_financials()44 inc, bal, cfs = fin.income_statement(periods=2), fin.balance_sheet(periods=2), fin.cash_flow(periods=2)4546 def g(stmt, col, *aliases):47 # búsqueda de fila de mejor esfuerzo; las empresas etiquetan la misma idea de manera diferente48 for a in aliases:49 try:50 row = stmt.loc[stmt.index.str.contains(a, case=False, na=False)]51 if not row.empty:52 return float(row.iloc[0, col])53 except Exception:54 continue55 return 0.05657 def build(col):58 return YearData(59 sales=g(inc, col, "RevenueFromContractWithCustomerExcludingAssessedTax", "Revenues", "SalesRevenueNet"),60 cogs=g(inc, col, "CostOfGoodsAndServicesSold", "CostOfRevenue"),61 sga=g(inc, col, "SellingGeneralAndAdministrativeExpense"),62 net_income=g(inc, col, "NetIncomeLoss"),63 cfo=g(cfs, col, "NetCashProvidedByUsedInOperatingActivities"),64 receivables=g(bal, col, "AccountsReceivableNetCurrent", "ReceivablesNetCurrent"),65 current_assets=g(bal, col, "AssetsCurrent"),66 current_liabilities=g(bal, col, "LiabilitiesCurrent"),67 ppe_net=g(bal, col, "PropertyPlantAndEquipmentNet"),68 depreciation=g(cfs, col, "DepreciationDepletionAndAmortization", "DepreciationAmortizationAndAccretionNet"),69 total_assets=g(bal, col, "Assets"),70 total_liabilities=g(bal, col, "Liabilities"),71 long_term_debt=g(bal, col, "LongTermDebtNoncurrent", "LongTermDebt"),72 retained_earnings=g(bal, col, "RetainedEarningsAccumulatedDeficit"),73 ebit=g(inc, col, "OperatingIncomeLoss"),74 market_cap=getattr(company, "market_cap", 0.0) or 0.0,75 shares=g(bal, col, "CommonStockSharesOutstanding"),76 )7778 # col 0 = año más reciente, col 1 = año anterior (edgartools ordena el más reciente primero)79 return build(0), build(1)8081def d(a, b): return a / b if b else 0.0 # división segura8283def beneish_m_score(t, p):84 DSRI = d(d(t.receivables, t.sales), d(p.receivables, p.sales))85 GMI = d((p.sales - p.cogs)/p.sales if p.sales else 0, (t.sales - t.cogs)/t.sales if t.sales else 0)86 AQI = d(1 - d(t.current_assets + t.ppe_net, t.total_assets), 1 - d(p.current_assets + p.ppe_net, p.total_assets))87 SGI = d(t.sales, p.sales)88 DEPI = d(d(p.depreciation, p.depreciation + p.ppe_net), d(t.depreciation, t.depreciation + t.ppe_net))89 SGAI = d(d(t.sga, t.sales), d(p.sga, p.sales))90 TATA = d(t.net_income - t.cfo, t.total_assets)91 LVGI = d(d(t.total_liabilities, t.total_assets), d(p.total_liabilities, p.total_assets))92 return (-4.84 + 0.92*DSRI + 0.528*GMI + 0.404*AQI + 0.892*SGI93 + 0.115*DEPI - 0.172*SGAI + 4.679*TATA - 0.327*LVGI)9495def altman_z_score(t):96 wc = t.current_assets - t.current_liabilities97 return (1.2*d(wc, t.total_assets) + 1.4*d(t.retained_earnings, t.total_assets)98 + 3.3*d(t.ebit, t.total_assets) + 0.6*d(t.market_cap, t.total_liabilities)99 + 1.0*d(t.sales, t.total_assets))100101def piotroski_f_score(t, p):102 s = 0103 s += t.net_income > 0104 s += t.cfo > 0105 s += d(t.net_income, t.total_assets) > d(p.net_income, p.total_assets)106 s += t.cfo > t.net_income # el efectivo supera las acumulaciones107 s += t.long_term_debt < p.long_term_debt108 s += d(t.current_assets, t.current_liabilities) > d(p.current_assets, p.current_liabilities)109 s += t.shares <= p.shares # sin dilución110 s += d(t.sales - t.cogs, t.sales) > d(p.sales - p.cogs, p.sales)111 s += d(t.sales, t.total_assets) > d(p.sales, p.total_assets)112 return int(s)113114def sloan_accruals(t): return d(t.net_income - t.cfo, t.total_assets)115116def risk_factor_diff(ticker):117 """compara los Factores de Riesgo de este año con los del año anterior. la mejor lectura única en el stack."""118 key = os.environ.get("ANTHROPIC_API_KEY")119 if not key:120 return "(omitido - establece ANTHROPIC_API_KEY para habilitar el diff)"121 from edgar import Company122 import anthropic123 f = Company(ticker).get_filings(form="10-K").latest(2)124 this_rf = getattr(f[0].obj(), "risk_factors", str(f[0]))125 last_rf = getattr(f[1].obj(), "risk_factors", str(f[1]))126 client = anthropic.Anthropic(api_key=key)127 msg = client.messages.create(128 model="claude-opus-4-8", max_tokens=1024,129 messages=[{"role": "user", "content": (130 "compara estas dos secciones de Factores de Riesgo de presentaciones anuales consecutivas. "131 "INFORMA SOLO lo que es NUEVO este año o lo que se ELIMINÓ. cita el nuevo lenguaje. "132 "ignora el texto estándar que está en ambas. termina con una oración: ¿cambia algo aquí el riesgo?\n\n"133 f"AÑO ANTERIOR:\n{last_rf[:40000]}\n\nESTE AÑO:\n{this_rf[:40000]}")}],134 )135 return msg.content[0].text136137def screen(ticker, do_diff=False):138 print(f"\n{'='*60}\n {ticker.upper()}\n{'='*60}")139 try:140 t, p = load_two_years(ticker)141 except Exception as e:142 print(f" no se pudieron cargar las presentaciones: {e}"); return143144 m, z, f, a = beneish_m_score(t, p), altman_z_score(t), piotroski_f_score(t, p), sloan_accruals(t)145 flags = []146 if m > M_FLAG: flags.append(f"M-Score {m:+.2f} - riesgo de manipulación de ganancias")147 if z < Z_DISTRESS: flags.append(f"Z-Score {z:.2f} - zona de angustia financiera")148 if abs(a) > ACCRUAL_BAD: flags.append(f"Acumulaciones {a:+.1%} - bandera roja de calidad de ganancias")149 if f < F_STRONG: flags.append(f"F-Score {f}/9 - no se está fortaleciendo")150151 print(f" Beneish M : {m:+.2f} (> {M_FLAG} = investigar)")152 print(f" Altman Z : {z:.2f} (< {Z_DISTRESS} angustia, > {Z_SAFE} seguro)")153 print(f" Piotroski F: {f}/9 (>= {F_STRONG} fuerte)")154 print(f" Sloan Accr : {a:+.1%} (|x| > {ACCRUAL_BAD:.0%} bandera roja)")155 print(f"\n VEREDICTO: {'INVESTIGAR' if flags else 'LIMPIO'}")156 for fl in flags: print(f" - {fl}")157 if do_diff:158 print("\n DIFF DE FACTORES DE RIESGO (año tras año):")159 print(" " + risk_factor_diff(ticker).replace("\n", "\n "))160161def main():162 ap = argparse.ArgumentParser(description="filtro forense para cualquier empresa pública de EE. UU.")163 ap.add_argument("tickers", nargs="+")164 ap.add_argument("--diff", action="store_true", help="también ejecuta el diff de factores de riesgo")165 args = ap.parse_args()166 for tk in args.tickers:167 screen(tk, do_diff=args.diff)168 print("\nrecordatorio: indicadores de probabilidad, no pruebas. Beneish se ejecuta con datos del año anterior, "169 "por lo que la manipulación podría ya estar deshaciéndose. una puntuación mala significa abrir la presentación, nunca "170 "vender en corto solo por el número.\n")171172if __name__ == "__main__":173 main()
Revisé las matemáticas antes de publicar, introduce un conjunto de números saludables y muestra un M limpio alrededor de -2.24, Z en la zona segura, F en 9/9, acumulaciones cerca de cero, exactamente lo que querrías.
Lo único que necesita tu máquina es la conexión en vivo con la SEC y una clave para el diff. Los alias de etiquetas cubren a los declarantes estándar, uno exótico podría necesitar una línea añadida y marqué dónde.





