From 20f705cc9d2c58c9783aac9b8b71f6de013ec85d Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 23:48:05 +0000 Subject: [PATCH 1/9] feat: Completed quantum relativistic meta-learning simulation --- Dockerfile | 13 + ...m_Relativistic_MetaLearning_Notebook.ipynb | 415 ++++++++++++++++++ codespaces-jupyter.code-workspace | 8 + main.py | 322 ++++++++++++++ panel_estabilidad_fase.png | Bin 0 -> 204635 bytes setup.sh | 18 + 6 files changed, 776 insertions(+) create mode 100644 Dockerfile create mode 100644 Quantum_Relativistic_MetaLearning_Notebook.ipynb create mode 100644 codespaces-jupyter.code-workspace create mode 100644 main.py create mode 100644 panel_estabilidad_fase.png create mode 100644 setup.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..7b0ef197b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.10-slim + +WORKDIR /app + +ENV MPLBACKEND=Agg + +# Instalación de dependencias de Python +RUN pip install yfinance numpy pandas matplotlib seaborn google-cloud-storage + +# Copiar el script principal de la aplicación +COPY main.py . + +ENTRYPOINT ["python3", "main.py"] diff --git a/Quantum_Relativistic_MetaLearning_Notebook.ipynb b/Quantum_Relativistic_MetaLearning_Notebook.ipynb new file mode 100644 index 000000000..5ba63247e --- /dev/null +++ b/Quantum_Relativistic_MetaLearning_Notebook.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "4bd07f55", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "```python?code_reference&code_event_index=5\n", + "import json\n", + "\n", + "# Definimos el contenido estructurado en celdas de un Jupyter Notebook (.ipynb)\n", + "notebook_data = {\n", + " \"cells\": [\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Demostración: Aprendizaje Continuo Cuántico-Relativista en Predicción Real y Meta-Learning\\n\",\n", + " \"\\n\",\n", + " \"Este notebook implementa y demuestra el pipeline matemático completo propuesto en el documento técnico para el control de estabilidad en espacios de fase dinámicos utilizando datos reales del mercado de criptoactivos (`BTC-USD`) obtenidos en tiempo real de Yahoo Finance.\\n\",\n", + " \"\\n\",\n", + " \"### Arquitectura del Algoritmo:\\n\",\n", + " \"1. **Espacio de Hilbert ($H$):** Representación del estado interno del sistema de control mediante un vector de estado complejo unitario $|\\\\psi_t\\\\rangle$.\\n\",\n", + " \"2. **Métrica Relativista Deformada ($g_{\\\\mu\\\\nu}$):** Modificación del espacio métrico basada en el gradiente de Kuhn-Tucker (variaciones de retorno e intensidad de volatilidad del mercado).\\n\",\n", + " \"3. **Control de Caos Proactivo por Exponente de Lyapunov ($\\\\lambda$):** Detección en tiempo real de divergencias exponenciales en las trayectorias del espacio de fases, activando amortiguaciones elásticas sobre la norma $L^2$ para prevenir desbordamientos o eventos de tipo \\\"Cisne Negro\\\".\\n\",\n", + " \"4. **Bucle de Meta-Learning:** Optimización de segundo orden para sintonizar dinámicamente los hiperparámetros de control $\\\\Theta$ basándose en meta-gradientes de pérdida acelerada.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": None,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# ==============================================================================\\n\",\n", + " \"# CELDA 1: ENTORNO, DEPENDENCIAS E IMPORTACIONES GENERALES\\n\",\n", + " \"# ==============================================================================\\n\",\n", + " \"import os\\n\",\n", + " \"import numpy as np\\n\",\n", + " \"import pandas as pd\\n\",\n", + " \"import yfinance as yf\\n\",\n", + " \"\\n\",\n", + " \"# Configuración de graficación para soporte headless / entornos de servidor\\n\",\n", + " \"import matplotlib\\n\",\n", + " \"matplotlib.use('Agg')\\n\",\n", + " \"import matplotlib.pyplot as plt\\n\",\n", + " \"import seaborn as sns\\n\",\n", + " \"\\n\",\n", + " \"print(\\\"[+] Entorno e importaciones inicializadas correctamente.\\\")\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 2. Core del Motor Matemático Cuántico-Relativista\\n\",\n", + " \"\\n\",\n", + " \"En esta celda se modela la clase del motor. Se incorpora la estabilización numérica mediante **Gradient Clipping** en el bucle de Meta-Learning, y el **Enfriamiento Dinámico Acelerado** en la Norma $L^2$ cuando el exponente de Lyapunov desciende del umbral de caos crítico configurado.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": None,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# ==============================================================================\\n\",\n", + " \"# CELDA 2: ARQUITECTURA DEL MOTOR GEOMÉTRICO (LYAPUNOV & META-LEARNING)\\n\",\n", + " \"# ==============================================================================\\n\",\n", + " \"class QuantumRelativisticEngine:\\n\",\n", + " \" def __init__(self, num_states=4, beta=0.01, kappa=0.1, lyapunov_threshold=4.20, lambda_meta=0.05):\\n\",\n", + " \" self.N = num_states\\n\",\n", + " \" self.beta = beta # Coeficiente de autointeracción relativista\\n\",\n", + " \" self.kappa = kappa # Constante de acoplamiento de control\\n\",\n", + " \" self.lyapunov_threshold = lyapunov_threshold # Umbral crítico de caos reajustado\\n\",\n", + " \" self.lambda_meta = lambda_meta # Regularización para el espacio Meta-Learning\\n\",\n", + " \" \\n\",\n", + " \" # Inicialización del Espacio de Hilbert H (Ground State)\\n\",\n", + " \" self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N)\\n\",\n", + " \" self.theta = np.random.randn(self.N) * 0.01 \\n\",\n", + " \" self.theta_0 = self.theta.copy() \\n\",\n", + " \" \\n\",\n", + " \" # Inicialización del Bloque de Memorias Adaptativas\\n\",\n", + " \" self.MP = np.random.rand(self.N) * 0.01\\n\",\n", + " \" self.MR = np.zeros(self.N) \\n\",\n", + " \" self.norm_state = 1.0 # Estado base de la Norma L2\\n\",\n", + " \" self.alpha = 0.5 # Balance de peso de memoria (t)\\n\",\n", + " \"\\n\",\n", + " \" def compute_relativistic_metric(self, price_change, volatility):\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" Calcula la métrica g_μν basada en el cambio de precio y la volatilidad local.\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" kuhn_tucker_grad = price_change * volatility\\n\",\n", + " \" numerator = 1.0 + np.abs(kuhn_tucker_grad)**2\\n\",\n", + " \" denominator = 1.0 + self.beta * (self.norm_state**2)\\n\",\n", + " \" g_factor = numerator / denominator\\n\",\n", + " \" \\n\",\n", + " \" g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0])\\n\",\n", + " \" return g_mu_nu, g_factor\\n\",\n", + " \"\\n\",\n", + " \" def compute_lyapunov_exponent(self, current_psi, previous_psi, dt=1):\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" Aproxima el Exponente de Lyapunov local midiendo la divergencia geométrica.\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" delta_psi = np.linalg.norm(current_psi - previous_psi)\\n\",\n", + " \" if delta_psi <= 1e-12:\\n\",\n", + " \" return 0.0\\n\",\n", + " \" jacobian_factor = np.abs(np.log(delta_psi / 1e-5) / dt)\\n\",\n", + " \" return jacobian_factor\\n\",\n", + " \"\\n\",\n", + " \" def execute_meta_learning(self, current_loss, lr_meta=0.001):\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" Meta-Learning de segundo orden estabilizado mediante Gradient Clipping.\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" grad_theta = 2 * (self.theta - self.theta_0) * current_loss\\n\",\n", + " \" grad_theta = np.clip(grad_theta, -1.0, 1.0) # Prevención de explosión\\n\",\n", + " \" \\n\",\n", + " \" l_meta = np.sum(grad_theta**2) + self.lambda_meta * np.sum((self.theta - self.theta_0)**2)\\n\",\n", + " \" self.theta -= lr_meta * grad_theta\\n\",\n", + " \" return l_meta\\n\",\n", + " \"\\n\",\n", + " \" def step_evolution(self, price_change, volatility, target_value_normalized):\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" Evolución temporal continua utilizando variables normalizadas unitarias.\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" prev_psi = self.c.copy()\\n\",\n", + " \" \\n\",\n", + " \" # 1. Espacio métrico relativista\\n\",\n", + " \" g_mu_nu, g_factor = self.compute_relativistic_metric(price_change, volatility)\\n\",\n", + " \" \\n\",\n", + " \" phase_arg = np.clip(self.theta * g_factor, -np.pi, np.pi)\\n\",\n", + " \" self.c = self.c * np.exp(1j * phase_arg)\\n\",\n", + " \" \\n\",\n", + " \" # Proyección y normalización estricta en el espacio de Hilbert\\n\",\n", + " \" norm_c = np.linalg.norm(self.c)\\n\",\n", + " \" if norm_c > 0 and not np.isnan(norm_c):\\n\",\n", + " \" self.c /= norm_c\\n\",\n", + " \" else:\\n\",\n", + " \" self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N)\\n\",\n", + " \" \\n\",\n", + " \" lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi)\\n\",\n", + " \" if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp):\\n\",\n", + " \" lyapunov_exp = 0.0\\n\",\n", + " \" \\n\",\n", + " \" # 3. Lógica de absorción elástica por Norma L2\\n\",\n", + " \" if lyapunov_exp > self.lyapunov_threshold:\\n\",\n", + " \" self.norm_state += ((lyapunov_exp - self.lyapunov_threshold) * 0.1) # Amortiguación suave\\n\",\n", + " \" status = \\\"⚠️ CHAOS DETECTED\\\"\\n\",\n", + " \" else:\\n\",\n", + " \" # Enfriamiento dinámico acelerado hacia el Ground State (1.0)\\n\",\n", + " \" self.norm_state = max(1.0, self.norm_state - 0.4 * (self.norm_state - 1.0))\\n\",\n", + " \" status = \\\"✅ STABLE\\\"\\n\",\n", + " \" \\n\",\n", + " \" # 4. Evaluación del Error en escala controlada [0, 1]\\n\",\n", + " \" current_prediction = np.abs(self.c[0]) * target_value_normalized\\n\",\n", + " \" loss = 0.5 * (current_prediction - target_value_normalized)**2\\n\",\n", + " \" \\n\",\n", + " \" # 5. Ejecución del ciclo de Meta-Learning\\n\",\n", + " \" l_meta = self.execute_meta_learning(loss)\\n\",\n", + " \" \\n\",\n", + " \" # 6. Actualización dinámica del bloque de memoria M(t)\\n\",\n", + " \" success_condition = 1.0 if loss < 0.01 else 0.0\\n\",\n", + " \" if success_condition == 1.0:\\n\",\n", + " \" self.alpha = max(0.1, self.alpha - 0.05)\\n\",\n", + " \" self.MR += 0.01 * np.abs(self.c)\\n\",\n", + " \" else:\\n\",\n", + " \" self.alpha = min(0.9, self.alpha + 0.05)\\n\",\n", + " \" self.MP += 0.01 * self.theta\\n\",\n", + " \" \\n\",\n", + " \" # 7. Actualización del aprendizaje estándar con protección anti-explosión\\n\",\n", + " \" grad_loss = np.clip(self.theta_0 * loss, -0.1, 0.1)\\n\",\n", + " \" self.theta_0 -= 0.01 * grad_loss\\n\",\n", + " \" \\n\",\n", + " \" return {\\n\",\n", + " \" \\\"Lyapunov\\\": lyapunov_exp,\\n\",\n", + " \" \\\"Norm\\\": self.norm_state,\\n\",\n", + " \" \\\"Status\\\": status,\\n\",\n", + " \" \\\"Loss\\\": loss,\\n\",\n", + " \" \\\"L_Meta\\\": l_meta,\\n\",\n", + " \" \\\"Prediction_Norm\\\": current_prediction\\n\",\n", + " \" }\\n\",\n", + " \"\\n\",\n", + " \"print(\\\"[+] Motor de simulación cuántica optimizado numéricamente.\\\")\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 3. Ingesta de Datos y Normalización de Escala\\n\",\n", + " \"\\n\",\n", + " \"Descargamos el historial de precios reales diario de Bitcoin e implementamos el tratamiento anti Multi-Index de pandas junto con la compresión logarítmica/unitaria respecto al máximo histórico para asegurar estabilidad numérica absoluta.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": None,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# ==============================================================================\\n\",\n", + " \"# CELDA 3: PIPELINE DE INGESTA DE DATOS Y NORMALIZACIÓN DE MATRIZ\\n\",\n", + " \"# ==============================================================================\\n\",\n", + " \"print(\\\"[*] Conectando a los servidores de Yahoo Finance para obtener BTC-USD...\\\")\\n\",\n", + " \"ticker = \\\"BTC-USD\\\"\\n\",\n", + " \"\\n\",\n", + " \"raw_data = yf.download(ticker, period=\\\"6mo\\\", interval=\\\"1d\\\", auto_adjust=True)\\n\",\n", + " \"\\n\",\n", + " \"if raw_data.empty:\\n\",\n", + " \" raise ValueError(\\\"[-] Error crítico: No se recibieron datos históricos.\\\")\\n\",\n", + " \"\\n\",\n", + " \"if isinstance(raw_data.columns, pd.MultiIndex):\\n\",\n", + " \" raw_data.columns = raw_data.columns.get_level_values(0)\\n\",\n", + " \"\\n\",\n", + " \"close_prices = raw_data['Close'].values.astype(float).flatten()\\n\",\n", + " \"dates = raw_data.index\\n\",\n", + " \"\\n\",\n", + " \"df = pd.DataFrame(index=dates)\\n\",\n", + " \"df['Price'] = close_prices\\n\",\n", + " \"df['Returns'] = df['Price'].pct_change().fillna(0)\\n\",\n", + " \"df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std())\\n\",\n", + " \"\\n\",\n", + " \"# Estabilización numérica crítica\\n\",\n", + " \"max_historical_price = np.max(close_prices)\\n\",\n", + " \"df['Price_Normalized'] = df['Price'] / max_historical_price\\n\",\n", + " \"\\n\",\n", + " \"print(f\\\"[+] Ingesta exitosa. Punto máximo de escala de referencia: ${max_historical_price:.2f} USD\\\")\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 4. Ejecución del Bucle Temporal de Simulación Continua\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": None,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# ==============================================================================\\n\",\n", + " \"# CELDA 4: BUCLE CONTINUO EN TIEMPO REAL\\n\",\n", + " \"# ==============================================================================\\n\",\n", + " \"engine = QuantumRelativisticEngine(num_states=4, lyapunov_threshold=4.20)\\n\",\n", + " \"history = []\\n\",\n", + " \"\\n\",\n", + " \"print(\\\"=\\\" * 100)\\n\",\n", + " \"for idx, (timestamp, row) in enumerate(df.iterrows()):\\n\",\n", + " \" metrics = engine.step_evolution(\\n\",\n", + " \" price_change=row['Returns'],\\n\",\n", + " \" volatility=row['Volatility'],\\n\",\n", + " \" target_value_normalized=row['Price_Normalized']\\n\",\n", + " \" )\\n\",\n", + " \" \\n\",\n", + " \" real_prediction = metrics[\\\"Prediction_Norm\\\"] * max_historical_price\\n\",\n", + " \" \\n\",\n", + " \" history.append({\\n\",\n", + " \" \\\"Price\\\": row['Price'],\\n\",\n", + " \" \\\"Lyapunov\\\": metrics[\\\"Lyapunov\\\"],\\n\",\n", + " \" \\\"Norm\\\": metrics[\\\"Norm\\\"],\\n\",\n", + " \" \\\"Loss\\\": metrics[\\\"Loss\\\"],\\n\",\n", + " \" \\\"L_Meta\\\": metrics[\\\"L_Meta\\\"],\\n\",\n", + " \" \\\"Prediction\\\": real_prediction,\\n\",\n", + " \" \\\"Status\\\": metrics[\\\"Status\\\"]\\n\",\n", + " \" })\\n\",\n", + " \" \\n\",\n", + " \" if idx % 15 == 0:\\n\",\n", + " \" date_str = timestamp.strftime('%Y-%m-%d')\\n\",\n", + " \" print(f\\\"{date_str} | Price: $ {row['Price']:9.2f} | Lyapunov: {metrics['Lyapunov']:.6f} | Norm: {metrics['Norm']:.4f} | {metrics['Status']}\\\")\\n\",\n", + " \"\\n\",\n", + " \"print(\\\"=\\\" * 100)\\n\",\n", + " \"df_res = pd.DataFrame(history, index=df.index)\\n\",\n", + " \"print(\\\"[+] Simulación temporal sin desbordamiento finalizada con éxito.\\\")\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 5. Proyección Predictiva en T+1 y Límites Dinámicos de Frontera\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": None,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# ==============================================================================\\n\",\n", + " \"# CELDA 5: CAPA PREDICTIVA EN T+1 Y LÍMITES DE FRONTERA DINÁMICOS\\n\",\n", + " \"# ==============================================================================\\n\",\n", + " \"last_close = df_res['Price'].iloc[-1]\\n\",\n", + " \"last_volatility = df['Volatility'].iloc[-1]\\n\",\n", + " \"last_norm = df_res['Norm'].iloc[-1]\\n\",\n", + " \"\\n\",\n", + " \"spatial_compression = 1.0 / last_norm\\n\",\n", + " \"max_tolerable_return = (engine.lyapunov_threshold / (last_volatility * 10)) * spatial_compression\\n\",\n", + " \"\\n\",\n", + " \"upper_chaos_limit = last_close * (1.0 + max_tolerable_return)\\n\",\n", + " \"lower_chaos_limit = last_close * (1.0 - max_tolerable_return)\\n\",\n", + " \"\\n\",\n", + " \"print(\\\"\\\\n[*] Inicializando análisis predictivo del próximo ciclo de mercado...\\\")\\n\",\n", + " \"print(\\\"=\\\" * 100)\\n\",\n", + " \"print(f\\\"MÉTRICAS BASE EN T (ÚLTIMO CIERRE REGISTRADO):\\\")\\n\",\n", + " \"print(f\\\" -> Último Precio de Cierre ($S_t$) : ${last_close:.2f} USD\\\")\\n\",\n", + " \"print(f\\\" -> Volatilidad del Sistema (\\\\\\\\sigma_t) : {last_volatility:.6f}\\\")\\n\",\n", + " \"print(f\\\" -> Magnitud de la Norma L2 (||\\\\\\\\psi||) : {last_norm:.4f}\\\")\\n\",\n", + " \"print(\\\"-\\\" * 100)\\n\",\n", + " \"print(\\\"PROYECCIÓN PREDICTIVA PARA T+1 (PRÓXIMAS 24 HORAS):\\\")\\n\",\n", + " \"print(f\\\" -> Retorno Crítico Máximo Tolerable: ±{max_tolerable_return*100:.2f}%\\\")\\n\",\n", + " \"print(f\\\" -> LÍMITE SUPERIOR DE CAOS : ${upper_chaos_limit:.2f} USD\\\")\\n\",\n", + " \"print(f\\\" -> LÍMITE INFERIOR DE CAOS : ${lower_chaos_limit:.2f} USD\\\")\\n\",\n", + " \"print(f\\\" -> CRÍTICO AJUSTADO POR NORMA : ${lower_chaos_limit * spatial_compression:.2f} USD\\\")\\n\",\n", + " \"print(\\\"=\\\" * 100)\\n\",\n", + " \"\\n\",\n", + " \"if last_norm == 1.0:\\n\",\n", + " \" print(\\\"✅ SISTEMA EN EQUILIBRIO: Las fronteras predictivas operan dentro de los márgenes estándar.\\\")\\n\",\n", + " \"else:\\n\",\n", + " \" print(\\\"⚠️ VARIEDAD DEFORMADA: Espacio elástico adaptado por la persistencia de energía caótica.\\\")\\n\",\n", + " \"print(\\\"=\\\" * 100)\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 6. Renderizado de Paneles Visuales Analíticos del Espacio de Fases\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": None,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# ==============================================================================\\n\",\n", + " \"# CELDA 6: RENDERIZADO ANALÍTICO DEL ESPACIO DE FASES\\n\",\n", + " \"# ==============================================================================\\n\",\n", + " \"fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True)\\n\",\n", + " \"\\n\",\n", + " \"# 1. Gráfico del espacio de variables físico\\n\",\n", + " \"axs[0].plot(df_res.index, df_res['Price'], label=\\\"Precio BTC-USD (Cierre Real)\\\", color='cyan', lw=2)\\n\",\n", + " \"axs[0].set_title(\\\"Evolución del Espacio de Variables Real\\\", fontsize=12, color='white')\\n\",\n", + " \"axs[0].set_ylabel(\\\"Precio (USD)\\\", color='white')\\n\",\n", + " \"axs[0].grid(True, alpha=0.15)\\n\",\n", + " \"axs[0].legend(loc=\\\"upper left\\\")\\n\",\n", + " \"\\n\",\n", + " \"# 2. Exponente de Lyapunov local frente al umbral crítico\\n\",\n", + " \"axs[1].plot(df_res.index, df_res['Lyapunov'], label=\\\"Exponente Lyapunov Local (λ)\\\", color='magenta', alpha=0.7)\\n\",\n", + " \"axs[1].axhline(y=engine.lyapunov_threshold, color='red', linestyle='--', label=\\\"Umbral de Caos Configurado\\\")\\n\",\n", + " \"axs[1].set_title(\\\"Métrica de Divergencia Exponencial (Control de Caos)\\\", fontsize=12, color='white')\\n\",\n", + " \"axs[1].set_ylabel(\\\"Magnitud λ\\\", color='white')\\n\",\n", + " \"axs[1].grid(True, alpha=0.15)\\n\",\n", + " \"axs[1].legend(loc=\\\"upper left\\\")\\n\",\n", + " \"\\n\",\n", + " \"# 3. Gráfico de deformación elástica de la Norma L2 en Hilbert\\n\",\n", + " \"axs[2].plot(df_res.index, df_res['Norm'], label=\\\"Deformación Dinámica de la Norma L2\\\", color='yellow', lw=2)\\n\",\n", + " \"axs[2].set_title(\\\"Estado Topológico del Espacio de Hilbert (Resiliencia Manifold)\\\", fontsize=12, color='white')\\n\",\n", + " \"axs[2].set_ylabel(\\\"Valor de la Norma\\\", color='white')\\n\",\n", + " \"axs[2].set_xlabel(\\\"Línea Temporal de la Simulación\\\", color='white')\\n\",\n", + " \"axs[2].grid(True, alpha=0.15)\\n\",\n", + " \"axs[2].legend(loc=\\\"upper left\\\")\\n\",\n", + " \"\\n\",\n", + " \"# Aplicación de estilo científico Dark-Mode\\n\",\n", + " \"for ax in axs:\\n\",\n", + " \" ax.set_facecolor('#111111')\\n\",\n", + " \" ax.tick_params(colors='white')\\n\",\n", + " \"fig.patch.set_facecolor('#1a1a1a')\\n\",\n", + " \"\\n\",\n", + " \"plt.tight_layout()\\n\",\n", + " \"output_filename = \\\"panel_estabilidad_fase.png\\\"\\n\",\n", + " \"plt.savefig(output_filename, facecolor=fig.get_facecolor(), edgecolor='none', dpi=150)\\n\",\n", + " \"print(f\\\"[+] Panel geométrico exportado con éxito en alta resolución: '{output_filename}'\\\\n\\\")\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"kernelspec\": {\n", + " \"display_name\": \"Python 3\",\n", + " \"language\": \"python\",\n", + " \"name\": \"python3\"\n", + " },\n", + " \"language_info\": {\n", + " \"name\": \"python\"\n", + " }\n", + " },\n", + " \"nbformat\": 4,\n", + " \"nbformat_minor\": 2\n", + "}\n", + "\n", + "# Exportar estructura completa a archivo físico .ipynb legible por Jupyter\n", + "file_path = \"Quantum_Relativistic_MetaLearning_Notebook.ipynb\"\n", + "with open(file_path, \"w\", encoding=\"utf-8\") as f:\n", + " json.dump(notebook_data, f, indent=2, ensure_ascii=False)\n", + "\n", + "print(f\"Archivo generado exitosamente en: {file_path}\")" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/codespaces-jupyter.code-workspace b/codespaces-jupyter.code-workspace new file mode 100644 index 000000000..876a1499c --- /dev/null +++ b/codespaces-jupyter.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 000000000..c257d5794 --- /dev/null +++ b/main.py @@ -0,0 +1,322 @@ +# ============================================================================== +# CELDA 1: ENTORNO, DEPENDENCIAS E IMPORTACIONES GENERALES +# ============================================================================== +import os +import numpy as np +import pandas as pd +import yfinance as yf + +# Configuración de graficación para soporte headless / entornos de servidor +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import seaborn as sns + +print("[+] Entorno e importaciones inicializadas correctamente.") + +# ============================================================================== +# CELDA 2: ARQUITECTURA DEL MOTOR GEOMÉTRICO (LYAPUNOV & META-LEARNING) +# ============================================================================== +class QuantumRelativisticEngine: + def __init__(self, num_states=4, beta=0.01, kappa=0.1, lyapunov_threshold=4.20, lambda_meta=0.05): + self.N = num_states + self.beta = beta # Coeficiente de autointeracción relativista + self.kappa = kappa # Constante de acoplamiento de control + self.lyapunov_threshold = lyapunov_threshold # Umbral crítico de caos reajustado + self.lambda_meta = lambda_meta # Regularización para el espacio Meta-Learning + + # Inicialización del Espacio de Hilbert H (Ground State) + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + self.theta = np.random.randn(self.N) * 0.01 + self.theta_0 = self.theta.copy() + + # Inicialización del Bloque de Memorias Adaptativas + self.MP = np.random.rand(self.N) * 0.01 + self.MR = np.zeros(self.N) + self.norm_state = 1.0 # Estado base de la Norma L2 + self.alpha = 0.5 # Balance de peso de peso de memoria (t) + self.hilbert_reset_threshold = 5.0 # Umbral de Safety Layer para la norma de Hilbert + + def compute_relativistic_metric(self, price_change, volatility): + """ + Calcula la métrica g_μν basada en el cambio de precio y la volatilidad local. + """ + kuhn_tucker_grad = price_change * volatility + numerator = 1.0 + np.abs(kuhn_tucker_grad)**2 + denominator = 1.0 + self.beta * (self.norm_state**2) + g_factor = numerator / denominator + + g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0]) + return g_mu_nu, g_factor + + def compute_lyapunov_exponent(self, current_psi, previous_psi, dt=1): + """ + Aproxima el Exponente de Lyapunov local midiendo la divergencia geométrica. + """ + delta_psi = np.linalg.norm(current_psi - previous_psi) + if delta_psi <= 1e-12: + return 0.0 + jacobian_factor = np.abs(np.log(delta_psi / 1e-5) / dt) + return jacobian_factor + + def compute_r_reg_tensor(self, g_mu_nu, lyapunov_exp, volatility, price_change): + """ + Implementa el tensor de regularización R_reg basado en una aproximación + de la ecuación de Einstein R_μν - 1/2 R g_μν + Λg_μν = κT_μν + R_reg. + Se asume un tensor de energía-momento (T_μν) y curvatura escalar (R) + simplificados para fines de regularización. + """ + # Simplificación: Curvatura escalar (R) como función del caos/estabilidad + R_scalar = lyapunov_exp / self.lyapunov_threshold if self.lyapunov_threshold > 0 else 0.0 + + # Simplificación: Tensor de energía-momento (T_μν) como función del mercado + T_mu_nu = np.diag([price_change, volatility, volatility, volatility]) + + # Constantes (aproximadas) + Lambda = 0.1 # Constante cosmológica (regularización de fondo) + kappa = 0.5 # Constante de acoplamiento gravitacional + + # Ecuación de Einstein simplificada para R_reg: + # R_reg = R_μν - 1/2 R g_μν + Λg_μν - κT_μν + # Aquí R_μν se aproxima como una función de Lyapunov + R_mu_nu_approx = np.diag([lyapunov_exp, lyapunov_exp, lyapunov_exp, lyapunov_exp]) + + r_reg_tensor = R_mu_nu_approx - 0.5 * R_scalar * g_mu_nu + Lambda * g_mu_nu - kappa * T_mu_nu + return r_reg_tensor + + def execute_meta_learning(self, current_loss, lr_meta=0.001): + """ + Meta-Learning de segundo orden estabilizado mediante Gradient Clipping. + """ + grad_theta = 2 * (self.theta - self.theta_0) * current_loss + grad_theta = np.clip(grad_theta, -1.0, 1.0) # Prevención de explosión + + l_meta = np.sum(grad_theta**2) + self.lambda_meta * np.sum((self.theta - self.theta_0)**2) + self.theta -= lr_meta * grad_theta + return l_meta + + def random_walk_memory_update(self): + """ + Implementa una caminata aleatoria para la actualización de los estados cuánticos. + (Basado en la sección 1.8 del documento técnico - asunción al no ser provista) + Esto permite una exploración del espacio de Hilbert cuando el sistema es estable. + """ + if self.norm_state < self.lyapunov_threshold: # Solo si no hay caos + random_perturbation = (np.random.rand(self.N) - 0.5) * 0.01 + 1j * (np.random.rand(self.N) - 0.5) * 0.01 + self.c = self.c * np.exp(random_perturbation) + norm_c = np.linalg.norm(self.c) + if norm_c > 0 and not np.isnan(norm_c): + self.c /= norm_c + + def step_evolution(self, price_change, volatility, target_value_normalized): + """ + Evolución temporal continua utilizando variables normalizadas unitarias. + """ + prev_psi = self.c.copy() + + # 1. Espacio métrico relativista + g_mu_nu, g_factor = self.compute_relativistic_metric(price_change, volatility) + + # 2. Cálculo del tensor de regularización R_reg + r_reg_tensor = self.compute_r_reg_tensor(g_mu_nu, engine.lyapunov_threshold, volatility, price_change) + # Se aplica la regularización al factor de fase para controlar la evolución + # La forma exacta de aplicar R_reg puede variar, aquí se usa para modular phase_arg + regulation_factor = np.mean(np.abs(r_reg_tensor)) # Promedio de la magnitud del tensor + + phase_arg = np.clip(self.theta * g_factor * (1.0 - regulation_factor), -np.pi, np.pi) + self.c = self.c * np.exp(1j * phase_arg) + + # Proyección y normalización estricta en el espacio de Hilbert + norm_c = np.linalg.norm(self.c) + if norm_c > 0 and not np.isnan(norm_c): + self.c /= norm_c + else: + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + + # SAFETY LAYER: Reset de Hilbert si la norma supera el umbral + if np.linalg.norm(self.c) > self.hilbert_reset_threshold: + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) # Reset al Ground State + self.norm_state = 1.0 # Reset de la norma también + status_safety = "❌ HILBERT RESET: Norma L2 excedida. Reiniciando a Ground State." + else: + status_safety = "" + + lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi) + if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp): + lyapunov_exp = 0.0 + + # Lógica de absorción elástica por Norma L2 (ahora influenciada por R_reg) + if lyapunov_exp > self.lyapunov_threshold: + self.norm_state += ((lyapunov_exp - self.lyapunov_threshold) * 0.1) # Amortiguación suave + status = "⚠️ CHAOS DETECTED" + else: + # Enfriamiento dinámico acelerado hacia el Ground State (1.0) + self.norm_state = max(1.0, self.norm_state - 0.4 * (self.norm_state - 1.0)) + status = "✅ STABLE" + # Optimización de Memoria: Caminata aleatoria en estados cuánticos + self.random_walk_memory_update() + + # 4. Evaluación del Error en escala controlada [0, 1] + current_prediction = np.abs(self.c[0]) * target_value_normalized + loss = 0.5 * (current_prediction - target_value_normalized)**2 + + # 5. Ejecución del ciclo de Meta-Learning + l_meta = self.execute_meta_learning(loss) + + # 6. Actualización dinámica del bloque de memoria M(t) + success_condition = 1.0 if loss < 0.01 else 0.0 + if success_condition == 1.0: + self.alpha = max(0.1, self.alpha - 0.05) + self.MR += 0.01 * np.abs(self.c) + else: + self.alpha = min(0.9, self.alpha + 0.05) + self.MP += 0.01 * self.theta + + # 7. Actualización del aprendizaje estándar con protección anti-explosión + grad_loss = np.clip(self.theta_0 * loss, -0.1, 0.1) + self.theta_0 -= 0.01 * grad_loss + + final_status = f"{status} {status_safety}".strip() + + return { + "Lyapunov": lyapunov_exp, + "Norm": self.norm_state, + "Status": final_status, + "Loss": loss, + "L_Meta": l_meta, + "Prediction_Norm": current_prediction + } + +# ============================================================================== +# CELDA 3: PIPELINE DE INGESTA DE DATOS Y NORMALIZACIÓN DE MATRIZ +# ============================================================================== +print("[*] Conectando a los servidores de Yahoo Finance para obtener BTC-USD...") +ticker = "BTC-USD" + +raw_data = yf.download(ticker, period="6mo", interval="1d", auto_adjust=True) + +if raw_data.empty: + raise ValueError("[-] Error crítico: No se recibieron datos históricos.") + +if isinstance(raw_data.columns, pd.MultiIndex): + raw_data.columns = raw_data.columns.get_level_values(0) + +close_prices = raw_data['Close'].values.astype(float).flatten() +dates = raw_data.index + +df = pd.DataFrame(index=dates) +df['Price'] = close_prices +df['Returns'] = df['Price'].pct_change().fillna(0) +df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std()) + +# Estabilización numérica crítica +max_historical_price = np.max(close_prices) +df['Price_Normalized'] = df['Price'] / max_historical_price + +print(f"[+] Ingesta exitosa. Punto máximo de escala de referencia: ${max_historical_price:.2f} USD") + +# ============================================================================== +# CELDA 4: BUCLE CONTINUO EN TIEMPO REAL +# ============================================================================== +engine = QuantumRelativisticEngine(num_states=4, lyapunov_threshold=4.20) +history = [] + +print("=" * 100) +for idx, (timestamp, row) in enumerate(df.iterrows()): + metrics = engine.step_evolution( + price_change=row['Returns'], + volatility=row['Volatility'], + target_value_normalized=row['Price_Normalized'] + ) + + real_prediction = metrics["Prediction_Norm"] * max_historical_price + + history.append({ + "Price": row['Price'], + "Lyapunov": metrics["Lyapunov"], + "Norm": metrics["Norm"], + "Loss": metrics["Loss"], + "L_Meta": metrics["L_Meta"], + "Prediction": real_prediction, + "Status": metrics["Status"] + }) + + if idx % 15 == 0: + date_str = timestamp.strftime('%Y-%m-%d') + print(f"{date_str} | Price: $ {row['Price']:9.2f} | Lyapunov: {metrics['Lyapunov']:.6f} | Norm: {metrics['Norm']:.4f} | {metrics['Status']}") + +print("=" * 100) +df_res = pd.DataFrame(history, index=df.index) +print("[+] Simulación temporal sin desbordamiento finalizada con éxito.") + +# ============================================================================== +# CELDA 5: CAPA PREDICTIVA EN T+1 Y LÍMITES DE FRONTERA DINÁMICOS +# ============================================================================== +last_close = df_res['Price'].iloc[-1] +last_volatility = df['Volatility'].iloc[-1] +last_norm = df_res['Norm'].iloc[-1] + +spatial_compression = 1.0 / last_norm +max_tolerable_return = (engine.lyapunov_threshold / (last_volatility * 10)) * spatial_compression + +upper_chaos_limit = last_close * (1.0 + max_tolerable_return) +lower_chaos_limit = last_close * (1.0 - max_tolerable_return) + +print("\n[*] Inicializando análisis predictivo del próximo ciclo de mercado...") +print("=" * 100) +print(f"MÉTRICAS BASE EN T (ÚLTIMO CIERRE REGISTRADO):") +print(f" -> Último Precio de Cierre ($S_t$) : ${last_close:.2f} USD") +print(f" -> Volatilidad del Sistema (\\sigma_t) : {last_volatility:.6f}") +print(f" -> Magnitud de la Norma L2 (||\\psi||) : {last_norm:.4f}") +print("-" * 100) +print("PROYECCIÓN PREDICTIVA PARA T+1 (PRÓXIMAS 24 HORAS):") +print(f" -> Retorno Crítico Máximo Tolerable: ±{max_tolerable_return*100:.2f}%") +print(f" -> LÍMITE SUPERIOR DE CAOS : ${upper_chaos_limit:.2f} USD") +print(f" -> LÍMITE INFERIOR DE CAOS : ${lower_chaos_limit:.2f} USD") +print(f" -> CRÍTICO AJUSTADO POR NORMA : ${lower_chaos_limit * spatial_compression:.2f} USD") +print("=" * 100) + +if last_norm == 1.0: + print("✅ SISTEMA EN EQUILIBRIO: Las fronteras predictivas operan dentro de los márgenes estándar.") +else: + print("⚠️ VARIEDAD DEFORMADA: Espacio elástico adaptado por la persistencia de energía caótica.") +print("=" * 100) + +# ============================================================================== +# CELDA 6: RENDERIZADO ANALÍTICO DEL ESPACIO DE FASES +# ============================================================================== +fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True) + +# 1. Gráfico del espacio de variables físico +axs[0].plot(df_res.index, df_res['Price'], label="Precio BTC-USD (Cierre Real)", color='cyan', lw=2) +axs[0].set_title("Evolución del Espacio de Variables Real", fontsize=12, color='white') +axs[0].set_ylabel("Precio (USD)", color='white') +axs[0].grid(True, alpha=0.15) +axs[0].legend(loc="upper left") + +# 2. Exponente de Lyapunov local frente al umbral crítico +axs[1].plot(df_res.index, df_res['Lyapunov'], label="Exponente Lyapunov Local (λ)", color='magenta', alpha=0.7) +axs[1].axhline(y=engine.lyapunov_threshold, color='red', linestyle='--', label="Umbral de Caos Configurado") +axs[1].set_title("Métrica de Divergencia Exponencial (Control de Caos)", fontsize=12, color='white') +axs[1].set_ylabel("Magnitud λ", color='white') +axs[1].grid(True, alpha=0.15) +axs[1].legend(loc="upper left") + +# 3. Gráfico de deformación elástica de la Norma L2 en Hilbert +axs[2].plot(df_res.index, df_res['Norm'], label="Deformación Dinámica de la Norma L2", color='yellow', lw=2) +axs[2].set_title("Estado Topológico del Espacio de Hilbert (Resiliencia Manifold)", fontsize=12, color='white') +axs[2].set_ylabel("Valor de la Norma", color='white') +axs[2].set_xlabel("Línea Temporal de la Simulación", color='white') +axs[2].grid(True, alpha=0.15) +axs[2].legend(loc="upper left") + +# Aplicación de estilo científico Dark-Mode +for ax in axs: + ax.set_facecolor('#111111') + ax.tick_params(colors='white') +fig.patch.set_facecolor('#1a1a1a') + +plt.tight_layout() +output_filename = "panel_estabilidad_fase.png" +plt.savefig(output_filename, facecolor=fig.get_facecolor(), edgecolor='none', dpi=150) +print(f"[+] Panel geométrico exportado con éxito en alta resolución: '{output_filename}'\n") diff --git a/panel_estabilidad_fase.png b/panel_estabilidad_fase.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8cd7c79edc251ac3421840b688fc524733b251 GIT binary patch literal 204635 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
uq=^8 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 Date: Wed, 27 May 2026 00:17:36 +0000 Subject: [PATCH 2/9] updates --- Dockerfile | 13 - ...m_Relativistic_MetaLearning_Notebook.ipynb | 415 ------------------ codespaces-jupyter.code-workspace | 8 - 3 files changed, 436 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7b0ef197b..e69de29bb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +0,0 @@ -FROM python:3.10-slim - -WORKDIR /app - -ENV MPLBACKEND=Agg - -# Instalación de dependencias de Python -RUN pip install yfinance numpy pandas matplotlib seaborn google-cloud-storage - -# Copiar el script principal de la aplicación -COPY main.py . - -ENTRYPOINT ["python3", "main.py"] diff --git a/Quantum_Relativistic_MetaLearning_Notebook.ipynb b/Quantum_Relativistic_MetaLearning_Notebook.ipynb index 5ba63247e..e69de29bb 100644 --- a/Quantum_Relativistic_MetaLearning_Notebook.ipynb +++ b/Quantum_Relativistic_MetaLearning_Notebook.ipynb @@ -1,415 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "4bd07f55", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "```python?code_reference&code_event_index=5\n", - "import json\n", - "\n", - "# Definimos el contenido estructurado en celdas de un Jupyter Notebook (.ipynb)\n", - "notebook_data = {\n", - " \"cells\": [\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Demostración: Aprendizaje Continuo Cuántico-Relativista en Predicción Real y Meta-Learning\\n\",\n", - " \"\\n\",\n", - " \"Este notebook implementa y demuestra el pipeline matemático completo propuesto en el documento técnico para el control de estabilidad en espacios de fase dinámicos utilizando datos reales del mercado de criptoactivos (`BTC-USD`) obtenidos en tiempo real de Yahoo Finance.\\n\",\n", - " \"\\n\",\n", - " \"### Arquitectura del Algoritmo:\\n\",\n", - " \"1. **Espacio de Hilbert ($H$):** Representación del estado interno del sistema de control mediante un vector de estado complejo unitario $|\\\\psi_t\\\\rangle$.\\n\",\n", - " \"2. **Métrica Relativista Deformada ($g_{\\\\mu\\\\nu}$):** Modificación del espacio métrico basada en el gradiente de Kuhn-Tucker (variaciones de retorno e intensidad de volatilidad del mercado).\\n\",\n", - " \"3. **Control de Caos Proactivo por Exponente de Lyapunov ($\\\\lambda$):** Detección en tiempo real de divergencias exponenciales en las trayectorias del espacio de fases, activando amortiguaciones elásticas sobre la norma $L^2$ para prevenir desbordamientos o eventos de tipo \\\"Cisne Negro\\\".\\n\",\n", - " \"4. **Bucle de Meta-Learning:** Optimización de segundo orden para sintonizar dinámicamente los hiperparámetros de control $\\\\Theta$ basándose en meta-gradientes de pérdida acelerada.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": None,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"# ==============================================================================\\n\",\n", - " \"# CELDA 1: ENTORNO, DEPENDENCIAS E IMPORTACIONES GENERALES\\n\",\n", - " \"# ==============================================================================\\n\",\n", - " \"import os\\n\",\n", - " \"import numpy as np\\n\",\n", - " \"import pandas as pd\\n\",\n", - " \"import yfinance as yf\\n\",\n", - " \"\\n\",\n", - " \"# Configuración de graficación para soporte headless / entornos de servidor\\n\",\n", - " \"import matplotlib\\n\",\n", - " \"matplotlib.use('Agg')\\n\",\n", - " \"import matplotlib.pyplot as plt\\n\",\n", - " \"import seaborn as sns\\n\",\n", - " \"\\n\",\n", - " \"print(\\\"[+] Entorno e importaciones inicializadas correctamente.\\\")\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## 2. Core del Motor Matemático Cuántico-Relativista\\n\",\n", - " \"\\n\",\n", - " \"En esta celda se modela la clase del motor. Se incorpora la estabilización numérica mediante **Gradient Clipping** en el bucle de Meta-Learning, y el **Enfriamiento Dinámico Acelerado** en la Norma $L^2$ cuando el exponente de Lyapunov desciende del umbral de caos crítico configurado.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": None,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"# ==============================================================================\\n\",\n", - " \"# CELDA 2: ARQUITECTURA DEL MOTOR GEOMÉTRICO (LYAPUNOV & META-LEARNING)\\n\",\n", - " \"# ==============================================================================\\n\",\n", - " \"class QuantumRelativisticEngine:\\n\",\n", - " \" def __init__(self, num_states=4, beta=0.01, kappa=0.1, lyapunov_threshold=4.20, lambda_meta=0.05):\\n\",\n", - " \" self.N = num_states\\n\",\n", - " \" self.beta = beta # Coeficiente de autointeracción relativista\\n\",\n", - " \" self.kappa = kappa # Constante de acoplamiento de control\\n\",\n", - " \" self.lyapunov_threshold = lyapunov_threshold # Umbral crítico de caos reajustado\\n\",\n", - " \" self.lambda_meta = lambda_meta # Regularización para el espacio Meta-Learning\\n\",\n", - " \" \\n\",\n", - " \" # Inicialización del Espacio de Hilbert H (Ground State)\\n\",\n", - " \" self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N)\\n\",\n", - " \" self.theta = np.random.randn(self.N) * 0.01 \\n\",\n", - " \" self.theta_0 = self.theta.copy() \\n\",\n", - " \" \\n\",\n", - " \" # Inicialización del Bloque de Memorias Adaptativas\\n\",\n", - " \" self.MP = np.random.rand(self.N) * 0.01\\n\",\n", - " \" self.MR = np.zeros(self.N) \\n\",\n", - " \" self.norm_state = 1.0 # Estado base de la Norma L2\\n\",\n", - " \" self.alpha = 0.5 # Balance de peso de memoria (t)\\n\",\n", - " \"\\n\",\n", - " \" def compute_relativistic_metric(self, price_change, volatility):\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" Calcula la métrica g_μν basada en el cambio de precio y la volatilidad local.\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" kuhn_tucker_grad = price_change * volatility\\n\",\n", - " \" numerator = 1.0 + np.abs(kuhn_tucker_grad)**2\\n\",\n", - " \" denominator = 1.0 + self.beta * (self.norm_state**2)\\n\",\n", - " \" g_factor = numerator / denominator\\n\",\n", - " \" \\n\",\n", - " \" g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0])\\n\",\n", - " \" return g_mu_nu, g_factor\\n\",\n", - " \"\\n\",\n", - " \" def compute_lyapunov_exponent(self, current_psi, previous_psi, dt=1):\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" Aproxima el Exponente de Lyapunov local midiendo la divergencia geométrica.\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" delta_psi = np.linalg.norm(current_psi - previous_psi)\\n\",\n", - " \" if delta_psi <= 1e-12:\\n\",\n", - " \" return 0.0\\n\",\n", - " \" jacobian_factor = np.abs(np.log(delta_psi / 1e-5) / dt)\\n\",\n", - " \" return jacobian_factor\\n\",\n", - " \"\\n\",\n", - " \" def execute_meta_learning(self, current_loss, lr_meta=0.001):\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" Meta-Learning de segundo orden estabilizado mediante Gradient Clipping.\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" grad_theta = 2 * (self.theta - self.theta_0) * current_loss\\n\",\n", - " \" grad_theta = np.clip(grad_theta, -1.0, 1.0) # Prevención de explosión\\n\",\n", - " \" \\n\",\n", - " \" l_meta = np.sum(grad_theta**2) + self.lambda_meta * np.sum((self.theta - self.theta_0)**2)\\n\",\n", - " \" self.theta -= lr_meta * grad_theta\\n\",\n", - " \" return l_meta\\n\",\n", - " \"\\n\",\n", - " \" def step_evolution(self, price_change, volatility, target_value_normalized):\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" Evolución temporal continua utilizando variables normalizadas unitarias.\\n\",\n", - " \" \\\"\\\"\\\"\\n\",\n", - " \" prev_psi = self.c.copy()\\n\",\n", - " \" \\n\",\n", - " \" # 1. Espacio métrico relativista\\n\",\n", - " \" g_mu_nu, g_factor = self.compute_relativistic_metric(price_change, volatility)\\n\",\n", - " \" \\n\",\n", - " \" phase_arg = np.clip(self.theta * g_factor, -np.pi, np.pi)\\n\",\n", - " \" self.c = self.c * np.exp(1j * phase_arg)\\n\",\n", - " \" \\n\",\n", - " \" # Proyección y normalización estricta en el espacio de Hilbert\\n\",\n", - " \" norm_c = np.linalg.norm(self.c)\\n\",\n", - " \" if norm_c > 0 and not np.isnan(norm_c):\\n\",\n", - " \" self.c /= norm_c\\n\",\n", - " \" else:\\n\",\n", - " \" self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N)\\n\",\n", - " \" \\n\",\n", - " \" lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi)\\n\",\n", - " \" if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp):\\n\",\n", - " \" lyapunov_exp = 0.0\\n\",\n", - " \" \\n\",\n", - " \" # 3. Lógica de absorción elástica por Norma L2\\n\",\n", - " \" if lyapunov_exp > self.lyapunov_threshold:\\n\",\n", - " \" self.norm_state += ((lyapunov_exp - self.lyapunov_threshold) * 0.1) # Amortiguación suave\\n\",\n", - " \" status = \\\"⚠️ CHAOS DETECTED\\\"\\n\",\n", - " \" else:\\n\",\n", - " \" # Enfriamiento dinámico acelerado hacia el Ground State (1.0)\\n\",\n", - " \" self.norm_state = max(1.0, self.norm_state - 0.4 * (self.norm_state - 1.0))\\n\",\n", - " \" status = \\\"✅ STABLE\\\"\\n\",\n", - " \" \\n\",\n", - " \" # 4. Evaluación del Error en escala controlada [0, 1]\\n\",\n", - " \" current_prediction = np.abs(self.c[0]) * target_value_normalized\\n\",\n", - " \" loss = 0.5 * (current_prediction - target_value_normalized)**2\\n\",\n", - " \" \\n\",\n", - " \" # 5. Ejecución del ciclo de Meta-Learning\\n\",\n", - " \" l_meta = self.execute_meta_learning(loss)\\n\",\n", - " \" \\n\",\n", - " \" # 6. Actualización dinámica del bloque de memoria M(t)\\n\",\n", - " \" success_condition = 1.0 if loss < 0.01 else 0.0\\n\",\n", - " \" if success_condition == 1.0:\\n\",\n", - " \" self.alpha = max(0.1, self.alpha - 0.05)\\n\",\n", - " \" self.MR += 0.01 * np.abs(self.c)\\n\",\n", - " \" else:\\n\",\n", - " \" self.alpha = min(0.9, self.alpha + 0.05)\\n\",\n", - " \" self.MP += 0.01 * self.theta\\n\",\n", - " \" \\n\",\n", - " \" # 7. Actualización del aprendizaje estándar con protección anti-explosión\\n\",\n", - " \" grad_loss = np.clip(self.theta_0 * loss, -0.1, 0.1)\\n\",\n", - " \" self.theta_0 -= 0.01 * grad_loss\\n\",\n", - " \" \\n\",\n", - " \" return {\\n\",\n", - " \" \\\"Lyapunov\\\": lyapunov_exp,\\n\",\n", - " \" \\\"Norm\\\": self.norm_state,\\n\",\n", - " \" \\\"Status\\\": status,\\n\",\n", - " \" \\\"Loss\\\": loss,\\n\",\n", - " \" \\\"L_Meta\\\": l_meta,\\n\",\n", - " \" \\\"Prediction_Norm\\\": current_prediction\\n\",\n", - " \" }\\n\",\n", - " \"\\n\",\n", - " \"print(\\\"[+] Motor de simulación cuántica optimizado numéricamente.\\\")\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## 3. Ingesta de Datos y Normalización de Escala\\n\",\n", - " \"\\n\",\n", - " \"Descargamos el historial de precios reales diario de Bitcoin e implementamos el tratamiento anti Multi-Index de pandas junto con la compresión logarítmica/unitaria respecto al máximo histórico para asegurar estabilidad numérica absoluta.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": None,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"# ==============================================================================\\n\",\n", - " \"# CELDA 3: PIPELINE DE INGESTA DE DATOS Y NORMALIZACIÓN DE MATRIZ\\n\",\n", - " \"# ==============================================================================\\n\",\n", - " \"print(\\\"[*] Conectando a los servidores de Yahoo Finance para obtener BTC-USD...\\\")\\n\",\n", - " \"ticker = \\\"BTC-USD\\\"\\n\",\n", - " \"\\n\",\n", - " \"raw_data = yf.download(ticker, period=\\\"6mo\\\", interval=\\\"1d\\\", auto_adjust=True)\\n\",\n", - " \"\\n\",\n", - " \"if raw_data.empty:\\n\",\n", - " \" raise ValueError(\\\"[-] Error crítico: No se recibieron datos históricos.\\\")\\n\",\n", - " \"\\n\",\n", - " \"if isinstance(raw_data.columns, pd.MultiIndex):\\n\",\n", - " \" raw_data.columns = raw_data.columns.get_level_values(0)\\n\",\n", - " \"\\n\",\n", - " \"close_prices = raw_data['Close'].values.astype(float).flatten()\\n\",\n", - " \"dates = raw_data.index\\n\",\n", - " \"\\n\",\n", - " \"df = pd.DataFrame(index=dates)\\n\",\n", - " \"df['Price'] = close_prices\\n\",\n", - " \"df['Returns'] = df['Price'].pct_change().fillna(0)\\n\",\n", - " \"df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std())\\n\",\n", - " \"\\n\",\n", - " \"# Estabilización numérica crítica\\n\",\n", - " \"max_historical_price = np.max(close_prices)\\n\",\n", - " \"df['Price_Normalized'] = df['Price'] / max_historical_price\\n\",\n", - " \"\\n\",\n", - " \"print(f\\\"[+] Ingesta exitosa. Punto máximo de escala de referencia: ${max_historical_price:.2f} USD\\\")\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## 4. Ejecución del Bucle Temporal de Simulación Continua\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": None,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"# ==============================================================================\\n\",\n", - " \"# CELDA 4: BUCLE CONTINUO EN TIEMPO REAL\\n\",\n", - " \"# ==============================================================================\\n\",\n", - " \"engine = QuantumRelativisticEngine(num_states=4, lyapunov_threshold=4.20)\\n\",\n", - " \"history = []\\n\",\n", - " \"\\n\",\n", - " \"print(\\\"=\\\" * 100)\\n\",\n", - " \"for idx, (timestamp, row) in enumerate(df.iterrows()):\\n\",\n", - " \" metrics = engine.step_evolution(\\n\",\n", - " \" price_change=row['Returns'],\\n\",\n", - " \" volatility=row['Volatility'],\\n\",\n", - " \" target_value_normalized=row['Price_Normalized']\\n\",\n", - " \" )\\n\",\n", - " \" \\n\",\n", - " \" real_prediction = metrics[\\\"Prediction_Norm\\\"] * max_historical_price\\n\",\n", - " \" \\n\",\n", - " \" history.append({\\n\",\n", - " \" \\\"Price\\\": row['Price'],\\n\",\n", - " \" \\\"Lyapunov\\\": metrics[\\\"Lyapunov\\\"],\\n\",\n", - " \" \\\"Norm\\\": metrics[\\\"Norm\\\"],\\n\",\n", - " \" \\\"Loss\\\": metrics[\\\"Loss\\\"],\\n\",\n", - " \" \\\"L_Meta\\\": metrics[\\\"L_Meta\\\"],\\n\",\n", - " \" \\\"Prediction\\\": real_prediction,\\n\",\n", - " \" \\\"Status\\\": metrics[\\\"Status\\\"]\\n\",\n", - " \" })\\n\",\n", - " \" \\n\",\n", - " \" if idx % 15 == 0:\\n\",\n", - " \" date_str = timestamp.strftime('%Y-%m-%d')\\n\",\n", - " \" print(f\\\"{date_str} | Price: $ {row['Price']:9.2f} | Lyapunov: {metrics['Lyapunov']:.6f} | Norm: {metrics['Norm']:.4f} | {metrics['Status']}\\\")\\n\",\n", - " \"\\n\",\n", - " \"print(\\\"=\\\" * 100)\\n\",\n", - " \"df_res = pd.DataFrame(history, index=df.index)\\n\",\n", - " \"print(\\\"[+] Simulación temporal sin desbordamiento finalizada con éxito.\\\")\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## 5. Proyección Predictiva en T+1 y Límites Dinámicos de Frontera\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": None,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"# ==============================================================================\\n\",\n", - " \"# CELDA 5: CAPA PREDICTIVA EN T+1 Y LÍMITES DE FRONTERA DINÁMICOS\\n\",\n", - " \"# ==============================================================================\\n\",\n", - " \"last_close = df_res['Price'].iloc[-1]\\n\",\n", - " \"last_volatility = df['Volatility'].iloc[-1]\\n\",\n", - " \"last_norm = df_res['Norm'].iloc[-1]\\n\",\n", - " \"\\n\",\n", - " \"spatial_compression = 1.0 / last_norm\\n\",\n", - " \"max_tolerable_return = (engine.lyapunov_threshold / (last_volatility * 10)) * spatial_compression\\n\",\n", - " \"\\n\",\n", - " \"upper_chaos_limit = last_close * (1.0 + max_tolerable_return)\\n\",\n", - " \"lower_chaos_limit = last_close * (1.0 - max_tolerable_return)\\n\",\n", - " \"\\n\",\n", - " \"print(\\\"\\\\n[*] Inicializando análisis predictivo del próximo ciclo de mercado...\\\")\\n\",\n", - " \"print(\\\"=\\\" * 100)\\n\",\n", - " \"print(f\\\"MÉTRICAS BASE EN T (ÚLTIMO CIERRE REGISTRADO):\\\")\\n\",\n", - " \"print(f\\\" -> Último Precio de Cierre ($S_t$) : ${last_close:.2f} USD\\\")\\n\",\n", - " \"print(f\\\" -> Volatilidad del Sistema (\\\\\\\\sigma_t) : {last_volatility:.6f}\\\")\\n\",\n", - " \"print(f\\\" -> Magnitud de la Norma L2 (||\\\\\\\\psi||) : {last_norm:.4f}\\\")\\n\",\n", - " \"print(\\\"-\\\" * 100)\\n\",\n", - " \"print(\\\"PROYECCIÓN PREDICTIVA PARA T+1 (PRÓXIMAS 24 HORAS):\\\")\\n\",\n", - " \"print(f\\\" -> Retorno Crítico Máximo Tolerable: ±{max_tolerable_return*100:.2f}%\\\")\\n\",\n", - " \"print(f\\\" -> LÍMITE SUPERIOR DE CAOS : ${upper_chaos_limit:.2f} USD\\\")\\n\",\n", - " \"print(f\\\" -> LÍMITE INFERIOR DE CAOS : ${lower_chaos_limit:.2f} USD\\\")\\n\",\n", - " \"print(f\\\" -> CRÍTICO AJUSTADO POR NORMA : ${lower_chaos_limit * spatial_compression:.2f} USD\\\")\\n\",\n", - " \"print(\\\"=\\\" * 100)\\n\",\n", - " \"\\n\",\n", - " \"if last_norm == 1.0:\\n\",\n", - " \" print(\\\"✅ SISTEMA EN EQUILIBRIO: Las fronteras predictivas operan dentro de los márgenes estándar.\\\")\\n\",\n", - " \"else:\\n\",\n", - " \" print(\\\"⚠️ VARIEDAD DEFORMADA: Espacio elástico adaptado por la persistencia de energía caótica.\\\")\\n\",\n", - " \"print(\\\"=\\\" * 100)\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## 6. Renderizado de Paneles Visuales Analíticos del Espacio de Fases\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": None,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"# ==============================================================================\\n\",\n", - " \"# CELDA 6: RENDERIZADO ANALÍTICO DEL ESPACIO DE FASES\\n\",\n", - " \"# ==============================================================================\\n\",\n", - " \"fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True)\\n\",\n", - " \"\\n\",\n", - " \"# 1. Gráfico del espacio de variables físico\\n\",\n", - " \"axs[0].plot(df_res.index, df_res['Price'], label=\\\"Precio BTC-USD (Cierre Real)\\\", color='cyan', lw=2)\\n\",\n", - " \"axs[0].set_title(\\\"Evolución del Espacio de Variables Real\\\", fontsize=12, color='white')\\n\",\n", - " \"axs[0].set_ylabel(\\\"Precio (USD)\\\", color='white')\\n\",\n", - " \"axs[0].grid(True, alpha=0.15)\\n\",\n", - " \"axs[0].legend(loc=\\\"upper left\\\")\\n\",\n", - " \"\\n\",\n", - " \"# 2. Exponente de Lyapunov local frente al umbral crítico\\n\",\n", - " \"axs[1].plot(df_res.index, df_res['Lyapunov'], label=\\\"Exponente Lyapunov Local (λ)\\\", color='magenta', alpha=0.7)\\n\",\n", - " \"axs[1].axhline(y=engine.lyapunov_threshold, color='red', linestyle='--', label=\\\"Umbral de Caos Configurado\\\")\\n\",\n", - " \"axs[1].set_title(\\\"Métrica de Divergencia Exponencial (Control de Caos)\\\", fontsize=12, color='white')\\n\",\n", - " \"axs[1].set_ylabel(\\\"Magnitud λ\\\", color='white')\\n\",\n", - " \"axs[1].grid(True, alpha=0.15)\\n\",\n", - " \"axs[1].legend(loc=\\\"upper left\\\")\\n\",\n", - " \"\\n\",\n", - " \"# 3. Gráfico de deformación elástica de la Norma L2 en Hilbert\\n\",\n", - " \"axs[2].plot(df_res.index, df_res['Norm'], label=\\\"Deformación Dinámica de la Norma L2\\\", color='yellow', lw=2)\\n\",\n", - " \"axs[2].set_title(\\\"Estado Topológico del Espacio de Hilbert (Resiliencia Manifold)\\\", fontsize=12, color='white')\\n\",\n", - " \"axs[2].set_ylabel(\\\"Valor de la Norma\\\", color='white')\\n\",\n", - " \"axs[2].set_xlabel(\\\"Línea Temporal de la Simulación\\\", color='white')\\n\",\n", - " \"axs[2].grid(True, alpha=0.15)\\n\",\n", - " \"axs[2].legend(loc=\\\"upper left\\\")\\n\",\n", - " \"\\n\",\n", - " \"# Aplicación de estilo científico Dark-Mode\\n\",\n", - " \"for ax in axs:\\n\",\n", - " \" ax.set_facecolor('#111111')\\n\",\n", - " \" ax.tick_params(colors='white')\\n\",\n", - " \"fig.patch.set_facecolor('#1a1a1a')\\n\",\n", - " \"\\n\",\n", - " \"plt.tight_layout()\\n\",\n", - " \"output_filename = \\\"panel_estabilidad_fase.png\\\"\\n\",\n", - " \"plt.savefig(output_filename, facecolor=fig.get_facecolor(), edgecolor='none', dpi=150)\\n\",\n", - " \"print(f\\\"[+] Panel geométrico exportado con éxito en alta resolución: '{output_filename}'\\\\n\\\")\"\n", - " ]\n", - " }\n", - " ],\n", - " \"metadata\": {\n", - " \"kernelspec\": {\n", - " \"display_name\": \"Python 3\",\n", - " \"language\": \"python\",\n", - " \"name\": \"python3\"\n", - " },\n", - " \"language_info\": {\n", - " \"name\": \"python\"\n", - " }\n", - " },\n", - " \"nbformat\": 4,\n", - " \"nbformat_minor\": 2\n", - "}\n", - "\n", - "# Exportar estructura completa a archivo físico .ipynb legible por Jupyter\n", - "file_path = \"Quantum_Relativistic_MetaLearning_Notebook.ipynb\"\n", - "with open(file_path, \"w\", encoding=\"utf-8\") as f:\n", - " json.dump(notebook_data, f, indent=2, ensure_ascii=False)\n", - "\n", - "print(f\"Archivo generado exitosamente en: {file_path}\")" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/codespaces-jupyter.code-workspace b/codespaces-jupyter.code-workspace index 876a1499c..e69de29bb 100644 --- a/codespaces-jupyter.code-workspace +++ b/codespaces-jupyter.code-workspace @@ -1,8 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": {} -} \ No newline at end of file From f3ce05a83205db455246006cbb86bff707d3ec78 Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 20:40:34 -0400 Subject: [PATCH 3/9] Create Master_Prompt_Deployment.md --- Master_Prompt_Deployment.md | 391 ++++++++++++++++++++++++++++++++++++ 1 file changed, 391 insertions(+) create mode 100644 Master_Prompt_Deployment.md diff --git a/Master_Prompt_Deployment.md b/Master_Prompt_Deployment.md new file mode 100644 index 000000000..f6c086c3a --- /dev/null +++ b/Master_Prompt_Deployment.md @@ -0,0 +1,391 @@ +```python?code_reference&code_event_index=5 +import json + +# Definimos el contenido estructurado en celdas de un Jupyter Notebook (.ipynb) +notebook_data = { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Demostración: Aprendizaje Continuo Cuántico-Relativista en Predicción Real y Meta-Learning\n", + "\n", + "Este notebook implementa y demuestra el pipeline matemático completo propuesto en el documento técnico para el control de estabilidad en espacios de fase dinámicos utilizando datos reales del mercado de criptoactivos (`BTC-USD`) obtenidos en tiempo real de Yahoo Finance.\n", + "\n", + "### Arquitectura del Algoritmo:\n", + "1. **Espacio de Hilbert ($H$):** Representación del estado interno del sistema de control mediante un vector de estado complejo unitario $|\\psi_t\\rangle$.\n", + "2. **Métrica Relativista Deformada ($g_{\\mu\\nu}$):** Modificación del espacio métrico basada en el gradiente de Kuhn-Tucker (variaciones de retorno e intensidad de volatilidad del mercado).\n", + "3. **Control de Caos Proactivo por Exponente de Lyapunov ($\\lambda$):** Detección en tiempo real de divergencias exponenciales en las trayectorias del espacio de fases, activando amortiguaciones elásticas sobre la norma $L^2$ para prevenir desbordamientos o eventos de tipo \"Cisne Negro\".\n", + "4. **Bucle de Meta-Learning:** Optimización de segundo orden para sintonizar dinámicamente los hiperparámetros de control $\\Theta$ basándose en meta-gradientes de pérdida acelerada." + ] + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# ==============================================================================\n", + "# CELDA 1: ENTORNO, DEPENDENCIAS E IMPORTACIONES GENERALES\n", + "# ==============================================================================\n", + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import yfinance as yf\n", + "\n", + "# Configuración de graficación para soporte headless / entornos de servidor\n", + "import matplotlib\n", + "matplotlib.use('Agg')\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "print(\"[+] Entorno e importaciones inicializadas correctamente.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Core del Motor Matemático Cuántico-Relativista\n", + "\n", + "En esta celda se modela la clase del motor. Se incorpora la estabilización numérica mediante **Gradient Clipping** en el bucle de Meta-Learning, y el **Enfriamiento Dinámico Acelerado** en la Norma $L^2$ cuando el exponente de Lyapunov desciende del umbral de caos crítico configurado." + ] + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# ==============================================================================\n", + "# CELDA 2: ARQUITECTURA DEL MOTOR GEOMÉTRICO (LYAPUNOV & META-LEARNING)\n", + "# ==============================================================================\n", + "class QuantumRelativisticEngine:\n", + " def __init__(self, num_states=4, beta=0.01, kappa=0.1, lyapunov_threshold=4.20, lambda_meta=0.05):\n", + " self.N = num_states\n", + " self.beta = beta # Coeficiente de autointeracción relativista\n", + " self.kappa = kappa # Constante de acoplamiento de control\n", + " self.lyapunov_threshold = lyapunov_threshold # Umbral crítico de caos reajustado\n", + " self.lambda_meta = lambda_meta # Regularización para el espacio Meta-Learning\n", + " \n", + " # Inicialización del Espacio de Hilbert H (Ground State)\n", + " self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N)\n", + " self.theta = np.random.randn(self.N) * 0.01 \n", + " self.theta_0 = self.theta.copy() \n", + " \n", + " # Inicialización del Bloque de Memorias Adaptativas\n", + " self.MP = np.random.rand(self.N) * 0.01\n", + " self.MR = np.zeros(self.N) \n", + " self.norm_state = 1.0 # Estado base de la Norma L2\n", + " self.alpha = 0.5 # Balance de peso de memoria (t)\n", + "\n", + " def compute_relativistic_metric(self, price_change, volatility):\n", + " \"\"\"\n", + " Calcula la métrica g_μν basada en el cambio de precio y la volatilidad local.\n", + " \"\"\"\n", + " kuhn_tucker_grad = price_change * volatility\n", + " numerator = 1.0 + np.abs(kuhn_tucker_grad)**2\n", + " denominator = 1.0 + self.beta * (self.norm_state**2)\n", + " g_factor = numerator / denominator\n", + " \n", + " g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0])\n", + " return g_mu_nu, g_factor\n", + "\n", + " def compute_lyapunov_exponent(self, current_psi, previous_psi, dt=1):\n", + " \"\"\"\n", + " Aproxima el Exponente de Lyapunov local midiendo la divergencia geométrica.\n", + " \"\"\"\n", + " delta_psi = np.linalg.norm(current_psi - previous_psi)\n", + " if delta_psi <= 1e-12:\n", + " return 0.0\n", + " jacobian_factor = np.abs(np.log(delta_psi / 1e-5) / dt)\n", + " return jacobian_factor\n", + "\n", + " def execute_meta_learning(self, current_loss, lr_meta=0.001):\n", + " \"\"\"\n", + " Meta-Learning de segundo orden estabilizado mediante Gradient Clipping.\n", + " \"\"\"\n", + " grad_theta = 2 * (self.theta - self.theta_0) * current_loss\n", + " grad_theta = np.clip(grad_theta, -1.0, 1.0) # Prevención de explosión\n", + " \n", + " l_meta = np.sum(grad_theta**2) + self.lambda_meta * np.sum((self.theta - self.theta_0)**2)\n", + " self.theta -= lr_meta * grad_theta\n", + " return l_meta\n", + "\n", + " def step_evolution(self, price_change, volatility, target_value_normalized):\n", + " \"\"\"\n", + " Evolución temporal continua utilizando variables normalizadas unitarias.\n", + " \"\"\"\n", + " prev_psi = self.c.copy()\n", + " \n", + " # 1. Espacio métrico relativista\n", + " g_mu_nu, g_factor = self.compute_relativistic_metric(price_change, volatility)\n", + " \n", + " phase_arg = np.clip(self.theta * g_factor, -np.pi, np.pi)\n", + " self.c = self.c * np.exp(1j * phase_arg)\n", + " \n", + " # Proyección y normalización estricta en el espacio de Hilbert\n", + " norm_c = np.linalg.norm(self.c)\n", + " if norm_c > 0 and not np.isnan(norm_c):\n", + " self.c /= norm_c\n", + " else:\n", + " self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N)\n", + " \n", + " lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi)\n", + " if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp):\n", + " lyapunov_exp = 0.0\n", + " \n", + " # 3. Lógica de absorción elástica por Norma L2\n", + " if lyapunov_exp > self.lyapunov_threshold:\n", + " self.norm_state += ((lyapunov_exp - self.lyapunov_threshold) * 0.1) # Amortiguación suave\n", + " status = \"⚠️ CHAOS DETECTED\"\n", + " else:\n", + " # Enfriamiento dinámico acelerado hacia el Ground State (1.0)\n", + " self.norm_state = max(1.0, self.norm_state - 0.4 * (self.norm_state - 1.0))\n", + " status = \"✅ STABLE\"\n", + " \n", + " # 4. Evaluación del Error en escala controlada [0, 1]\n", + " current_prediction = np.abs(self.c[0]) * target_value_normalized\n", + " loss = 0.5 * (current_prediction - target_value_normalized)**2\n", + " \n", + " # 5. Ejecución del ciclo de Meta-Learning\n", + " l_meta = self.execute_meta_learning(loss)\n", + " \n", + " # 6. Actualización dinámica del bloque de memoria M(t)\n", + " success_condition = 1.0 if loss < 0.01 else 0.0\n", + " if success_condition == 1.0:\n", + " self.alpha = max(0.1, self.alpha - 0.05)\n", + " self.MR += 0.01 * np.abs(self.c)\n", + " else:\n", + " self.alpha = min(0.9, self.alpha + 0.05)\n", + " self.MP += 0.01 * self.theta\n", + " \n", + " # 7. Actualización del aprendizaje estándar con protección anti-explosión\n", + " grad_loss = np.clip(self.theta_0 * loss, -0.1, 0.1)\n", + " self.theta_0 -= 0.01 * grad_loss\n", + " \n", + " return {\n", + " \"Lyapunov\": lyapunov_exp,\n", + " \"Norm\": self.norm_state,\n", + " \"Status\": status,\n", + " \"Loss\": loss,\n", + " \"L_Meta\": l_meta,\n", + " \"Prediction_Norm\": current_prediction\n", + " }\n", + "\n", + "print(\"[+] Motor de simulación cuántica optimizado numéricamente.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Ingesta de Datos y Normalización de Escala\n", + "\n", + "Descargamos el historial de precios reales diario de Bitcoin e implementamos el tratamiento anti Multi-Index de pandas junto con la compresión logarítmica/unitaria respecto al máximo histórico para asegurar estabilidad numérica absoluta." + ] + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# ==============================================================================\n", + "# CELDA 3: PIPELINE DE INGESTA DE DATOS Y NORMALIZACIÓN DE MATRIZ\n", + "# ==============================================================================\n", + "print(\"[*] Conectando a los servidores de Yahoo Finance para obtener BTC-USD...\")\n", + "ticker = \"BTC-USD\"\n", + "\n", + "raw_data = yf.download(ticker, period=\"6mo\", interval=\"1d\", auto_adjust=True)\n", + "\n", + "if raw_data.empty:\n", + " raise ValueError(\"[-] Error crítico: No se recibieron datos históricos.\")\n", + "\n", + "if isinstance(raw_data.columns, pd.MultiIndex):\n", + " raw_data.columns = raw_data.columns.get_level_values(0)\n", + "\n", + "close_prices = raw_data['Close'].values.astype(float).flatten()\n", + "dates = raw_data.index\n", + "\n", + "df = pd.DataFrame(index=dates)\n", + "df['Price'] = close_prices\n", + "df['Returns'] = df['Price'].pct_change().fillna(0)\n", + "df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std())\n", + "\n", + "# Estabilización numérica crítica\n", + "max_historical_price = np.max(close_prices)\n", + "df['Price_Normalized'] = df['Price'] / max_historical_price\n", + "\n", + "print(f\"[+] Ingesta exitosa. Punto máximo de escala de referencia: ${max_historical_price:.2f} USD\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Ejecución del Bucle Temporal de Simulación Continua" + ] + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# ==============================================================================\n", + "# CELDA 4: BUCLE CONTINUO EN TIEMPO REAL\n", + "# ==============================================================================\n", + "engine = QuantumRelativisticEngine(num_states=4, lyapunov_threshold=4.20)\n", + "history = []\n", + "\n", + "print(\"=\" * 100)\n", + "for idx, (timestamp, row) in enumerate(df.iterrows()):\n", + " metrics = engine.step_evolution(\n", + " price_change=row['Returns'],\n", + " volatility=row['Volatility'],\n", + " target_value_normalized=row['Price_Normalized']\n", + " )\n", + " \n", + " real_prediction = metrics[\"Prediction_Norm\"] * max_historical_price\n", + " \n", + " history.append({\n", + " \"Price\": row['Price'],\n", + " \"Lyapunov\": metrics[\"Lyapunov\"],\n", + " \"Norm\": metrics[\"Norm\"],\n", + " \"Loss\": metrics[\"Loss\"],\n", + " \"L_Meta\": metrics[\"L_Meta\"],\n", + " \"Prediction\": real_prediction,\n", + " \"Status\": metrics[\"Status\"]\n", + " })\n", + " \n", + " if idx % 15 == 0:\n", + " date_str = timestamp.strftime('%Y-%m-%d')\n", + " print(f\"{date_str} | Price: $ {row['Price']:9.2f} | Lyapunov: {metrics['Lyapunov']:.6f} | Norm: {metrics['Norm']:.4f} | {metrics['Status']}\")\n", + "\n", + "print(\"=\" * 100)\n", + "df_res = pd.DataFrame(history, index=df.index)\n", + "print(\"[+] Simulación temporal sin desbordamiento finalizada con éxito.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Proyección Predictiva en T+1 y Límites Dinámicos de Frontera" + ] + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# ==============================================================================\n", + "# CELDA 5: CAPA PREDICTIVA EN T+1 Y LÍMITES DE FRONTERA DINÁMICOS\n", + "# ==============================================================================\n", + "last_close = df_res['Price'].iloc[-1]\n", + "last_volatility = df['Volatility'].iloc[-1]\n", + "last_norm = df_res['Norm'].iloc[-1]\n", + "\n", + "spatial_compression = 1.0 / last_norm\n", + "max_tolerable_return = (engine.lyapunov_threshold / (last_volatility * 10)) * spatial_compression\n", + "\n", + "upper_chaos_limit = last_close * (1.0 + max_tolerable_return)\n", + "lower_chaos_limit = last_close * (1.0 - max_tolerable_return)\n", + "\n", + "print(\"\\n[*] Inicializando análisis predictivo del próximo ciclo de mercado...\")\n", + "print(\"=\" * 100)\n", + "print(f\"MÉTRICAS BASE EN T (ÚLTIMO CIERRE REGISTRADO):\")\n", + "print(f\" -> Último Precio de Cierre ($S_t$) : ${last_close:.2f} USD\")\n", + "print(f\" -> Volatilidad del Sistema (\\\\sigma_t) : {last_volatility:.6f}\")\n", + "print(f\" -> Magnitud de la Norma L2 (||\\\\psi||) : {last_norm:.4f}\")\n", + "print(\"-\" * 100)\n", + "print(\"PROYECCIÓN PREDICTIVA PARA T+1 (PRÓXIMAS 24 HORAS):\")\n", + "print(f\" -> Retorno Crítico Máximo Tolerable: ±{max_tolerable_return*100:.2f}%\")\n", + "print(f\" -> LÍMITE SUPERIOR DE CAOS : ${upper_chaos_limit:.2f} USD\")\n", + "print(f\" -> LÍMITE INFERIOR DE CAOS : ${lower_chaos_limit:.2f} USD\")\n", + "print(f\" -> CRÍTICO AJUSTADO POR NORMA : ${lower_chaos_limit * spatial_compression:.2f} USD\")\n", + "print(\"=\" * 100)\n", + "\n", + "if last_norm == 1.0:\n", + " print(\"✅ SISTEMA EN EQUILIBRIO: Las fronteras predictivas operan dentro de los márgenes estándar.\")\n", + "else:\n", + " print(\"⚠️ VARIEDAD DEFORMADA: Espacio elástico adaptado por la persistencia de energía caótica.\")\n", + "print(\"=\" * 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Renderizado de Paneles Visuales Analíticos del Espacio de Fases" + ] + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# ==============================================================================\n", + "# CELDA 6: RENDERIZADO ANALÍTICO DEL ESPACIO DE FASES\n", + "# ==============================================================================\n", + "fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True)\n", + "\n", + "# 1. Gráfico del espacio de variables físico\n", + "axs[0].plot(df_res.index, df_res['Price'], label=\"Precio BTC-USD (Cierre Real)\", color='cyan', lw=2)\n", + "axs[0].set_title(\"Evolución del Espacio de Variables Real\", fontsize=12, color='white')\n", + "axs[0].set_ylabel(\"Precio (USD)\", color='white')\n", + "axs[0].grid(True, alpha=0.15)\n", + "axs[0].legend(loc=\"upper left\")\n", + "\n", + "# 2. Exponente de Lyapunov local frente al umbral crítico\n", + "axs[1].plot(df_res.index, df_res['Lyapunov'], label=\"Exponente Lyapunov Local (λ)\", color='magenta', alpha=0.7)\n", + "axs[1].axhline(y=engine.lyapunov_threshold, color='red', linestyle='--', label=\"Umbral de Caos Configurado\")\n", + "axs[1].set_title(\"Métrica de Divergencia Exponencial (Control de Caos)\", fontsize=12, color='white')\n", + "axs[1].set_ylabel(\"Magnitud λ\", color='white')\n", + "axs[1].grid(True, alpha=0.15)\n", + "axs[1].legend(loc=\"upper left\")\n", + "\n", + "# 3. Gráfico de deformación elástica de la Norma L2 en Hilbert\n", + "axs[2].plot(df_res.index, df_res['Norm'], label=\"Deformación Dinámica de la Norma L2\", color='yellow', lw=2)\n", + "axs[2].set_title(\"Estado Topológico del Espacio de Hilbert (Resiliencia Manifold)\", fontsize=12, color='white')\n", + "axs[2].set_ylabel(\"Valor de la Norma\", color='white')\n", + "axs[2].set_xlabel(\"Línea Temporal de la Simulación\", color='white')\n", + "axs[2].grid(True, alpha=0.15)\n", + "axs[2].legend(loc=\"upper left\")\n", + "\n", + "# Aplicación de estilo científico Dark-Mode\n", + "for ax in axs:\n", + " ax.set_facecolor('#111111')\n", + " ax.tick_params(colors='white')\n", + "fig.patch.set_facecolor('#1a1a1a')\n", + "\n", + "plt.tight_layout()\n", + "output_filename = \"panel_estabilidad_fase.png\"\n", + "plt.savefig(output_filename, facecolor=fig.get_facecolor(), edgecolor='none', dpi=150)\n", + "print(f\"[+] Panel geométrico exportado con éxito en alta resolución: '{output_filename}'\\n\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} + +# Exportar estructura completa a archivo físico .ipynb legible por Jupyter +file_path = "Quantum_Relativistic_MetaLearning_Notebook.ipynb" +with open(file_path, "w", encoding="utf-8") as f: + json.dump(notebook_data, f, indent=2, ensure_ascii=False) + +print(f"Archivo generado exitosamente en: {file_path}") From 0ba0f1474e2536c90ee9a73d5ca1760afc720b73 Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 20:43:00 -0400 Subject: [PATCH 4/9] Create run_engine.sh --- run_engine.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 run_engine.sh diff --git a/run_engine.sh b/run_engine.sh new file mode 100644 index 000000000..af5984c3e --- /dev/null +++ b/run_engine.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# ============================================================================== +# SCRIPT DE AUTOMATIZACIÓN: MOTOR CUÁNTICO-RELATIVISTA +# ============================================================================== + +echo "[*] Iniciando despliegue del entorno..." + +# 1. Configuración del entorno virtual +if [ ! -d "venv" ]; then + python3 -m venv venv + echo "[+] Entorno virtual creado." +fi +source venv/bin/activate + +# 2. Verificación de dependencias +pip install --upgrade pip +pip install numpy pandas yfinance matplotlib seaborn + +# 3. Ejecución del motor (puedes extraer el código a main.py si prefieres) +echo "[*] Ejecutando simulación de estabilidad sobre datos BTC-USD..." +python3 -c " +# Aquí iría la lógica del engine extraída del notebook para ejecución headless +# (Opcionalmente, puedes ejecutar el notebook vía nbconvert) +from QuantumRelativisticEngine import QuantumRelativisticEngine +# ... lógica de simulación ... +print('[+] Simulación finalizada.') +" + +echo "[+] Reporte de estabilidad generado en 'panel_estabilidad_fase.png'" From 1a120245bc0096ec810021602c1f5f6a12efeea4 Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 20:43:56 -0400 Subject: [PATCH 5/9] Create app.py --- app.py | 230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 app.py diff --git a/app.py b/app.py new file mode 100644 index 000000000..65e938c8a --- /dev/null +++ b/app.py @@ -0,0 +1,230 @@ +import streamlit as st +import numpy as np +import pandas as pd +import yfinance as yf +import matplotlib.pyplot as plt + +# ============================================================================== +# CONFIGURACIÓN DE LA PÁGINA Y ESTILOS +# ============================================================================== +st.set_page_config(page_title="Quantum Relativistic Engine", layout="wide", page_icon="🌌") +st.title("🌌 Panel de Control: Motor Cuántico-Relativista") +st.markdown("Plataforma de pruebas *offline* para el análisis de estabilidad y control de caos en series financieras.") + +# ============================================================================== +# CLASE DEL MOTOR (Integrada para portabilidad del orquestador) +# ============================================================================== +class QuantumRelativisticEinsteinEngine: + def __init__(self, num_states=4, beta=0.01, kappa=0.1, base_threshold=2.0, lambda_meta=0.05, Lambda_cosmo=0.02): + self.N = num_states + self.beta = beta + self.kappa = kappa + self.Lambda = Lambda_cosmo + self.base_threshold = base_threshold + self.lambda_meta = lambda_meta + + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + self.theta = np.random.randn(self.N) * 0.01 + self.theta_0 = self.theta.copy() + + self.MP = np.random.rand(self.N) * 0.01 + self.MR = np.zeros(self.N) + self.norm_state = 1.0 + self.lyapunov_window = [] + + def compute_einstein_tensor_control(self, price_change, volatility): + kuhn_tucker_grad = price_change * volatility + numerator = 1.0 + np.abs(kuhn_tucker_grad)**2 + denominator = 1.0 + self.beta * (self.norm_state**2) + g_factor = numerator / denominator + g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0]) + + partial_mu_psi = np.array([price_change, volatility, np.abs(self.c[0]), np.mean(self.theta)]) + lagrangian = 0.5 * np.sum(partial_mu_psi[1:]**2) - 0.5 * (price_change**2) + + T_mu_nu = np.zeros(4) + for mu in range(4): + T_mu_nu[mu] = (partial_mu_psi[mu] * partial_mu_psi[mu]) - (g_mu_nu[mu] * lagrangian) + + trace_T = np.sum(T_mu_nu * (1.0 / g_mu_nu)) + R_scalar = -self.kappa * trace_T + 4.0 * self.Lambda + R_mu_nu = self.kappa * (T_mu_nu - 0.5 * trace_T * g_mu_nu) + self.Lambda * g_mu_nu + R_reg = R_mu_nu - 0.5 * R_scalar * g_mu_nu + self.Lambda * g_mu_nu + + return g_mu_nu, g_factor, np.mean(R_reg) + + def compute_lyapunov_exponent(self, current_psi, previous_psi): + delta_psi = np.linalg.norm(current_psi - previous_psi) + if delta_psi <= 1e-12: return 0.0 + return np.abs(np.log(delta_psi + 1e-8)) + + def execute_meta_learning(self, current_loss, lr_meta=0.001): + grad_theta = 2 * (self.theta - self.theta_0) * current_loss + grad_theta = np.clip(grad_theta, -1.0, 1.0) + l_meta = np.sum(grad_theta**2) + self.lambda_meta * np.sum((self.theta - self.theta_0)**2) + self.theta -= lr_meta * grad_theta + return l_meta + + def step_evolution(self, price_change, volatility, target_value_normalized): + prev_psi = self.c.copy() + g_mu_nu, g_factor, r_reg_scalar = self.compute_einstein_tensor_control(price_change, volatility) + + phase_arg = np.clip(self.theta * g_factor + (r_reg_scalar * self.kappa), -np.pi, np.pi) + self.c = self.c * np.exp(1j * phase_arg) + + norm_c = np.linalg.norm(self.c) + if norm_c > 0 and not np.isnan(norm_c): self.c /= norm_c + else: self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + + lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi) + if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp): lyapunov_exp = 0.0 + + self.lyapunov_window.append(lyapunov_exp) + if len(self.lyapunov_window) > 14: self.lyapunov_window.pop(0) + + dynamic_threshold = np.mean(self.lyapunov_window) + (1.5 * np.std(self.lyapunov_window) if len(self.lyapunov_window) > 2 else 0) + if dynamic_threshold <= 0: dynamic_threshold = self.base_threshold + + # Guardrail de seguridad: Reinicio de Hilbert + if self.norm_state > 5.0: + self.norm_state = 1.0 + + if lyapunov_exp > dynamic_threshold: + self.norm_state += ((lyapunov_exp - dynamic_threshold) * 0.05) + status = "⚠️ CAOS" + else: + self.norm_state = max(1.0, self.norm_state - 0.3 * (self.norm_state - 1.0)) + status = "✅ ESTABLE" + + current_prediction = np.abs(self.c[0]) * target_value_normalized + loss = 0.5 * (current_prediction - target_value_normalized)**2 + + l_meta = self.execute_meta_learning(loss) + + if loss < 0.01: self.MR += 0.01 * np.abs(self.c) + else: self.MP += 0.01 * self.theta + + grad_loss = np.clip(self.theta_0 * loss, -0.1, 0.1) + self.theta_0 -= 0.01 * grad_loss + + return { + "Lyapunov": lyapunov_exp, "Threshold": dynamic_threshold, + "Norm": self.norm_state, "Status": status, "Loss": loss, + "L_Meta": l_meta, "Prediction_Norm": current_prediction, + "R_reg_scalar": r_reg_scalar + } + +# ============================================================================== +# INTERFAZ DE USUARIO (UI) +# ============================================================================== +with st.sidebar: + st.header("⚙️ Hiperparámetros") + ticker_input = st.text_input("Activo (Ticker)", value="BTC-USD") + period_input = st.selectbox("Periodo Histórico", ["3mo", "6mo", "1y", "2y"], index=1) + + st.markdown("---") + beta_param = st.slider("Beta (Autointeracción)", 0.001, 0.1, 0.01, 0.001) + kappa_param = st.slider("Kappa (Acoplamiento de Campo)", 0.01, 0.5, 0.1, 0.01) + lambda_param = st.slider("Λ (Constante Cosmológica)", 0.01, 0.1, 0.02, 0.01) + + run_button = st.button("🚀 Ejecutar Simulación", type="primary", use_container_width=True) + +if run_button: + with st.spinner(f"Descargando datos de {ticker_input} e inicializando tensores..."): + # 1. Ingesta de Datos + raw_data = yf.download(ticker_input, period=period_input, interval="1d", auto_adjust=True) + if isinstance(raw_data.columns, pd.MultiIndex): + raw_data.columns = raw_data.columns.get_level_values(0) + + close_prices = raw_data['Close'].values.astype(float).flatten() + dates = raw_data.index + df = pd.DataFrame(index=dates) + df['Price'] = close_prices + df['Returns'] = df['Price'].pct_change().fillna(0) + df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std()) + max_historical_price = np.max(close_prices) + df['Price_Normalized'] = df['Price'] / max_historical_price + + # 2. Orquestación del Bucle Matemático + engine = QuantumRelativisticEinsteinEngine( + beta=beta_param, kappa=kappa_param, Lambda_cosmo=lambda_param, base_threshold=2.0 + ) + + history = [] + progress_bar = st.progress(0) + + for idx, (timestamp, row) in enumerate(df.iterrows()): + metrics = engine.step_evolution(row['Returns'], row['Volatility'], row['Price_Normalized']) + history.append({ + "Date": timestamp, "Price": row['Price'], + "Lyapunov": metrics["Lyapunov"], "Threshold": metrics["Threshold"], + "Norm": metrics["Norm"], "R_reg": metrics["R_reg_scalar"], + "Status": metrics["Status"] + }) + progress_bar.progress((idx + 1) / len(df)) + + df_res = pd.DataFrame(history).set_index("Date") + + # 3. Cálculo Predictivo T+1 + last_close = df_res['Price'].iloc[-1] + last_volatility = df['Volatility'].iloc[-1] + last_norm = df_res['Norm'].iloc[-1] + last_threshold = df_res['Threshold'].iloc[-1] + spatial_compression = 1.0 / last_norm + raw_return_factor = (last_threshold * last_volatility) * spatial_compression + max_tolerable_return = np.tanh(raw_return_factor * 10) * 0.20 + + upper_chaos_limit = last_close * (1.0 + max_tolerable_return) + lower_chaos_limit = last_close * (1.0 - max_tolerable_return) + critical_adjusted = last_close * spatial_compression + + # ============================================================================== + # RENDERIZADO DEL DASHBOARD + # ============================================================================== + st.success("Simulación finalizada sin desbordamientos numéricos.") + + col1, col2, col3, col4 = st.columns(4) + col1.metric("Último Precio (T)", f"${last_close:,.2f}") + col2.metric("Límite Superior Caos (T+1)", f"${upper_chaos_limit:,.2f}") + col3.metric("Límite Inferior Caos (T+1)", f"${lower_chaos_limit:,.2f}") + col4.metric("Estado Geométrico (Norma)", f"{last_norm:.4f}", + delta="Equilibrio" if last_norm <= 1.05 else "Deformado", delta_color="inverse") + + # Gráficos con Matplotlib + st.subheader("Análisis de Espacio de Fases") + + fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True) + # Precio + axs[0].plot(df_res.index, df_res['Price'], label=f"Precio {ticker_input}", color='#00d4ff', lw=2) + axs[0].axhline(y=upper_chaos_limit, color='#ff4b4b', linestyle=':', alpha=0.6, label="Frontera Superior (T+1)") + axs[0].axhline(y=lower_chaos_limit, color='#ffa500', linestyle=':', alpha=0.6, label="Frontera Inferior (T+1)") + axs[0].set_title("Evolución del Espacio de Variables Real", color='white') + axs[0].legend(loc="upper left") + + # R_reg + axs[1].plot(df_res.index, df_res['R_reg'], label="Tensor Regularizador de Curvatura (R_reg)", color='#ffcc00', lw=1.5) + axs[1].axhline(y=0, color='white', linestyle='--', alpha=0.3) + axs[1].set_title("Inyección de Amortiguación Relativista", color='white') + axs[1].legend(loc="upper left") + + # Norma + axs[2].plot(df_res.index, df_res['Norm'], label="Resiliencia Topológica (Norma L2)", color='#00ff00', lw=2) + axs[2].set_title("Estado del Espacio de Hilbert", color='white') + axs[2].legend(loc="upper left") + + for ax in axs: + ax.set_facecolor('#0e1117') + ax.tick_params(colors='white') + ax.grid(True, alpha=0.1) + fig.patch.set_facecolor('#0e1117') + plt.tight_layout() + + st.pyplot(fig) + + with st.expander("Ver Datos Tabulares de Diagnóstico"): + st.dataframe(df_res.tail(20).style.applymap( + lambda x: 'color: red' if 'CAOS' in str(x) else ('color: green' if 'ESTABLE' in str(x) else ''), + subset=['Status'] + )) +else: + st.info("👈 Configura los parámetros en el panel lateral y haz clic en 'Ejecutar Simulación' para comenzar.") From 8dc4c6dda55cc2bc3523d3f82b3776cc3985e10f Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 20:50:35 -0400 Subject: [PATCH 6/9] Update requirements.txt --- requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/requirements.txt b/requirements.txt index 14365463b..e4f420094 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,7 @@ pillow>=12.1.1 fonttools>=4.60.0 filelock>=3.20.3 Pygments==2.20.0 +seaborn>=0.12.0 +yfinance>=0.2.31 +streamlit>=1.28.0 +numpy>=1.24.0 From 432a604089d98ae3d05b6b613b4666a9d8e56d70 Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 20:56:19 -0400 Subject: [PATCH 7/9] Add files via upload --- Script_Matematico_Completo (3).PDF | Bin 0 -> 55523 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Script_Matematico_Completo (3).PDF diff --git a/Script_Matematico_Completo (3).PDF b/Script_Matematico_Completo (3).PDF new file mode 100644 index 0000000000000000000000000000000000000000..6639b06909779fb95ed32a1a78ea57bc70e68b4f GIT binary patch literal 55523 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 SP!w30jF^*CMn#s4`2PV)+TK$D literal 0 HcmV?d00001 From 7bbc140ed2a8fff1a1c335174a48816002f63e1f Mon Sep 17 00:00:00 2001 From: Marcos Mora Date: Tue, 26 May 2026 21:02:28 -0400 Subject: [PATCH 8/9] Create python-app.yml --- .github/workflows/python-app.yml | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/python-app.yml diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 000000000..1168bd9ad --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,39 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python + +name: Python application + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest From 0a769395912e3f01c4154f34be395ad2a3ec7287 Mon Sep 17 00:00:00 2001 From: sjhallo07 Date: Wed, 27 May 2026 02:57:51 -0400 Subject: [PATCH 9/9] updates --- .vscode/extensions.json | 6 + .vscode/settings.json | 3 + Dockerfile | 19 ++ ...m_Relativistic_MetaLearning_Notebook.ipynb | 0 agent.py | 102 ++++++ api.py | 164 ++++++++++ app.py | 296 +++++------------- requirements.txt | 30 +- 8 files changed, 399 insertions(+), 221 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json delete mode 100644 Quantum_Relativistic_MetaLearning_Notebook.ipynb create mode 100644 agent.py create mode 100644 api.py diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..694d3a4ce --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "ms-python.python", + "tomoki1207.pdf" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..4d7cae47a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "pdf-preview.default.sidebar": true +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index e69de29bb..8c2280ac9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -0,0 +1,19 @@ +# app/Dockerfile + +FROM python:3.10-slim + +WORKDIR /app + +RUN apt-get update && apt-get install -y \ + build-essential \ + curl \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN pip3 install --no-cache-dir -r requirements.txt + +COPY api.py . + +EXPOSE 8080 + +CMD ["python", "api.py"] diff --git a/Quantum_Relativistic_MetaLearning_Notebook.ipynb b/Quantum_Relativistic_MetaLearning_Notebook.ipynb deleted file mode 100644 index e69de29bb..000000000 diff --git a/agent.py b/agent.py new file mode 100644 index 000000000..38b11c845 --- /dev/null +++ b/agent.py @@ -0,0 +1,102 @@ +import os +import json +import requests +from typing import TypedDict, Annotated, List, Union +from langgraph.graph import StateGraph, END +from langgraph.prebuilt import ToolNode +from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, ToolMessage +from langchain_core.tools import tool +from langchain_google_genai import ChatGoogleGenerativeAI +from langchain_community.vectorstores import Chroma +from langchain_openai import OpenAIEmbeddings # Or Google embeddings +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder + +# Configuration +API_URL = os.getenv("ENGINE_API_URL", "http://localhost:8080/simulate") + +class AgentState(TypedDict): + messages: Annotated[List[BaseMessage], "The messages in the conversation"] + metrics: Dict[str, Any] + +@tool +def simulate_market(beta: float = 0.01, kappa: float = 0.1, lambda_cosmo: float = 0.1): + """ + Triggers the Quantum-Relativistic simulation for BTC-USD using the specified + physical constants. Returns T+1 boundaries and current system stability metrics. + """ + payload = { + "beta": beta, + "kappa": kappa, + "lambda_cosmo": lambda_cosmo, + "num_states": 4, + "lyapunov_threshold": 4.20, + "lambda_meta": 0.05 + } + response = requests.post(API_URL, json=payload) + if response.status_code == 200: + return response.json() + else: + return {"error": f"API call failed with status {response.status_code}"} + +# Initialize LLM +llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash") # Or vertex ai + +# Setup Vector Store (ChromaDB) +# Note: In production, this would be persistent +vector_store = Chroma( + collection_name="topological_states", + embedding_function=OpenAIEmbeddings() # Placeholder +) + +def call_model(state: AgentState): + prompt = ChatPromptTemplate.from_messages([ + ("system", "You are a Quantitative Physicist specializing in Quantum-Relativistic Market Dynamics. " + "Your task is to analyze the market using topological metrics (Norm deformation, Chaos limits, Lyapunov exponents). " + "Translate these physical properties into actionable financial strategies. " + "Always refer to the 'metric deformation' and 'Hilbert space stability' in your analysis."), + MessagesPlaceholder(variable_name="messages"), + ]) + chain = prompt | llm.bind_tools([simulate_market]) + response = chain.invoke(state) + return {"messages": [response]} + +def tool_node(state: AgentState): + tool_messages = [] + last_message = state["messages"][-1] + for tool_call in last_message.tool_calls: + tool_result = simulate_market.invoke(tool_call["args"]) + tool_messages.append(ToolMessage( + content=json.dumps(tool_result), + tool_call_id=tool_call["id"] + )) + + # RAG: Store the state in ChromaDB + vector_store.add_texts( + texts=[f"State: {json.dumps(tool_result['current_state'])} | Prediction: {json.dumps(tool_result['t_plus_1'])}"], + metadatas=[{"timestamp": "now"}] # Simplify for example + ) + + return {"messages": tool_messages} + +def should_continue(state: AgentState): + last_message = state["messages"][-1] + if last_message.tool_calls: + return "tools" + return END + +# Build Graph +workflow = StateGraph(AgentState) +workflow.add_node("agent", call_model) +workflow.add_node("tools", tool_node) + +workflow.set_entry_point("agent") +workflow.add_conditional_edges("agent", should_continue) +workflow.add_edge("tools", "agent") + +app = workflow.compile() + +if __name__ == "__main__": + # Test run + inputs = {"messages": [HumanMessage(content="Analyze the market with beta=0.02")]} + for output in app.stream(inputs): + print(output) diff --git a/api.py b/api.py new file mode 100644 index 000000000..14b2ce663 --- /dev/null +++ b/api.py @@ -0,0 +1,164 @@ +import os +import numpy as np +import pandas as pd +import yfinance as yf +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from typing import List, Dict, Any + +app = FastAPI(title="Quantum-Relativistic Financial Engine API") + +class EngineConfig(BaseModel): + num_states: int = 4 + beta: float = 0.01 + kappa: float = 0.1 + lyapunov_threshold: float = 4.20 + lambda_meta: float = 0.05 + lambda_cosmo: float = 0.1 + +class QuantumRelativisticEngine: + def __init__(self, config: EngineConfig): + self.N = config.num_states + self.beta = config.beta + self.kappa = config.kappa + self.lyapunov_threshold = config.lyapunov_threshold + self.lambda_meta = config.lambda_meta + self.lambda_cosmo = config.lambda_cosmo + + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + self.theta = np.random.randn(self.N) * 0.01 + self.theta_0 = self.theta.copy() + + self.norm_state = 1.0 + self.hilbert_reset_threshold = 5.0 + + def compute_relativistic_metric(self, price_change, volatility): + kuhn_tucker_grad = price_change * volatility + numerator = 1.0 + np.abs(kuhn_tucker_grad)**2 + denominator = 1.0 + self.beta * (self.norm_state**2) + g_factor = numerator / denominator + g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0]) + return g_mu_nu, g_factor + + def compute_lyapunov_exponent(self, current_psi, previous_psi, dt=1): + delta_psi = np.linalg.norm(current_psi - previous_psi) + if delta_psi <= 1e-12: + return 0.0 + jacobian_factor = np.abs(np.log(delta_psi / 1e-5) / dt) + return jacobian_factor + + def compute_r_reg_tensor(self, g_mu_nu, lyapunov_exp, volatility, price_change): + R_scalar = lyapunov_exp / self.lyapunov_threshold if self.lyapunov_threshold > 0 else 0.0 + T_mu_nu = np.diag([price_change, volatility, volatility, volatility]) + Lambda = self.lambda_cosmo + kappa = self.kappa + + R_mu_nu_approx = np.diag([lyapunov_exp, lyapunov_exp, lyapunov_exp, lyapunov_exp]) + r_reg_tensor = R_mu_nu_approx - 0.5 * R_scalar * g_mu_nu + Lambda * g_mu_nu - kappa * T_mu_nu + return r_reg_tensor + + def execute_meta_learning(self, current_loss, lr_meta=0.001): + grad_theta = 2 * (self.theta - self.theta_0) * current_loss + grad_theta = np.clip(grad_theta, -1.0, 1.0) + self.theta -= lr_meta * grad_theta + return np.sum(grad_theta**2) + + def step_evolution(self, price_change, volatility, target_value_normalized): + prev_psi = self.c.copy() + g_mu_nu, g_factor = self.compute_relativistic_metric(price_change, volatility) + r_reg_tensor = self.compute_r_reg_tensor(g_mu_nu, self.lyapunov_threshold, volatility, price_change) + regulation_factor = np.mean(np.abs(r_reg_tensor)) + + phase_arg = np.clip(self.theta * g_factor * (1.0 - regulation_factor), -np.pi, np.pi) + self.c = self.c * np.exp(1j * phase_arg) + + norm_c = np.linalg.norm(self.c) + if norm_c > 0 and not np.isnan(norm_c): + self.c /= norm_c + else: + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + + if np.linalg.norm(self.c) > self.hilbert_reset_threshold: + self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) + self.norm_state = 1.0 + + lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi) + if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp): + lyapunov_exp = 0.0 + + if lyapunov_exp > self.lyapunov_threshold: + self.norm_state += ((lyapunov_exp - self.lyapunov_threshold) * 0.1) + else: + self.norm_state = max(1.0, self.norm_state - 0.4 * (self.norm_state - 1.0)) + + current_prediction = np.abs(self.c[0]) * target_value_normalized + loss = 0.5 * (current_prediction - target_value_normalized)**2 + l_meta = self.execute_meta_learning(loss) + + return { + "lyapunov": float(lyapunov_exp), + "norm": float(self.norm_state), + "loss": float(loss), + "prediction_norm": float(current_prediction) + } + +@app.post("/simulate") +async def simulate(config: EngineConfig): + try: + ticker = "BTC-USD" + raw_data = yf.download(ticker, period="6mo", interval="1d", auto_adjust=True) + if raw_data.empty: + raise HTTPException(status_code=404, detail="No data found for BTC-USD") + + if isinstance(raw_data.columns, pd.MultiIndex): + raw_data.columns = raw_data.columns.get_level_values(0) + + close_prices = raw_data['Close'].values.astype(float).flatten() + df = pd.DataFrame(index=raw_data.index) + df['Price'] = close_prices + df['Returns'] = df['Price'].pct_change().fillna(0) + df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std()) + max_historical_price = np.max(close_prices) + df['Price_Normalized'] = df['Price'] / max_historical_price + + engine = QuantumRelativisticEngine(config) + history = [] + + for idx, (timestamp, row) in enumerate(df.iterrows()): + metrics = engine.step_evolution( + price_change=row['Returns'], + volatility=row['Volatility'], + target_value_normalized=row['Price_Normalized'] + ) + history.append(metrics) + + # Calculate T+1 Boundaries + last_close = float(df['Price'].iloc[-1]) + last_volatility = float(df['Volatility'].iloc[-1]) + last_norm = float(history[-1]['norm']) + + spatial_compression = 1.0 / last_norm + max_tolerable_return = (config.lyapunov_threshold / (last_volatility * 10)) * spatial_compression + + upper_chaos_limit = last_close * (1.0 + max_tolerable_return) + lower_chaos_limit = last_close * (1.0 - max_tolerable_return) + + return { + "t_plus_1": { + "upper_limit": upper_chaos_limit, + "lower_limit": lower_chaos_limit, + "max_tolerable_return": max_tolerable_return + }, + "current_state": { + "lyapunov": history[-1]['lyapunov'], + "norm": last_norm, + "last_price": last_close + }, + "history": history[-20:] # Return last 20 steps for context + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host="0.0.0.0", port=8080) diff --git a/app.py b/app.py index 65e938c8a..7ef8888c6 100644 --- a/app.py +++ b/app.py @@ -1,230 +1,106 @@ -import streamlit as st +import gradio as gr +import requests +import matplotlib.pyplot as plt import numpy as np import pandas as pd -import yfinance as yf -import matplotlib.pyplot as plt - -# ============================================================================== -# CONFIGURACIÓN DE LA PÁGINA Y ESTILOS -# ============================================================================== -st.set_page_config(page_title="Quantum Relativistic Engine", layout="wide", page_icon="🌌") -st.title("🌌 Panel de Control: Motor Cuántico-Relativista") -st.markdown("Plataforma de pruebas *offline* para el análisis de estabilidad y control de caos en series financieras.") +from agent import app as agent_app +from langchain_core.messages import HumanMessage +import os -# ============================================================================== -# CLASE DEL MOTOR (Integrada para portabilidad del orquestador) -# ============================================================================== -class QuantumRelativisticEinsteinEngine: - def __init__(self, num_states=4, beta=0.01, kappa=0.1, base_threshold=2.0, lambda_meta=0.05, Lambda_cosmo=0.02): - self.N = num_states - self.beta = beta - self.kappa = kappa - self.Lambda = Lambda_cosmo - self.base_threshold = base_threshold - self.lambda_meta = lambda_meta - - self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) - self.theta = np.random.randn(self.N) * 0.01 - self.theta_0 = self.theta.copy() - - self.MP = np.random.rand(self.N) * 0.01 - self.MR = np.zeros(self.N) - self.norm_state = 1.0 - self.lyapunov_window = [] +API_URL = os.getenv("ENGINE_API_URL", "http://localhost:8080/simulate") - def compute_einstein_tensor_control(self, price_change, volatility): - kuhn_tucker_grad = price_change * volatility - numerator = 1.0 + np.abs(kuhn_tucker_grad)**2 - denominator = 1.0 + self.beta * (self.norm_state**2) - g_factor = numerator / denominator - g_mu_nu = g_factor * np.array([-1.0, 1.0, 1.0, 1.0]) - - partial_mu_psi = np.array([price_change, volatility, np.abs(self.c[0]), np.mean(self.theta)]) - lagrangian = 0.5 * np.sum(partial_mu_psi[1:]**2) - 0.5 * (price_change**2) - - T_mu_nu = np.zeros(4) - for mu in range(4): - T_mu_nu[mu] = (partial_mu_psi[mu] * partial_mu_psi[mu]) - (g_mu_nu[mu] * lagrangian) +def get_plot(beta, lambda_cosmo): + payload = { + "beta": beta, + "kappa": 0.1, + "lambda_cosmo": lambda_cosmo, + "num_states": 4, + "lyapunov_threshold": 4.20, + "lambda_meta": 0.05 + } + try: + response = requests.post(API_URL, json=payload) + if response.status_code == 200: + data = response.json() + history = data["history"] - trace_T = np.sum(T_mu_nu * (1.0 / g_mu_nu)) - R_scalar = -self.kappa * trace_T + 4.0 * self.Lambda - R_mu_nu = self.kappa * (T_mu_nu - 0.5 * trace_T * g_mu_nu) + self.Lambda * g_mu_nu - R_reg = R_mu_nu - 0.5 * R_scalar * g_mu_nu + self.Lambda * g_mu_nu - - return g_mu_nu, g_factor, np.mean(R_reg) - - def compute_lyapunov_exponent(self, current_psi, previous_psi): - delta_psi = np.linalg.norm(current_psi - previous_psi) - if delta_psi <= 1e-12: return 0.0 - return np.abs(np.log(delta_psi + 1e-8)) - - def execute_meta_learning(self, current_loss, lr_meta=0.001): - grad_theta = 2 * (self.theta - self.theta_0) * current_loss - grad_theta = np.clip(grad_theta, -1.0, 1.0) - l_meta = np.sum(grad_theta**2) + self.lambda_meta * np.sum((self.theta - self.theta_0)**2) - self.theta -= lr_meta * grad_theta - return l_meta - - def step_evolution(self, price_change, volatility, target_value_normalized): - prev_psi = self.c.copy() - g_mu_nu, g_factor, r_reg_scalar = self.compute_einstein_tensor_control(price_change, volatility) - - phase_arg = np.clip(self.theta * g_factor + (r_reg_scalar * self.kappa), -np.pi, np.pi) - self.c = self.c * np.exp(1j * phase_arg) - - norm_c = np.linalg.norm(self.c) - if norm_c > 0 and not np.isnan(norm_c): self.c /= norm_c - else: self.c = np.ones(self.N, dtype=complex) / np.sqrt(self.N) - - lyapunov_exp = self.compute_lyapunov_exponent(self.c, prev_psi) - if np.isnan(lyapunov_exp) or np.isinf(lyapunov_exp): lyapunov_exp = 0.0 - - self.lyapunov_window.append(lyapunov_exp) - if len(self.lyapunov_window) > 14: self.lyapunov_window.pop(0) + norms = [h["norm"] for h in history] + lyapunovs = [h["lyapunov"] for h in history] - dynamic_threshold = np.mean(self.lyapunov_window) + (1.5 * np.std(self.lyapunov_window) if len(self.lyapunov_window) > 2 else 0) - if dynamic_threshold <= 0: dynamic_threshold = self.base_threshold - - # Guardrail de seguridad: Reinicio de Hilbert - if self.norm_state > 5.0: - self.norm_state = 1.0 + fig, ax1 = plt.subplots(figsize=(8, 4)) + ax2 = ax1.twinx() - if lyapunov_exp > dynamic_threshold: - self.norm_state += ((lyapunov_exp - dynamic_threshold) * 0.05) - status = "⚠️ CAOS" - else: - self.norm_state = max(1.0, self.norm_state - 0.3 * (self.norm_state - 1.0)) - status = "✅ ESTABLE" + ax1.plot(norms, color='cyan', label='Hilbert Norm') + ax2.plot(lyapunovs, color='magenta', label='Lyapunov') - current_prediction = np.abs(self.c[0]) * target_value_normalized - loss = 0.5 * (current_prediction - target_value_normalized)**2 - - l_meta = self.execute_meta_learning(loss) - - if loss < 0.01: self.MR += 0.01 * np.abs(self.c) - else: self.MP += 0.01 * self.theta + ax1.set_xlabel('Recent Time Steps') + ax1.set_ylabel('Norm', color='cyan') + ax2.set_ylabel('Lyapunov', color='magenta') + plt.title(f"Phase-Space Stability (Beta={beta}, Lambda={lambda_cosmo})") + plt.grid(alpha=0.2) - grad_loss = np.clip(self.theta_0 * loss, -0.1, 0.1) - self.theta_0 -= 0.01 * grad_loss - - return { - "Lyapunov": lyapunov_exp, "Threshold": dynamic_threshold, - "Norm": self.norm_state, "Status": status, "Loss": loss, - "L_Meta": l_meta, "Prediction_Norm": current_prediction, - "R_reg_scalar": r_reg_scalar - } + return fig + else: + fig, ax = plt.subplots() + ax.text(0.5, 0.5, f"API Error: {response.status_code}", ha='center') + return fig + except Exception as e: + fig, ax = plt.subplots() + ax.text(0.5, 0.5, f"Connection Error: {str(e)}", ha='center') + return fig -# ============================================================================== -# INTERFAZ DE USUARIO (UI) -# ============================================================================== -with st.sidebar: - st.header("⚙️ Hiperparámetros") - ticker_input = st.text_input("Activo (Ticker)", value="BTC-USD") - period_input = st.selectbox("Periodo Histórico", ["3mo", "6mo", "1y", "2y"], index=1) +def chat_response(message, history, beta, lambda_cosmo): + full_message = f"{message} (Current Engine Context: beta={beta}, lambda={lambda_cosmo})" - st.markdown("---") - beta_param = st.slider("Beta (Autointeracción)", 0.001, 0.1, 0.01, 0.001) - kappa_param = st.slider("Kappa (Acoplamiento de Campo)", 0.01, 0.5, 0.1, 0.01) - lambda_param = st.slider("Λ (Constante Cosmológica)", 0.01, 0.1, 0.02, 0.01) + inputs = {"messages": [HumanMessage(content=full_message)]} + response = "I'm analyzing the topological deformations..." - run_button = st.button("🚀 Ejecutar Simulación", type="primary", use_container_width=True) + try: + for output in agent_app.stream(inputs): + for key, value in output.items(): + if key == "agent": + last_msg = value["messages"][-1] + if hasattr(last_msg, 'content'): + response = last_msg.content + except Exception as e: + response = f"Error in agent execution: {str(e)}" + + return response -if run_button: - with st.spinner(f"Descargando datos de {ticker_input} e inicializando tensores..."): - # 1. Ingesta de Datos - raw_data = yf.download(ticker_input, period=period_input, interval="1d", auto_adjust=True) - if isinstance(raw_data.columns, pd.MultiIndex): - raw_data.columns = raw_data.columns.get_level_values(0) +with gr.Blocks(theme=gr.themes.Soft()) as demo: + gr.Markdown("# 🌌 Quantum-Relativistic Financial Agent") + gr.Markdown("Integration of Einstein Field Equations and Hilbert Space dynamics for BTC-USD forecasting.") + + with gr.Row(): + with gr.Column(scale=1): + gr.Markdown("### ⚙️ Engine Parameters") + beta_slider = gr.Slider(0.001, 0.1, value=0.01, label="Relativistic Self-Interaction (β)") + lambda_slider = gr.Slider(0.01, 0.5, value=0.1, label="Cosmological Constant (Λ)") + + plot_output = gr.Plot(label="Phase-Space Analysis") + update_btn = gr.Button("Re-Simulate Engine", variant="primary") - close_prices = raw_data['Close'].values.astype(float).flatten() - dates = raw_data.index - df = pd.DataFrame(index=dates) - df['Price'] = close_prices - df['Returns'] = df['Price'].pct_change().fillna(0) - df['Volatility'] = df['Returns'].rolling(window=14).std().fillna(df['Returns'].std()) - max_historical_price = np.max(close_prices) - df['Price_Normalized'] = df['Price'] / max_historical_price + update_btn.click(get_plot, inputs=[beta_slider, lambda_slider], outputs=plot_output) - # 2. Orquestación del Bucle Matemático - engine = QuantumRelativisticEinsteinEngine( - beta=beta_param, kappa=kappa_param, Lambda_cosmo=lambda_param, base_threshold=2.0 - ) - - history = [] - progress_bar = st.progress(0) - - for idx, (timestamp, row) in enumerate(df.iterrows()): - metrics = engine.step_evolution(row['Returns'], row['Volatility'], row['Price_Normalized']) - history.append({ - "Date": timestamp, "Price": row['Price'], - "Lyapunov": metrics["Lyapunov"], "Threshold": metrics["Threshold"], - "Norm": metrics["Norm"], "R_reg": metrics["R_reg_scalar"], - "Status": metrics["Status"] - }) - progress_bar.progress((idx + 1) / len(df)) + with gr.Column(scale=2): + gr.Markdown("### 🤖 Physicist Chatbot") + chatbot = gr.Chatbot(height=500) + msg = gr.Textbox(placeholder="Ask the Physicist about market stability or request a prediction...") - df_res = pd.DataFrame(history).set_index("Date") + def user(user_message, history): + return "", history + [[user_message, None]] - # 3. Cálculo Predictivo T+1 - last_close = df_res['Price'].iloc[-1] - last_volatility = df['Volatility'].iloc[-1] - last_norm = df_res['Norm'].iloc[-1] - last_threshold = df_res['Threshold'].iloc[-1] - spatial_compression = 1.0 / last_norm - raw_return_factor = (last_threshold * last_volatility) * spatial_compression - max_tolerable_return = np.tanh(raw_return_factor * 10) * 0.20 - - upper_chaos_limit = last_close * (1.0 + max_tolerable_return) - lower_chaos_limit = last_close * (1.0 - max_tolerable_return) - critical_adjusted = last_close * spatial_compression + def bot(history, beta, lambda_cosmo): + user_message = history[-1][0] + bot_message = chat_response(user_message, history, beta, lambda_cosmo) + history[-1][1] = bot_message + return history - # ============================================================================== - # RENDERIZADO DEL DASHBOARD - # ============================================================================== - st.success("Simulación finalizada sin desbordamientos numéricos.") - - col1, col2, col3, col4 = st.columns(4) - col1.metric("Último Precio (T)", f"${last_close:,.2f}") - col2.metric("Límite Superior Caos (T+1)", f"${upper_chaos_limit:,.2f}") - col3.metric("Límite Inferior Caos (T+1)", f"${lower_chaos_limit:,.2f}") - col4.metric("Estado Geométrico (Norma)", f"{last_norm:.4f}", - delta="Equilibrio" if last_norm <= 1.05 else "Deformado", delta_color="inverse") + msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then( + bot, [chatbot, beta_slider, lambda_slider], chatbot + ) - # Gráficos con Matplotlib - st.subheader("Análisis de Espacio de Fases") - - fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True) - # Precio - axs[0].plot(df_res.index, df_res['Price'], label=f"Precio {ticker_input}", color='#00d4ff', lw=2) - axs[0].axhline(y=upper_chaos_limit, color='#ff4b4b', linestyle=':', alpha=0.6, label="Frontera Superior (T+1)") - axs[0].axhline(y=lower_chaos_limit, color='#ffa500', linestyle=':', alpha=0.6, label="Frontera Inferior (T+1)") - axs[0].set_title("Evolución del Espacio de Variables Real", color='white') - axs[0].legend(loc="upper left") - - # R_reg - axs[1].plot(df_res.index, df_res['R_reg'], label="Tensor Regularizador de Curvatura (R_reg)", color='#ffcc00', lw=1.5) - axs[1].axhline(y=0, color='white', linestyle='--', alpha=0.3) - axs[1].set_title("Inyección de Amortiguación Relativista", color='white') - axs[1].legend(loc="upper left") - - # Norma - axs[2].plot(df_res.index, df_res['Norm'], label="Resiliencia Topológica (Norma L2)", color='#00ff00', lw=2) - axs[2].set_title("Estado del Espacio de Hilbert", color='white') - axs[2].legend(loc="upper left") - - for ax in axs: - ax.set_facecolor('#0e1117') - ax.tick_params(colors='white') - ax.grid(True, alpha=0.1) - fig.patch.set_facecolor('#0e1117') - plt.tight_layout() - - st.pyplot(fig) + demo.load(get_plot, inputs=[beta_slider, lambda_slider], outputs=plot_output) - with st.expander("Ver Datos Tabulares de Diagnóstico"): - st.dataframe(df_res.tail(20).style.applymap( - lambda x: 'color: red' if 'CAOS' in str(x) else ('color: green' if 'ESTABLE' in str(x) else ''), - subset=['Status'] - )) -else: - st.info("👈 Configura los parámetros en el panel lateral y haz clic en 'Ejecutar Simulación' para comenzar.") +if __name__ == "__main__": + demo.launch(server_name="0.0.0.0", server_port=7860) diff --git a/requirements.txt b/requirements.txt index e4f420094..8b7ad02f1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,22 @@ -ipywidgets==8.1.8 -matplotlib==3.8.4 -pandas==2.2.2 -torch==2.8.0 -torchvision==0.23.0 -tqdm==4.66.4 -pillow>=12.1.1 -fonttools>=4.60.0 -filelock>=3.20.3 -Pygments==2.20.0 +ipywidgets>=8.0.0 +matplotlib>=3.8.0 +pandas>=2.2.0 +tqdm>=4.66.0 +pillow>=10.0.0 +fonttools>=4.40.0 +filelock>=3.12.0 +Pygments>=2.15.0 seaborn>=0.12.0 yfinance>=0.2.31 -streamlit>=1.28.0 numpy>=1.24.0 +fastapi>=0.100.0 +uvicorn>=0.22.0 +langgraph>=0.0.1 +langchain>=0.1.0 +langchain-community>=0.0.10 +langchain-google-genai>=1.0.0 +langchain-openai>=0.0.5 +chromadb>=0.4.0 +gradio>=4.0.0 +requests>=2.31.0 +pydantic>=2.0.0