Nexo-S commited on
Commit
009d5a7
·
verified ·
1 Parent(s): fbb2dd4

Update regime_model.py

Browse files
Files changed (1) hide show
  1. regime_model.py +110 -110
regime_model.py CHANGED
@@ -1,111 +1,111 @@
1
- import ccxt
2
- import pandas as pd
3
- import pandas_ta as ta
4
- import numpy as np
5
- import joblib
6
- from sklearn.mixture import GaussianMixture
7
- from sklearn.preprocessing import StandardScaler
8
- import os
9
-
10
- # Fichiers de sauvegarde
11
- # Fichiers de sauvegarde sur le Cloud
12
- REGIME_MODEL_FILE = "H:/Mon Drive/Alpha_Memory/regime_model.pkl"
13
- REGIME_SCALER_FILE = "H:/Mon Drive/Alpha_Memory/regime_scaler.pkl"
14
-
15
- def fetch_macro_data(symbol="BTC/USDT", timeframe="1d", limit=1000):
16
- """
17
- Récupère l'historique long terme pour comprendre le régime global.
18
- On utilise le Bitcoin car c'est lui qui dicte la météo du marché crypto.
19
- """
20
- print(f"📥 Téléchargement des données macro pour {symbol} ({timeframe})...")
21
- exchange = ccxt.binance({'enableRateLimit': True})
22
- data = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
23
- df = pd.DataFrame(data, columns=["ts", "open", "high", "low", "close", "vol"])
24
- df['ts'] = pd.to_datetime(df['ts'], unit='ms')
25
- return df
26
-
27
- def prepare_regime_features(df):
28
- """
29
- Calcule les variables (features) qui définissent l'état du marché.
30
- Ici on ne cherche pas la direction, mais le "climat" (volatilité, force, panique).
31
- """
32
- # 1. Volatilité relative (ATR en pourcentage du prix)
33
- df["ATR"] = df.ta.atr(length=14)
34
- df["ATR_pct"] = (df["ATR"] / df["close"]) * 100
35
-
36
- # 2. Pente de la tendance (Est-ce que l'EMA200 monte ou descend ?)
37
- df["EMA200"] = df.ta.ema(length=200)
38
- # Pente sur 10 jours
39
- df["EMA200_slope"] = (df["EMA200"] / df["EMA200"].shift(10)) - 1
40
-
41
- # 3. Drawdown (Chute par rapport au plus haut des 14 derniers jours)
42
- df["Roll_Max"] = df["close"].rolling(14).max()
43
- df["Drawdown"] = (df["close"] / df["Roll_Max"]) - 1
44
-
45
- # 4. Momentum Global
46
- df["RSI_Macro"] = df.ta.rsi(length=14)
47
-
48
- # Nettoyage
49
- df = df.dropna().copy()
50
-
51
- # On garde uniquement les colonnes qui intéressent l'IA de Régime
52
- features = df[["ATR_pct", "EMA200_slope", "Drawdown", "RSI_Macro"]]
53
- return df, features
54
-
55
- def train_regime_model():
56
- """
57
- Entraîne le modèle non-supervisé pour découvrir les régimes de marché.
58
- """
59
- print("🧠 Démarrage de l'entraînement du Détecteur de Régime (Couche 1)...")
60
-
61
- df = fetch_macro_data()
62
- df, features = prepare_regime_features(df)
63
-
64
- # L'IA a besoin que les données soient à la même échelle (Standardisation)
65
- scaler = StandardScaler()
66
- scaled_features = scaler.fit_transform(features)
67
-
68
- # Création du modèle GMM (On lui demande de trouver 4 régimes distincts)
69
- # Par exemple : 0=TREND, 1=RANGE, 2=PANIC, 3=HIGH_VOL (L'ordre sera défini par l'IA)
70
- gmm = GaussianMixture(n_components=4, covariance_type='full', random_state=42)
71
- gmm.fit(scaled_features)
72
-
73
- # Sauvegarde des cerveaux
74
- joblib.dump(gmm, REGIME_MODEL_FILE)
75
- joblib.dump(scaler, REGIME_SCALER_FILE)
76
-
77
- print(f"✅ Modèle GMM entraîné sur {len(df)} jours et sauvegardé !")
78
-
79
- # On va afficher les caractéristiques moyennes de chaque régime
80
- # pour que tu puisses leur donner un nom (BULL, BEAR, PANIC, RANGE)
81
- df['Regime'] = gmm.predict(scaled_features)
82
- print("\n📊 CARACTÉRISTIQUES DES RÉGIMES DÉCOUVERTS :")
83
- summary = df.groupby('Regime')[["ATR_pct", "EMA200_slope", "Drawdown", "RSI_Macro"]].mean()
84
- print(summary)
85
-
86
- return gmm, scaler
87
-
88
- def detect_current_regime(df_latest):
89
- """
90
- Fonction qui sera appelée par ton bot V8 en temps réel.
91
- """
92
- if not os.path.exists(REGIME_MODEL_FILE) or not os.path.exists(REGIME_SCALER_FILE):
93
- return -1 # Erreur ou modèle non prêt
94
-
95
- gmm = joblib.load(REGIME_MODEL_FILE)
96
- scaler = joblib.load(REGIME_SCALER_FILE)
97
-
98
- _, features = prepare_regime_features(df_latest)
99
- if len(features) == 0:
100
- return -1
101
-
102
- # On prend la toute dernière bougie
103
- last_row = features.iloc[[-1]]
104
- scaled_row = scaler.transform(last_row)
105
-
106
- regime = gmm.predict(scaled_row)[0]
107
- return regime
108
-
109
- if __name__ == "__main__":
110
- # Si tu lances ce fichier directement, il va s'entraîner !
111
  train_regime_model()
 
