Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import joblib | |
| from tensorflow.keras.models import load_model | |
| # ========================= | |
| # LOAD MODEL + PREPROCESS | |
| # ========================= | |
| BASE_DIR = os.path.dirname(__file__) | |
| try: | |
| model = load_model(os.path.join(BASE_DIR, "../../models/global_return_lstm.keras")) | |
| scaler = joblib.load(os.path.join(BASE_DIR, "../../models/return_scaler.save")) | |
| encoder = joblib.load(os.path.join(BASE_DIR, "../../models/symbol_encoder.save")) | |
| except Exception as e: | |
| print("MODEL LOAD ERROR:", e) | |
| model = None | |
| SEQ_LEN = 60 | |
| SIGNAL_THRESHOLD = 0.001 | |
| # ========================= | |
| # PREPARE INPUT | |
| # ========================= | |
| def prepare_input(symbol, returns): | |
| # encode symbol | |
| symbol_id = encoder.transform([symbol])[0] | |
| # scale returns | |
| returns = returns.reshape(-1, 1) | |
| returns_scaled = scaler.transform(returns) | |
| # reshape for LSTM | |
| X_price = returns_scaled.reshape(1, SEQ_LEN, 1) | |
| X_symbol = np.array([[symbol_id]]) | |
| return X_price, X_symbol | |
| # ========================= | |
| # PREDICT SIGNAL | |
| # ========================= | |
| def predict_signal(symbol, returns): | |
| if model is None: | |
| return "HOLD" | |
| if len(returns) < SEQ_LEN: | |
| return "HOLD" | |
| returns = returns[-SEQ_LEN:] | |
| X_price, X_symbol = prepare_input(symbol, returns) | |
| pred_return = model.predict([X_price, X_symbol], verbose=0)[0][0] | |
| if pred_return > SIGNAL_THRESHOLD: | |
| return "BUY" | |
| elif pred_return < -SIGNAL_THRESHOLD: | |
| return "SELL" | |
| else: | |
| return "HOLD" |