| # config.py | |
| # --- Parâmetros de Dados --- | |
| SYMBOL = 'ETH/USDT' # Ativo principal para o modelo de classificação (se ainda usar) | |
| MULTI_ASSET_SYMBOLS = { # Para o agente de portfólio RL | |
| 'eth': 'ETH-USD', # Chave amigável: ticker_yfinance | |
| 'btc': 'BTC-USD', | |
| 'ada': 'ADA-USD', | |
| 'sol': 'SOL-USD' | |
| } | |
| NUM_ASSETS_PORTFOLIO = len(MULTI_ASSET_SYMBOLS) # Número de ativos no portfólio | |
| NUM_ASSETS=4 | |
| TIMEFRAME = '1h' # Usado tanto para yfinance quanto para ccxt (se adaptar) | |
| DAYS_OF_DATA_TO_FETCH = 365 * 2 | |
| LIMIT_PER_FETCH = 1000 # Para ccxt | |
| # --- Parâmetros de Features e Janela --- | |
| WINDOW_SIZE = 60 | |
| # BASE_FEATURE_COLS: Colunas calculadas para CADA ativo ANTES do escalonamento final para o modelo. | |
| # Estas são as features que seu data_handler_multi_asset.py DEVE produzir para cada ativo. | |
| # O rnn_predictor.py (ou a parte de features da DeepPortfolioAgentNetwork) também as calculará. | |
| BASE_FEATURES_PER_ASSET_INPUT = [ # Renomeado para clareza | |
| 'open_div_atr', 'high_div_atr', 'low_div_atr', 'close_div_atr', 'volume_div_atr', | |
| 'log_return', 'rsi_14', 'atr', 'bbp', 'cci_37', 'mfi_37', | |
| 'body_size_norm_atr', 'body_vs_avg_body', 'macd', 'sma_10_div_atr', | |
| 'adx_14', 'volume_zscore', 'buy_condition_v1' | |
| # Se 'cond_compra_v1' for diferente de 'buy_condition_v1', adicione aqui. | |
| # Se for igual, remova a redundância. Assumindo que 'buy_condition_v1' é a correta. | |
| ] | |
| # Nomes das colunas de preço/volume (normalizadas por ATR) que usarão o price_vol_scaler | |
| API_PRICE_VOL_COLS = ['open_div_atr', 'high_div_atr', 'low_div_atr', 'close_div_atr', 'volume_div_atr', 'body_size_norm_atr'] | |
| # Nomes das colunas de indicadores (e outras) que usarão o indicator_scaler | |
| API_INDICATOR_COLS = [col for col in BASE_FEATURES_PER_ASSET_INPUT if col not in API_PRICE_VOL_COLS] | |
| # Número de features que CADA ativo terá após todos os cálculos e ANTES do escalonamento final. | |
| NUM_FEATURES_PER_ASSET = len(BASE_FEATURES_PER_ASSET_INPUT) | |
| # Nomes das colunas escaladas que o modelo RNN/RL efetivamente verá como entrada. | |
| # Esta é a ordem que deve ser mantida após o escalonamento no data_handler e no rnn_predictor. | |
| # E também o que o create_sequences espera. | |
| EXPECTED_SCALED_FEATURES_FOR_MODEL = [f"{col}_scaled" for col in BASE_FEATURES_PER_ASSET_INPUT] | |
| # NUM_FEATURES_MODEL_INPUT será len(EXPECTED_SCALED_FEATURES_FOR_MODEL), que é igual a NUM_FEATURES_PER_ASSET | |
| # --- Parâmetros do Alvo da Predição (Para o Modelo de Classificação Supervisionado, se ainda usar) --- | |
| PREDICTION_HORIZON = 5 | |
| PRICE_CHANGE_THRESHOLD = 0.0075 | |
| # --- Parâmetros da Rede Neural (DeepPortfolioAgentNetwork e seu AssetProcessor) --- | |
| # Para AssetProcessor (processamento individual de ativo) | |
| ASSET_CNN_FILTERS1 = 32 | |
| ASSET_CNN_FILTERS2 = 64 | |
| ASSET_LSTM_UNITS1 = 64 | |
| ASSET_LSTM_UNITS2 = 32 # Saída do AssetProcessor, se torna a dimensão da feature latente por ativo | |
| ASSET_DROPOUT = 0.2 | |
| # Para DeepPortfolioAgentNetwork (camadas após processamento individual) | |
| MHA_NUM_HEADS = 4 | |
| # key_dim da MHA será ASSET_LSTM_UNITS2 // MHA_KEY_DIM_DIVISOR | |
| MHA_KEY_DIM_DIVISOR = 2 # Ex: 32 // 2 = 16. Garanta que ASSET_LSTM_UNITS2 seja divisível. Se não, ajuste. | |
| # Camadas densas FINAIS DENTRO da DeepPortfolioAgentNetwork, ANTES da saída de features latentes | |
| # ou da camada de alocação softmax (se não estiver retornando features latentes). | |
| # `FINAL_DENSE_UNITS2_EXTRACTOR` será a dimensão das features que o extrator cospe para o SB3. | |
| DPN_FINAL_DENSE1_UNITS = 64 # "DPN" para DeepPortfolioNetwork | |
| DPN_LATENT_FEATURE_DIM = 32 # Saída da DPN quando output_latent_features=True. IGUAL A ASSET_LSTM_UNITS2 se não houver mais camadas após GAP. | |
| # Se você adicionou Dense(final_dense_units1) e Dense(final_dense_units2) APÓS a atenção | |
| # no DeepPortfolioAgentNetwork, então DPN_LATENT_FEATURE_DIM seria final_dense_units2. | |
| # No nosso último design, era a saída do global_avg_pool_attention, então ASSET_LSTM_UNITS2. | |
| # Vamos assumir que a saída do GAP é usada como feature latente por enquanto. | |
| # DPN_LATENT_FEATURE_DIM = ASSET_LSTM_UNITS2 | |
| # Ajustando com base no seu código de `deep_portfolio.py` onde você tinha `final_dense_units1` e `final_dense_units2` | |
| # após a atenção e antes do output de alocação. | |
| # Estas são as camadas que produzem as features latentes para SB3. | |
| DPN_SHARED_HEAD_DENSE1_UNITS = 128 # Corresponde a final_dense_units1 na sua DeepPortfolioAgentNetwork | |
| DPN_SHARED_HEAD_LATENT_DIM = 64 # Corresponde a final_dense_units2, que será o self.features_dim do extrator | |
| DPN_SHARED_HEAD_DROPOUT = 0.3 | |
| DEFAULT_EXTRACTOR_KWARGS=DPN_SHARED_HEAD_DENSE1_UNITS | |
| # Para as cabeças de Política (Ator) e Valor (Crítico) no Stable-Baselines3 (APÓS o extrator) | |
| # Se vazias, a saída do extrator é usada diretamente para as camadas finais de ação/valor. | |
| POLICY_HEAD_NET_ARCH = [64] # Ex: [64, 32] ou [] se não quiser camadas extras | |
| VALUE_HEAD_NET_ARCH = [64] # Ex: [64, 32] ou [] | |
| # --- Parâmetros Gerais do Modelo (se aplicável a ambos os tipos de modelo) --- | |
| MODEL_DROPOUT_RATE = 0.3 # Você usou 0.3 na última rodada de classificação bem-sucedida | |
| MODEL_L2_REG = 0.0001 # Você usou 0.0001 ou 0.0005 | |
| L2_REG = 0.0001 | |
| # --- Parâmetros de Treinamento --- | |
| # Para o modelo de classificação supervisionado (se ainda usar) | |
| SUPERVISED_LEARNING_RATE = 0.0005 | |
| SUPERVISED_BATCH_SIZE = 128 | |
| SUPERVISED_EPOCHS = 100 | |
| LEARNING_RATE=0.0005 | |
| # Para o agente RL (PPO) | |
| PPO_LEARNING_RATE = 0.0003 # Padrão do SB3 PPO, pode ajustar | |
| PPO_N_STEPS = 2048 | |
| PPO_BATCH_SIZE_RL = 64 # Mini-batch size do PPO | |
| PPO_ENT_COEF = 0.0 | |
| PPO_TOTAL_TIMESTEPS = 2048 #1000000 # Comece com menos para teste (ex: 50k-100k) | |
| # --- Parâmetros do Ambiente RL --- | |
| # RISK_FREE_RATE_ANNUAL = 0.02 # Taxa livre de risco anual (ex: 2%) | |
| # REWARD_WINDOW_SHARPE = 252 * 1 # Ex: Janela de 1 ano de dados horários para Sharpe (252 dias * 24h) | |
| # Ou uma janela menor como 60 ou 120 passos. | |
| INITIAL_BALANCE = 100000 | |
| TRANSACTION_COST_PCT = 0.001 # 0.1% | |
| # --- Caminhos para Salvar --- | |
| MODEL_ROOT_DIR = "app/model" # Diretório raiz para todos os modelos e scalers | |
| # Para modelo de classificação supervisionado (se mantiver) | |
| SUPERVISED_MODEL_NAME = "classification_model.h5" | |
| SUPERVISED_PV_SCALER_NAME = "supervisor_pv_scaler.joblib" | |
| SUPERVISED_IND_SCALER_NAME = "supervisor_ind_scaler.joblib" | |
| # Para modelo RL (agente PPO salvo pelo SB3) | |
| RL_AGENT_MODEL_NAME = "ppo_deep_portfolio_agent" # SB3 adiciona .zip | |
| # Scalers usados para preparar dados para o DeepPortfolioAgentNetwork (que é o extrator do RL) | |
| RL_PV_SCALER_NAME = "rl_price_volume_atr_norm_scaler.joblib" # Seus nomes descritivos | |
| RL_INDICATOR_SCALER_NAME = "rl_other_indicators_scaler.joblib" | |
| FINAL_DENSE_UNITS1_EXTRACTOR=DEFAULT_EXTRACTOR_KWARGS | |
| USE_SENTIMENT_CONFIG=True |