From 3b3cf5976a119f3eba0d64fa2031a91f79d5f8ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Delacotte?= Date: Tue, 11 Nov 2025 11:43:49 +0100 Subject: [PATCH] =?UTF-8?q?LGBMClassifier=20ajout=20des=20corr=C3=A9lation?= =?UTF-8?q?s=20/=20pr=C3=A9visions=20d=C3=A9riv=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zeus_LGBMRegressor.py | 67 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/Zeus_LGBMRegressor.py b/Zeus_LGBMRegressor.py index 4aa0974..fd8e386 100644 --- a/Zeus_LGBMRegressor.py +++ b/Zeus_LGBMRegressor.py @@ -63,6 +63,7 @@ from sklearn.model_selection import GridSearchCV from sklearn.feature_selection import VarianceThreshold import seaborn as sns from lightgbm import LGBMRegressor +import lightgbm as lgb # Couleurs ANSI de base RED = "\033[31m" @@ -100,7 +101,8 @@ class Zeus_LGBMRegressor(IStrategy): # 'rsi_1h', 'rsi_deriv1_1h', 'rsi_deriv2_1h', "max_rsi_12_1h", # ] - model_indicators = ["ms-10", "ms-5", "ms-2", "ms-1", "ms-0"] + model = None + model_indicators = ["ms-10", "ms-5", "ms-4", "ms-3", "ms-2", "ms-1", "ms-0"] # model_indicators = ['open', 'high', 'close', 'haclose', 'percent', 'sma5', 'sma12', 'sma24', 'sma24_deriv1', 'sma24_deriv2', 'sma48', 'sma48_deriv1', 'sma48_deriv2', 'sma60', 'sma60_dist', 'sma60_deriv1', # 'sma60_deriv2', 'mid_smooth_3_deriv2', 'mid_smooth_12_deriv1', 'mid_smooth_12_deriv2', 'mid_smooth_24', 'mid_smooth_24_deriv1', 'mid_smooth_24_deriv2', 'max_rsi_12', 'max_rsi_24', 'max12', # 'max60', 'min60', 'min_max_60', 'bb_lowerband', 'bb_upperband', 'bb_width', 'macd', 'macdsignal', 'macdhist', 'sma_20', 'sma_100', 'atr', 'atr_norm', 'adx', 'obv', 'vol_24', 'adx_change', @@ -993,12 +995,6 @@ class Zeus_LGBMRegressor(IStrategy): dataframe['mid_smooth_5h'] dataframe["mid_smooth_5h_deriv2"] = 100 * dataframe["mid_smooth_5h_deriv1"].diff().rolling(window=60).mean() - dataframe["ms-10"] = dataframe["mid_smooth_24_deriv1"].shift(10) - dataframe["ms-5"] = dataframe["mid_smooth_24_deriv1"].shift(5) - dataframe["ms-2"] = dataframe["mid_smooth_24_deriv1"].shift(2) - dataframe["ms-1"] = dataframe["mid_smooth_24_deriv1"].shift(1) - dataframe["ms-0"] = dataframe["mid_smooth_24_deriv1"] - # dataframe["ms+10"] = dataframe["mid_smooth_24"].shift(-11) # =============================== # Lissage des valeurs Journalières horizon_d = 12 * 5 * 24 @@ -1114,6 +1110,14 @@ class Zeus_LGBMRegressor(IStrategy): # # self.model_indicators = usable_cols + dataframe["ms-10"] = dataframe["mid_smooth_24_deriv1"].shift(10) + dataframe["ms-5"] = dataframe["mid_smooth_24_deriv1"].shift(5) + dataframe["ms-4"] = dataframe["mid_smooth_24_deriv1"].shift(4) + dataframe["ms-3"] = dataframe["mid_smooth_24_deriv1"].shift(3) + dataframe["ms-2"] = dataframe["mid_smooth_24_deriv1"].shift(2) + dataframe["ms-1"] = dataframe["mid_smooth_24_deriv1"].shift(1) + dataframe["ms-0"] = dataframe["mid_smooth_24_deriv1"] + # dataframe["ms+10"] = dataframe["mid_smooth_24"].shift(-11) df = dataframe[self.model_indicators].copy() # Corrélations des colonnes @@ -1572,7 +1576,7 @@ class Zeus_LGBMRegressor(IStrategy): # print(f"✅ Meilleur F1 : {f1s[best_idx]:.3f} au seuil {seuils[best_idx]:.2f}") # --- Après l'entraînement du modèle --- - preds = self.model.predict(X_test) + preds = model.predict(X_test) # --- Évaluation --- mse = mean_squared_error(y_test, preds) @@ -1607,6 +1611,53 @@ class Zeus_LGBMRegressor(IStrategy): print(f"✅ Graphique sauvegardé : {plot_path}") + # save_dir = "/home/souti/freqtrade/user_data/plots/" + # os.makedirs(save_dir, exist_ok=True) + + ax = lgb.plot_tree(model, tree_index=0, figsize=(30, 20), + show_info=["split_gain", "internal_value", "internal_count"]) + plt.title("Arbre de décision n°0") + plt.savefig(os.path.join(plot_dir, "lgbm_tree_0.png"), bbox_inches="tight") + plt.close() + + ax = lgb.plot_tree(model, figsize=(40, 20)) + plt.title("Vue globale du modèle LGBM") + plt.savefig(os.path.join(plot_dir, "lgbm_all_trees.png"), bbox_inches="tight") + plt.close() + # X_test = np.linspace(0, 10, 1000).reshape(-1, 1) + y_pred = model.predict(X_test) + + plt.figure(figsize=(10, 5)) + plt.plot(X_test, y_pred, color="red", label="modèle LGBM") + plt.title("Fonction apprise par LGBMRegressor") + plt.xlabel("x") + plt.ylabel("y") + plt.legend() + plt.savefig(os.path.join(plot_dir, "lgbm_function_curve.png"), bbox_inches="tight") + plt.close() + + ax = lgb.plot_importance(model, max_num_features=30, figsize=(12, 6)) + plt.title("Importance des features - LGBM") + plt.savefig(os.path.join(plot_dir, "lgbm_feature_importance.png"), bbox_inches="tight") + plt.close() + + + corr = X_train.corr() * 100 # en pourcentage + + plt.figure(figsize=(20, 16)) + sns.heatmap(corr, cmap="coolwarm", center=0, annot=False, fmt=".1f", cbar_kws={'label': 'Corrélation (%)'}) + plt.title("Matrice de corrélation (%)") + plt.savefig(os.path.join(plot_dir, "correlation_matrix.png"), bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 6)) + plt.scatter(y_test, model.predict(X_test), alpha=0.5) + plt.xlabel("Valeurs réelles") + plt.ylabel("Prédictions du modèle") + plt.title("Comparaison y_test vs y_pred") + plt.savefig(os.path.join(plot_dir, "ytest_vs_ypred.png"), bbox_inches="tight") + plt.close() + print("\n===== ✅ FIN DE L’ANALYSE =====") def plot_threshold_analysis(self, y_true, y_proba, step=0.05, save_path=None):