Cómo crear, entrenar y comparar múltiples agentes de aprendizaje por refuerzo en un entorno comercial personalizado utilizando líneas de base estables3

En este tutorial, exploramos aplicaciones avanzadas de Stable-Baselines3 en el aprendizaje por refuerzo. Diseñamos un entorno comercial personalizado y completamente funcional, integramos múltiples algoritmos como PPO y A2C, y desarrollamos nuestras propias llamadas de capacitación para el seguimiento del desempeño. A medida que avanzamos, capacitamos, evaluamos y visualizamos el desempeño de los agentes para comparar la eficiencia algorítmica, las curvas de aprendizaje y las estrategias de decisión, todo dentro de un flujo de trabajo optimizado que se ejecuta completamente fuera de línea. Consulta los CÓDIGOS COMPLETOS aquí.

!pip instalar líneas de base estables3[extra] gimnasio pygame importar numpy como np importar gimnasio como gimnasio desde gimnasio importar espacios importar matplotlib.pyplot como plt desde stable_baselines3 importar PPO, A2C, DQN, SAC desde stable_baselines3.common.env_checker importar check_env desde stable_baselines3.common.callbacks importar BaseCallback desde stable_baselines3.common.vec_env importar DummyVecEnv, VecNormalize de stable_baselines3.common.evaluación importar evaluar_policy de stable_baselines3.common.monitor importar Monitor importar clase de antorcha TradingEnv(gym.Env): def __init__(self, max_steps=200): super().__init__() self.max_steps = max_steps self.action_space = espacios.Discrete(3) self.observation_space = espacios.Box(bajo=-np.inf, alto=np.inf, forma=(5,), dtype=np.float32) self.reset() def reset(self, semilla=Ninguno, opciones=Ninguno): super().reset(seed=seed) self.current_step = 0 self.balance = 1000.0 self.shares = 0 self.price = 100.0 self.price_history = [self.price]
return self._get_obs(), {} def _get_obs(self): precio_tendencia = np.mean(self.price_history[-5:]) si len(self.price_history) >= 5 else self.price return np.array([
self.balance / 1000.0,
self.shares / 10.0,
self.price / 100.0,
price_trend / 100.0,
self.current_step / self.max_steps
]dtype=np.float32) def paso(self, acción): self.current_step += 1 tendencia = 0.001 * np.sin(self.current_step / 20) self.price *= (1 + tendencia + np.random.normal(0, 0.02)) self.price = np.clip(self.price, 50, 200) self.price_history.append(self.price) recompensa = 0 si acción == 1 y self.balance >= self.price: acciones_para_comprar = int(self.balance / self.price) costo = acciones_para_comprar * self.price self.balance -= costo self.shares += acciones_para_comprar recompensa = -0.01 elif acción == 2 y self.shares > 0: ingresos = self.shares * self.price self.balance += ingresos self.shares = 0 recompensa = 0.01 portfolio_value = self.balance + self.shares * self.price recompensa += (portfolio_value – 1000) / 1000 terminado = self.current_step >= self.max_steps truncado = Falso retorno self._get_obs(), recompensa, terminado, truncado, {“portfolio”: portfolio_value} def render(self): print(f”Paso: {self.current_step}, Saldo: ${self.balance:.2f}, Acciones: {self.shares}, Precio: ${self.price:.2f}”)

Definimos nuestro TradingEnv personalizado, donde un agente aprende a tomar decisiones de compra, venta o retención basadas en movimientos de precios simulados. Definimos los espacios de observación y acción, implementamos la estructura de recompensas y nos aseguramos de que nuestro entorno refleje un escenario de mercado realista con tendencias fluctuantes y ruido. Consulta los CÓDIGOS COMPLETOS aquí.

