DeepFin / agents /scripts /config.py
amos-fernandes's picture
Upload 151 files
b3a7985 verified
# --- 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"