Aprenda a ler gráficos de ações como um profissional. Este guia explica suportes, resistências, médias móveis e os principais padrões de candlesticks para você tomar melhores decisões de investimento.
O Que é Análise Técnica?
A análise técnica é o estudo do comportamento histórico dos preços para prever movimentos futuros. Diferente da análise fundamentalista (que analisa balanços e indicadores), a análise técnica foca no gráfico de preços e no volume negociado.
Análise Técnica vs Fundamentalista
| Aspecto | Análise Técnica | Análise Fundamentalista |
|---|---|---|
| Foco | Preço e volume | Balanços e indicadores |
| Prazo | Curto/médio prazo | Longo prazo |
| Pergunta | "Quando comprar?" | "O que comprar?" |
| Base | Padrões gráficos | Valor intrínseco |
| Uso | Trading, timing | Investimento, seleção |
Importante: As duas análises podem ser complementares. Muitos investidores usam fundamentalista para escolher QUAIS ações comprar e técnica para decidir QUANDO comprar.
Princípios Fundamentais
1. O Preço Desconta Tudo
Toda informação disponível (notícias, resultados, expectativas) já está refletida no preço atual da ação.
2. Preços se Movem em Tendências
Os preços não se movem aleatoriamente — eles seguem tendências que podem ser identificadas e aproveitadas.
3. A História se Repete
Padrões de comportamento do mercado tendem a se repetir porque refletem a psicologia humana (medo, ganância, esperança).
Tendências de Mercado
Tipos de Tendência
TENDÊNCIA DE ALTA (Bull Market)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📈
●
●
●
● → Topos e fundos ascendentes
●
●
TENDÊNCIA DE BAIXA (Bear Market)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●
●
● → Topos e fundos descendentes
●
●
● 📉
TENDÊNCIA LATERAL (Consolidação)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
● ● ●
● ● ● → Preço oscila em faixa
● ● ●
↔️Como Identificar Tendências
Tendência de Alta:
- Topos cada vez mais altos (higher highs)
- Fundos cada vez mais altos (higher lows)
- Preço acima das médias móveis
Tendência de Baixa:
- Topos cada vez mais baixos (lower highs)
- Fundos cada vez mais baixos (lower lows)
- Preço abaixo das médias móveis
Consolidação/Lateral:
- Topos e fundos no mesmo nível
- Preço oscilando entre suporte e resistência
- Volume geralmente diminui
Suporte e Resistência
O Que São?
Suporte: Nível de preço onde compradores entram com força, impedindo quedas maiores. "Chão" do preço.
Resistência: Nível de preço onde vendedores entram com força, impedindo altas maiores. "Teto" do preço.
SUPORTE E RESISTÊNCIA
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
R$ 42.00 ─────────────────────── RESISTÊNCIA 🔴
● ● ●
● ●
● ●
● ●
● ●
● ●
● ● ●
R$ 35.00 ─────────────────────── SUPORTE 🟢
O preço "bate" no suporte e resistência
múltiplas vezes antes de romperPor Que Funcionam?
- Memória do mercado: Investidores lembram onde compraram/venderam
- Psicologia: Números redondos (R$ 10, R$ 50, R$ 100) são significativos
- Ordens acumuladas: Muitas ordens de compra/venda ficam nesses níveis
- Profecias autorrealizáveis: Muitos traders olham os mesmos níveis
Como Identificar Suportes e Resistências
Suportes fortes:
- Fundos anteriores onde o preço reverteu
- Médias móveis importantes (21, 50, 200)
- Números psicológicos (10, 20, 50, 100)
- Gaps não preenchidos
- Volume alto no nível
Resistências fortes:
- Topos anteriores onde o preço reverteu
- Máximas históricas (all-time high)
- Zonas de congestão anterior
- Linhas de tendência de baixa
Rompimentos (Breakouts)
Quando o preço rompe um suporte ou resistência com volume, geralmente continua na direção do rompimento:
ROMPIMENTO DE RESISTÊNCIA
━━━━━━━━━━━━━━━━━━━━━━━━━━
● → CONTINUAÇÃO
●
════════●════════ ← RESISTÊNCIA VIRA SUPORTE
● ●
●
●
Volume alto no rompimento = mais confiávelRegra importante: Resistência rompida vira suporte. Suporte rompido vira resistência.
Médias Móveis
O Que São?
Médias móveis suavizam o preço, mostrando a tendência mais claramente. São calculadas pela média dos últimos N períodos.
Tipos de Médias Móveis
| Tipo | Sigla | Característica |
|---|---|---|
| Simples | SMA/MMS | Todos os períodos têm mesmo peso |
| Exponencial | EMA/MME | Períodos recentes têm mais peso |
| Ponderada | WMA | Peso crescente para períodos recentes |
Médias Mais Usadas
| Período | Uso | Significado |
|---|---|---|
| 9 períodos | Day trade, scalp | Muito curto prazo |
| 21 períodos | Swing trade | Curto prazo (1 mês) |
| 50 períodos | Position trade | Médio prazo (2 meses) |
| 200 períodos | Investimento | Longo prazo (1 ano) |
Calculando Médias Móveis com Python
import requests
import pandas as pd
def get_historical_data(symbol: str, token: str) -> pd.DataFrame:
"""Busca dados históricos da brapi"""
url = f"https://brapi.dev/api/quote/{symbol}"
params = {
"token": token,
"range": "1y",
"interval": "1d"
}
response = requests.get(url, params=params)
data = response.json()['results'][0]['historicalDataPrice']
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'], unit='s')
df = df.sort_values('date')
return df
def calculate_moving_averages(df: pd.DataFrame) -> pd.DataFrame:
"""Calcula médias móveis"""
# Média Móvel Simples
df['SMA_9'] = df['close'].rolling(window=9).mean()
df['SMA_21'] = df['close'].rolling(window=21).mean()
df['SMA_50'] = df['close'].rolling(window=50).mean()
df['SMA_200'] = df['close'].rolling(window=200).mean()
# Média Móvel Exponencial
df['EMA_9'] = df['close'].ewm(span=9, adjust=False).mean()
df['EMA_21'] = df['close'].ewm(span=21, adjust=False).mean()
return df
df = get_historical_data('PETR4', 'SEU_TOKEN')
df = calculate_moving_averages(df)
# Último fechamento e médias
ultimo = df.iloc[-1]
print(f"PETR4 - Análise de Médias Móveis")
print(f"Fechamento: R$ {ultimo['close']:.2f}")
print(f"SMA 9: R$ {ultimo['SMA_9']:.2f}")
print(f"SMA 21: R$ {ultimo['SMA_21']:.2f}")
print(f"SMA 50: R$ {ultimo['SMA_50']:.2f}")Sinais de Compra e Venda
Cruzamento de Médias (Golden Cross / Death Cross):
GOLDEN CROSS (Sinal de Alta)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●──────────● SMA 50 (lenta)
●────X────●
●────● SMA 21 (rápida)
↑
COMPRA: Média rápida cruza acima da lenta
DEATH CROSS (Sinal de Baixa)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●────● SMA 21 (rápida)
●────X────●
●──────────● SMA 50 (lenta)
↑
VENDA: Média rápida cruza abaixo da lentaCódigo para detectar cruzamentos:
def detect_crossovers(df: pd.DataFrame) -> list:
"""Detecta cruzamentos de médias móveis"""
signals = []
for i in range(1, len(df)):
# Golden Cross: SMA9 cruza acima de SMA21
if (df['SMA_9'].iloc[i-1] < df['SMA_21'].iloc[i-1] and
df['SMA_9'].iloc[i] > df['SMA_21'].iloc[i]):
signals.append({
'date': df['date'].iloc[i],
'type': 'GOLDEN_CROSS',
'signal': 'COMPRA',
'price': df['close'].iloc[i]
})
# Death Cross: SMA9 cruza abaixo de SMA21
elif (df['SMA_9'].iloc[i-1] > df['SMA_21'].iloc[i-1] and
df['SMA_9'].iloc[i] < df['SMA_21'].iloc[i]):
signals.append({
'date': df['date'].iloc[i],
'type': 'DEATH_CROSS',
'signal': 'VENDA',
'price': df['close'].iloc[i]
})
return signals
# Uso
sinais = detect_crossovers(df)
for s in sinais[-5:]: # Últimos 5 sinais
print(f"{s['date'].strftime('%d/%m/%Y')}: {s['signal']} a R$ {s['price']:.2f}")Preço vs Média como Suporte/Resistência
- Preço acima da SMA 200: Tendência de longo prazo é de alta
- Preço abaixo da SMA 200: Tendência de longo prazo é de baixa
- Médias servem como suporte/resistência dinâmicos
Candlesticks (Velas Japonesas)
Anatomia de um Candlestick
CANDLESTICK DE ALTA CANDLESTICK DE BAIXA
(Verde/Branco) (Vermelho/Preto)
│ ← Sombra superior │
│ │
┌───┴───┐ ← Fechamento ┌───┴───┐ ← Abertura
│ │ │███████│
│ │ Corpo │███████│ Corpo
│ │ │███████│
└───┬───┘ ← Abertura └───┬───┘ ← Fechamento
│ │
│ ← Sombra inferior │
Fechou ACIMA da abertura Fechou ABAIXO da aberturaPadrões de Candlesticks Mais Importantes
Padrões de Reversão de Alta (Compra)
1. Martelo (Hammer)
│
┌───┴───┐
│ │ ← Corpo pequeno no topo
└───┬───┘
│
│
│ ← Sombra inferior longa (2-3x o corpo)
│
Aparece após queda. Indica que vendedores perderam força.2. Engolfo de Alta (Bullish Engulfing)
Dia 1 Dia 2
┌─────┐
│█████│ ┌───────┐
│█████│ │ │
└──┬──┘ │ │ ← Corpo verde "engole" o vermelho
│ │ │
└───┬───┘
│
Corpo verde maior que o corpo vermelho anterior.
Sinal de reversão após queda.3. Estrela da Manhã (Morning Star)
Dia 1 Dia 2 Dia 3
┌─────┐ ┌───────┐
│█████│ │ │
│█████│ │ │
│█████│ ┌─┐ │ │
└──┬──┘ └─┘ └───────┘
Gap
Padrão de 3 candles: vermelho grande + corpo pequeno + verde grande
Forte sinal de reversão de alta.Padrões de Reversão de Baixa (Venda)
1. Enforcado (Hanging Man)
│
│
│ ← Sombra inferior longa
│
┌───┴───┐
│ │ ← Corpo pequeno no topo
└───────┘
Similar ao martelo, mas aparece após ALTA.
Indica que compradores podem estar perdendo força.2. Engolfo de Baixa (Bearish Engulfing)
Dia 1 Dia 2
┌───────┐
┌─────┐ │███████│
│ │ │███████│ ← Corpo vermelho "engole" o verde
│ │ │███████│
└──┬──┘ │███████│
│ └───┬───┘
│
Corpo vermelho maior que o corpo verde anterior.
Sinal de reversão após alta.3. Estrela Cadente (Shooting Star)
│
│
│ ← Sombra superior longa
│
┌───┴───┐
│ │ ← Corpo pequeno na base
└───────┘
Aparece após alta. Indica rejeição do preço mais alto.Padrões de Continuação
Doji (Indecisão)
│
│
────┼──── ← Abertura = Fechamento (corpo mínimo)
│
│
Mercado indeciso. Pode indicar reversão se aparecer
após movimento forte.Indicadores Técnicos
IFR - Índice de Força Relativa (RSI)
Mede a força do movimento de preço em uma escala de 0-100.
- RSI > 70: Sobrecomprado (possível correção para baixo)
- RSI < 30: Sobrevendido (possível recuperação)
- RSI = 50: Neutro
def calculate_rsi(df: pd.DataFrame, periods: int = 14) -> pd.Series:
"""Calcula o RSI (Relative Strength Index)"""
delta = df['close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=periods).mean()
avg_loss = loss.rolling(window=periods).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
return rsi
# Uso
df['RSI'] = calculate_rsi(df)
ultimo_rsi = df['RSI'].iloc[-1]
if ultimo_rsi > 70:
print(f"RSI: {ultimo_rsi:.1f} - ⚠️ SOBRECOMPRADO")
elif ultimo_rsi < 30:
print(f"RSI: {ultimo_rsi:.1f} - ⚠️ SOBREVENDIDO")
else:
print(f"RSI: {ultimo_rsi:.1f} - Neutro")MACD - Convergência/Divergência de Médias Móveis
Identifica mudanças na força, direção e duração de uma tendência.
def calculate_macd(df: pd.DataFrame) -> pd.DataFrame:
"""Calcula MACD e Linha de Sinal"""
# MACD = EMA(12) - EMA(26)
ema_12 = df['close'].ewm(span=12, adjust=False).mean()
ema_26 = df['close'].ewm(span=26, adjust=False).mean()
df['MACD'] = ema_12 - ema_26
# Linha de Sinal = EMA(9) do MACD
df['MACD_Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
# Histograma = MACD - Sinal
df['MACD_Hist'] = df['MACD'] - df['MACD_Signal']
return df
# Sinais
# COMPRA: MACD cruza acima da linha de sinal
# VENDA: MACD cruza abaixo da linha de sinalBandas de Bollinger
Mostram volatilidade e níveis de sobrecompra/sobrevenda.
def calculate_bollinger_bands(df: pd.DataFrame,
periods: int = 20,
std_dev: int = 2) -> pd.DataFrame:
"""Calcula Bandas de Bollinger"""
# Banda central = SMA
df['BB_Middle'] = df['close'].rolling(window=periods).mean()
# Desvio padrão
rolling_std = df['close'].rolling(window=periods).std()
# Bandas superior e inferior
df['BB_Upper'] = df['BB_Middle'] + (rolling_std * std_dev)
df['BB_Lower'] = df['BB_Middle'] - (rolling_std * std_dev)
return df
# Interpretação:
# Preço perto da banda superior = sobrecomprado
# Preço perto da banda inferior = sobrevendido
# Bandas apertando = baixa volatilidade (possível movimento forte)
# Bandas expandindo = alta volatilidadeAnálise Técnica na Prática
Sistema de Trading Completo
import requests
import pandas as pd
from dataclasses import dataclass
from typing import List
@dataclass
class TechnicalAnalysis:
symbol: str
price: float
trend: str # "ALTA", "BAIXA", "LATERAL"
rsi: float
rsi_signal: str
macd_signal: str
support: float
resistance: float
recommendation: str
def analyze_stock(symbol: str, token: str) -> TechnicalAnalysis:
"""Análise técnica completa de uma ação"""
# Busca dados
url = f"https://brapi.dev/api/quote/{symbol}"
params = {"token": token, "range": "6mo", "interval": "1d"}
response = requests.get(url, params=params)
data = response.json()['results'][0]
historical = data.get('historicalDataPrice', [])
if len(historical) < 50:
raise ValueError("Dados históricos insuficientes")
df = pd.DataFrame(historical)
df['date'] = pd.to_datetime(df['date'], unit='s')
df = df.sort_values('date')
# Calcula indicadores
df['SMA_21'] = df['close'].rolling(21).mean()
df['SMA_50'] = df['close'].rolling(50).mean()
df['RSI'] = calculate_rsi(df)
df = calculate_macd(df)
ultimo = df.iloc[-1]
price = ultimo['close']
# Determina tendência
if ultimo['SMA_21'] > ultimo['SMA_50'] and price > ultimo['SMA_21']:
trend = "ALTA"
elif ultimo['SMA_21'] < ultimo['SMA_50'] and price < ultimo['SMA_21']:
trend = "BAIXA"
else:
trend = "LATERAL"
# RSI Signal
rsi = ultimo['RSI']
if rsi > 70:
rsi_signal = "SOBRECOMPRADO"
elif rsi < 30:
rsi_signal = "SOBREVENDIDO"
else:
rsi_signal = "NEUTRO"
# MACD Signal
if ultimo['MACD'] > ultimo['MACD_Signal']:
macd_signal = "COMPRA"
else:
macd_signal = "VENDA"
# Suporte e Resistência (simplificado)
support = df['low'].tail(20).min()
resistance = df['high'].tail(20).max()
# Recomendação
bullish_signals = 0
if trend == "ALTA":
bullish_signals += 1
if rsi_signal == "SOBREVENDIDO":
bullish_signals += 1
if macd_signal == "COMPRA":
bullish_signals += 1
if bullish_signals >= 2:
recommendation = "COMPRA"
elif bullish_signals == 0:
recommendation = "VENDA"
else:
recommendation = "AGUARDAR"
return TechnicalAnalysis(
symbol=symbol,
price=price,
trend=trend,
rsi=rsi,
rsi_signal=rsi_signal,
macd_signal=macd_signal,
support=support,
resistance=resistance,
recommendation=recommendation
)
# Uso
analysis = analyze_stock('PETR4', 'SEU_TOKEN')
print(f"""
📊 ANÁLISE TÉCNICA - {analysis.symbol}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💰 Preço Atual: R$ {analysis.price:.2f}
📈 Tendência: {analysis.trend}
📉 Suporte: R$ {analysis.support:.2f}
📈 Resistência: R$ {analysis.resistance:.2f}
🔢 RSI: {analysis.rsi:.1f} ({analysis.rsi_signal})
📊 MACD: {analysis.macd_signal}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 RECOMENDAÇÃO: {analysis.recommendation}
""")Dicas Importantes
✅ Boas Práticas
- Combine indicadores: Nunca use apenas um indicador
- Confirme com volume: Movimentos com volume alto são mais confiáveis
- Respeite o stop loss: Defina onde sair ANTES de entrar
- Opere a favor da tendência: "The trend is your friend"
- Pratique em simuladores: Não arrisque dinheiro real no início
❌ Erros Comuns
- Over-trading: Operar demais por ansiedade
- Ignorar stop loss: Deixar perdas crescerem
- Análise paralisia: Usar muitos indicadores
- Operar contra tendência: Tentar "pegar facas caindo"
- Não ter plano: Entrar sem saber quando sair
Conclusão
A análise técnica é uma ferramenta poderosa quando usada corretamente. Os conceitos mais importantes são:
- Tendências: Identifique se o mercado está em alta, baixa ou lateral
- Suporte/Resistência: Níveis onde o preço tende a parar
- Médias Móveis: Indicam tendência e servem como suporte/resistência
- Volume: Confirma a força dos movimentos
- Indicadores: RSI, MACD e Bollinger complementam a análise
Próximos Passos
- Crie sua conta na brapi - Dados históricos para análise
- Stock Screener - Filtre ações automaticamente
- Backtesting - Teste suas estratégias
- Bot de Telegram - Receba alertas
Use dados da brapi.dev para suas análises técnicas. Comece gratuitamente agora!
