Untitled
neron
plain_text
20 days ago
7.7 kB
2
Indexable
Never
import ccxt import numpy as np import pandas as pd import pandas_ta as ta from sklearn.impute import SimpleImputer from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingClassifier from sklearn.metrics import f1_score import joblib import os from datetime import datetime, timedelta, timezone import time # Binance borsasına bağlanın exchange = ccxt.binanceusdm() # İşlem yapacağınız sembolleri liste olarak tanımlayın symbols = ['BNB/USDT'] timeframe = '15m' # Zaman dilimi limit = 500 # Kaç veri noktası almak istediğinizi belirleyin ma_period = 10 # Hareketli ortalama süresi # Zaman dilimlerini milisaniye cinsine çeviren bir fonksiyon timeframe_to_minutes = { '1m': 1, '3m': 3, '5m': 5, '15m': 15, '30m': 30, '1h': 60, '2h': 120, '4h': 240, '6h': 360, '12h': 720, '1d': 1440, } # Timeframe'in dakika cinsinden değeri timeframe_minutes = timeframe_to_minutes[timeframe] # Oyun teorisi tabanlı özellikleri hesaplama fonksiyonu def calculate_game_theory_features(df): df['price_change'] = df['close'].diff() df['up_moves'] = np.where(df['price_change'] > 0, 1, 0) df['down_moves'] = np.where(df['price_change'] < 0, 1, 0) df['total_up_moves'] = df['up_moves'].cumsum() df['total_down_moves'] = df['down_moves'].cumsum() df['volume_change'] = df['volume'].diff().fillna(0) df['volume_up'] = np.where(df['volume_change'] > 0, 1, 0) df['volume_down'] = np.where(df['volume_change'] < 0, 1, 0) df['total_volume_up'] = df['volume_up'].cumsum() df['total_volume_down'] = df['volume_down'].cumsum() df = df.dropna() # NaN değerleri olan satırları kaldır return df def fetch_and_update_data(symbol, timeframe, limit): # Veri dosyası adı filename = f'{symbol.replace("/", "_")}_veri.csv' if os.path.exists(filename): df = pd.read_csv(filename) last_timestamp = pd.to_datetime(df['timestamp']).max() start_time = last_timestamp + timedelta(minutes=timeframe_minutes) start_time = int(start_time.timestamp() * 1000) # Milisaniyeye çevir else: start_time = None ohlcv = exchange.fetch_ohlcv(symbol, timeframe, since=start_time, limit=limit) if len(ohlcv) == 0: print(f'{symbol} için yeni veri bulunamadı.') return pd.DataFrame() # Boş DataFrame döndür new_df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) new_df['symbol'] = symbol new_df['timestamp'] = pd.to_datetime(new_df['timestamp'], unit='ms') if os.path.exists(filename): df = pd.concat([df, new_df], ignore_index=True).drop_duplicates(subset=['timestamp']).reset_index(drop=True) else: df = new_df # Teknik analiz verilerini hesaplayın df['rsi'] = ta.rsi(df['close'], length=14) bbands = ta.bbands(df['close'], length=20, std=2) df['bb_upper'] = bbands['BBU_20_2.0'] df['bb_middle'] = bbands['BBM_20_2.0'] df['bb_lower'] = bbands['BBL_20_2.0'] df['bollinger_flag'] = np.where(df['close'] > df['bb_upper'], 1, np.where(df['close'] < df['bb_lower'], -1, 0)) stoch = ta.stoch(df['high'], df['low'], df['close'], k=14, d=3) df['stoch_k'] = stoch['STOCHk_14_3_3'] df['stochastic_flag'] = np.where(df['stoch_k'] < 20, -1, np.where(df['stoch_k'] > 80, 1, 0)) macd = ta.macd(df['close'], fast=12, slow=26, signal=9) df['macd_line'] = macd['MACD_12_26_9'] df['macd_signal_line'] = macd['MACDs_12_26_9'] df['macd_signal'] = np.where((df['macd_line'].shift(1) < df['macd_signal_line'].shift(1)) & (df['macd_line'] > df['macd_signal_line']), 1, np.where((df['macd_line'].shift(1) > df['macd_signal_line'].shift(1)) & (df['macd_line'] < df['macd_signal_line']), -1, 0)) df['ma'] = ta.sma(df['close'], length=ma_period) df['ma_flag'] = np.where(df['close'] > df['ma'], 1, 0) df['body_size'] = np.abs(df['close'] - df['open']).round(2) df['unit_diff'] = df['close'].diff().round(2) df['percent_diff'] = (df['unit_diff'] / df['close'].shift(1) * 100).round(2) df['percent_high_diff'] = ((df['high'] - df['open']) / df['open'] * 100).round(2) df['percent_low_diff'] = ((df['low'] - df['open']) / df['open'] * 100).round(2) df.dropna(inplace=True) # Oyun teorisi tabanlı özellikleri hesapla df = calculate_game_theory_features(df) df.to_csv(filename, index=False) print(f'{symbol} için veri başarıyla güncellendi ve kaydedildi.') return df def train_and_evaluate_model(df): X = df.drop(['symbol', 'timestamp', 'percent_diff'], axis=1) y = np.where(df['percent_diff'] > 0, 1, 0) # NaN değerlerini doldur imputer = SimpleImputer(strategy='mean') X_imputed = pd.DataFrame(imputer.fit_transform(X), columns=X.columns) X_train, X_test, y_train, y_test = train_test_split(X_imputed, y, test_size=0.2, random_state=42) model = GradientBoostingClassifier() model.fit(X_train, y_train) y_pred = model.predict(X_test) f1 = f1_score(y_test, y_pred) print(f'F1 Skoru: {f1}') model_filename = 'gradient_boosting_model.pkl' if os.path.exists(model_filename): previous_model = joblib.load(model_filename) y_prev_pred = previous_model.predict(X_test) prev_f1 = f1_score(y_test, y_prev_pred) print(f'Önceki Modelin F1 Skoru: {prev_f1}') if f1 > prev_f1: joblib.dump(model, model_filename) print("Yeni model kaydedildi.") active_model = model else: print("Önceki model daha iyi performans gösteriyor, yeni model kaydedilmedi.") active_model = previous_model else: joblib.dump(model, model_filename) print("Model ilk kez kaydedildi.") active_model = model return active_model def predict_next_movement(active_model, df): next_input = df.iloc[-1:].drop(['symbol', 'timestamp', 'percent_diff'], axis=1).values next_prediction = active_model.predict(next_input) if next_prediction[0] == 1: print("Tahmin: Gelecek mumda fiyat yükselecek.") else: print("Tahmin: Gelecek mumda fiyat düşecek.") def determine_next_run_time(timestamp_str, timeframe_minutes): current_time = datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S') next_run_time = current_time + timedelta(minutes=timeframe_minutes) return next_run_time.replace(tzinfo=timezone.utc) # Başlangıç zamanını ayarla initial_timestamp = '2024-09-12 19:27:00' initial_time = datetime.strptime(initial_timestamp, '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone.utc) next_run_time = determine_next_run_time(initial_time.strftime('%Y-%m-%d %H:%M:%S'), timeframe_minutes) while True: now = datetime.now(timezone.utc) if now >= next_run_time: for symbol in symbols: df = fetch_and_update_data(symbol, timeframe, limit) if df is not None and not df.empty: active_model = train_and_evaluate_model(df) predict_next_movement(active_model, df) next_run_time = determine_next_run_time(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'), timeframe_minutes) sleep_duration = (next_run_time - now).total_seconds() print(f'{sleep_duration} saniye bekleniyor...') time.sleep(max(sleep_duration, 0))
Leave a Comment