Projeto de exploração e modelagem de série temporal do preço de fechamento da Apple (AAPL), comparando múltiplos modelos preditivos sobre dados corretamente tratados com log-retorno e RobustScaler.
Entender a estrutura estatística da série e avaliar como diferentes classes de modelos — estatísticos, ML e deep learning — se comportam em um problema de previsão de retornos financeiros diários.
Métrica primária: Direction Accuracy (DA%) — % de acertos na direção do movimento (alta/baixa).
| Modelo | Tipo | DA% Teste | DA% Holdout |
|---|---|---|---|
| Naive (lag-1) | Baseline | 52.4% | 65.0% |
| ARIMA(1,0,0) | Estatístico | 51.7% | 40.0% |
| Hybrid ARIMA + LSTM | Ensemble | 51.6% | — |
| LSTM (melhor grid) | Deep Learning | 51.0% | 35.0% |
| XGBoost | ML | 80.8% | 90.0% ✅ |
.
├── aapl_series_temporal.ipynb # Notebook principal (50 células)
├── validate_notebook_v2.py # Pipeline completo em script Python
├── images/ # Plots gerados durante a análise
│ ├── 01_serie_bruta.png
│ ├── 02_decomposicao.png
│ ├── 03_acf_bruto.png
│ ├── 04_log_retorno.png
│ ├── 05_acf_retorno.png
│ ├── 05_dist_retorno.png
│ ├── 07_splits.png
│ ├── 08_xgb_importance.png
│ ├── 09_lstm_learning.png
│ ├── 12_comparacao.png
│ └── 13_holdout_precos.png
├── pyproject.toml # Dependências (uv)
├── requirements.txt # Versões exatas
├── uv.lock # Lock file
└── .gitignore
| Seção | Conteúdo |
|---|---|
| 1. Setup | Imports, seeds, reprodutibilidade |
| 2. Coleta | yfinance 2015–2026, 2.786 pregões |
| 3. EDA Bruta | Série temporal, decomposição multiplicativa, ACF/PACF, ADF |
| 4. Log-Retorno | Estacionarização, ADF pós-diferenciação, Q-Q plot, Jarque-Bera |
| 5. Indicadores | Volatilidade realizada, RSI-14, momentum, Bollinger width |
| 6. Split | 70% treino / 15% val / 15% teste / 20 dias holdout |
| 7. Pré-processamento | RobustScaler fitado apenas no treino |
| 8. Métricas | DA% como métrica primária; sem MAPE (inválido para log-retornos ≈ 0) |
| 9. Baselines | Naive (lag-1) + ARIMA por auto_arima com rolling 1-step |
| 10. XGBoost | 500 árvores, early stopping, feature importance |
| 11. LSTM | Grid search: 36 configs (seq_len × units × dropout × lr) |
| 12. Hybrid | ARIMA captura autocorrelação + LSTM aprende nos resíduos |
| 13. Holdout | Avaliação final nos 20 dias nunca vistos |
| 14. Comparação | Tabela consolidada + plots |
| 15. Conclusões | Achados, limitações, próximos passos |
O preço bruto da AAPL cresceu ~850% entre 2015 e 2026 — série altamente não-estacionária (ADF p=0.977). O log-retorno log(P_t / P_{t-1}) remove a tendência e torna a série estacionária (ADF p≈0), resolvendo o problema de escalas incompatíveis entre treino e teste.
Baseado em mediana e IQR — mais robusto que MinMaxScaler para séries financeiras com picos de volatilidade (COVID, crises). Fitado exclusivamente no treino para evitar data leakage.
Log-retornos diários têm baixa dependência temporal (ARIMA seleciona AR(1)). Features de lag explícito lag_1..lag_20 + rolling stats capturam toda a estrutura temporal que o LSTM extrairia de sequências — sem o custo de treinamento. Em séries com baixo sinal/ruído, modelos mais simples generalizam melhor.
# Com uv (recomendado)
uv sync
# Ou com pip
pip install -r requirements.txt.venv/bin/python -m ipykernel install --user --name crypto_lstm --display-name "Python 3.10 (crypto_lstm)".venv/bin/jupyter lab aapl_series_temporal.ipynbSelecione o kernel "Python 3.10 (crypto_lstm)".
| Lib | Uso |
|---|---|
yfinance |
Download de dados históricos |
tensorflow / keras |
Modelo LSTM |
xgboost |
Gradient boosting |
statsmodels |
Decomposição STL, ADF, ARIMA |
pmdarima |
auto_arima (seleção por AIC) |
scikit-learn |
RobustScaler, métricas |
pandas / numpy |
Manipulação de dados |
matplotlib / seaborn |
Visualizações |
- Walk-forward validation (retreino periódico)
- Features de sentimento (NLP sobre notícias)
- ARIMAX com features técnicas como exógenas
- Temporal Fusion Transformer
- Sharpe Ratio como métrica financeira complementar