File size: 3,279 Bytes
4bd6312 | 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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import torch
import numpy as np
import pandas as pd
import gradio as gr
import joblib
from model.ConvGRUTransformerHL import ConvGRUTransformerHL_Attn # โมเดลของมึง
# ===== Config =====
LOOKBACK = 3
FOLDS = [1,2,3]
MODEL_DIR = "models" # ปรับ path ตามจริง
# ===== Load scalers =====
scalers = {}
for fold in FOLDS:
scalers[fold] = {
"price": joblib.load(f"{MODEL_DIR}/scaler_fold{fold}/scaler_price.pkl"),
"adx": joblib.load(f"{MODEL_DIR}/scaler_fold{fold}/scaler_adx.pkl"),
"atr": joblib.load(f"{MODEL_DIR}/scaler_fold{fold}/scaler_atr.pkl"),
"tick": joblib.load(f"{MODEL_DIR}/scaler_fold{fold}/scaler_tick_volume.pkl"),
"target_high": joblib.load(f"{MODEL_DIR}/scaler_fold{fold}/scaler_target_high.pkl"),
"target_low": joblib.load(f"{MODEL_DIR}/scaler_fold{fold}/scaler_target_low.pkl"),
}
# ===== Load models =====
models = {}
for fold in FOLDS:
checkpoint = torch.load(f"{MODEL_DIR}/EURUSDm_transformer_finetuned_fold_{fold}_01.pth", map_location="cpu")
model = ConvGRUTransformerHL_Attn(input_dim=10, seq_len=LOOKBACK, kernel_size=LOOKBACK, output_steps=1)
model.load_state_dict(checkpoint["model_state_dict"])
model.eval()
models[fold] = model
# ===== Prediction function =====
def predict_signal(open_, high_, low_, close_, tick_volume, adx, atr, hour, weekday, month):
df = pd.DataFrame([{
'open': open_, 'high': high_, 'low': low_, 'close': close_,
'tick_volume': tick_volume, 'adx': adx, 'atr': atr,
'hour': hour, 'weekday': weekday, 'month': month
}])
# เตรียม X_scaled
pred_high_list = []
pred_low_list = []
for fold in FOLDS:
s = scalers[fold]
price_scaled = s["price"].transform(df[['open','high','low','close']].values)
adx_scaled = s["adx"].transform(df[['adx']].values)
atr_scaled = s["atr"].transform(df[['atr']].values)
tick_scaled = s["tick"].transform(df[['tick_volume']].values)
time_data = df[['hour','weekday','month']].values
X_scaled = np.concatenate([price_scaled, adx_scaled, atr_scaled, tick_scaled, time_data], axis=1)
X_tensor = torch.tensor(X_scaled, dtype=torch.float32).unsqueeze(0) # (1, seq_len, features)
# Predict
with torch.no_grad():
pred_high, pred_low = models[fold](X_tensor)
# Inverse transform
pred_high_np = s["target_high"].inverse_transform(pred_high.numpy())
pred_low_np = s["target_low"].inverse_transform(pred_low.numpy())
pred_high_list.append(pred_high_np[0][0])
pred_low_list.append(pred_low_np[0][0])
# เอาค่าเฉลี่ย folds
return float(np.mean(pred_high_list)), float(np.mean(pred_low_list))
# ===== Gradio UI =====
iface = gr.Interface(
fn=predict_signal,
inputs=["number","number","number","number","number","number","number","number","number","number"], # 10 features
outputs=["number","number"],
title="AI Trading Signals",
description="Enter latest OHLC + tick + adx + atr + hour + weekday + month to get predicted High/Low"
)
iface.launch()
|