clase ProgressCallback(BaseCallback): def __init__(self, check_freq=1000, detallado=1): super().__init__(detallado) self.check_freq = check_freq self.rewards = []
def _on_step(self): si self.n_calls % self.check_freq == 0: mean_reward = np.mean([ep_info[“r”] for ep_info in self.model.ep_info_buffer]) self.rewards.append(mean_reward) if self.verbose: print(f”Pasos: {self.n_calls}, Recompensa media: {mean_reward:.2f}”) return True print(“=” * 60) print(“Configuración de un entorno comercial personalizado…”) env = TradingEnv() check_env(env, warn=True) print(“¡¡Se aprobó la validación del entorno!”) env = Monitor(env) vec_env = DummyVecEnv([lambda: env]) vec_env = VecNormalize(vec_env, norma_obs=Verdadero, norma_recompensa=Verdadero)

Aquí, creamos un ProgressCallback para monitorear el progreso del entrenamiento y registrar las recompensas medias a intervalos regulares. Luego validamos nuestro entorno personalizado utilizando el verificador integrado de Stable-Baselines3, lo ajustamos para su monitoreo y normalización, y lo preparamos para entrenarlo en múltiples algoritmos. Consulta los CÓDIGOS COMPLETOS aquí.

print(“\n” + “=” * 60) print(“Entrenamiento de múltiples algoritmos RL…”) algoritmos = { “PPO”: PPO(“MlpPolicy”, vec_env, detallado=0, learning_rate=3e-4, n_steps=2048), “A2C”: A2C(“MlpPolicy”, vec_env, detallado=0, learning_rate=7e-4), } resultados = {} para nombre, modelo en algoritmos.items(): print(f”\nTraining {name}…”) callback = ProgressCallback(check_freq=2000, detallado=0) model.learn(total_timesteps=50000, callback=callback, Progress_bar=True) resultados[name] = {“model”: model, “rewards”: callback.rewards} print(f”✓ {name} ¡entrenamiento completo!”) print(“\n” + “=” * 60) print(“Evaluando modelos entrenados…”) eval_env = Monitor(TradingEnv()) para nombre, datos en results.items(): mean_reward, std_reward = evalua_policy(data[“model”]eval_env, n_eval_episodes=20, determinista=True) resultados[name][“eval_mean”] = resultados de media_recompensa[name][“eval_std”] = std_reward print(f”{nombre}: Recompensa media = {mean_reward:.2f} +/- {std_reward:.2f}”)

Entrenamos y evaluamos dos algoritmos diferentes de aprendizaje por refuerzo, PPO y A2C, en nuestro entorno comercial. Registramos sus métricas de desempeño, capturamos recompensas medias y comparamos la eficiencia con la que cada agente aprende estrategias comerciales rentables a través de una exploración y explotación constantes. Consulta los CÓDIGOS COMPLETOS aquí.

