sermpakassistant's picture
Upload app.py with huggingface_hub
27429ea verified
Raw
History Blame Contribute Delete
4.78 kB
"""
XAUUSD Trading Model Training
Simple version - generates synthetic data for testing
"""
import gradio as gr
import numpy as np
import pandas as pd
from sklearn.preprocessing import RobustScaler
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score, classification_report
import warnings
warnings.filterwarnings('ignore')
def generate_data(n_samples=100000):
"""Generate synthetic XAUUSD-like data"""
np.random.seed(42)
# Price-like data
prices = 1800 + np.cumsum(np.random.randn(n_samples) * 10)
data = pd.DataFrame({
'close': prices,
'open': prices + np.random.randn(n_samples) * 5,
'high': prices + np.abs(np.random.randn(n_samples) * 8),
'low': prices - np.abs(np.random.randn(n_samples) * 8),
'volume': np.random.randint(1000, 100000, n_samples)
})
return data
def create_features(df):
"""Create technical indicators"""
features = pd.DataFrame()
features['close'] = df['close']
features['open'] = df['open']
features['high'] = df['high']
features['low'] = df['low']
features['volume'] = df['volume']
# Returns
features['returns'] = df['close'].pct_change()
# Simple Moving Averages
features['sma20'] = df['close'].rolling(20).mean()
features['sma50'] = df['close'].rolling(50).mean()
# MACD
ema12 = df['close'].ewm(span=12).mean()
ema26 = df['close'].ewm(span=26).mean()
macd = ema12 - ema26
features['macd'] = macd
features['macd_signal'] = macd.ewm(span=9).mean()
features['histogram'] = features['macd'] - features['macd_signal']
# RSI
delta = df['close'].diff()
gain = delta.where(delta > 0, 0).rolling(14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(14).mean()
rs = gain / loss
features['rsi'] = 100 - (100 / (1 + rs))
# Bollinger Bands
sma20 = df['close'].rolling(20).mean()
std20 = df['close'].rolling(20).std()
features['bb_upper'] = sma20 + (std20 * 2)
features['bb_lower'] = sma20 - (std20 * 2)
# Future returns for labels
future_returns = df['close'].shift(-5) / df['close'] - 1
labels = pd.Series(0, index=df.index)
labels[future_returns > 0.005] = 1 # BUY
labels[future_returns < -0.005] = -1 # SELL
# HOLD = 0
features['label'] = labels
return features.dropna()
def train_model(n_estimators, max_depth, learning_rate):
import time
start = time.time()
yield "πŸ“Š Loading data..."
df = generate_data(100000)
yield "πŸ”§ Creating features..."
data = create_features(df)
yield "βš™οΈ Preparing..."
X = data.drop('label', axis=1).values
y = data['label'].values
split_idx = int(len(X) * 0.8)
X_train, X_test = X[:split_idx], X[split_idx:]
y_train, y_test = y[:split_idx], y[split_idx:]
scaler = RobustScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
yield f"πŸš€ Training (n={n_estimators}, depth={max_depth})..."
model = GradientBoostingClassifier(
n_estimators=int(n_estimators),
max_depth=int(max_depth),
learning_rate=learning_rate,
subsample=0.8,
random_state=42
)
model.fit(X_train_scaled, y_train)
yield "πŸ“Š Evaluating..."
y_pred = model.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
elapsed = time.time() - start
yield {
"accuracy": f"{accuracy:.2%}",
"time": f"{elapsed:.1f}s",
"train_samples": f"{len(X_train):,}",
"test_samples": f"{len(X_test):,}",
"report": classification_report(y_test, y_pred, target_names=['SELL', 'HOLD', 'BUY'])
}
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("# πŸ€– XAUUSD Trading Model Training")
gr.Markdown("**TESTING VERSION** - Uses synthetic data")
with gr.Row():
with gr.Column():
n_estimators = gr.Slider(50, 200, value=100, step=10, label="n_estimators")
max_depth = gr.Slider(3, 8, value=5, step=1, label="max_depth")
learning_rate = gr.Slider(0.01, 0.3, value=0.1, step=0.01, label="learning_rate")
train_btn = gr.Button("πŸš€ Train Model", variant="primary")
with gr.Column():
output = gr.JSON(label="Results")
report = gr.Textbox(label="Report", lines=8)
train_btn.click(
fn=train_model,
inputs=[n_estimators, max_depth, learning_rate],
outputs=[output, report]
)
gr.Markdown("""
## Test Mode
- Synthetic 100k samples
- 14 features (price + MACD + RSI + BB)
- No external dependencies needed
""")
demo.launch()