# B3 Analysis

> Load this skill when analyzing Brazilian stocks listed on B3, building investment portfolios with Brazilian equities, or interpreting data from yfinance, BCB API, and Google News PT-BR. Provides the quality methodology, technical indicator reference, and sector impact framework used in /analyze and /portfolio.

- Skill: `guhcostan/b3-analysis` (Agent Skill)
- Install (CLI): `npx skillmds@latest add guhcostan/b3-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/guhcostan/b3-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: guhcostan (https://skillmd.com/u/guhcostan)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/guhcostan/b3-analysis

---


## B3 Quality Checklist

Methodology from Logan's tier list (YouTube: @investimentosemevidencia). Criteria 1, 2, 3 are **ELIMINATORY** — fail any = automatic AVOID regardless of other factors.

| # | Criterion | Eliminatory | How to evaluate |
|---|---|---|---|
| 1 | **Consistent growing profits (escadinha)** | 🔴 YES | Stair-step pattern in income statement, no recurring losses. #1 criterion. |
| 2 | **Liquid ON shares (ticker ending in 3)** | 🔴 YES | PN-only or Unit-only with no ON liquidity = disqualified. Verify volume in OHLCV data. |
| 3 | **No recent IPO** | 🔴 YES | Minimum 5+ years of profit history on B3. |
| 4 | **Novo Mercado listing** | No | Highest B3 governance level |
| 5 | **Tag Along 100%** | No | Minority protection — < 100% = penalize |
| 6 | **Controlled debt** | No | Prefer net cash or D/EBITDA < 2x |
| 7 | **Expected return > CDI** | No | Selic ~14,75% a.a. — justify via earnings yield, DCF, or DY |

### Score interpretation (after passing eliminatory filters)
- 6–7: Strong Buy / Elite
- 5: Buy
- 4: Hold / Monitor
- 0–3: Avoid

### Tier classification
- **Elite**: All 7 ✅, proven stair-step growth, large/growing TAM
- **Bom**: Passes eliminatory, 5–6/7, minor flags
- **OK**: Passes eliminatory, 4/7, one notable weakness
- **Mé**: Passes eliminatory barely, erratic profits or structural limits
- **Você é Louco**: Fails an eliminatory criterion
- **Oi**: Persistent losses, cotação trending to zero

## Technical Indicator Reference

When interpreting `fetch_stock.py` output:

| Indicator | Bullish Signal | Bearish Signal |
|---|---|---|
| Close > SMA 200 | Uptrend confirmed | Below = downtrend |
| SMA 50 crosses SMA 200 up | Golden cross | Death cross |
| RSI 14 < 30 | Oversold — possible entry | RSI > 70 = overbought |
| MACD hist positive & rising | Momentum building | Negative & falling |
| Price near Bollinger Lower | Potential bounce | |
| ADX > 25 | Strong trend — confirm direction | ADX < 20 = ranging market |

## Macro Impact by Sector

| Sector | High Selic Impact |
|---|---|
| Banking (ITUB, BBAS) | Mixed — spread benefits, but higher default risk |
| Utilities (EQTL, SAPR) | Negative — regulated returns compressed vs risk-free |
| Healthcare (RADL, FLRY) | Neutral-negative — capex financing more expensive |
| Retail (LREN, RENT) | Negative — consumer credit more expensive |
| Exporters (VALE, SUZB) | Positive — stronger USD boosts BRL revenue |
| Technology (TOTS) | Negative — high growth DCF heavily discounted |
| Insurance (PSSA, BBSE) | Positive — float income rises with higher rates |

## Red Flags

- Ticker final 4/11 only, no ON liquidity — bad faith (wants capital without losing control)
- Controlling shareholder holds only ON, forces investors into PN — misalignment
- Tag Along < 100%
- Heavy state interference (pricing, dividend policy risk)
- D/EBITDA > 3x
- Highly cyclical commodity sector without multi-decade consistent track record

## Output Rules

- Always respond in **Portuguese (Brazil)**
- **Every report must begin with the disclaimer:** `⚠️ **Aviso:** Este relatório é gerado por agentes de IA para fins exclusivamente **educacionais e de estudo pessoal**. Não constitui recomendação de investimento, consultoria financeira ou análise profissional. Renda variável envolve risco de perda do capital investido.`
- Always compare expected equity return vs CDI explicitly
- State clearly when data is unavailable or scripts return errors
- Never recommend leverage or derivatives — long-only equity analysis only
- Minimum position size for portfolio allocation: R$ 500

## Universo B3 (Screening)

Usado pelo `/b3:screen` como universo padrão de triagem. Apenas ações ON (final 3) ou com ON líquida conhecida. Atualizar conforme necessário.

```
Bancos:         ITUB3, BBAS3, BBDC3, SANB3, BRSR3
Seguros:        PSSA3, BBSE3, IRBR3, ODPV3
Varejo:         LREN3, ARZZ3, VULC3, PNVL3, VIVA3, GRND3
Saúde:          FLRY3, HAPV3, RDOR3, DASA3, HYPE3
Tech/Software:  TOTS3, INTB3
Energia:        EQTL3, EGIE3, TAEE3, CPFE3, NEOE3
Saneamento:     SAPR3, SBSP3, CSMG3
Industrial:     WEGE3, ROMI3, FRAS3, LEVE3
Farmácias:      RADL3
Petróleo:       PETR3, PRIO3, RECV3
Mineração:      VALE3, GOAU3, GGBR3
Agro:           SLCE3, SMTO3, AGRO3
Logística:      RENT3, RAIL3, EMBR3
Construção:     DIRR3, CYRE3
Celulose:       SUZB3, KLBN3, RANI3
Alimentos:      ABEV3, JBSS3, MRFG3, MDIA3
Educação:       YDUQ3
```

> Este universo pode ser substituído por qualquer lista de tickers via `/b3:screen TICKER1 TICKER2 ...`

## Gotchas

- **Criterion 2 is often misread**: check the actual ticker suffix AND verify daily volume > R$ 10M. A ticker ending in 3 with low liquidity still fails criterion 2.
- **yfinance P/L can be misleading for Brazilian stocks**: cross-check against the income statement returned by `fetch_stock.py`. Trailing PE from `info` uses US GAAP adjustments.
- **CDI is monthly in BCB data**: `fetch_macro.py` converts it to annualized, but always double-check the annualization logic when citing CDI % a.a.
- **Google News RSS has no pagination**: if the lookback window is long and articles are sparse, `fetch_news.py` may return fewer results than expected. This is a data gap, not an error.
- **D/EBITDA from yfinance uses `debtToEquity`** (debt/equity ratio), not debt/EBITDA. To get D/EBITDA, divide `totalDebt` by `ebitda` from the fundamentals output.
- **Score ≤ 2 = exclude from portfolio regardless of macro environment**. No macro tailwind overrides a failed eliminatory criterion.

