# --- Parâmetros de Configuração --- # Dados SYMBOL = 'ETH/USDT' # MUDAMOS PARA ETH/USDT PARA TESTE MULTI_ASSET_SYMBOLS = { 'crypto_eth': 'ETH-USD', # yfinance ticker para ETH/USD 'crypto_ada': 'ADA-USD', # yfinance ticker para ADA/USD 'stock_aapl': 'AAPL', # NASDAQ 'stock_petr': 'PETR4.SA' # B3 } # Use os tickers corretos para yfinance ou ccxt TIMEFRAME_YFINANCE = '1h' # yfinance suporta '1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo' # Para '1h', yfinance só retorna os últimos 730 dias. Para mais dados, use '1d'. # Se usar ccxt, TIMEFRAME = '1h' como antes. DAYS_TO_FETCH = 365 * 2 # 2 anos # Lista das features base que você quer calcular para CADA ativo # (as 19 que definimos antes) INDIVIDUAL_ASSET_BASE_FEATURES = [ 'open', 'high', 'low', 'close', 'volume', # OHLCV originais são necessários para os cálculos 'sma_10', 'rsi_14', 'macd', 'macds', 'atr', 'bbp', 'cci_37', 'mfi_37', 'adx_14', 'volume_zscore', 'body_size', 'body_size_norm_atr', 'body_vs_avg_body', 'log_return', 'buy_condition_v1', # 'sma_50' é calculada dentro de buy_condition_v1 # As colunas _div_atr serão criadas a partir destas ] # Features que serão normalizadas pelo ATR COLS_TO_NORM_BY_ATR = ['open', 'high', 'low', 'close', 'volume', 'sma_10', 'macd', 'body_size'] TIMEFRAME = '1h' DAYS_OF_DATA_TO_FETCH = 365 * 2 LIMIT_PER_FETCH = 1000 # Features e Janela WINDOW_SIZE = 60 # BASE_FEATURE_COLS define as features *originais* ou *derivadas diretamente dos dados brutos* # que serão usadas ANTES do escalonamento específico para o modelo no script de treino, # e também as features que o rnn_predictor.py precisará calcular/ter ANTES de aplicar SEUS scalers. BASE_FEATURE_COLS = [ 'open_div_atr', # Feature 1 (Preço normalizado) 'high_div_atr', # Feature 2 (Preço normalizado) 'low_div_atr', # Feature 3 (Preço normalizado) 'close_div_atr', # Feature 4 (Preço normalizado) 'volume_div_atr', # Feature 5 (Volume normalizado) 'log_return', # Feature 6 (Momento) 'rsi_14', # Feature 7 (Oscilador) 'atr', # Feature 8 (Volatilidade - será escalada) 'bbp', # Feature 9 (%B - será escalado) 'cci_37', # Feature 10 (Oscilador - será escalado) 'mfi_37', # Feature 11 (Volume/Oscilador - será escalado) 'body_size_norm_atr', # Feature 12 (Candle normalizado) 'body_vs_avg_body', # Feature 13 (Candle relativo) 'macd', # Feature 14 (Linha MACD - será escalada) 'sma_10_div_atr', # Feature 15 (Preço normalizado) 'adx_14', # Feature 16 (Força da Tendência - será escalada) 'volume_zscore', # Feature 17 (Volume relativo - será escalado) 'buy_condition_v1', # Feature 18 (Condição Composta - binária, pode ou não ser escalada) # 'cond_compra_v1', # Parece ser um duplicado de 'buy_condition_v1', remova se for. # Se for diferente, mantenha, mas garanta que está sendo calculada. ] # REMOVA as colunas _scaled de BASE_FEATURE_COLS. Elas são o *resultado* do escalonamento. # BASE_FEATURE_COLS são as features ANTES do último passo de escalonamento para o modelo. # Vamos assumir que cond_compra_v1 e buy_condition_v1 são a mesma. # Se forem diferentes, você precisará ajustar. if 'cond_compra_v1' in BASE_FEATURE_COLS and 'buy_condition_v1' in BASE_FEATURE_COLS: if 'cond_compra_v1' == 'buy_condition_v1': # Redundante se nomes iguais, mas para clareza print("AVISO em config.py: 'cond_compra_v1' e 'buy_condition_v1' parecem ser a mesma feature. Verifique.") # Decida qual manter ou se são realmente diferentes. Por ora, vou assumir que você quer ambas se estiverem listadas. # Se forem a mesma, remova uma. Vou remover 'cond_compra_v1' se 'buy_condition_v1' for a oficial. # BASE_FEATURE_COLS.remove('cond_compra_v1') # Exemplo NUM_FEATURES = len(BASE_FEATURE_COLS) # ATUALIZADO AUTOMATICAMENTE # Alvo da Predição (Target) PREDICTION_HORIZON = 5 PRICE_CHANGE_THRESHOLD = 0.0075 # Você aumentou, OK. # Modelo RNN LSTM_UNITS = [64, 64] # Boa escolha para mais features DENSE_UNITS = 32 DROPOUT_RATE = 0.3 # Bom para regularizar um modelo maior LEARNING_RATE = 0.0005 # LR inicial para ReduceLROnPlateau L2_REG = 0.0001 # Regularização L2 leve # Treinamento BATCH_SIZE = 128 EPOCHS = 100 # Deixe EarlyStopping controlar # Caminhos para Salvar MODEL_SAVE_DIR = "app/model" MODEL_NAME = "model.h5" # Nomes de scaler mais descritivos que você sugeriu: PRICE_VOL_SCALER_NAME = "price_volume_atr_norm_scaler.joblib" INDICATOR_SCALER_NAME = "other_indicators_scaler.joblib" # EXPECTED_SCALED_FEATURES_FOR_MODEL define os nomes das colunas APÓS o escalonamento # que são usadas para criar as sequências e alimentar o modelo no script de treino. # E também o que o rnn_predictor.py DEVE produzir após aplicar seus scalers carregados. EXPECTED_SCALED_FEATURES_FOR_MODEL = [f"{col}_scaled" for col in BASE_FEATURE_COLS] # ^^^ IMPORTANTE: Esta linha assume que TODAS as features em BASE_FEATURE_COLS # serão escaladas e terão o sufixo _scaled. # Se 'rsi_14', 'bbp', 'buy_condition_v1' não forem escaladas ou tiverem # outro tratamento, esta lista precisa ser ajustada manualmente. # Exemplo: Se 'buy_condition_v1' é binária e não escalada: # EXPECTED_SCALED_FEATURES_FOR_MODEL = [f"{col}_scaled" for col in BASE_FEATURE_COLS if col != 'buy_condition_v1'] + ['buy_condition_v1'] # Por simplicidade, vamos assumir que todas são escaladas por enquanto. EXPECTED_FEATURES_ORDER = EXPECTED_SCALED_FEATURES_FOR_MODEL INDIVIDUAL_ASSET_BASE_FEATURES = EXPECTED_FEATURES_ORDER MODEL_SAVE_DIR = "app/model" PRICE_VOL_SCALER_NAME = "price_volume_atr_norm_scaler.joblib" INDICATOR_SCALER_NAME = "other_indicators_scaler.joblib"