File size: 3,713 Bytes
fb6c0e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import ccxt
import pandas as pd
import streamlit as st
import xgboost as xgb
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

exchange = ccxt.mexc({
    'apiKey': 'mx0vglbkoCOwmqV5tn',
    'secret': 'c6d8cc8953fd405787ed54e3488ae0db',
    'enableRateLimit': True,
})

def fetch_ohlcv_data(symbol, timeframe, limit):
    return exchange.fetch_ohlcv(symbol, timeframe, since=None, limit=limit)

def data_to_dataframe(data):
    df = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    df.set_index('timestamp', inplace=True)
    return df

def prepare_dataset(df, lags):
    X = pd.DataFrame()
    y = pd.DataFrame()

    for lag in range(1, lags + 1):
        shifted_close = df['close'].shift(lag)
        X[f'close_lag_{lag}'] = shifted_close

    y = df['close'].shift(-1)
    return X, y

def train_xgboost_model(X_train, y_train):
    dtrain = xgb.DMatrix(X_train, label=y_train)
    params = {
        'objective': 'reg:squarederror',
        'eval_metric': 'rmse',
    }

    try:
        model = xgb.train(params, dtrain)
    except xgb.core.XGBoostError as e:
        print(f"Error training XGBoost model: {e}")
        return None

    return model

def predict_next_hour_price(df, model, lags):
    X_test = pd.DataFrame()

    for lag in range(1, lags + 1):
        shifted_close = df['close'].shift(lag)
        X_test[f'close_lag_{lag}'] = shifted_close

    X_test = X_test.tail(1)
    dtest = xgb.DMatrix(X_test)

    try:
        next_hour_price = model.predict(dtest)
    except xgb.core.XGBoostError as e:
        print(f"Error making prediction with XGBoost model: {e}")
        return None

    return next_hour_price

def evaluate_prediction_accuracy(y_test, y_pred):
    accuracy = r2_score(y_test, y_pred)
    return accuracy

def execute_trade(exchange, symbol, side, amount):
    order = exchange.create_market_order(symbol, side, amount)
    return order

symbol = 'BTC/USDT'
timeframe = '1h'
limit = 100
lags = 12
test_size = 0.3

ohlcv_data = fetch_ohlcv_data(symbol, timeframe, limit)
df = data_to_dataframe(ohlcv_data)

if st.button("hoo"):
    st.write(df)

X, y = prepare_dataset(df, lags)

if X.isnull().values.any() or y.isnull().values.any():
    print("Error: Null values found in X or y")
else:
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size)

    model = train_xgboost_model(X_train, y_train)

    if model is None:
        print("Error: XGBoost model could not be trained")
    else:
        y_pred = model.predict(X_test)
        accuracy = evaluate_prediction_accuracy(y_test, y_pred)

        if accuracy > 0.9:
            latest_data = df.tail(lags)
            predicted_price = predict_next_hour_price(latest_data, model, lags)

            if predicted_price is None:
                print("Error: XGBoost model could not make prediction")
            else:
                current_price = latest_data['close'].iloc[-1]

                if predicted_price > current_price:
                    # Buy BTC
                    amount = 0.001  # Set the amount you want to trade
                    order = execute_trade(exchange, symbol, 'buy', amount)
                    print(f"Bought {amount} BTC at {current_price}")
                elif predicted_price < current_price:
                    # Sell BTC
                    amount = 0.001  # Set the amount you want to trade
                    order = execute_trade(exchange, symbol, 'sell', amount)
                    print(f"Sold {amount} BTC at {current_price}")
        else:
            print("Accuracy is low, not placing order.")