File size: 6,905 Bytes
5f10e37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a68bc6
 
5f10e37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
124
125
126
# 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