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.

O que vamos construir

  • Coleta automática de dados de qualquer ação da B3
  • Cálculo de RSI, médias móveis MM20 e MM50, e volume relativo
  • Análise em linguagem natural gerada por IA com Gemini
  • Envio automático no Telegram toda manhã
  • Agendamento para rodar sozinho nos dias úteis

Instalação

 
 
pip install yfinance pandas python-telegram-bot google-generativeai python-dotenv

Crie o .env:

 
 
TELEGRAM_TOKEN=seu_token_do_botfather
TELEGRAM_CHAT_ID=seu_chat_id
GEMINI_API_KEY=sua_chave_gemini

Como criar o bot no Telegram:

  1. Fale com @BotFather no Telegram
  2. Use o comando /newbot
  3. Copie o token gerado

Como descobrir seu chat_id: Mande qualquer mensagem para o bot e acesse: https://api.telegram.org/bot<SEU_TOKEN>/getUpdates

As ações monitoradas

 
 
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.

Código completo

 
 
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())

Agendando para rodar automaticamente

Linux/Mac — cron (roda às 8h30 nos dias úteis):

 
 
crontab -e

Adicione essa linha:

 
 
30 8 * * 1-5 /usr/bin/python3 /caminho/do/script/analise_acoes.py

1-5 significa segunda a sexta — não roda no fim de semana.

Windows — usando schedule:

 
 
pip install schedule
 
 
import 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)

Exemplo do alerta no Telegram

 
 
📊 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.

Como evoluir o sistema

  • Alertas por gatilho — notifica só quando RSI < 30 ou volume 3x acima da média
  • Análise de notícias sobre as ações com web scraping
  • Gráfico gerado automaticamente e enviado como imagem no Telegram
  • Dados fundamentalistas — P/L, ROE, dividend yield via yfinance

Conclusão

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