Dashboard interativo para análise de retornos históricos de ativos e índices da B3.
Lê automaticamente a planilha Excel, processa os dados e exibe estatísticas completas.
Ativos incluídos: IBOV, SMLL, ICON, IEEX, IFNC, IMAT, IMOB, MLCX, INDX, CCMFUT, BGIFUT, VALE3, PETR4, ITUB4
Cobertura: 1994–2026 | Total de registros: 3.413 observações mensais
mercado-stats/
├── b3stats.html ← DASHBOARD STANDALONE (abre direto no navegador)
├── dados.json ← Dados processados (gerado automaticamente)
├── dados_embed.json ← Dados compactos (embutidos no HTML)
│
├── backend/
│ ├── main.py ← API REST (FastAPI)
│ └── requirements.txt ← Dependências Python
│
└── frontend/
├── index.html ← Frontend SPA
└── src/
└── app.js ← Lógica do frontend (com API)
Abra diretamente no navegador:
# macOS
open b3stats.html
# Linux
xdg-open b3stats.html
# Windows
start b3stats.html
✅ Funciona offline. Todos os 3.413 registros estão embutidos no HTML.
Não precisa de Python, Node, servidor ou internet.
cd backend
pip install -r requirements.txt
# A partir da pasta raiz do projeto
uvicorn backend.main:app --reload --port 8000
O servidor estará disponível em: http://localhost:8000
Documentação interativa da API: http://localhost:8000/docs
# Em outro terminal, sirva o frontend
cd frontend
python3 -m http.server 3000
Abra http://localhost:3000 no navegador.
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /ativos |
Lista todos os ativos disponíveis |
| GET | /dados?ativo=IBOV&mes=1 |
Série histórica filtrada |
| GET | /estatisticas?ativo=IBOV&mes=1 |
Estatísticas completas |
| GET | /heatmap?ativo=IBOV |
Matriz ano × mês para heatmap |
| GET | /ranking?ativo=IBOV |
Ranking dos meses por retorno médio |
| GET | /comparacao?ativos=IBOV,SMLL&mes=1 |
Comparação entre ativos |
| Parâmetro | Tipo | Descrição |
|---|---|---|
mes |
int (1–12) | Filtrar por mês específico |
ano_inicio |
int | Ano inicial do período |
ano_fim |
int | Ano final do período |
apenas_positivos |
bool | Somente retornos > 0 |
apenas_negativos |
bool | Somente retornos < 0 |
acima_da_media |
bool | Somente retornos acima da média |
abaixo_da_media |
bool | Somente retornos abaixo da média |
# IBOV em Janeiro — todos os anos
curl "http://localhost:8000/estatisticas?ativo=IBOV&mes=1"
# PETR4 em Outubro 2010–2024, apenas meses positivos
curl "http://localhost:8000/dados?ativo=PETR4&mes=10&ano_inicio=2010&ano_fim=2024&apenas_positivos=true"
# Heatmap completo do IBOV
curl "http://localhost:8000/heatmap?ativo=IBOV"
# Ranking de meses do VALE3
curl "http://localhost:8000/ranking?ativo=VALE3"
# Comparação IBOV vs SMLL vs MLCX em Dezembro
curl "http://localhost:8000/comparacao?ativos=IBOV,SMLL,MLCX&mes=12"
Para incorporar uma nova versão da planilha Excel:
python3 << 'EOF'
import pandas as pd
import json
SHEETS = ['IBOV','SMLL','ICON','IEEX','IFNC','IMAT','IMOB','MLCX','INDX','CCMFUT','BGIFUT','VALE3','PETR4','ITUB4']
xl = pd.ExcelFile('sua_planilha.xlsx')
records = []
for sheet in SHEETS:
if sheet not in xl.sheet_names:
continue
df = xl.parse(sheet, header=None)
for _, row in df.iterrows():
try:
ano = int(float(str(row[0]).replace('.0','')))
except:
continue
if not 1990 <= ano <= 2030:
continue
for m in range(1, 13):
val = row[m] if m < len(row) else None
if pd.notna(val) and isinstance(val, (int, float)):
records.append([sheet, ano, m, round(float(val), 6)])
with open('dados_embed.json', 'w') as f:
json.dump(records, f, separators=(',',':'))
print(f"✅ {len(records)} registros exportados")
EOF
Depois regenere o b3stats.html substituindo o conteúdo da variável RAW pelo novo JSON.
| Camada | Tecnologia |
|---|---|
| Dados | Pandas, openpyxl |
| Backend | Python 3.11, FastAPI, Uvicorn |
| Frontend | HTML5, CSS3, JavaScript ES2022 |
| Gráficos | Chart.js 4.4 |
| Fontes | Google Fonts (Syne, DM Mono, Inter) |
| Banco | Dados em memória (DataFrame Pandas / JSON embutido) |
const RAW = [...] com 3.413 arrays no JSallow_origins=["*"])Uso interno. Dados históricos da B3.