File size: 1,537 Bytes
3a5d147
9523912
 
3a5d147
9523912
 
 
d687a96
 
 
 
 
 
 
 
 
9523912
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d59db71
d687a96
 
 
3a5d147
9523912
 
 
 
 
 
 
 
3a5d147
9523912
3a5d147
9523912
3a5d147
 
 
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
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"