Traders profissionais não ficam horas olhando para gráficos. Eles automatizam o monitoramento e só tomam decisões quando o sistema avisa que algo mudou.
Neste post você vai construir exatamente isso: um robô em Python que acorda antes de você, analisa suas ações favoritas da B3, calcula os principais indicadores técnicos, usa IA para interpretar os dados e te manda um relatório completo no Telegram — tudo antes do mercado abrir.
pip install yfinance pandas python-telegram-bot google-generativeai python-dotenvCrie o .env:
TELEGRAM_TOKEN=seu_token_do_botfather
TELEGRAM_CHAT_ID=seu_chat_id
GEMINI_API_KEY=sua_chave_geminiComo criar o bot no Telegram:
Como descobrir seu chat_id: Mande qualquer mensagem para o bot e acesse: https://api.telegram.org/bot<SEU_TOKEN>/getUpdates
ACOES_MONITORADAS = ["PETR4.SA", "VALE3.SA", "ITUB4.SA", "MGLU3.SA"]O sufixo .SA indica ações da bolsa brasileira B3. Funciona com qualquer ticker do yfinance — ações americanas não precisam do sufixo.
import yfinance as yf
import pandas as pd
import asyncio
from telegram import Bot
import google.generativeai as genai
from dotenv import load_dotenv
import os
from datetime import datetime
load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
model = genai.GenerativeModel("gemini-2.0-flash")
ACOES_MONITORADAS = ["PETR4.SA", "VALE3.SA", "ITUB4.SA", "MGLU3.SA"]
def coletar_dados(ticker, dias=60):
ativo = yf.Ticker(ticker)
return ativo.history(period=f"{dias}d")
def calcular_indicadores(df):
preco_atual = df["Close"].iloc[-1]
preco_ontem = df["Close"].iloc[-2]
variacao_dia = ((preco_atual - preco_ontem) / preco_ontem) * 100
mm20 = df["Close"].rolling(20).mean().iloc[-1]
mm50 = df["Close"].rolling(50).mean().iloc[-1]
vol_medio = df["Volume"].rolling(20).mean().iloc[-1]
vol_hoje = df["Volume"].iloc[-1]
max_30d = df["Close"].tail(30).max()
min_30d = df["Close"].tail(30).min()
delta = df["Close"].diff()
ganhos = delta.where(delta > 0, 0).rolling(14).mean()
perdas = (-delta.where(delta < 0, 0)).rolling(14).mean()
rsi = 100 - (100 / (1 + ganhos / perdas))
return {
"preco_atual": round(preco_atual, 2),
"variacao_dia": round(variacao_dia, 2),
"mm20": round(mm20, 2),
"mm50": round(mm50, 2),
"volume_relativo": round(vol_hoje / vol_medio, 2),
"max_30d": round(max_30d, 2),
"min_30d": round(min_30d, 2),
"rsi": round(rsi.iloc[-1], 1)
}
def analisar_com_ia(ticker, indicadores):
prompt = f"""Você é um analista técnico experiente do mercado financeiro brasileiro.
Analise os dados abaixo para a ação {ticker} e gere uma análise OBJETIVA e DIRETA.
DADOS:
- Preço atual: R$ {indicadores['preco_atual']}
- Variação no dia: {indicadores['variacao_dia']}%
- Média Móvel 20 dias: R$ {indicadores['mm20']}
- Média Móvel 50 dias: R$ {indicadores['mm50']}
- Volume relativo: {indicadores['volume_relativo']}x
- Máxima 30 dias: R$ {indicadores['max_30d']}
- Mínima 30 dias: R$ {indicadores['min_30d']}
- RSI (14): {indicadores['rsi']}
Responda com:
1. Tendência atual — 1 frase
2. Pontos de atenção — 2 bullets
3. RSI — sobrecomprado/sobrevendido/neutro
4. Sentimento: POSITIVO / NEUTRO / NEGATIVO
Máximo 120 palavras. Não é recomendação de investimento."""
return model.generate_content(prompt).text
async def enviar_telegram(mensagem):
bot = Bot(token=os.getenv("TELEGRAM_TOKEN"))
await bot.send_message(
chat_id=os.getenv("TELEGRAM_CHAT_ID"),
text=mensagem,
parse_mode="Markdown"
)
async def rodar_analise_diaria():
data_hoje = datetime.now().strftime("%d/%m/%Y %H:%M")
mensagem = f"📊 *Análise Diária — {data_hoje}*\n\n"
for ticker in ACOES_MONITORADAS:
try:
df = coletar_dados(ticker)
indicadores = calcular_indicadores(df)
analise = analisar_com_ia(ticker, indicadores)
emoji = "🟢" if indicadores["variacao_dia"] > 0 else "🔴"
mensagem += (
f"{emoji} *{ticker}* — R$ {indicadores['preco_atual']} "
f"({indicadores['variacao_dia']:+.2f}%)\n"
f"{analise}\n"
f"{'─' * 28}\n\n"
)
except Exception as e:
mensagem += f"⚠️ *{ticker}*: Erro — {e}\n\n"
mensagem += "_⚠️ Análise educacional. Não é recomendação de investimento._"
await enviar_telegram(mensagem)
print("✅ Relatório enviado!")
if __name__ == "__main__":
asyncio.run(rodar_analise_diaria())Linux/Mac — cron (roda às 8h30 nos dias úteis):
crontab -eAdicione essa linha:
30 8 * * 1-5 /usr/bin/python3 /caminho/do/script/analise_acoes.py1-5 significa segunda a sexta — não roda no fim de semana.
Windows — usando schedule:
pip install scheduleimport schedule
import time
import asyncio
def job():
asyncio.run(rodar_analise_diaria())
schedule.every().monday.at("08:30").do(job)
schedule.every().tuesday.at("08:30").do(job)
schedule.every().wednesday.at("08:30").do(job)
schedule.every().thursday.at("08:30").do(job)
schedule.every().friday.at("08:30").do(job)
while True:
schedule.run_pending()
time.sleep(60)📊 Análise Diária — 19/05/2026 08:30
🟢 PETR4.SA — R$ 38.45 (+1.23%)
Tendência de alta no curto prazo. Preço acima das MM20 e MM50.
- Volume 1.4x acima da média — confirma força compradora
- RSI em 62 — neutro, espaço para continuar subindo
Sentimento: POSITIVO
────────────────────────────
🔴 MGLU3.SA — R$ 9.12 (-2.45%)
Tendência de baixa. Preço abaixo das duas médias móveis.
- Volume dentro da média — movimento sem convicção
- RSI em 38 — próximo de sobrevenda, atenção para reversão
Sentimento: NEGATIVO
⚠️ Análise educacional. Não é recomendação de investimento.Em menos de 100 linhas de Python você tem um analista técnico trabalhando para você todos os dias úteis antes do mercado abrir. A IA interpreta os dados e entrega em linguagem humana — você decide o que fazer com a informação.
Quer ir além? No livro O Arquiteto de IA mostro como construir sistemas com múltiplas fontes de dados e execução integrada a corretoras. Acesse aqui
Leia também: Como Criar um Bot no WhatsApp com IA usando Python
O Arquiteto de IA é orgulhosamente mantido com WordPress