File size: 2,241 Bytes
a0b1c59
 
 
 
 
 
 
 
 
447a4ac
 
a0b1c59
 
 
447a4ac
a0b1c59
 
 
447a4ac
a0b1c59
 
 
 
 
 
 
 
 
 
 
 
 
447a4ac
a0b1c59
 
 
 
 
 
 
447a4ac
a0b1c59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
447a4ac
a0b1c59
 
 
 
 
 
 
 
447a4ac
 
 
 
 
 
 
a0b1c59
 
 
c3cbd65
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import pandas as pd
import xgboost as xgb
import joblib
import os

TIME_MODEL_FILE = "time_model.pkl"

def prepare_time_features(df):
    """
    Génère la Target.
    Les features (Lags, Momentum, Volume) sont DÉJÀ calculées par app.py !
    """
    df = df.copy()
    
    # 🎯 Target (Ce qu'on veut prédire : la prochaine bougie sera-t-elle verte ?)
    # 1 = Hausse, 0 = Baisse
    df['target'] = (df['close'].shift(-1) > df['close']).astype(int)
    
    # Nettoyage de la toute dernière ligne (qui n'a pas encore de futur)
    df = df.dropna()
    
    # Les colonnes que XGBoost va regarder
    features = [
        'return_1h', 'return_3h', 'return_12h', 
        'RSI_lag1', 'RSI_lag2', 'vol_lag1', 'VOL_RATIO'
    ]
    
    return df[features], df['target']

def train_time_model(df):
    """
    Entraîne le modèle XGBoost. 
    Ultra-rapide, optimisé pour les 4 threads de ton processeur !
    """
    print("⏳ [V9] Entraînement du Time Engine (XGBoost) en cours...")
    
    X, y = prepare_time_features(df)
    
    # Paramétrage Quant : 
    # max_depth=4 (pour ne pas overfitter le bruit de la crypto)
    # n_jobs=-1 (utilise 100% du CPU dispo)
    model = xgb.XGBClassifier(
        n_estimators=100,
        max_depth=4,
        learning_rate=0.05,
        objective='binary:logistic',
        eval_metric='logloss',
        n_jobs=-1, 
        random_state=42
    )
    
    model.fit(X, y)
    joblib.dump(model, TIME_MODEL_FILE)
    
    print("✅ [V9] Time Engine sauvegardé avec succès ! Ton CPU te remercie.")
    return model

def load_time_model():
    """Charge le modèle depuis le disque."""
    if os.path.exists(TIME_MODEL_FILE):
        return joblib.load(TIME_MODEL_FILE)
    return None

def predict_time(model, df):
    """
    Prédit la probabilité de hausse pour la bougie actuelle.
    """
    features = [
        'return_1h', 'return_3h', 'return_12h', 
        'RSI_lag1', 'RSI_lag2', 'vol_lag1', 'VOL_RATIO'
    ]
    
    # On isole la toute dernière ligne du marché
    last_row = df[features].iloc[[-1]]
    
    # predict_proba renvoie [prob_baisse, prob_hausse]. On veut la hausse (indice 1)
    prob_hausse = model.predict_proba(last_row)[0][1]
    return prob_hausse