FrictradeLearning.py Stoploss auto et gestion steps de mises adjust

This commit is contained in:
Jérôme Delacotte
2025-12-14 20:20:26 +01:00
parent 639afa42f0
commit c82b3359fa
16 changed files with 471 additions and 257 deletions

View File

@@ -445,6 +445,46 @@ class Crash:
return selected_corr
def drawPredictions(self, df, indicators, y_proba, threshold=0.5):
"""
Trace simultanément plusieurs indicateurs et la prédiction du modèle.
Parameters
----------
df : pd.DataFrame
Dataframe avec les colonnes des indicateurs et la target.
indicators : list[str]
Liste des colonnes du dataframe à tracer.
y_proba : np.array
Probabilités prédites par le modèle (valeurs continues entre 0 et 1)
threshold : float
Seuil pour convertir probabilité en signal binaire
output_file : str
Fichier sur lequel sauvegarder le graphique
"""
plt.figure(figsize=(18, 6))
# Tracer les indicateurs
for col in indicators:
plt.plot(df.index, df[col], label=col, alpha=0.7)
# Tracer la prédiction du modèle (probabilité)
plt.plot(df.index, y_proba, label="Prediction prob.", color="black", linestyle="--")
# Optionnel : signal binaire (1 si prob > threshold)
y_signal = (y_proba > threshold).astype(int)
plt.scatter(df.index, y_signal, color='red', marker='o', label='Signal > threshold', s=20)
plt.title("Indicateurs + prédiction MLP")
plt.xlabel("Date")
plt.ylabel("Valeur / Probabilité")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig(f"{self.path}/indicators_vs_prediction.png")
plt.close()
def drawSequentialGraphs(self, model, history, X_train_scaled, X_valid_scaled, y_train,
y_valid, thresholds=None, best_threshold=None
):
@@ -556,6 +596,17 @@ class Crash:
# plt.savefig(f"{self.path}/permutation_importance.png")
# plt.close()
# Exemple : on choisit 3 indicateurs du dataframe
indicators = ['percent12']
# y_proba = model.predict(X_valid_scaled).ravel()
self.drawPredictions(
df=self.dataframe.iloc[-len(y_proba):], # sélectionner la période correspondant à X_valid
indicators=indicators,
y_proba=y_proba,
threshold=0.5
)
# =========================
# 7⃣ Sauvegarde seuil
# =========================
@@ -567,7 +618,7 @@ class Crash:
"best_f1": max(f1s)
}
def optimize_sequential(self, X_train, y_train, X_valid, y_valid, n_trials=20):
def optimize_sequential(self, X_train, X_valid, y_train, y_valid , n_trials=20):
def objective(trial):
tf.keras.backend.clear_session()
@@ -835,7 +886,7 @@ class Crash:
# df['target'] = df['target'].fillna(0).astype(int)
# label : crash si -n% dans les p heures
self.calculateTarget(df)
self.initTarget(df)
self.calculateCorrelation(df)
@@ -872,7 +923,7 @@ class Crash:
assert len(X_train) == len(y_train)
assert len(X_valid) == len(y_valid)
self.train_model, study = self.optimize_sequential(X_train, y_train, X_valid, y_valid, n_trials=50)
self.train_model, study = self.optimize_sequential(X_train, X_valid, y_train, y_valid, n_trials=50)
self.analyseStudy(study)
@@ -939,7 +990,7 @@ class Crash:
# plt.ylabel("Score")
# plt.show()
self.analyze_model(pair, self.train_model, X_train, X_valid, y_train, y_valid)
self.analyze_model(self.train_model, X_train, X_valid, y_train, y_valid)
def analyseImportances(self, selected_features, X_train, X_valid, y_valid):
# Feature importance
@@ -1137,7 +1188,7 @@ class Crash:
# FIN SHAP
def calculateTarget(self, df):
def initTarget(self, df):
future = df['mid'].shift(-12)
df['future_dd'] = (future - df['mid']) / df['mid']
df['target'] = (df['future_dd'] > 0.003).astype(int)
@@ -1214,7 +1265,7 @@ class Crash:
print("\n===== ✅ FIN DE LINSPECTION =====")
def analyze_model(self, pair, model, X_train, X_valid, y_train, y_valid):
def analyze_model(self, model, X_train, X_valid, y_train, y_valid):
"""
Analyse complète d'un modèle ML supervisé (classification binaire).
Affiche performances, importance des features, matrices, seuils, etc.
@@ -1398,7 +1449,7 @@ class Crash:
df = df.set_index('date')
# Optionnel : ne garder quune plage temporelle
df = df["2025-01-01":"2025-07-14"]
df = df["2025-01-01":"2025-02-01"]
df = df.reset_index('date')
# Supprimer NaN