1
+ import ccxt
2
+ import pandas as pd
3
+ import pandas_ta as ta
4
+ import numpy as np
5
+ import joblib
6
+ from sklearn.mixture import GaussianMixture
7
+ from sklearn.preprocessing import StandardScaler
8
+ import os
9
+
10
+ # Fichiers de sauvegarde
11
+ # Fichiers de sauvegarde sur le Cloud
12
+ REGIME_MODEL_FILE = "regime_model.pkl"
13
+ REGIME_SCALER_FILE = "regime_scaler.pkl"
14
+
15
+ def fetch_macro_data(symbol="BTC/USDT", timeframe="1d", limit=1000):
16
+ """
17
+ Récupère l'historique long terme pour comprendre le régime global.
18
+ On utilise le Bitcoin car c'est lui qui dicte la météo du marché crypto.
19
+ """
20
+ print(f"📥 Téléchargement des données macro pour {symbol} ({timeframe})...")
21
+ exchange = ccxt.binance({'enableRateLimit': True})
22
+ data = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
23
+ df = pd.DataFrame(data, columns=["ts", "open", "high", "low", "close", "vol"])
24
+ df['ts'] = pd.to_datetime(df['ts'], unit='ms')
25
+ return df
26
+
27
+ def prepare_regime_features(df):
28
+ """
29
+ Calcule les variables (features) qui définissent l'état du marché.
30
+ Ici on ne cherche pas la direction, mais le "climat" (volatilité, force, panique).
31
+ """
32
+ # 1. Volatilité relative (ATR en pourcentage du prix)
33
+ df["ATR"] = df.ta.atr(length=14)
34
+ df["ATR_pct"] = (df["ATR"] / df["close"]) * 100
35
+
36
+ # 2. Pente de la tendance (Est-ce que l'EMA200 monte ou descend ?)
37
+ df["EMA200"] = df.ta.ema(length=200)
38
+ # Pente sur 10 jours
39
+ df["EMA200_slope"] = (df["EMA200"] / df["EMA200"].shift(10)) - 1
40
+
41
+ # 3. Drawdown (Chute par rapport au plus haut des 14 derniers jours)
42
+ df["Roll_Max"] = df["close"].rolling(14).max()
43
+ df["Drawdown"] = (df["close"] / df["Roll_Max"]) - 1
44
+
45
+ # 4. Momentum Global
46
+ df["RSI_Macro"] = df.ta.rsi(length=14)
47
+
48
+ # Nettoyage
49
+ df = df.dropna().copy()
50
+
51
+ # On garde uniquement les colonnes qui intéressent l'IA de Régime
52
+ features = df[["ATR_pct", "EMA200_slope", "Drawdown", "RSI_Macro"]]
53
+ return df, features
54
+
55
+ def train_regime_model():
56
+ """
57
+ Entraîne le modèle non-supervisé pour découvrir les régimes de marché.
58
+ """
59
+ print("🧠 Démarrage de l'entraînement du Détecteur de Régime (Couche 1)...")
60
+
61
+ df = fetch_macro_data()
62
+ df, features = prepare_regime_features(df)
63
+
64
+ # L'IA a besoin que les données soient à la même échelle (Standardisation)
65
+ scaler = StandardScaler()
66
+ scaled_features = scaler.fit_transform(features)
67
+
68
+ # Création du modèle GMM (On lui demande de trouver 4 régimes distincts)
69
+ # Par exemple : 0=TREND, 1=RANGE, 2=PANIC, 3=HIGH_VOL (L'ordre sera défini par l'IA)
70
+ gmm = GaussianMixture(n_components=4, covariance_type='full', random_state=42)
71
+ gmm.fit(scaled_features)
72
+
73
+ # Sauvegarde des cerveaux
74
+ joblib.dump(gmm, REGIME_MODEL_FILE)
75
+ joblib.dump(scaler, REGIME_SCALER_FILE)
76
+
77
+ print(f"✅ Modèle GMM entraîné sur {len(df)} jours et sauvegardé !")
78
+
79
+ # On va afficher les caractéristiques moyennes de chaque régime
80
+ # pour que tu puisses leur donner un nom (BULL, BEAR, PANIC, RANGE)
81
+ df['Regime'] = gmm.predict(scaled_features)
82
+ print("\n📊 CARACTÉRISTIQUES DES RÉGIMES DÉCOUVERTS :")
83
+ summary = df.groupby('Regime')[["ATR_pct", "EMA200_slope", "Drawdown", "RSI_Macro"]].mean()
84
+ print(summary)
85
+
86
+ return gmm, scaler
87
+
88
+ def detect_current_regime(df_latest):
89
+ """
90
+ Fonction qui sera appelée par ton bot V8 en temps réel.
91
+ """
92
+ if not os.path.exists(REGIME_MODEL_FILE) or not os.path.exists(REGIME_SCALER_FILE):
93
+ return -1 # Erreur ou modèle non prêt
94
+
95
+ gmm = joblib.load(REGIME_MODEL_FILE)
96
+ scaler = joblib.load(REGIME_SCALER_FILE)
97
+
98
+ _, features = prepare_regime_features(df_latest)
99
+ if len(features) == 0:
100
+ return -1
101
+
102
+ # On prend la toute dernière bougie
103
+ last_row = features.iloc[[-1]]
104
+ scaled_row = scaler.transform(last_row)
105
+
106
+ regime = gmm.predict(scaled_row)[0]
107
+ return regime
108
+
109
+ if __name__ == "__main__":
110
+ # Si tu lances ce fichier directement, il va s'entraîner !
111
  train_regime_model()