AlphaV15-Quant-Engine / lstm_model.py
Nexo-S's picture
Upload 3 files
c3cbd65 verified
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)