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

Publicaron el informe en el sitio web de la escuela. En ese entonces, toda la calle aún tenía a Enron con recomendación de compra, y la mayoría mantuvo esa recomendación hasta unas semanas antes de que la empresa llegara a cero.
Era una presentación pública que cualquiera podía consultar y una fórmula que toma unos 20 minutos a mano. Eso es todo lo que estoy a punto de mostrarte, excepto que tú lo ejecutarás en segundos y podrás aplicarlo a cualquier empresa o token del mundo.
No es asesoría financiera, haz tu propia investigación. Los puntajes 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
N0: Casa de Datos
Cada 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 todos los números que una empresa haya reportado, ya estructurados.
2 cosas convierten a EDGAR en un arma:
- Búsqueda de texto completo. Indexa el texto real de cada presentación jamás realizada, por lo 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 seguimiento para ventas en corto 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, por lo 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, gratuito para la mayoría de lo que necesitas. Bueno para echar un vistazo.

Ahora tienes acceso estructurado gratuito a los libros de todas las empresas públicas.
N1 - Atrapa Mentirosos
Tienes los números. Antes de leer una sola frase de la gerencia hablando de su "año transformador", ejecutas algunas fórmulas en las cifras brutas.
Los académicos construyeron estas basándose en décadas de casos reales de fraude. Solo tienes que saber qué está buscando cada una.
Beneish M-Score es la de Enron.
Ocho entradas combinadas en un solo número. La entrada más importante con diferencia 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 como 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.
Combina rentabilidad, apalancamiento y qué tan duro están trabajando los activos en un puntaje de angustia. Por debajo de 1.81 es la zona de peligro.

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

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 seguimiento y solo leer los nombres que marcan. Que es exactamente lo que hace el script que está más abajo.
Y por favor, no reimplementes estos basándote en algún blog aleatorio, la mitad del código M-Score en GitHub está sutilmente incorrecto.
El repositorio FinanceToolkit tiene más de 150 ratios: Beneish, Altman, Piotroski, Sloan, todos ellos, con las fórmulas escritas abiertamente para que puedas auditar un número cuando no confíes en él.
Combínalo con una clave 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 datos del año pasado, por lo que la manipulación podría ya estar deshaciéndose para cuando la veas. Omite algunos fraudes reales y marca falsamente algunos limpios. Un puntaje bajo significa abrir la presentación. Nunca es por sí solo una razón para vender en corto.
N2: IA Lee las Palabras por Ti
Hiciste el filtro, algo 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 cuadro de chat y decir "¿es esta 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 pasado.
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 ambos.
Una empresa que inserta silenciosamente 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 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 solo 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 obtenerlas. Ese es todo su trabajo y lo hace bien, alimenta la salida en tu diff.
Si prefieres pagar en lugar de construir, aquí tienes el 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 de banderas rojas entre años automáticamente, detecta lenguaje de empresa en funcionamiento, debilidades materiales, riesgo de partes relacionadas sin que se lo pidas. Comienza alrededor de $100/mes. Si lees presentaciones en serio, esta es la mejor relación calidad-precio de la lista.

AlphaSense
Opción predeterminada institucional, alrededor de 15-20k por asiento, por lo que realísticamente solo si tu empresa paga. Es dueña de Tegus, una biblioteca de miles de entrevistas pagadas con exempleados y clientes. Tan cerca del conocimiento interno legal como se puede 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. Ese rastro de auditoría es por lo que 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.

N3: Cripto
Cambia a tokens. Exactamente la misma idea.
En las acciones, el fraude se esconde en acumulaciones y notas al pie.
En cripto, se esconde en cronogramas de suministro y 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, tarifas, ingresos y cronograma de desbloqueo de cada protocolo.
Un protocolo tiene 3 números que se asignan directamente a una empresa normal.
- Tarifas = todo lo que pagan los usuarios. Eso es ingreso bruto.
- Ingresos = la parte que el protocolo realmente retiene. Eso es neto.
- Ganancias = ingresos menos los tokens que imprimió para sobornar a los usuarios para que aparecieran en primer lugar.
Token Terminal estandariza exactamente estos, tarifas, ingresos, ganancias, los equivalentes de P/E cripto, en todas las cadenas principales.
Genuinamente el Bloomberg-de-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 cronogramas de desbloqueo.
Los tokens no existen todos en el lanzamiento, las asignaciones del equipo y de los VC se consolidan durante años, y cuando se desbloquean, las personas que entraron cerca de cero finalmente pueden deshacerse de ellos contigo. 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 anticipación.
Conoce las 3 formas.
- Acantilado: libera un gran lote en un día (violento).
- Consolidación lineal: gotea diariamente (sangrado lento que a veces puedes soportar).
- Emisiones: se liberan según la 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 sin procesar 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 gratuito 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 bitcoin 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 intercambio centralizado. Vale la pena si operas en cadena en serio.
Dune
Más de 100,000 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 encuéntralo antes de construir el tuyo propio.
Messari tiene una sólida investigación cualitativa y calificaciones. Los precios son opacos y orientados 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 desbloqueo es lo tuyo, este es el especialista.
N4: Un Solo Sistema
Ahora 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 tú copies y pegues 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 absolutamente no deberías operarlo en vivo con dinero real.
Pero como una lección gratuita sobre cómo orquestar agentes de análisis, cómo encadenar un buscador 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 abiertos que puedes ajustar de forma económica. Académicamente impresionante 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, los puntajes forenses y las comprobaciones en cadena se ejecutan automáticamente en cualquier cosa que entre en tu universo.
Capa de lectura, la comparación año tras año en lo que sobrevive al filtro.
Síntesis, el modelo escribe el memo con una cita en cada afirmación y tú lees el memo en lugar de las 200 páginas.
En cuanto a modelos, Claude o GPT funcionan ambos. 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 la fuente y aplicarles matemáticas disciplinadas.
N5: Construye N1
Entrégale un ticker, extrae las presentaciones reales de EDGAR, calcula Beneish, Altman, Piotroski y el índice de acumulaciones, y si le das una clave, ejecuta la comparación año tras año de Factores de Riesgo 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 # agrega 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_pasado). llama a 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 vs. el año pasado. la mejor lectura de todo 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 fue ELIMINADO. cita el nuevo lenguaje. "132 "ignora el texto estándar en ambas. termina con una oración: ¿cambia algo aquí el riesgo?\n\n"133 f"AÑO PASADO:\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 "169 "pasado, por lo que la manipulación podría ya estar deshaciéndose. un puntaje bajo significa "170 "abrir la presentación, nunca vendas en corto solo por el número.\n")171172if __name__ == "__main__":173 main()
Revisé las matemáticas antes de enviarlo, alimenta un conjunto saludable de números y imprime 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 los presentadores estándar, uno exótico podría necesitar una línea agregada y marqué dónde.





