import numpy as np import pandas as pd import os from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.layers import LSTM, Dense, Dropout from tensorflow.keras.optimizers import Adam MODEL_FILE = "lstm_model.keras" SEQ_LEN = 30 FEATURES = ["close","RSI","EMA50","EMA200","ATR"] def build_sequences(df): df = df.dropna() X, y = [], [] for i in range(len(df) - SEQ_LEN - 1): seq = df[FEATURES].iloc[i:i+SEQ_LEN].values future = df["close"].iloc[i+SEQ_LEN] current = df["close"].iloc[i+SEQ_LEN-1] label = 1 if future > current else 0 X.append(seq) y.append(label) return np.array(X), np.array(y) def train_lstm(df): X, y = build_sequences(df) if len(X) < 200: return None model = Sequential([ LSTM(64, return_sequences=True, input_shape=(X.shape[1], X.shape[2])), Dropout(0.2), LSTM(32), Dense(1, activation="sigmoid") ]) model.compile(loss="binary_crossentropy", optimizer=Adam(learning_rate=0.001), metrics=["accuracy"]) # Optimisation i7 : On double le temps d'apprentissage pour la précision model.fit(X, y, epochs=20, batch_size=32, verbose=0) model.save(MODEL_FILE) return model def load_lstm(): if os.path.exists(MODEL_FILE): return load_model(MODEL_FILE) return None def predict_lstm(model, df): df = df.dropna() if len(df) < SEQ_LEN: return 0.5 seq = df[FEATURES].iloc[-SEQ_LEN:].values seq = np.expand_dims(seq, axis=0) prob = model.predict(seq, verbose=0)[0][0] return float(prob)