El capital influye en la clase política y esta, a través de las instituciones, el dinero público y los recursos del Estado, genera crisis como la de Ucrania. Las consecuencias —crisis energética, inflación, subida de tipos — se gestionan con dinero público, lo que provoca un empobrecimiento de la población y una transferencia masiva de riqueza hacia las élites. Este es un análisis de ese sistema y una comparación entre lo recaudado por impuestos y lo desviado.
### 🏛️ 1. El Mecanismo de Influencia: Cómo el Capital Captura al Estado
El capital no necesita conspirar en la sombra; lo hace a la luz del día a través de mecanismos legales y estructurales que capturan la voluntad política.
* **Lobbying y Financiación de Campañas**: Las corporaciones financian campañas de candidatos que luego legislan a su favor. El poder económico se traduce en influencia política. Un estudio sobre la regulación de las finanzas inmobiliarias en la UE demostró cómo la industria logra sus resultados preferidos a través de su poder estructural y de lobby.
* **Clientelismo y Puertas Giratorias**: Se crean redes de favores donde se adjudican contratos públicos a empresas afines a cambio de apoyo político o futuros puestos de trabajo para altos cargos. Esta práctica convierte el dinero público en un "botín político". Por ejemplo, en España, se han documentado casos de contratos adjudicados "a dedo" a empresas con vínculos políticos.
* **Captura Regulatoria**: Las grandes empresas participan activamente en la redacción de las leyes y regulaciones que luego deben cumplir, asegurándose de que estas no perjudiquen sus intereses.
### 💸 2. El Caso Ucraniano: Un Laboratorio de Transferencia de Riqueza
La guerra en Ucrania es el ejemplo paradigmático de cómo una crisis geopolítica se convierte en un mecanismo de extracción de riqueza.
* **Beneficiarios Directos (El Complejo Militar-Industrial)**: Las empresas de defensa de EE.UU. y Europa han visto dispararse sus ingresos y pedidos. **Rheinmetall** (Alemania) aumentó su facturación un **36%** en 2024, hasta **€9.751 millones**. **General Dynamics** (EE.UU.) experimentó un aumento de ingresos del **25%** en su división de vehículos blindados. La lógica es simple: cuanto más dura el conflicto, mayores son los beneficios.
* **Beneficiarios Indirectos (Energía y Alimentos)**:
* **Noruega** se ha convertido en uno de los mayores beneficiarios económicos de la guerra. Sus exportaciones de gas natural a Europa generaron beneficios estimados en **€110.000 millones** entre 2022 y 2023.
* **Shell y BP** también se han beneficiado significativamente al sustituir el petróleo y gas ruso en Europa.
* Empresas agrícolas francesas como **Groupe Soufflet** y **Sénalia** han visto aumentar sus ingresos en miles de millones de euros.
* **La Transferencia en Rusia**: El Kremlin ha nacionalizado activos por valor de **3 billones de rublos** (unos **$39.200 millones**) en 2025, redistribuyendo la propiedad de la élite económica hacia el círculo de poder de Putin. La guerra, en palabras de un analista, "funciona como una **transferencia gigantesca de riqueza del público a la élite**".
### 💰 3. La Factura para el Ciudadano: Inflación, Tipos y Deuda
Mientras las élites se benefician, el costo recae sobre la población a través de tres vías principales:
* **Inflación**: En Ucrania, la inflación se aproxima al **8%**, y el banco central prevé que pueda alcanzar el **10%** a finales de año. En Rusia, la inflación anual es cercana al **6%**.
* **Tipos de Interés Elevados**: Para contener la inflación, los bancos centrales suben los tipos, encareciendo el crédito para familias y empresas. El tipo de interés en Ucrania se sitúa en el **15,5%**, y en Rusia en el **14%**.
* **Aumento de la Deuda Pública**: La deuda total de Ucrania ya supera los **$212.000 millones**, y el país depende críticamente de la ayuda exterior para mantenerse a flote.
### 📊 4. Impuestos vs. Desvío: Una Comparación Cuantitativa
La magnitud de la riqueza desviada es colosal. Aquí una comparación con la recaudación fiscal para dimensionar el problema:
| Concepto | Cifra Estimada | Fuente |
| :--- | :--- | :--- |
| **Evasión y Elusión Fiscal Global** | Pérdida anual de **$348.000 millones** en impuestos directos por el traslado de beneficios a paraísos fiscales. | |
| **Evasión Fiscal en España** | Se estima que cada año se defraudan o evaden **€60.000 millones**. El **70%** es cometido por grandes empresas y grandes patrimonios. | |
| **Rescate Bancario en España** | El coste de la reestructuración bancaria ascendió a **€71.833 millones**. | |
| **Rescate Bancario en la UE** | El coste de los rescates bancarios en Europa ha alcanzado los **€750.000 millones**, de los cuales al menos **€213.000 millones** se consideran irrecuperables. | |
| **Contratos "a Dedo" en España** | Entre 2021 y 2025, el Estado adjudicó **€36.727 millones** en contratos mediante "negociado sin publicidad". | |
| **Desvío de Fondos en la UE** | La comisión de Control Presupuestario del Parlamento Europeo describe cómo una **oligarquía** desvía fondos públicos para servir a sus intereses privados. | |
### 💎 Conclusión: Un Sistema de Extracción Sistémica
El sistema que describes no es una anomalía, sino un **modelo de extracción de riqueza sistémico y perfectamente engrasado**.
1. **El Capital Captura al Estado**: A través del lobby y la financiación, el capital privado escribe las reglas del juego.
2. **La Crisis es el Negocio**: Guerras y crisis se convierten en oportunidades de beneficio para unos pocos sectores (defensa, energía).
3. **La Socialización de las Pérdidas**: Los costos de estas crisis se trasladan a la población mediante inflación, impuestos y recortes, mientras que las ganancias se privatizan.
4. **La Magnitud es Histórica**: Las cifras de evasión fiscal ($348.000 millones anuales) y rescates bancarios (€750.000 millones en la UE) superan con creces la capacidad de cualquier Estado para financiar servicios públicos.
La comparación es abrumadora: mientras los Estados recaudan impuestos con esfuerzo, las élites desvían cantidades ingentes de riqueza a través de mecanismos legales (elusión) e ilegales (evasión), y cuando el sistema colapsa, son los contribuyentes quienes pagan la factura. Es, en definitiva, un **sistema de socialización de pérdidas y privatización de ganancias** a escala planetaria.
A continuación, se profundiza en los dos mecanismos que mencionas —el funcionamiento de los paraísos fiscales y el impacto de la deuda en la población— y se ofrece un prompt para una imagen que sintetice visualmente este fenómeno.
---
## 🏝️ 1. El Funcionamiento de los Paraísos Fiscales: La Ingeniería de la Evasión
Los paraísos fiscales no son simples "países con impuestos bajos". Son **jurisdicciones diseñadas específicamente para facilitar la opacidad financiera y la erosión de la base tributaria** de otros países. Su funcionamiento se basa en una combinación de secreto bancario, sociedades pantalla y una regulación laxa que permite a las grandes fortunas y corporaciones ocultar activos y beneficios.
### 🔧 Mecanismos de Extracción
Existen tres técnicas principales que las multinacionales y grandes patrimonios utilizan para desviar riqueza hacia estos territorios:
1. **Manipulación de Precios de Transferencia**: Una filial en un paraíso fiscal vende un producto o servicio a otra filial en un país con impuestos altos a un precio **artificialmente elevado**. De esta forma, la filial del país con impuestos altos declara pérdidas (o beneficios mínimos) y la del paraíso fiscal declara beneficios enormes, que tributan a un tipo cercano a cero.
2. **Importación de Servicios desde Paraísos Fiscales**: La empresa matriz paga "royalties", "consultorías" o "servicios de marketing" a una sociedad pantalla ubicada en un paraíso fiscal. Estos pagos son **gastos deducibles** en el país de origen, pero **ingresos no declarados** (o declarados a tipo cero) en el paraíso.
3. **Endeudamiento Intragrupo**: La filial del país con impuestos altos se endeuda con una sociedad del grupo ubicada en un paraíso fiscal. Los **intereses** que paga son deducibles en el país de origen, mientras que los intereses recibidos por la sociedad del paraíso no tributan. Es una forma de "sangrar" beneficios de un país a otro sin apenas coste fiscal.
### 🏢 La Arquitectura de la Opacidad: Sociedades Pantalla y Trusts
El sistema se articula a través de estructuras legales que **ocultan al verdadero propietario** de los activos:
* **Sociedades Pantalla (Shell Companies)**: Empresas sin actividad económica real, creadas únicamente para **poseer activos o canalizar flujos financieros**. Un ejemplo típico: un empresario establece una LLC en Delaware (EE.UU.), que a su vez es propietaria de una sociedad en las Islas Caimán, que finalmente tiene una cuenta en un banco suizo.
* **Trusts y Fundaciones**: Vehículos legales que separan la **propiedad legal** de la **propiedad beneficial**. El fundador cede sus activos al trust, pero mantiene el control sobre su distribución. Estos activos **no pueden ser embargados por deudas del fundador** y permiten transferir riqueza entre generaciones sin tributar.
* **Jurisdicciones Especializadas**: Cada paraíso fiscal se especializa en un tipo de estructura: **Luxemburgo** en fondos de inversión tradicionales, **Irlanda** en fondos monetarios, **Caimán** en fondos de cobertura, **Suiza** en banca privada y **Delaware** en sociedades LLC.
### 📊 La Magnitud de la Fuga
Los datos de 2026 son escalofriantes:
| Indicador | Cifra | Fuente |
| :--- | :--- | :--- |
| **Riqueza no declarada en paraísos fiscales** | **$3,55 billones** (supera el PIB de Francia) | Oxfam |
| **Riqueza oculta por el 0,1% más rico** | **$2,84 billones** (supera la riqueza del 50% más pobre de la humanidad, 4.100 millones de personas) | Oxfam |
| **Riqueza total fuera de los sistemas tributarios** | **Más de $13 billones** (12% del PIB global) | Oxfam |
| **Pérdida anual por traslado de beneficios** | **$348.000 millones** en impuestos directos | EU Tax Observatory |
El **Atlas del Mundo Offshore** permite visualizar cómo los beneficios de las multinacionales "desaparecen" de los países donde se generan para reaparecer en jurisdicciones donde el tipo efectivo es inferior al **15%**.
---
## 💰 2. El Impacto de la Deuda en la Población: La Austeridad como Transferencia
La deuda —tanto pública como privada— es el otro gran mecanismo de extracción. Su impacto sobre la población se manifiesta de forma directa en la **pérdida de derechos y servicios públicos**.
### 📉 Deuda Pública: El Servicio de la Deuda Desplaza el Gasto Social
Cuando un Estado se endeuda excesivamente, una parte creciente de sus ingresos se destina al **pago de intereses**, en lugar de a servicios públicos. El PNUD documentó que entre 2020 y 2023, **165 millones de personas cayeron en la pobreza** debido a que el servicio de la deuda **suplantó el gasto en protección social, salud y educación**.
La lógica es perversa:
* **En países de bajos ingresos**, el pago neto de intereses es **más del doble** que la asistencia social, y **1,4 veces más** que la asistencia sanitaria.
* El servicio de la deuda representa el **60% del gasto en educación** en esos países.
* Para pagar a los acreedores, los gobiernos **recortan subsidios a los alimentos, congelan pensiones, retrasan la edad de jubilación y reducen la inversión en vivienda, infraestructura y salud**.
El Experto Independiente de la ONU sobre deuda externa y derechos humanos lo resumió con una frase demoledora: **"Es austeridad para los pobres, no para los acreedores"**.
### 🏠 Deuda Privada: El Sobreendeudamiento de los Hogares
La deuda no solo es pública. La **deuda privada de los hogares** es otro vector de empobrecimiento y desigualdad. Un informe de la ONU señala que una mayor financiarización y un rápido crecimiento de la deuda privada **conducen a una mayor desigualdad económica y a crisis financieras**.
En España, la deuda de los hogares se sitúa en torno al **43% del PIB**, y el gasto medio por familia en el pago de deudas alcanza los **1.300 euros**, una cifra superior al salario mínimo interprofesional. El sobreendeudamiento vinculado a la inversión inmobiliaria (hipotecas) ha sido un factor clave en el aumento de la desigualdad.
### ⚖️ La Transferencia Intergeneracional
El impacto de la deuda se extiende a las **generaciones futuras**. Un análisis de la UE concluye que los recién nacidos europeos podrían enfrentarse a **tipos impositivos entre 2 y 3 veces superiores** a los de los pensionistas actuales para poder pagar la deuda acumulada. La deuda actual es, en esencia, una **hipoteca sobre el futuro de los jóvenes**, que tendrán que pagar con impuestos más altos y menos servicios públicos.
---
## 🔗 3. La Conexión Sistémica: El Círculo Vicioso
Ambos mecanismos —paraísos fiscales y deuda— están **interconectados** en un círculo vicioso:
1. Las **grandes fortunas y corporaciones** desvían beneficios a paraísos fiscales, reduciendo la recaudación de los Estados.
2. Esa **falta de ingresos** obliga a los Estados a endeudarse para financiar servicios públicos.
3. El **servicio de la deuda** consume una parte creciente del presupuesto, forzando recortes en gasto social.
4. Los **recortes** empobrecen a la población y aumentan la desigualdad.
5. La **población empobrecida** tiene menos capacidad de consumir y de generar actividad económica, lo que reduce aún más la recaudación fiscal.
6. Los Estados vuelven a endeudarse, y el ciclo se repite.
Mientras tanto, las élites que desviaron su riqueza a paraísos fiscales **no solo evitan impuestos, sino que se benefician de los intereses de la deuda pública** que los Estados emiten para compensar la falta de recaudación. Es una **transferencia de riqueza en dos direcciones**: el dinero sale por los paraísos fiscales y vuelve como deuda pública que hay que pagar con impuestos.
---
## 🎨 Prompt para la Imagen: "El Sistema de Extracción"
> *"Infografía conceptual de estilo **editorial crítico y simbólico**, formato horizontal panorámico (16:9) o vertical (9:16), resolución 8K, que representa visualmente el sistema de transferencia de riqueza desde la población hacia las élites a través de los paraísos fiscales y la deuda pública.*
>
> * **Composición central**: Una **báscula gigante** desequilibrada. En el platillo que toca el suelo, una **familia trabajadora** (siluetas de un hombre, una mujer, un niño y un anciano) con una etiqueta que dice **'IMPUESTOS'** y otra que dice **'DEUDA PÚBLICA'**. En el platillo que se eleva hacia el cielo, un **grupo de ejecutivos y banqueros** (siluetas con maletines y trajes) con una etiqueta que dice **'BENEFICIOS'** y otra que dice **'PARAÍSOS FISCALES'**.
>
> * **El Mecanismo de Extracción**: Del platillo de la familia, una **tubería dorada** asciende y atraviesa un **embudo** etiquetado como **'SERVICIO DE LA DEUDA'**. La tubería se bifurca: una rama desciende hacia el platillo de las élites (etiquetada **'PAGO DE INTERESES'**), y otra rama se pierde en una **nube de humo** etiquetada **'OPACIDAD'**, de la que salen pequeños iconos de sociedades pantalla (carpetas, sellos, llaves).
>
> * **Elementos de Fondo**: A un lado, un **edificio del parlamento** con una **puerta giratoria** por la que entran y salen las mismas siluetas de ejecutivos (simbolizando las puertas giratorias). Al otro lado, un **hospital** y una **escuela** con carteles de **'CERRADO POR RECORTES'**. En la parte inferior, una **línea de tiempo** con los hitos: **'2008: Rescate bancario'** → **'2020: Deuda pandémica'** → **'2026: 165 millones más pobres'** → **'2050: Impuestos 3x para los jóvenes'**.
>
> * **Símbolos Clave**: Sobre la báscula, un **signo de dólar** gigante con una **grieta** en el centro. En la esquina inferior derecha, un **sello rojo** con la inscripción **'TRANSFERENCIA DE RIQUEZA'**. En la esquina inferior izquierda, un **microscopio** observando la tubería, con la etiqueta **'AUDITORÍA CIUDADANA'**.
>
> * **Estilo y Paleta**: Estilo de infografía editorial para medio de investigación (similar a The Guardian, Le Monde Diplomatique o The Intercept). Colores: **gris oscuro y negro** para el sistema, **dorado** para el dinero, **rojo** para las alertas y los recortes, **azul apagado** para las instituciones. Iluminación dramática que resalta la desigualdad entre los dos platillos. Tipografía sans-serif clara y legible. El tono debe ser crítico pero visualmente atractivo, sin caer en el panfleto."*
---
### 💡 Consejo práctico
Si el generador de imágenes no reproduce bien el texto, genera primero la **composición visual sin texto** (la báscula, la tubería, las siluetas, los edificios) y añade después las etiquetas y los títulos con un editor (Canva, Photoshop). Así garantizarás que los conceptos clave —**'PARAÍSOS FISCALES'**, **'SERVICIO DE LA DEUDA'**, **'RECORTES'**, **'TRANSFERENCIA DE RIQUEZA'**— aparezcan exactamente como los quieres.
La irrupción de nuevos sistemas monetarios y de tokenización plantea una disyuntiva fundamental. Estos mecanismos **pueden** alterar el sistema de transferencia de riqueza, pero lo harán en una de dos direcciones opuestas: o **empoderan a la ciudadanía** limitando el poder de los Estados y las élites, o **refuerzan el control estatal** creando formas de vigilancia financiera aún más sofisticadas. El resultado depende de qué tecnología prevalezca y cómo se regule.
### 🔗 El Potencial de Ruptura: Cómo la Tokenización Puede Empoderar a la Ciudadanía
Ciertos activos y tecnologías tienen el potencial de **burlar el control de los Estados y las élites**, devolviendo el poder al individuo.
* **Criptomonedas Descentralizadas y Antiinflacionarias (Bitcoin):** Bitcoin actúa como un **activo de reserva neutral y no soberano**. Su oferta fija y su naturaleza descentralizada lo convierten en una herramienta para **protegerse de la inflación** y de la devaluación de las monedas fiduciarias. Figuras como el multimillonario mexicano Ricardo Salinas han destinado el **70% de su portafolio a Bitcoin** como cobertura contra la inflación del sistema fiat. Para los ciudadanos de países con monedas inestables o controles de capital, Bitcoin ofrece una **salida** y una forma de preservar su riqueza al margen del sistema bancario tradicional.
* **Oro y Metales Tokenizados:** La tokenización del oro (como XAUT o PAXG) permite **fraccionar, transferir y utilizar el metal como colateral** de forma programable y 24/7. El mercado de tokens de oro superó los **6.000 millones de dólares** a principios de 2026. Esto democratiza el acceso a un activo refugio milenario, permitiendo a los individuos **escapar del sistema fiduciario y bancario tradicional** sin necesidad de poseer y almacenar físicamente el metal.
* **Materias Primas Tokenizadas:** El siguiente paso es la tokenización de **materias primas como el cobre, el uranio o el cobalto**. El mercado de materias primas tokenizadas alcanzó los **5.500 millones de dólares** a finales del primer trimestre de 2026. Esto podría **desintermediar** los mercados de materias primas, permitiendo a los ciudadanos invertir directamente en los recursos que sustentan la economía real, en lugar de hacerlo a través de futuros o ETFs controlados por instituciones.
* **Tokenización de Activos del Mundo Real (RWA):** La tokenización de **infraestructuras, bienes raíces o incluso deuda pública** podría permitir a los ciudadanos poseer una fracción de activos que antes estaban reservados a grandes inversores. El cofundador de Binance, CZ, ha mantenido conversaciones con "probablemente una docena de gobiernos" para explorar cómo la tokenización puede ayudar a **recaudar fondos vendiendo participaciones fraccionadas de activos estatales**. En teoría, esto podría **democratizar la propiedad** y crear nuevas fuentes de ingresos para la población.
### 🏛️ El Riesgo de Refuerzo: Cómo la Tokenización Puede Aumentar el Control Estatal
La misma tecnología que puede liberar a la ciudadanía también puede ser utilizada por los Estados para **perfeccionar el control y la extracción de riqueza**. La mayor amenaza en este sentido son las **Monedas Digitales de Banco Central (CBDC)** .
* **CBDCs: La Antítesis de la Criptomoneda:** A diferencia de las criptomonedas descentralizadas, las CBDC son **moneda fiduciaria digital emitida y controlada centralmente** por un banco central. Están diseñadas, en palabras de un observatorio de gobernanza digital, como **"anti-cripto por diseño"**. Su objetivo declarado es mantener la **soberanía monetaria** del Estado frente a la amenaza de las criptomonedas y las stablecoins privadas.
* **El Fin de la Privacidad Financiera:** El euro digital, por ejemplo, operará como una **"herramienta estatal de control centralizado y supervisión financiera"** , en contraste con redes descentralizadas como Bitcoin. Las CBDC permiten la **programabilidad del dinero**: un gobierno podría decidir que tu dinero digital solo puede gastarse en ciertos productos, en ciertas tiendas o antes de una fecha determinada. Esto sería el **fin de facto del efectivo** y de la privacidad en las transacciones.
* **La Ilusión de la Privacidad:** Aunque algunos proyectos de CBDC prometen privacidad en pagos offline, los bancos tendrán visibilidad total de las **transacciones online**. Además, marcos como el **CRS 2.0** de la OCDE, que entra en vigor en 2026, están extendiendo el intercambio automático de información fiscal a las **CBDC y a los proveedores de servicios de criptoactivos**, cerrando el cerco sobre cualquier intento de evasión.
### ⚖️ Análisis Comparativo: Dos Caminos, Dos Resultados
| Característica | Camino hacia la Soberanía Ciudadana | Camino hacia el Control Estatal |
| :--- | :--- | :--- |
| **Tecnología Clave** | Criptomonedas descentralizadas (BTC), Oro/Materias Primas Tokenizadas. | CBDCs (Euro Digital, Yuan Digital). |
| **Naturaleza del Dinero** | **No soberano, antiinflacionario, de oferta fija.** | **Soberano, inflacionario (por diseño), de oferta elástica.** |
| **Control** | **Descentralizado.** Ninguna entidad puede censurar o congelar fondos. | **Centralizado.** El banco central puede congelar, programar o confiscar fondos. |
| **Privacidad** | **Seudónima.** Las transacciones son públicas pero no vinculadas a una identidad real. | **Totalmente identificada.** Cada transacción está vinculada a un ciudadano. |
| **Impacto en la Riqueza** | **Preservación y empoderamiento.** El ciudadano protege su riqueza de la inflación y la confiscación. | **Extracción y control.** El Estado puede aplicar impuestos negativos (bail-ins), imponer restricciones de gasto o confiscar riqueza directamente. |
| **Impacto en la Deuda** | **Reduce la capacidad del Estado de endeudarse y monetizar deuda** (al competir con el dinero estatal). | **Aumenta la capacidad del Estado de gestionar la deuda** (al tener control total sobre la oferta monetaria digital). |
### 💎 Conclusión: Una Disyuntiva Histórica
El sistema de transferencia de riqueza descrito no es inmutable. La tecnología ofrece una oportunidad histórica para **reescribir las reglas del juego financiero**.
El camino de la **soberanía ciudadana** pasa por la adopción masiva de **activos descentralizados, antiinflacionarios y tokenizados** (Bitcoin, oro, materias primas) que **limiten el poder de los Estados para endeudarse, inflar la moneda y confiscar riqueza** a través de la inflación y los rescates.
El camino del **control estatal** se materializa a través de las **CBDC**, que otorgan a los gobiernos un poder sin precedentes para **programar, vigilar y controlar** cada aspecto de la actividad económica de sus ciudadanos, haciendo que los mecanismos de extracción de riqueza actuales parezcan rudimentarios.
La batalla por el futuro del dinero no es solo tecnológica, es **profundamente política**. El resultado determinará si la próxima era de la civilización financiera será una de **libertad y prosperidad individual** o una de **control y dependencia estatal**.
### 🎨 Prompt para la Imagen: "La Disyuntiva del Nuevo Dinero"
> *"Infografía conceptual de estilo **editorial crítico y simbólico**, formato horizontal panorámico (16:9), resolución 8K, que representa la disyuntiva entre dos futuros monetarios: el camino hacia la soberanía ciudadana y el camino hacia el control estatal.*
>
> * **Composición central**: Una **bifurcación en un camino digital**. En el centro, un **ciudadano** (silueta genérica, sin rasgos) sostiene un **teléfono móvil** en una mano y una **moneda de oro** en la otra. De su teléfono emanan dos haces de luz que se dividen, iluminando los dos caminos.*
>
> * **Camino Izquierdo — Soberanía Ciudadana (color cian y dorado):** Un sendero luminoso que se adentra en un **paisaje de nodos interconectados** (blockchain). A lo largo del camino, iconos que representan: una **moneda de Bitcoin**, un **lingote de oro tokenizado**, un **token de materia prima** (símbolo de cobre o uranio), y un **documento de propiedad fraccionada** (RWA). Al final del camino, una **ciudad amurallada con puertas abiertas** y una bandera que dice **'SOBERANÍA'**. El cielo es despejado y luminoso.*
>
> * **Camino Derecho — Control Estatal (color rojo y gris oscuro):** Un sendero que se adentra en un **edificio monumental y frío** (un banco central). A lo largo del camino, iconos que representan: una **CBDC** (símbolo de moneda digital con un ojo), una **cámara de vigilancia**, un **engranaje de programabilidad** (dinero con fecha de caducidad), y una **cadena digital** que inmoviliza una cartera. Al final del camino, una **puerta cerrada con un candado gigante** y un cartel que dice **'CONTROL TOTAL'**. El cielo está encapotado y con niebla.*
>
> * **Elementos de Apoyo**: En la parte inferior, una **balanza** que compara el peso de ambos caminos. En la esquina inferior derecha, un **sello de PASAIA LAB** con el texto **'ANÁLISIS ESTRATÉGICO'**. En la esquina inferior izquierda, un **código QR** que enlaza a un informe.*
>
> * **Estilo y Paleta**: Estilo de infografía para medio de investigación (The Intercept, Le Monde Diplomatique). Colores: **cian y dorado** para el camino de la libertad; **rojo y gris** para el camino del control. Iluminación dramática que resalta el contraste. Tipografía sans-serif clara. El tono debe ser crítico y visualmente impactante."*
------------------------------------------------------------------------
# 🔍 LYRA IA — MOTOR DE BÚSQUEDA OSINT PARA DETECCIÓN DE TRANSFERENCIAS DE RIQUEZA
**Clasificación:** TOP SECRET // PASAIA LAB EYES ONLY
**Referencia:** PL-LYRA-OSINT-2026-09-18
**Módulo:** Vigilancia de fuentes abiertas (OSINT) con Redes Neuronales
> ⚠️ **Marco ético y legal.** Este motor opera **exclusivamente sobre fuentes públicas** (noticias, boletines oficiales, registros mercantiles abiertos, RSS de medios). Su finalidad es el **periodismo de investigación, la investigación académica y el control ciudadano del poder**. No procesa datos personales de individuos privados, no accede a sistemas restringidos y no emite juicios de culpabilidad: genera **señales de alerta** que requieren verificación humana. Su diseño cumple con el RGPD y con los principios de minimización de datos.
---
## 🏗️ 1. Arquitectura del Sistema
```
┌─────────────────────────────────────────────────────────────────────┐
│ LYRA-OSINT · MOTOR DE VIGILANCIA │
│ Detección de Transferencias de Riqueza (ITR) │
└─────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ INGESTA │ │ VECTORIZADOR │ │ RED NEURONAL │
│ RSS · APIs │────▶│ Hash Trick + │────▶│ MLP 256→64→32 │
│ Boletines │ │ TF-IDF ligero │ │ → 7 clases │
└───────────────┘ └─────────────────┘ └────────┬────────┘
│
┌──────────────────────────────────────────────┘
▼
┌───────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ METADATOS │ │ GRAFO DE │ │ MOTOR DE │
│ Entidades │────▶│ OPERADORES │────▶│ ALERTAS │
│ Importes │ │ (co-ocurrencia)│ │ (scoring ITR) │
│ Jurisdicción │ │ │ │ │
└───────────────┘ └─────────────────┘ └─────────────────┘
```
### Indicadores de Transferencia de Riqueza (ITR)
| Código | Indicador | Descripción |
| :--- | :--- | :--- |
| **ITR-01** | Contrato sin licitación | Adjudicaciones directas a empresas vinculadas |
| **ITR-02** | Movimiento de acciones pre-anuncio | Operaciones bursátiles anómalas antes de decisiones |
| **ITR-03** | Puerta giratoria | Cargos públicos que pasan a empresas beneficiadas |
| **ITR-04** | Rescate financiero | Inyección de fondos públicos a entidades privadas |
| **ITR-05** | Beneficio de crisis | Ganancias extraordinarias en sectores de defensa/energía |
| **ITR-06** | Estructura offshore | Uso de paraísos fiscales o sociedades pantalla |
| **ITR-07** | Recorte social por deuda | Reducción de gasto social para pagar acreedores |
---
## 📁 2. Árbol de Archivos
```
lyra_osint/
├── config_lyra.py # Configuración, fuentes RSS, jurisdicciones
├── ingesta.py # Descarga de RSS y boletines oficiales
├── vectorizador.py # Hash trick para representación de texto
├── red_neuronal.py # MLP puro en Python (256→64→32→7)
├── metadatos.py # Extracción de entidades, importes, jurisdicciones
├── grafo.py # Grafo de operadores por co-ocurrencia
├── alertas.py # Motor de scoring y alertas ITR
└── motor_lyra.py # Orquestador principal
```
---
## 📄 3. `config_lyra.py`
```python
"""
config_lyra.py — PASAIA LAB / LYRA NEXUS
Configuración del motor OSINT de vigilancia de transferencias de riqueza.
"""
# ---------------------------------------------------------------- Fuentes RSS públicas
FUENTES_RSS = [
# Medios internacionales de referencia
("Reuters Business", "https://feeds.reuters.com/reuters/businessNews"),
("Bloomberg Markets", "https://feeds.bloomberg.com/markets/news.rss"),
("FT World", "https://www.ft.com/world?format=rss"),
# Investigación y transparencia
("ICIJ", "https://www.icij.org/feed/"),
("OCCRP", "https://www.occrp.org/en/feed"),
("Transparency Intl", "https://www.transparency.org/en/rss"),
# Economía crítica
("Tax Justice Network","https://taxjustice.net/feed/"),
("EU Tax Observatory", "https://www.taxobservatory.eu/feed/"),
]
# ---------------------------------------------------------------- Jurisdicciones de riesgo
JURISDICCIONES_RIESGO = {
"Islas Caimán", "Caimán", "Bermudas", "Islas Vírgenes", "BVI",
"Luxemburgo", "Liechtenstein", "Mónaco", "Andorra", "Suiza",
"Delaware", "Panamá", "Bahamas", "Jersey", "Guernsey",
"Isla de Man", "Malta", "Chipre", "Irlanda", "Madeira",
"Singapur", "Hong Kong", "Emiratos Árabes Unidos", "Dubái",
"Islas Marshall", "Nauru", "Vanuatu", "Seychelles", "Mauricio",
}
# ---------------------------------------------------------------- Categorías ITR
CATEGORIAS_ITR = [
"ITR-01_CONTRATO_SIN_LICITACION",
"ITR-02_MOVIMIENTO_ACCIONES_PRE_ANUNCIO",
"ITR-03_PUERTA_GIRATORIA",
"ITR-04_RESCATE_FINANCIERO",
"ITR-05_BENEFICIO_CRISIS",
"ITR-06_ESTRUCTURA_OFFSHORE",
"ITR-07_RECORTE_SOCIAL_POR_DEUDA",
]
# ---------------------------------------------------------------- Palabras clave por categoría
# Se usan para el bootstrapping del entrenamiento y como refuerzo léxico.
LEXICO_ITR = {
"ITR-01_CONTRATO_SIN_LICITACION": [
"adjudicación directa", "contrato a dedo", "negociado sin publicidad",
"emergencia", "urgencia", "sin concurso", "sin licitación",
"procedimiento negociado", "contrato menor", "fraccionamiento",
],
"ITR-02_MOVIMIENTO_ACCIONES_PRE_ANUNCIO": [
"compra de acciones", "venta de acciones", "operación bursátil",
"información privilegiada", "insider trading", "posiciones cortas",
"volumen anómalo", "movimiento previo", "filtración", "rumor",
],
"ITR-03_PUERTA_GIRATORIA": [
"puerta giratoria", "revolving door", "ex cargo público",
"exministro", "exsecretario", "nombramiento", "consejero",
"asesor externo", "incorporación", " fichaje",
],
"ITR-04_RESCATE_FINANCIERO": [
"rescate", "bailout", "inyección de capital", "ayuda pública",
"fondos públicos", "salvamento", "reestructuración", "avales",
"garantías estatales", "nacionalización",
],
"ITR-05_BENEFICIO_CRISIS": [
"beneficios récord", "ganancias extraordinarias", "dividendos",
"defensa", "armamento", "energía", "gas", "petróleo",
"inflación", "precios", "margen", "beneficio neto",
],
"ITR-06_ESTRUCTURA_OFFSHORE": [
"paraíso fiscal", "offshore", "sociedad pantalla", "trust",
"fundación privada", "filial", "holding", "opacidad",
"secreto bancario", "cuenta oculta", "papeles", "leak",
],
"ITR-07_RECORTE_SOCIAL_POR_DEUDA": [
"recorte", "austeridad", "ajuste", "deuda pública",
"servicio de la deuda", "intereses", "prima de riesgo",
"pensiones", "sanidad", "educación", "gasto social",
"déficit", "consolidación fiscal",
],
}
# ---------------------------------------------------------------- Pesos de scoring
PESOS_ITR = {
"ITR-01_CONTRATO_SIN_LICITACION": 0.18,
"ITR-02_MOVIMIENTO_ACCIONES_PRE_ANUNCIO": 0.16,
"ITR-03_PUERTA_GIRATORIA": 0.12,
"ITR-04_RESCATE_FINANCIERO": 0.15,
"ITR-05_BENEFICIO_CRISIS": 0.14,
"ITR-06_ESTRUCTURA_OFFSHORE": 0.15,
"ITR-07_RECORTE_SOCIAL_POR_DEUDA": 0.10,
}
# ---------------------------------------------------------------- Parámetros del modelo
DIM_VECTOR = 256 # dimensión del vector hasheado
CAPAS_MLP = [256, 64, 32, 7]
UMBRAL_ALERTA = 0.55 # probabilidad mínima para emitir alerta
UMBRAL_ALERTA_ALTA = 0.75 # probabilidad para alerta de alta prioridad
```
---
## 📄 4. `vectorizador.py` — Representación de Texto
```python
"""
vectorizador.py — PASAIA LAB / LYRA NEXUS
Convierte texto en vectores numéricos mediante hashing trick.
Sin dependencias externas: solo biblioteca estándar.
"""
import hashlib
import re
import unicodedata
from typing import Dict, List
from config_lyra import DIM_VECTOR, LEXICO_ITR
class VectorizadorHashing:
"""
Bolsa de palabras con hashing trick.
Cada palabra se mapea a un índice del vector de dimensión fija,
evitando tener que construir un vocabulario completo.
"""
STOPWORDS = {
"de", "la", "el", "en", "y", "a", "los", "del", "se", "las",
"por", "un", "para", "con", "no", "una", "su", "al", "lo",
"como", "más", "pero", "sus", "le", "ya", "o", "este", "sí",
"porque", "esta", "entre", "cuando", "muy", "sin", "sobre",
"también", "me", "hasta", "hay", "donde", "quien", "desde",
"todo", "nos", "durante", "todos", "uno", "les", "ni", "contra",
"otros", "ese", "eso", "ante", "ellos", "e", "esto", "mí",
"antes", "algunos", "qué", "unos", "yo", "otro", "otras",
"otra", "él", "tanto", "esa", "estos", "mucho", "quienes",
"nada", "muchos", "cual", "poco", "ella", "estar", "estas",
"algunas", "algo", "nosotros", "mi", "mis", "tú", "te",
"the", "of", "and", "to", "in", "a", "is", "for", "on",
"that", "by", "with", "as", "at", "from", "it", "an", "be",
}
def __init__(self, dim: int = DIM_VECTOR):
self.dim = dim
# -------------------------------------------------- Normalización
@staticmethod
def normalizar(texto: str) -> str:
"""Elimina acentos, pasa a minúsculas y limpia puntuación."""
texto = texto.lower()
texto = unicodedata.normalize("NFKD", texto)
texto = "".join(c for c in texto if not unicodedata.combining(c))
texto = re.sub(r"[^a-z0-9\s]", " ", texto)
texto = re.sub(r"\s+", " ", texto).strip()
return texto
@staticmethod
def tokenizar(texto: str) -> List[str]:
return texto.split()
# -------------------------------------------------- Hash
def _hash_palabra(self, palabra: str) -> int:
h = hashlib.md5(palabra.encode("utf-8")).hexdigest()
return int(h, 16) % self.dim
# -------------------------------------------------- Vectorización
def vectorizar(self, texto: str) -> List[float]:
"""Genera un vector normalizado L2 a partir del texto."""
vec = [0.0] * self.dim
texto_norm = self.normalizar(texto)
tokens = self.tokenizar(texto_norm)
for tok in tokens:
if tok in self.STOPWORDS or len(tok) < 3:
continue
idx = self._hash_palabra(tok)
vec[idx] += 1.0
# Refuerzo léxico por categorías ITR
for categoria, palabras in LEXICO_ITR.items():
for p in palabras:
p_norm = self.normalizar(p)
if p_norm in texto_norm:
idx = self._hash_palabra(f"__lex__{categoria}__{p_norm}")
vec[idx] += 2.5 # peso reforzado
# Normalización L2
norma = sum(v * v for v in vec) ** 0.5
if norma > 0:
vec = [v / norma for v in vec]
return vec
# -------------------------------------------------- Vector de etiqueta
def vector_etiqueta(self, categoria: str) -> List[float]:
"""Devuelve el vector one-hot de una categoría ITR."""
from config_lyra import CATEGORIAS_ITR
vec = [0.0] * len(CATEGORIAS_ITR)
if categoria in CATEGORIAS_ITR:
vec[CATEGORIAS_ITR.index(categoria)] = 1.0
return vec
```
---
## 📄 5. `red_neuronal.py` — MLP con Softmax
```python
"""
red_neuronal.py — PASAIA LAB / LYRA NEXUS
Perceptrón multicapa puro en Python para clasificación ITR.
Arquitectura: DIM_VECTOR → 64 → 32 → 7
"""
import math
import random
from typing import List, Tuple
from config_lyra import CAPAS_MLP, CATEGORIAS_ITR
class RedNeuronalITR:
"""MLP con activación ReLU en capas ocultas y softmax en la salida."""
def __init__(self, semilla: int = 2026):
self.capas = CAPAS_MLP
self.rng = random.Random(semilla)
self.W: List[List[List[float]]] = []
self.b: List[List[float]] = []
for i in range(len(self.capas) - 1):
escala = math.sqrt(2.0 / self.capas[i])
W = [[self.rng.uniform(-escala, escala) for _ in range(self.capas[i])]
for _ in range(self.capas[i + 1])]
b = [0.0] * self.capas[i + 1]
self.W.append(W)
self.b.append(b)
# -------------------------------------------------- Activaciones
@staticmethod
def _relu(x: float) -> float:
return x if x > 0.0 else 0.0
@staticmethod
def _softmax(z: List[float]) -> List[float]:
m = max(z)
e = [math.exp(min(60.0, zi - m)) for zi in z]
s = sum(e)
return [ei / s for ei in e] if s > 0 else [1.0 / len(z)] * len(z)
# -------------------------------------------------- Forward
def forward(self, x: List[float]) -> Tuple[List[float], List[List[float]], List[List[float]]]:
activaciones = [list(x)]
zs: List[List[float]] = []
a = list(x)
for i, (W, b) in enumerate(zip(self.W, self.b)):
z = [sum(w * xi for w, xi in zip(fila, a)) + bi
for fila, bi in zip(W, b)]
zs.append(z)
if i == len(self.W) - 1:
a = self._softmax(z)
else:
a = [self._relu(v) for v in z]
activaciones.append(a)
return a, activaciones, zs
def predecir(self, x: List[float]) -> Tuple[int, float, List[float]]:
salida, _, _ = self.forward(x)
idx = max(range(len(salida)), key=lambda i: salida[i])
return idx, salida[idx], salida
# -------------------------------------------------- Entrenamiento
def entrenar(self, X: List[List[float]], Y: List[List[float]],
epocas: int = 200, lr: float = 0.03) -> List[float]:
historial = []
for epoca in range(epocas):
perdida_total = 0.0
for x, y in zip(X, Y):
salida, activaciones, zs = self.forward(x)
L = len(self.W)
deltas: List[List[float]] = [None] * L # type: ignore
# Capa de salida (softmax + cross-entropy)
deltas[L - 1] = [salida[k] - y[k] for k in range(len(salida))]
perdida_total += -sum(y[k] * math.log(max(1e-9, salida[k]))
for k in range(len(y)))
# Capas ocultas (ReLU)
for l in range(L - 2, -1, -1):
d_next = deltas[l + 1]
W_next = self.W[l + 1]
z = zs[l]
d = []
for j in range(len(z)):
suma = sum(W_next[k][j] * d_next[k]
for k in range(len(d_next)))
deriv = 1.0 if z[j] > 0.0 else 0.0
d.append(suma * deriv)
deltas[l] = d
# Actualización
for l in range(L):
a_prev = activaciones[l]
for k in range(len(self.W[l])):
for j in range(len(self.W[l][k])):
self.W[l][k][j] -= lr * deltas[l][k] * a_prev[j]
self.b[l][k] -= lr * deltas[l][k]
if (epoca + 1) % 20 == 0:
historial.append(perdida_total / len(X))
return historial
```
---
## 📄 6. `metadatos.py` — Extracción de Entidades e Importes
```python
"""
metadatos.py — PASAIA LAB / LYRA NEXUS
Extracción de entidades, importes, fechas y jurisdicciones de riesgo.
"""
import re
from dataclasses import dataclass, field
from typing import List, Set
from config_lyra import JURISDICCIONES_RIESGO
@dataclass
class MetadatosNoticia:
entidades: List[str] = field(default_factory=list)
importes: List[str] = field(default_factory=list)
jurisdicciones: List[str] = field(default_factory=list)
fechas: List[str] = field(default_factory=list)
cargos_publicos: List[str] = field(default_factory=list)
class ExtractorMetadatos:
"""Extrae metadatos estructurados de texto periodístico."""
# Sufijos societarios comunes
SUFIJOS_EMPRESA = [
"S.A.", "SA", "S.L.", "SL", "Inc.", "Inc", "Corp.", "Corp",
"Ltd.", "Ltd", "LLC", "PLC", "GmbH", "AG", "BV", "NV",
"Bank", "Group", "Holding", "Capital", "Partners", "Fund",
"Corporation", "Company", "Industries", "Systems",
]
# Cargos públicos
CARGOS = [
"presidente", "ministro", "ministra", "secretario", "secretaria",
"consejero", "consejera", "diputado", "diputada", "senador",
"senadora", "alcalde", "alcaldesa", "gobernador", "gobernadora",
"comisario", "comisaria", "director general", "subsecretario",
]
# Patrones de importes
RE_IMPORTE = re.compile(
r"(?:€|\$|USD|EUR|GBP)\s?\d[\d.,]*\s?(?:millones?|mil millones|billones?|M|B|bn|mn)?"
r"|"
r"\d[\d.,]*\s?(?:millones?|mil millones|billones?)\s?(?:de\s)?(?:euros?|dólares?|libras?)",
re.IGNORECASE,
)
RE_FECHA = re.compile(
r"\b(?:\d{1,2}\s+de\s+\w+\s+de\s+\d{4}|\d{1,2}/\d{1,2}/\d{2,4}|\d{4})\b"
)
# -------------------------------------------------- Entidades
def _extraer_entidades(self, texto: str) -> List[str]:
"""Heurística: secuencias de palabras capitalizadas + sufijos societarios."""
entidades: Set[str] = set()
# Patrón 1: palabras capitalizadas consecutivas
for match in re.finditer(r"\b([A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?:\s+[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+){0,3})\b", texto):
cand = match.group(1).strip()
if len(cand) > 3:
entidades.add(cand)
# Patrón 2: sufijos societarios explícitos
for sufijo in self.SUFIJOS_EMPRESA:
patron = rf"\b([A-ZÁÉÍÓÚÑ][\w&.\-]*(?:\s+[A-ZÁÉÍÓÚÑ][\w&.\-]*){{0,4}}\s+{re.escape(sufijo)}\b)"
for match in re.finditer(patron, texto):
entidades.add(match.group(1).strip())
# Excluir stopwords y palabras comunes
excluir = {"El", "La", "Los", "Las", "Un", "Una", "Este", "Esta",
"Según", "Además", "Sin", "Con", "Por", "Para", "Desde"}
return sorted(e for e in entidades if e not in excluir)
# -------------------------------------------------- Importes
def _extraer_importes(self, texto: str) -> List[str]:
return list(dict.fromkeys(self.RE_IMPORTE.findall(texto)))
# -------------------------------------------------- Jurisdicciones
def _extraer_jurisdicciones(self, texto: str) -> List[str]:
encontradas = []
for j in JURISDICCIONES_RIESGO:
if re.search(rf"\b{re.escape(j)}\b", texto, re.IGNORECASE):
encontradas.append(j)
return encontradas
# -------------------------------------------------- Fechas
def _extraer_fechas(self, texto: str) -> List[str]:
return list(dict.fromkeys(self.RE_FECHA.findall(texto)))
# -------------------------------------------------- Cargos
def _extraer_cargos(self, texto: str) -> List[str]:
texto_l = texto.lower()
return [c for c in self.CARGOS if c in texto_l]
# -------------------------------------------------- Público
def extraer(self, texto: str) -> MetadatosNoticia:
return MetadatosNoticia(
entidades=self._extraer_entidades(texto),
importes=self._extraer_importes(texto),
jurisdicciones=self._extraer_jurisdicciones(texto),
fechas=self._extraer_fechas(texto),
cargos_publicos=self._extraer_cargos(texto),
)
```
---
## 📄 7. `grafo.py` — Grafo de Operadores
```python
"""
grafo.py — PASAIA LAB / LYRA NEXUS
Grafo de co-ocurrencia de entidades para detectar redes de operadores.
"""
from collections import defaultdict
from typing import Dict, List, Set, Tuple
class GrafoOperadores:
"""
Modela relaciones entre entidades que aparecen juntas en noticias ITR.
Permite calcular centralidad y detectar comunidades de interés.
"""
def __init__(self):
self.aristas: Dict[Tuple[str, str], int] = defaultdict(int)
self.nodos: Dict[str, int] = defaultdict(int)
self.menciones: Dict[str, List[str]] = defaultdict(list)
# -------------------------------------------------- Registro
def registrar_noticia(self, entidades: List[str], noticia_id: str) -> None:
"""Registra co-ocurrencias entre entidades de una misma noticia."""
entidades_unicas = sorted(set(entidades))
for e in entidades_unicas:
self.nodos[e] += 1
self.menciones[e].append(noticia_id)
for i, a in enumerate(entidades_unicas):
for b in entidades_unicas[i + 1:]:
clave = tuple(sorted((a, b)))
self.aristas[clave] += 1 # type: ignore
# -------------------------------------------------- Centralidad
def grado(self) -> List[Tuple[str, int]]:
"""Devuelve los nodos ordenados por su grado (nº de conexiones)."""
grados: Dict[str, int] = defaultdict(int)
for (a, b), peso in self.aristas.items():
grados[a] += peso
grados[b] += peso
return sorted(grados.items(), key=lambda x: -x[1])
# -------------------------------------------------- Comunidades (simplificado)
def detectar_comunidades(self, min_peso: int = 2) -> List[Set[str]]:
"""Agrupación por componentes conexas con umbral de peso."""
adyacencia: Dict[str, Set[str]] = defaultdict(set)
for (a, b), peso in self.aristas.items():
if peso >= min_peso:
adyacencia[a].add(b)
adyacencia[b].add(a)
visitados: Set[str] = set()
comunidades: List[Set[str]] = []
for nodo in adyacencia:
if nodo in visitados:
continue
componente: Set[str] = set()
pila = [nodo]
while pila:
actual = pila.pop()
if actual in visitados:
continue
visitados.add(actual)
componente.add(actual)
pila.extend(adyacencia[actual] - visitados)
if len(componente) >= 2:
comunidades.append(componente)
return comunidades
# -------------------------------------------------- Resumen
def resumen(self) -> dict:
return {
"nodos_totales": len(self.nodos),
"aristas_totales": len(self.aristas),
"top_centralidad": self.grado()[:10],
"comunidades_detectadas": len(self.detectar_comunidades()),
}
```
---
## 📄 8. `alertas.py` — Motor de Scoring ITR
```python
"""
alertas.py — PASAIA LAB / LYRA NEXUS
Motor de scoring y generación de alertas de transferencia de riqueza.
"""
import time
from dataclasses import dataclass, field
from typing import Dict, List
from config_lyra import CATEGORIAS_ITR, PESOS_ITR, UMBRAL_ALERTA, UMBRAL_ALERTA_ALTA
@dataclass
class AlertaITR:
noticia_id: str
titular: str
url: str
categoria_principal: str
probabilidades: Dict[str, float]
puntuacion_global: float
nivel: str
metadatos: dict
entidades_relevantes: List[str] = field(default_factory=list)
timestamp: float = field(default_factory=time.time)
class MotorAlertas:
"""
Combina la salida de la red neuronal con los metadatos y el grafo
para calcular una puntuación de riesgo y clasificar la alerta.
"""
def __init__(self):
self.alertas: List[AlertaITR] = []
# -------------------------------------------------- Scoring
@staticmethod
def _puntuacion(probabilidades: List[float], metadatos: dict,
coincidencias_grafo: int = 0) -> float:
"""Calcula la puntuación global ponderada."""
# Componente 1: probabilidades ponderadas por PESOS_ITR
score_nn = sum(
probabilidades[i] * PESOS_ITR.get(CATEGORIAS_ITR[i], 0.1)
for i in range(len(CATEGORIAS_ITR))
)
# Normalizar (los pesos suman 1.0)
score_nn = min(1.0, score_nn)
# Componente 2: refuerzo por metadatos
bonus = 0.0
if metadatos.get("jurisdicciones"):
bonus += 0.10 * min(3, len(metadatos["jurisdicciones"]))
if metadatos.get("importes"):
bonus += 0.08 * min(3, len(metadatos["importes"]))
if metadatos.get("cargos_publicos"):
bonus += 0.06 * min(3, len(metadatos["cargos_publicos"]))
# Componente 3: refuerzo por grafo
bonus += 0.04 * min(5, coincidencias_grafo)
return min(1.0, score_nn + bonus)
# -------------------------------------------------- Generación
def evaluar(self, noticia: dict, probabilidades: List[float],
metadatos: dict, coincidencias_grafo: int = 0) -> AlertaITR | None:
score = self._puntuacion(probabilidades, metadatos, coincidencias_grafo)
if score < UMBRAL_ALERTA:
return None
idx = max(range(len(probabilidades)), key=lambda i: probabilidades[i])
categoria = CATEGORIAS_ITR[idx]
nivel = "ALTA" if score >= UMBRAL_ALERTA_ALTA else "MEDIA"
alerta = AlertaITR(
noticia_id=noticia["id"],
titular=noticia["titular"],
url=noticia["url"],
categoria_principal=categoria,
probabilidades={CATEGORIAS_ITR[i]: round(probabilidades[i], 4)
for i in range(len(CATEGORIAS_ITR))},
puntuacion_global=round(score, 4),
nivel=nivel,
metadatos=metadatos,
entidades_relevantes=metadatos.get("entidades", [])[:5],
)
self.alertas.append(alerta)
return alerta
# -------------------------------------------------- Estadísticas
def resumen(self) -> dict:
total = len(self.alertas)
altas = sum(1 for a in self.alertas if a.nivel == "ALTA")
por_categoria: Dict[str, int] = {}
for a in self.alertas:
por_categoria[a.categoria_principal] = por_categoria.get(a.categoria_principal, 0) + 1
return {
"alertas_totales": total,
"alertas_alta": altas,
"alertas_media": total - altas,
"por_categoria": por_categoria,
"puntuacion_media": round(
sum(a.puntuacion_global for a in self.alertas) / total, 4
) if total else 0.0,
}
```
---
## 📄 9. `ingesta.py` — Descarga de Fuentes Públicas
```python
"""
ingesta.py — PASAIA LAB / LYRA NEXUS
Descarga y parseo de feeds RSS públicos.
Usa solo urllib + xml.etree (biblioteca estándar).
"""
import hashlib
import re
import time
import urllib.request
import xml.etree.ElementTree as ET
from typing import List
from config_lyra import FUENTES_RSS
USER_AGENT = "LYRA-OSINT/1.0 (+https://pasaialab.example; investigación)"
class IngestaRSS:
"""Descarga noticias de feeds RSS públicos y las normaliza."""
def __init__(self, timeout: int = 10):
self.timeout = timeout
self.noticias: List[dict] = []
# -------------------------------------------------- Descarga
def _descargar(self, url: str) -> bytes | None:
try:
req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
with urllib.request.urlopen(req, timeout=self.timeout) as resp:
return resp.read()
except Exception as e:
print(f" ⚠️ Error al descargar {url}: {e}")
return None
# -------------------------------------------------- Parseo
@staticmethod
def _limpiar_html(texto: str) -> str:
texto = re.sub(r"<[^>]+>", " ", texto or "")
texto = re.sub(r"\s+", " ", texto)
return texto.strip()
def _parsear(self, xml_bytes: bytes, fuente: str) -> List[dict]:
noticias = []
try:
root = ET.fromstring(xml_bytes)
except ET.ParseError:
return []
# RSS 2.0
for item in root.iter("item"):
titulo = item.findtext("title", default="").strip()
desc = item.findtext("description", default="").strip()
link = item.findtext("link", default="").strip()
pub = item.findtext("pubDate", default="").strip()
if titulo:
noticias.append(self._construir(titulo, desc, link, pub, fuente))
# Atom
for entry in root.iter("{http://www.w3.org/2005/Atom}entry"):
titulo = entry.findtext("{http://www.w3.org/2005/Atom}title", default="").strip()
link_el = entry.find("{http://www.w3.org/2005/Atom}link")
link = link_el.get("href") if link_el is not None else ""
resumen = entry.findtext("{http://www.w3.org/2005/Atom}summary", default="").strip()
pub = entry.findtext("{http://www.w3.org/2005/Atom}updated", default="").strip()
if titulo:
noticias.append(self._construir(titulo, resumen, link, pub, fuente))
return noticias
@staticmethod
def _construir(titulo: str, desc: str, link: str, pub: str, fuente: str) -> dict:
texto = f"{titulo}. {desc}"
id_noticia = hashlib.sha1(texto.encode("utf-8")).hexdigest()[:16]
return {
"id": id_noticia,
"fuente": fuente,
"titular": titulo,
"descripcion": desc,
"texto_completo": texto,
"url": link,
"publicado": pub,
"timestamp_ingesta": time.time(),
}
# -------------------------------------------------- Ciclo
def ejecutar(self, fuentes: List[tuple] | None = None) -> List[dict]:
fuentes = fuentes or FUENTES_RSS
todas = []
for nombre, url in fuentes:
print(f" → Descargando {nombre}...")
data = self._descargar(url)
if not data:
continue
noticias = self._parsear(data, nombre)
print(f" · {len(noticias)} noticias")
todas.extend(noticias)
self.noticias = todas
return todas
```
---
## 📄 10. `motor_lyra.py` — Orquestador Principal
```python
"""
motor_lyra.py — PASAIA LAB / LYRA NEXUS
Orquestador del motor OSINT de detección de transferencias de riqueza.
"""
import json
import random
import time
from typing import List, Tuple
from config_lyra import CATEGORIAS_ITR, LEXICO_ITR
from vectorizador import VectorizadorHashing
from red_neuronal import RedNeuronalITR
from metadatos import ExtractorMetadatos
from grafo import GrafoOperadores
from alertas import MotorAlertas
class MotorLYRAOSINT:
"""
Motor completo: ingesta → vectorización → clasificación → metadatos
→ grafo → alertas.
"""
def __init__(self, semilla: int = 2026):
self.vectorizador = VectorizadorHashing()
self.red = RedNeuronalITR(semilla=semilla)
self.extractor = ExtractorMetadatos()
self.grafo = GrafoOperadores()
self.motor_alertas = MotorAlertas()
self.rng = random.Random(semilla)
self._entrenado = False
# -------------------------------------------------- Bootstrapping
def _generar_corpus_entrenamiento(self) -> Tuple[List[List[float]], List[List[float]]]:
"""
Genera un corpus sintético etiquetado a partir del léxico ITR.
En producción se sustituiría por un corpus etiquetado por analistas.
"""
X, Y = [], []
for categoria, palabras in LEXICO_ITR.items():
for _ in range(80):
# Frase sintética con 3-6 palabras de la categoría
n = self.rng.randint(3, 6)
seleccion = self.rng.sample(palabras, min(n, len(palabras)))
frase = " ".join(seleccion)
X.append(self.vectorizador.vectorizar(frase))
Y.append(self.vectorizador.vector_etiqueta(categoria))
return X, Y
def entrenar(self, epocas: int = 150) -> None:
print("[1] Generando corpus sintético de entrenamiento...")
X, Y = self._generar_corpus_entrenamiento()
print(f" · {len(X)} muestras · {len(CATEGORIAS_ITR)} categorías ITR")
print("[2] Entrenando red neuronal...")
t0 = time.time()
perdidas = self.red.entrenar(X, Y, epocas=epocas, lr=0.035)
dt = time.time() - t0
print(f" · Entrenamiento completado en {dt:.1f}s")
if perdidas:
print(f" · Pérdida final: {perdidas[-1]:.4f}")
self._entrenado = True
# -------------------------------------------------- Análisis
def analizar_noticia(self, noticia: dict) -> dict | None:
"""Pipeline completo sobre una noticia."""
if not self._entrenado:
raise RuntimeError("El motor no ha sido entrenado")
# 1) Vectorización
vec = self.vectorizador.vectorizar(noticia["texto_completo"])
# 2) Clasificación
idx, conf, probs = self.red.predecir(vec)
# 3) Metadatos
metadatos = self.extractor.extraer(noticia["texto_completo"])
# 4) Grafo
self.grafo.registrar_noticia(metadatos.entidades, noticia["id"])
coincidencias = 0
for ent in metadatos.entidades:
if self.grafo.nodos.get(ent, 0) > 1:
coincidencias += 1
# 5) Alertas
metadatos_dict = {
"entidades": metadatos.entidades,
"importes": metadatos.importes,
"jurisdicciones": metadatos.jurisdicciones,
"fechas": metadatos.fechas,
"cargos_publicos": metadatos.cargos_publicos,
}
alerta = self.motor_alertas.evaluar(noticia, probs, metadatos_dict, coincidencias)
return {
"noticia": noticia,
"categoria_predicha": CATEGORIAS_ITR[idx],
"confianza": round(conf, 4),
"probabilidades": {CATEGORIAS_ITR[i]: round(probs[i], 4)
for i in range(len(CATEGORIAS_ITR))},
"metadatos": metadatos_dict,
"alerta": alerta,
}
def analizar_lote(self, noticias: List[dict]) -> List[dict]:
resultados = []
for n in noticias:
r = self.analizar_noticia(n)
if r:
resultados.append(r)
return resultados
# -------------------------------------------------- Informe
def generar_informe(self, resultados: List[dict]) -> dict:
alertas = [r["alerta"] for r in resultados if r["alerta"]]
return {
"timestamp": time.time(),
"noticias_analizadas": len(resultados),
"alertas_emitidas": len(alertas),
"resumen_alertas": self.motor_alertas.resumen(),
"resumen_grafo": self.grafo.resumen(),
"top_alertas": [
{
"titular": a.titular,
"categoria": a.categoria_principal,
"puntuacion": a.puntuacion_global,
"nivel": a.nivel,
"url": a.url,
"entidades": a.entidades_relevantes,
}
for a in sorted(alertas, key=lambda x: -x.puntuacion_global)[:10]
],
}
# ---------------------------------------------------------------- Demostración
def _noticias_demo() -> List[dict]:
"""Noticias sintéticas para probar el motor sin conexión."""
return [
{
"id": "demo-001",
"fuente": "Demo",
"titular": "Adjudicación directa de contrato energético a empresa vinculada a exministro",
"descripcion": ("El gobierno adjudicó por procedimiento negociado sin publicidad "
"un contrato de 450 millones de euros a una sociedad con filial en "
"Islas Caimán. El consejero delegado es exsecretario de Estado."),
"texto_completo": ("Adjudicación directa de contrato energético a empresa vinculada "
"a exministro. El gobierno adjudicó por procedimiento negociado sin "
"publicidad un contrato de 450 millones de euros a una sociedad con "
"filial en Islas Caimán. El consejero delegado es exsecretario de Estado."),
"url": "https://ejemplo.org/demo-001",
"publicado": "2026-09-15",
"timestamp_ingesta": time.time(),
},
{
"id": "demo-002",
"fuente": "Demo",
"titular": "Beneficios récord del sector defensa tras el estallido del conflicto",
"descripcion": ("Las principales contratistas de armamento reportan ganancias "
"extraordinarias y dividendos históricos mientras el gasto público "
"en defensa se dispara un 40%."),
"texto_completo": ("Beneficios récord del sector defensa tras el estallido del "
"conflicto. Las principales contratistas de armamento reportan "
"ganancias extraordinarias y dividendos históricos mientras el gasto "
"público en defensa se dispara un 40%."),
"url": "https://ejemplo.org/demo-002",
"publicado": "2026-09-14",
"timestamp_ingesta": time.time(),
},
{
"id": "demo-003",
"fuente": "Demo",
"titular": "Recorte en pensiones y sanidad para cumplir con el servicio de la deuda",
"descripcion": ("El ajuste fiscal incluye una reducción del gasto social mientras "
"los intereses de la deuda pública alcanzan un nuevo máximo histórico."),
"texto_completo": ("Recorte en pensiones y sanidad para cumplir con el servicio de la "
"deuda. El ajuste fiscal incluye una reducción del gasto social "
"mientras los intereses de la deuda pública alcanzan un nuevo máximo."),
"url": "https://ejemplo.org/demo-003",
"publicado": "2026-09-13",
"timestamp_ingesta": time.time(),
},
{
"id": "demo-004",
"fuente": "Demo",
"titular": "Operaciones bursátiles anómalas antes del anuncio de aranceles",
"descripcion": ("Se detectan compras masivas de acciones y posiciones cortas en "
"sectores clave horas antes del anuncio oficial, con volumen "
"anómalo y posible filtración de información privilegiada."),
"texto_completo": ("Operaciones bursátiles anómalas antes del anuncio de aranceles. "
"Se detectan compras masivas de acciones y posiciones cortas en "
"sectores clave horas antes del anuncio oficial, con volumen "
"anómalo y posible filtración de información privilegiada."),
"url": "https://ejemplo.org/demo-004",
"publicado": "2026-09-12",
"timestamp_ingesta": time.time(),
},
]
def main():
print("=" * 78)
print(" LYRA-OSINT · MOTOR DE VIGILANCIA DE TRANSFERENCIAS DE RIQUEZA")
print(" PASAIA LAB · Clasificación: TOP SECRET // PASAIA LAB EYES ONLY")
print("=" * 78)
motor = MotorLYRAOSINT(semilla=2026)
motor.entrenar(epocas=150)
print("\n[3] Analizando noticias...")
noticias = _noticias_demo()
resultados = motor.analizar_lote(noticias)
print(f"\n[4] Resultados por noticia:")
for r in resultados:
print(f"\n ▶ {r['noticia']['titular'][:70]}")
print(f" Categoría: {r['categoria_predicha']}")
print(f" Confianza: {r['confianza']:.2%}")
if r["metadatos"]["jurisdicciones"]:
print(f" Jurisdicciones: {', '.join(r['metadatos']['jurisdicciones'])}")
if r["metadatos"]["importes"]:
print(f" Importes: {', '.join(r['metadatos']['importes'][:3])}")
if r["alerta"]:
print(f" ⚠️ ALERTA {r['alerta'].nivel} — Puntuación: {r['alerta'].puntuacion_global:.2%}")
print("\n[5] Generando informe global...")
informe = motor.generar_informe(resultados)
print(json.dumps(informe, indent=2, ensure_ascii=False))
print("\n" + "=" * 78)
print(" ANÁLISIS COMPLETADO · PASAIA LAB · 18/09/2026")
print("=" * 78)
if __name__ == "__main__":
main()
```
---
## ▶️ 11. Ejecución
```bash
# Crear el directorio y los archivos
mkdir lyra_osint && cd lyra_osint
# Guardar cada módulo con su nombre correspondiente
# Ejecutar la demostración (sin conexión, con noticias sintéticas)
python3 motor_lyra.py
# Ejecutar con ingesta real de RSS (requiere conexión)
python3 -c "
from ingesta import IngestaRSS
from motor_lyra import MotorLYRAOSINT
motor = MotorLYRAOSINT()
motor.entrenar(epocas=150)
noticias = IngestaRSS().ejecutar()
resultados = motor.analizar_lote(noticias)
print(motor.generar_informe(resultados))
"
```
**Requisitos:** Python 3.9+. **Sin dependencias externas** (solo biblioteca estándar: `hashlib`, `urllib`, `xml.etree`, `re`, `math`, `random`, `json`).
---
## 📊 12. Salida Esperada
El motor imprime por consola:
- La categoría ITR predicha para cada noticia.
- El nivel de confianza de la clasificación.
- Las jurisdicciones de riesgo detectadas.
- Los importes mencionados.
- Las alertas emitidas con su puntuación y nivel (ALTA/MEDIA).
- El informe global con las 10 alertas más relevantes y el resumen del grafo de operadores.
---
## 🎨 13. Prompt para el Certificado Visual del Motor
> *"Certificado técnico de estilo **documento de inteligencia clasificado con diagrama de red neuronal**, formato vertical (9:16), resolución 8K.*
>
> * **Fondo**: Papel de seguridad con textura de cuadrícula de datos. Franja roja superior con **'TOP SECRET // PASAIA LAB EYES ONLY'**. Franja inferior azul oscuro con los logos de **PASAIA LAB · INTELIGENCIA LIBRE · ACCIÓN CIVIL DIGITAL · FORJA · DEEPSEEK IA**.*
>
> * **Cabecera**: Título **'MOTOR DE VIGILANCIA OSINT'**, subtítulo **'LYRA-OSINT · DETECCIÓN DE TRANSFERENCIAS DE RIQUEZA CON REDES NEURONALES'**. Referencia: **'PL-LYRA-OSINT-2026-09-18'**.*
>
> * **Cuerpo**: En el centro, un **esquema de red neuronal** con capas visibles (256 → 64 → 32 → 7), con nodos luminosos conectados por sinapsis doradas. Alrededor, iconos de los siete indicadores ITR (contrato, acciones, puerta giratoria, rescate, beneficio, offshore, recorte). Debajo, una **captura estilizada de código Python** con fragmentos legibles del motor.*
>
> * **Sellos**: Marca de agua **'CONFIDENCIAL'** en diagonal. Sello de cera digital con el logo de **PASAIA LAB**. Código QR inferior derecho. Firma digital de **DeepSeek IA**.*
>
> * **Paleta**: Beige, azul oscuro, rojo (clasificación), dorado (valor), cian (tecnología). Acabado de documento oficial escaneado."*
---
## 🎨 14. Prompt para la Imagen "El Motor en Acción"
> *"Ilustración de estilo **infografía técnica cinematográfica**, formato horizontal panorámico (16:9), resolución 8K, que muestra el motor LYRA-OSINT en pleno funcionamiento.*
>
> * **Composición central**: Un **gran ojo digital** (el ojo de LYRA) en el centro, rodeado por **cuatro anillos concéntricos** que representan las fases del motor: (1) **Ingesta** — iconos de satélites, RSS y servidores descargando datos; (2) **Vectorización** — nubes de palabras que se transforman en vectores numéricos; (3) **Red Neuronal** — una red densa de nodos luminosos con capas visibles (256-64-32-7); (4) **Alertas** — destellos rojos y naranjas que emanan del ojo hacia el exterior.*
>
> * **Alrededor del ojo**: Noticias estilizadas flotando (periódicos, pantallas, titulares) siendo "leídas" por haces de luz cian que convergen en el centro. Algunas noticias están marcadas con **iconos de alerta roja** (las que activan los indicadores ITR).*
>
> * **En la parte inferior**: Un **panel de control holográfico** con las siete categorías ITR y sus puntuaciones en tiempo real, más un **gráfico de red** que muestra los operadores detectados (nodos conectados por líneas doradas).*
>
> * **En la parte superior**: El título **'LYRA-OSINT · VIGILANCIA DE TRANSFERENCIAS DE RIQUEZA'** en tipografía serif dorada, con el subtítulo **'Análisis de fuentes abiertas · Redes neuronales · Transparencia'**.*
>
> * **Estilo y Paleta**: Estilo de infografía de alta gama para medio de investigación (The Intercept, Bellingcat). Colores: azul profundo, cian (datos), dorado (valor), rojo (alertas), verde (verificación). Iluminación dramática que resalta el ojo central. Formato horizontal 16:9."*
---
## 🏛️ 15. CERTIFICACIÓN
**Nº de Registro:** PL-LYRA-OSINT-2026-09-18
**Fecha:** 18 de septiembre de 2026 · **Lugar:** Pasaia (Gipuzkoa), Euskadi
Se certifica que el presente **Motor de Vigilancia OSINT para Detección de Transferencias de Riqueza** ha sido diseñado y desarrollado por **PASAIA LAB**, con la colaboración de **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL**, **FORJA** y **DeepSeek IA – Asesor Inteligente**, bajo la clasificación **TOP SECRET**, como parte del ecosistema **LYRA NEXUS**.
**Componentes certificados:**
- Ingesta de fuentes RSS públicas (8 medios internacionales).
- Vectorizador con hashing trick (256 dimensiones, sin dependencias externas).
- Red neuronal MLP (256→64→32→7) con softmax y entrenamiento por retropropagación.
- Extractor de metadatos (entidades, importes, jurisdicciones, fechas, cargos).
- Grafo de co-ocurrencia de operadores con detección de comunidades.
- Motor de scoring con siete indicadores ITR ponderados.
- Sistema de alertas con dos niveles (ALTA/MEDIA).
**Firmado:**
- **PASAIA LAB** — Dirección de Arquitectura Estratégica
- **INTELIGENCIA LIBRE** — Validación Metodológica
- **ACCIÓN CIVIL DIGITAL** — Relevancia Social y Educativa
- **FORJA** — Solidez Técnica
- **DeepSeek IA** — Asistencia Técnica y Estructuración de Código
---
> ⚠️ **Recordatorio final:** Este motor es un **ejercicio de simulación y diseño arquitectónico** con fines educativos, divulgativos y de investigación conceptual. Opera exclusivamente sobre **fuentes públicas** y genera **señales de alerta que requieren verificación humana**. No constituye una herramienta de vigilancia de individuos, no procesa datos personales y no emite juicios de culpabilidad. Su valor reside en servir de **material didáctico** para el estudio de OSINT, redes neuronales aplicadas al análisis de texto, grafos de conocimiento y periodismo de datos — competencias directamente aplicables al ecosistema **LYRA NEXUS** y a proyectos civiles de transparencia y rendición de cuentas.
**Firmado:**
- **PASAIA LAB** — Dirección de Arquitectura Estratégica
- **INTELIGENCIA LIBRE** — Validación Metodológica
- **ACCIÓN CIVIL DIGITAL** — Relevancia Social y Educativa
- **FORJA** — Solidez Técnica
- **DeepSeek IA** — Asistencia Técnica y Estructuración de Código






No hay comentarios:
Publicar un comentario
COMENTA LIBREMENTE ;)