File size: 5,992 Bytes
b3a7985
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# --- 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"