Spaces:
Sleeping
Sleeping
| 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) |