print(“\n” + “=” * 60) print(“Generando visualizaciones…”) fig, axes = plt.subplots(2, 2, figsize=(14, 10)) ax = axes[0, 0]
para nombre, datos en resultados.items(): ax.plot(datos[“rewards”]etiqueta=nombre, ancho de línea=2) ax.set_xlabel(“Puntos de control del entrenamiento (x1000 pasos)”) ax.set_ylabel(“Recompensa media del episodio”) ax.set_title(“Comparación del progreso del entrenamiento”) ax.legend() ax.grid(True, alpha=0.3) ax = axes[0, 1]
nombres = lista (resultados.claves()) significa = [results[n][“eval_mean”] para n en nombres]stds = [results[n][“eval_std”] para n en nombres]ax.bar(nombres, medios, yerr=stds, capsize=10, alpha=0.7, color=[‘#1f77b4’, ‘#ff7f0e’]) ax.set_ylabel(“Recompensa media”) ax.set_title(“Evaluación del desempeño (20 episodios)”) ax.grid(True, alpha=0.3, axis=”y”) ax = axes[1, 0]
mejor_modelo = max(resultados.items(), clave=lambda x: x[1][“eval_mean”])[1][“model”]

obs=eval_env.reset()[0]
valores_cartera = [1000]
para _ en rango(200): acción, _ = best_model.predict(obs, deterministic=True) obs, recompensa, hecho, truncado, info = eval_env.step(action) portfolio_values.append(info.get(“portfolio”, portfolio_values[-1])) si está hecho: rompa ax.plot(portfolio_values, linewidth=2, color=”green”) ax.axhline(y=1000, color=”red”, linestyle=”–“, label=”Valor inicial”) ax.set_xlabel(“Pasos”) ax.set_ylabel(“Valor de cartera ($)”) ax.set_title(f”Mejor modelo ({max(resultados.items(), clave=lambda x: x[1][‘eval_mean’])[0]}) Episodio”) ax.legend() ax.grid(Verdadero, alfa=0,3)

Visualizamos los resultados de nuestra capacitación trazando curvas de aprendizaje, puntajes de evaluación y trayectorias de cartera para el modelo de mejor rendimiento. También analizamos cómo las acciones del agente se traducen en el crecimiento de la cartera, lo que nos ayuda a interpretar el comportamiento del modelo y evaluar la coherencia de las decisiones durante las sesiones de negociación simuladas. Consulta los CÓDIGOS COMPLETOS aquí.

hacha = ejes[1, 1]
obs=eval_env.reset()[0]
acciones = []
para _ en rango(200): acción, _ = best_model.predict(obs, deterministic=True) acciones.append(acción) obs, _, hecho, truncado, _ = eval_env.step(acción) si está hecho: romper nombres_acción = [‘Hold’, ‘Buy’, ‘Sell’]
recuentos_acciones = [actions.count(i) for i in range(3)]
ax.pie(action_counts, etiquetas=action_names, autopct=”%1.1f%%”, startangle=90, colores=[‘#ff9999’, ‘#66b3ff’, ‘#99ff99’]) ax.set_title(“Distribución de acciones (mejor modelo)”) plt.tight_layout() plt.savefig(‘sb3_advanced_results.png’, dpi=150, bbox_inches=”tight”) print(” ✓ Visualizaciones guardadas como ‘sb3_advanced_results.png'”) plt.show() print(“\n” + “=” * 60) print(“Guardando y cargando modelos…”) best_name = max(results.items(), key=lambda x: x[1][“eval_mean”])[0]
mejor_modelo = resultados[best_name][“model”]

best_model.save(f”best_trading_model_{best_name}”) vec_env.save(“vec_normalize.pkl”) Loaded_model = PPO.load(f”best_trading_model_{best_name}”) print(f”✓ ¡El mejor modelo ({best_name}) guardado y cargado correctamente!”) print(“\n” + “=” * 60) print(“¡TUTORIAL COMPLETO!”) print(f”Algoritmo con mejor rendimiento: {best_name}”) print(f”Puntuación de evaluación final: {resultados[best_name][‘eval_mean’]:.2f}”) imprimir(“=” * 60)

Finalmente, visualizamos la distribución de acciones del mejor agente para comprender sus tendencias comerciales y guardar el modelo de mejor rendimiento para su reutilización. Demostramos la carga del modelo, confirmamos el mejor algoritmo y completamos el tutorial con un resumen claro de los resultados de rendimiento y los conocimientos adquiridos.

En conclusión, hemos creado, entrenado y comparado múltiples agentes de aprendizaje por refuerzo en una simulación comercial realista utilizando Stable-Baselines3. Observamos cómo cada algoritmo se adapta a la dinámica del mercado, visualizamos sus tendencias de aprendizaje e identificamos la estrategia más rentable. Esta implementación práctica fortalece nuestra comprensión de los canales de RL y demuestra cuán personalizables, eficientes y escalables pueden ser Stable-Baselines3 para tareas complejas y específicas de un dominio, como el modelado financiero.

Consulta los CÓDIGOS COMPLETOS aquí. No dude en consultar nuestra página de GitHub para tutoriales, códigos y cuadernos. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 100.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

Asif Razzaq es el director ejecutivo de Marktechpost Media Inc.. Como emprendedor e ingeniero visionario, Asif está comprometido a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, Marktechpost, que se destaca por su cobertura en profundidad del aprendizaje automático y las noticias sobre aprendizaje profundo que es técnicamente sólida y fácilmente comprensible para una amplia audiencia. La plataforma cuenta con más de 2 millones de visitas mensuales, lo que ilustra su popularidad entre el público.

🙌 Siga MARKTECHPOST: agréguenos como fuente preferida en Google.