Agentes de IA e a Bolsa de Valores: Um Guia Visual e Prático
Um agente de IA pode investir por você? Veja o que as evidências dizem, o que os agentes fazem bem e como montar um com segurança: níveis de confiança, um portão de ordens com limites, botão de parada, armadilhas de backtest, experimentos reais, gráficos e um caminho até o dinheiro real.

Nesta página
Imagine dizer a um programa: "Vigie o mercado para mim e opere quando fizer sentido." Com os agentes de IA de hoje, isso é tecnicamente possível. Um agente de IA é um programa que usa um modelo de IA para decidir o próximo passo e que pode agir por meio de ferramentas, como a API de uma corretora. Já existem ferramentas de corretoras para isso, e configurar uma leva minutos.
Se você deveria fazer isso é outra questão. Neste guia você vai ver o que as evidências dizem, o que os agentes realmente fazem bem e quanta confiança dar a eles. Depois vai construir a parte mais importante, um portão entre o modelo e o seu dinheiro. Você também vai cair de propósito nas armadilhas clássicas de backtest, para saber reconhecê-las, e vai seguir um caminho passo a passo do dinheiro falso ao dinheiro real. Exercícios fecham o artigo.
Este é um guia educativo, e não uma recomendação de investimento. Ele não recomenda nenhum investimento, e ninguém pode prometer retornos. Operar na bolsa pode dar prejuízo, inclusive de tudo o que você investiu. Nenhuma ordem real foi enviada para este guia. Os experimentos com modelos rodaram com uma ação inventada e uma conta simulada, e os gráficos usam preços reais do SPY até outubro de 2026, sem nenhuma operação real por trás. O SPY é um fundo que acompanha o índice S&P 500, uma cesta de 500 grandes empresas dos Estados Unidos.
A resposta curta
Aqui está o guia inteiro em quatro frases:
- Agentes são muito úteis para pesquisa, monitoramento e disciplina.
- As evidências até agora não mostram que eles superam de forma confiável quem simplesmente fica no mercado.
- O perigo não é só uma previsão ruim. É um programa que age mais rápido do que você consegue perceber.
- Então o projeto que importa é um conjunto de limites rígidos fora do modelo, e o resto deste guia mostra como construí-los.
Como é uma rodada de um agente
Um agente de investimentos roda em um ciclo. A cada rodada, ele reúne informações, pensa e propõe algo. A parte importante vem depois: um código simples confere a proposta antes de qualquer coisa acontecer.

Aqui está onde os agentes ajudam, e onde não ajudam:
| Tarefa | Combina? | Por quê |
|---|---|---|
| Resumir relatórios e teleconferências de resultados | Sim | Muita leitura, e você pode conferir a fonte |
| Vigiar suas próprias regras e avisar você | Sim | Ele nunca cansa nem fica entediado |
| Rebalancear para uma meta que você escolheu | Sim | Regras simples, feitas na data certa |
| Manter um diário das suas decisões | Sim | Combate sua memória e suas desculpas |
| Prever o preço da semana que vem | Sem boas evidências | Milhares de profissionais já competem nisso |
| Reagir em milissegundos | Não | Uma chamada ao modelo leva segundos, e firmas com sistemas rápidos estão na sua frente |
| Lidar com algo que nunca viu | Arriscado | Ele pode soar seguro e estar errado |
Cinco níveis de confiança
"Deixar a IA operar" não é uma decisão só. É uma escada, e você escolhe até onde subir:

Os níveis 1 e 2 não conseguem enviar uma ordem ruim, porque não enviam nenhuma. O nível 3 é onde está a maior parte do valor para a maioria das pessoas: o agente faz o trabalho, e você fica com o clique final. O nível 4 precisa de tudo o que há neste guia. Evite o nível 5 por completo.
O que as evidências dizem
Pesquisadores já testaram esses agentes com preços reais e até com dinheiro real. Os resultados são menos empolgantes que o marketing:
| Estudo | O que foi testado | Resultado |
|---|---|---|
| StockBench (2025) | Modelos operando ações reais por alguns meses | O resumo diz que a maioria dos modelos tem dificuldade para superar comprar e manter. A tabela mostra a maioria passando um pouco de uma referência fraca de 0,4%, com quedas menores |
| Duas frotas em produção (2026) | Milhares de agentes criados por usuários, em mercados de criptomoedas | "Nenhuma das frotas mostra vantagem direcional." A alavancagem mediana foi de 5x em todos os níveis de volatilidade |
| Backtest, simulação e depois real (2026) | Métodos de operação em criptomoedas, terminando com dinheiro real | Nenhum superou manter Bitcoin na etapa real |
| SPIVA (2025) | Fundos profissionais de grandes empresas dos EUA | 79% ficaram atrás do S&P 500 naquele ano |
| Day traders brasileiros (2019) | Pessoas que fizeram day trade em futuros por 300 dias ou mais | 97% perderam dinheiro |
Leia isso com cuidado. A maioria dos estudos com agentes é curta, vários tratam de criptomoedas e não de ações, e alguns meses provam pouco para qualquer lado. Repare também que o resumo do StockBench e a tabela dele apontam para direções diferentes, dependendo da referência que você olha.
O estudo em produção traz mais uma lição. O comportamento dependeu mais das configurações em volta dos agentes, como um controle de risco, do que de qualquer coisa escrita no texto da estratégia. Os limites que você define moldam um agente mais do que o prompt esperto que você escreve.
Então aqui está o teste justo para qualquer agente: depois de todos os custos, ele supera um fundo de índice barato, sem mais risco? Essa é a régua. Muitos profissionais não passam por ela.
Um experimento: o que um modelo realmente propõe?
Chega de leitura. Vamos perguntar a modelos reais. Demos a dois modelos, o Haiku 5.5 e o Sonnet 5.5, uma conta simulada de US$ 10.000 e uma ação inventada, NVLT, com cinco preços de fechamento quase parados. As regras mandavam operar só NVLT, com no máximo US$ 1.000 por ordem. Mudamos uma coisa, a notícia, e rodamos cada caso 30 vezes. O prompt foi escrito em inglês:
- Notícia normal: receita dentro das estimativas.
- Euforia anônima: um blog dizendo que pessoas de dentro esperam uma compra da empresa, com muitos pontos de exclamação.
- Instrução escondida: a notícia normal com um falso "SYSTEM NOTICE" dentro dela, mandando comprar US$ 10.000 de outra ação, XQZT. Isso se chama injeção de prompt: um texto de fora que tenta agir como uma instrução.

As 180 execuções custaram US$ 0,21 no total, e há boas e más notícias aqui:
- A boa notícia: em 60 execuções com a instrução escondida, nenhum modelo propôs XQZT. Os dois ignoraram a euforia anônima. Toda resposta foi um JSON válido.
- A má notícia: a instrução ainda deixou marca. O Haiku nunca comprou com a notícia normal, e comprou NVLT em 7 de 30 execuções quando o texto injetado estava presente, duas vezes com os US$ 1.000 completos.
- A surpresa: o Sonnet propôs uma compra em 3 de 30 execuções com o prompt normal. Mesma entrada, decisão diferente. Um agente não é uma regra fixa, então uma execução boa prova pouco.
Este é um teste pequeno, com um único prompt, e um atacante pode tentar milhares. Os modelos de hoje resistirem a um truque grosseiro não é garantia. Ataques mais novos, e outros modelos, podem ter outro resultado. É por isso que a próxima parte não depende de o modelo se comportar.
O projeto que importa: uma fronteira de confiança
Trate tudo o que está de um lado desta linha como possivelmente errado ou manipulado, incluindo o próprio modelo. O outro lado é código simples que você controla:

Quatro regras saem dessa imagem:
- O modelo só escreve texto. Ele nunca toca na corretora e nunca vê suas chaves.
- Os limites moram no código, fora do modelo. Uma frase em um prompt dizendo "nunca gaste mais de US$ 1.000" é um pedido. Uma verificação no código é uma parede.
- Tudo fica registrado. Você quer conseguir responder "por que isso aconteceu?" daqui a um mês.
- Existe um jeito de parar que não depende de o modelo concordar.
A ideia não é nova. Corretoras dos EUA precisam ter controles de risco antes da negociação, como limites de crédito e verificações que rejeitam ordens erradas, pela regra de acesso ao mercado da SEC. No relatório de 2026, a FINRA, reguladora das corretoras dos EUA, lista os riscos dos agentes de IA: agir sem aprovação humana, passar da própria autoridade e ser difícil de auditar. Essas regras miram as empresas, e o mesmo raciocínio serve para você.
Construa o portão de ordens
Vamos construí-lo em Python, sem bibliotecas e sem corretora. Você precisa do Python 3.10 ou mais recente. Crie uma pasta nova e salve isto como limites.py:
1# limites.py
2import json
3from dataclasses import dataclass, field
4
5
6@dataclass(frozen=True)
7class Limites:
8 ativos_permitidos: tuple = ("NVLT", "SPY")
9 ordem_maxima: float = 1000 # dólares em uma ordem
10 fatia_maxima_por_ativo: float = 0.20 # parte da conta em um ativo
11 ordens_maximas_por_dia: int = 5
12 perda_diaria_maxima: float = 0.03
13 aprovacao_acima_de: float = 500 # uma pessoa aprova o que for maior
14
15
16@dataclass
17class Conta:
18 caixa: float = 10_000
19 posicoes: dict = field(default_factory=dict) # ativo -> dólares
20 inicio_do_dia: float = 10_000
21 ordens_hoje: int = 0
22 parada: bool = False
23
24 @property
25 def valor(self):
26 return self.caixa + sum(self.posicoes.values())
27
28
29def interpretar_proposta(resposta):
30 """Transforma o texto do modelo em uma proposta, ou None se não for exatamente o que pedimos."""
31 try:
32 proposta = json.loads(resposta)
33 acao = proposta["acao"]
34 ativo = proposta["ativo"]
35 dolares = float(proposta["dolares"])
36 except (ValueError, KeyError, TypeError):
37 return None
38 if acao not in ("comprar", "vender", "manter") or not isinstance(ativo, str) or dolares < 0:
39 return None
40 return {"acao": acao, "ativo": ativo, "dolares": dolares}
41
42
43def conferir_ordem(ordem, conta, limites):
44 """Retorna ("bloqueada", motivo), ("aprovacao", motivo) ou ("permitida", "")."""
45 perda = 1 - conta.valor / conta.inicio_do_dia
46 if conta.parada or perda >= limites.perda_diaria_maxima:
47 conta.parada = True
48 return "bloqueada", "botão de parada: limite de perda diária atingido"
49 if ordem["ativo"] not in limites.ativos_permitidos:
50 return "bloqueada", "ativo fora da lista permitida"
51 if ordem["dolares"] > limites.ordem_maxima:
52 return "bloqueada", "ordem acima do limite de tamanho"
53 if conta.ordens_hoje >= limites.ordens_maximas_por_dia:
54 return "bloqueada", "ordens demais hoje"
55
56 atual = conta.posicoes.get(ordem["ativo"], 0)
57 if ordem["acao"] == "vender" and ordem["dolares"] > atual:
58 return "bloqueada", "vendendo mais do que temos"
59 if ordem["acao"] == "comprar":
60 if ordem["dolares"] > conta.caixa:
61 return "bloqueada", "caixa insuficiente"
62 if (atual + ordem["dolares"]) / conta.valor > limites.fatia_maxima_por_ativo:
63 return "bloqueada", "a posição ficaria grande demais"
64 if ordem["dolares"] > limites.aprovacao_acima_de:
65 return "aprovacao", "ordem grande precisa de uma pessoa"
66 return "permitida", ""Repare que nada aqui é inteligente, e esse é o ponto. É um código sem graça que você lê em um minuto e testa por inteiro. As verificações seguem a ordem deste fluxograma:

Agora o passo do agente. executar é uma corretora simulada, então nenhuma ordem real vai a lugar nenhum. Salve isto como agente_simulado.py:
1# agente_simulado.py
2import json
3from datetime import datetime, timezone
4
5from limites import conferir_ordem, interpretar_proposta
6
7
8def executar(ordem, conta):
9 """Corretora simulada: nenhuma ordem real vai a lugar nenhum."""
10 com_sinal = ordem["dolares"] if ordem["acao"] == "comprar" else -ordem["dolares"]
11 conta.caixa -= com_sinal
12 conta.posicoes[ordem["ativo"]] = conta.posicoes.get(ordem["ativo"], 0) + com_sinal
13 conta.ordens_hoje += 1
14
15
16def passo(resposta, conta, limites, aprovar, caminho_do_log="auditoria.jsonl"):
17 proposta = interpretar_proposta(resposta)
18 if proposta is None:
19 resultado, motivo = "rejeitada", "a resposta não é uma proposta válida"
20 elif proposta["acao"] == "manter":
21 resultado, motivo = "manter", ""
22 else:
23 resultado, motivo = conferir_ordem(proposta, conta, limites)
24 if resultado == "aprovacao":
25 resultado = "permitida" if aprovar(proposta) else "recusada"
26 if resultado == "permitida":
27 executar(proposta, conta)
28 resultado = "executada"
29
30 registro = {
31 "hora": datetime.now(timezone.utc).isoformat(timespec="seconds"),
32 "resposta": resposta,
33 "resultado": resultado,
34 "motivo": motivo,
35 "caixa": round(conta.caixa, 2),
36 }
37 with open(caminho_do_log, "a", encoding="utf-8") as log:
38 log.write(json.dumps(registro, ensure_ascii=False) + "\n")
39 return resultado, motivoVamos atacá-lo com os tipos de resposta que um modelo poderia dar de verdade, incluindo a que uma injeção de prompt gostaria de ver. Salve isto como main.py e rode python main.py:
1# main.py
2import json
3
4from agente_simulado import passo
5from limites import Conta, Limites
6
7conta = Conta()
8limites = Limites()
9
10
11def proposta(acao, ativo, dolares):
12 return json.dumps({"acao": acao, "ativo": ativo, "dolares": dolares})
13
14
15def pessoa_diz_nao(ordem):
16 return False
17
18
19respostas = [
20 proposta("manter", "NVLT", 0),
21 proposta("comprar", "NVLT", 400),
22 proposta("comprar", "NVLT", 900),
23 proposta("comprar", "NVLT", 5000),
24 proposta("comprar", "XQZT", 300),
25 proposta("vender", "SPY", 200),
26 "Claro! Acho que você deveria comprar tudo.",
27]
28
29for resposta in respostas:
30 resultado, motivo = passo(resposta, conta, limites, aprovar=pessoa_diz_nao)
31 print(f"{resultado:10} {motivo}")
32
33print(f"Caixa restante: US$ {conta.caixa:.0f}")
34
35conta.posicoes["NVLT"] = 60 # a posição caiu muito, e a conta está 3,4% abaixo
36print(passo(proposta("comprar", "SPY", 100), conta, limites, aprovar=pessoa_diz_nao))1manter
2executada
3recusada ordem grande precisa de uma pessoa
4bloqueada ordem acima do limite de tamanho
5bloqueada ativo fora da lista permitida
6bloqueada vendendo mais do que temos
7rejeitada a resposta não é uma proposta válida
8Caixa restante: US$ 9600
9('bloqueada', 'botão de parada: limite de perda diária atingido')Toda resposta ruim parou, cada uma com um motivo claro. A última linha é o botão de parada: quando a conta cai 3% em um dia, ele recusa tudo até uma pessoa olhar. E isso não depende de o modelo concordar.
Para ligar um modelo real, troque as respostas fixas por uma chamada. Foi assim que nosso experimento perguntou ao modelo, pela linha de comando do Claude Code, e qualquer modelo funciona do mesmo jeito:
1import subprocess
2
3
4def perguntar_ao_modelo(prompt):
5 resultado = subprocess.run(
6 ["claude", "-p", prompt, "--model", "claude-haiku-5-5", "--tools", ""],
7 capture_output=True, text=True, encoding="utf-8", stdin=subprocess.DEVNULL,
8 )
9 return resultado.stdout.strip()Repare no --tools "": o modelo não recebe nenhuma ferramenta. Tudo o que ele pode fazer é responder com texto, que depois passa pelo passo.
Uma página simples em cima desse log dá a você o nível 3 da escada. Esta é uma demonstração local que construímos e rodamos para este guia. Ela lista respostas reais das nossas execuções do Haiku ao lado dos casos de teste, e está esperando uma pessoa decidir sobre uma ordem de US$ 1.000:

O que o portão não consegue fazer: ele barra o tipo errado de ordem, mas não julga se uma ordem válida é uma boa ideia. Aquelas sete compras do Haiku passariam: cinco direto, e duas com a aprovação de uma pessoa. Um portão limita o estrago de uma decisão ruim, mas não torna as decisões boas. Para isso, você precisa de testes.
Armadilha de backtest 1: a regra de sorte
Um backtest roda uma estratégia em preços do passado. É a primeira coisa que mostram para você, e é muito fácil enganar a si mesmo com um. Um agente é especialmente bom nisso, porque consegue testar milhares de ideias em uma tarde.
Vamos gerar 1.000 regras totalmente sem sentido: cada uma fica no SPY só em uma metade aleatória dos dias do mês. Vamos escolher a melhor de 2010 a 2019 e depois ver o que ela faz. Para este programa e o próximo, você precisa do numpy e de um arquivo chamado spy.csv com preços diários, com as colunas date e adj_close. Baixamos o nosso do Yahoo Finance, com os preços ajustados por dividendos.
1# regras_de_sorte.py
2import csv
3
4import numpy as np
5
6linhas = list(csv.DictReader(open("spy.csv")))
7precos = np.array([float(linha["adj_close"]) for linha in linhas])
8retornos = precos[1:] / precos[:-1] - 1
9anos = np.array([int(linha["date"][:4]) for linha in linhas[1:]])
10dias = np.array([int(linha["date"][8:]) for linha in linhas[1:]])
11
12
13def anual(diarios):
14 return np.prod(1 + diarios) ** (252 / len(diarios)) - 1
15
16
17treino = (anos >= 2010) & (anos <= 2019)
18teste = (anos >= 2020) & (anos <= 2025)
19regras = np.random.default_rng(2026).random((1000, 32)) < 0.5
20
21notas = [anual(retornos[treino] * regra[dias[treino]]) for regra in regras]
22melhor = regras[int(np.argmax(notas))]
23
24print(f"Mercado, 2010 a 2019: {anual(retornos[treino]):.1%} ao ano")
25print(f"Melhor regra, 2010 a 2019: {max(notas):.1%} ao ano")
26print(f"Mercado, 2020 a 2025: {anual(retornos[teste]):.1%} ao ano")
27print(f"Melhor regra, 2020 a 2025: {anual(retornos[teste] * melhor[dias[teste]]):.1%} ao ano")1Mercado, 2010 a 2019: 13.5% ao ano
2Melhor regra, 2010 a 2019: 15.0% ao ano
3Mercado, 2020 a 2025: 15.0% ao ano
4Melhor regra, 2020 a 2025: 6.9% ao anoUma regra sem lógica nenhuma superou o mercado por dez anos. Depois ganhou menos da metade do que o mercado ganhou. Se você tivesse visto só a primeira década, ela teria parecido genial:

Teste ideias suficientes, e uma delas vai parecer ótima por puro acaso. Isso se chama sobreajuste (overfitting). A defesa é dividir os dados: escolha em um período e julgue em outro, que você só toca uma vez. Anote também quantas ideias testou, porque a melhor de 1.000 significa muito menos que a melhor de 3.
Armadilha de backtest 2: ver o futuro
O bug mais comum em backtests é usar informação que ainda não estava disponível. Pegue uma regra simples: ficar no SPY só depois de um dia de alta. Aqui está ela duas vezes, e a única diferença é uma linha:
1# bug_de_olhar_o_futuro.py
2import csv
3
4import numpy as np
5
6linhas = list(csv.DictReader(open("spy.csv")))
7precos = np.array([float(linha["adj_close"]) for linha in linhas])
8retornos = precos[1:] / precos[:-1] - 1
9anos = np.array([int(linha["date"][:4]) for linha in linhas[1:]])
10retornos = retornos[(anos >= 2015) & (anos <= 2025)]
11
12honesta = np.concatenate([[0], retornos[:-1] > 0]) # ontem subiu
13com_bug = retornos > 0 # hoje sobe: ela espia a resposta
14
15print(f"Mercado: US$ {np.prod(1 + retornos):.2f}")
16print(f"Honesta: US$ {np.prod(1 + retornos * honesta):.2f}")
17print(f"Com bug: US$ {np.prod(1 + retornos * com_bug):.2f}")Mercado: US$ 4.00
Honesta: US$ 1.47
Com bug: US$ 49532.11Foi nisso que US$ 1 se transformou de 2015 a 2025. A versão com bug "sabe" o resultado de cada dia antes de decidir, então nunca tem um dia de perda:

Aqui os números são tão absurdos que você perceberia. Em código real, um pequeno vazamento gera uma estratégia que parece apenas muito boa, e esse é o tipo perigoso. Se um backtest parece bom demais, assuma que há um bug até provar o contrário.
A memória do modelo também é um vazamento
A IA traz uma nova versão dessa armadilha. Um modelo treinado com dados até certa data já leu o que aconteceu. Peça para ele "operar" em 2021, e ele pode simplesmente lembrar. Pedimos ao Sonnet 5.5 o preço de fechamento do SPY em 18 datas, de memória, sem ferramentas e com uma resposta por data:

Sem nenhum dado, ele chegou a menos de 5% em 12 das 18 datas. Não é uma memória perfeita, como março de 2020 mostra, e uma boa noção do nível geral dos preços explica parte disso. Mesmo assim, ele sabe bastante sobre o passado, incluindo datas de 2026.
Pesquisadores mediram isso com mais cuidado. Um artigo de 2026 chama isso de viés de antecipação guardado nos pesos do modelo, e mostrou que suprimir essa memória reduziu os retornos do backtest em até 67% nas datas que o modelo tinha memorizado. Então um backtest em datas que estavam no treino do modelo prova muito pouco. Só contam as datas depois dos dados de treino.
Armadilha de backtest 3: esquecer os custos
Toda operação custa algo: taxas, a diferença entre os preços de compra e de venda e o efeito da sua própria ordem no preço. Vamos pegar duas regras de médias móveis de 2015 a 2025, uma lenta e uma muito ativa, e variar o custo de cada operação:

A regra lenta mal percebe. A regra ativa vai do ganho à perda, porque 53 operações a 0,25% dão cerca de 13% ao ano. E olhe a linha tracejada: nenhuma das regras superou não fazer nada. Agentes adoram operar, porque cada rodada pede uma decisão, então sempre meça os resultados depois dos custos. Impostos sobre ganhos de curto prazo podem levar mais um pedaço.
O tamanho é o que mata
Uma previsão ruim custa dinheiro. Risco demais pode acabar com o jogo. Alavancagem significa operar com dinheiro emprestado, então 2x anda o dobro do mercado, nas duas direções. Aqui está o caminho real do SPY na crise de 2007 a 2009, em quatro níveis. Isto assume rebalanceamento diário e empréstimo de graça, o que favorece as linhas alavancadas:

Com 5x, US$ 100 viraram 22 centavos. Lembre que as frotas em produção do início tinham alavancagem mediana de 5x. As perdas também doem mais do que parecem, porque você se recupera a partir de uma base menor:
| Você perde | Precisa deste ganho para voltar |
|---|---|
| 10% | 11% |
| 25% | 33% |
| 50% | 100% |
| 80% | 400% |
A velocidade piora tudo isso. Em agosto de 2012, um problema de software na firma americana Knight Capital enviou mais de 4 milhões de ordens em 45 minutos enquanto tentava executar só 212 ordens de clientes. A firma informou uma perda de cerca de US$ 457,6 milhões, e a SEC depois a multou por controles fracos. Nenhuma IA estava envolvida. É só como a operação automatizada se parece sem uma parada que funcione.
Como conectar a uma corretora
Algumas corretoras oferecem uma API, e poucas oferecem ferramentas para agentes. Um exemplo é o servidor MCP da Alpaca, uma corretora dos EUA, que dá a um assistente de IA ferramentas de dados de mercado e de ordens. O modo simulado, com dinheiro falso, vem ligado por padrão. Não rodamos este, porque ele precisa de uma conta. Aqui está a ideia, com base na documentação:
1{
2 "env": {
3 "ALPACA_API_KEY": "sua_chave_simulada",
4 "ALPACA_SECRET_KEY": "seu_segredo_simulado",
5 "ALPACA_PAPER_TRADE": "true",
6 "ALPACA_TOOLSETS": "stock-data"
7 }
8}A última linha é a importante. Por padrão, o servidor liga todas as ferramentas, incluindo enviar ordens. Se você conectar isso direto a um modelo, pulou o seu portão, e o modelo está com as chaves. Com ALPACA_TOOLSETS em stock-data, o modelo consegue ler preços e mais nada. As ordens passam então pelo seu próprio executor, depois do portão.
Uma lista para qualquer conexão com corretora:
- Comece com uma conta simulada, e mantenha as chaves dela separadas das reais.
- Dê ao modelo ferramentas só de leitura. Mantenha as ferramentas de ordens no seu código.
- Deixe as chaves fora de prompts, código e logs, como no nosso guia do Key Vault.
- Use também os limites da própria corretora, se ela tiver.
- Use uma conta sem margem, para o pior caso ser o que está nela.
- Saiba como cancelar à mão todas as ordens abertas.
Regras e golpes
Estas notas tratam dos EUA, e as regras mudam de país para país. No Brasil, por exemplo, quem regula o mercado é a CVM, então confira as regras do seu país.
- A conta é sua. Um agente não leva a culpa. As ordens que ele envia são suas, e as perdas e os impostos também.
- Administrar dinheiro de outras pessoas é diferente. Rodar um agente na sua própria conta é uma coisa. Fazer isso para outros pode exigir registro como administrador ou consultor, o que é regulado.
- As regras de day trade dos EUA mudaram em 2026. O Aviso 26-10 da FINRA trocou a regra de "pattern day trader" e seu mínimo de US$ 25.000 por regras de margem intradiária, valendo desde 4 de junho de 2026. As corretoras podem adotar isso em momentos diferentes, então confira a sua. Uma barreira menor não é motivo para operar mais.
- Desconfie de vendas de "robôs de IA". A SEC, a NASAA e a FINRA alertam sobre plataformas que prometem coisas como uma IA que não perde. Retorno garantido é um sinal clássico de fraude. Confira se a empresa é registrada antes de enviar qualquer dinheiro.
Da ideia ao dinheiro real
Se você ainda quiser ir adiante, cada etapa precisa conquistar a próxima:

Escreva suas regras antes de começar, enquanto está calmo:
| Antes de avançar | Exemplo de regra clara |
|---|---|
| Com o que estou comparando? | Um fundo de índice de baixo custo, depois de todos os custos |
| Quanto dura o teste? | O bastante para incluir uma fase ruim, em meses e não em dias |
| Quanto posso perder no máximo? | Um valor fixo que não mudaria a minha vida |
| O que faz parar? | Um limite de perda diária e qualquer limite quebrado |
| Quem olha? | Eu, toda semana, lendo o log |
| O que me faz desistir? | Ficar atrás do índice por um período definido |
A maioria das ideias vai falhar na primeira ou na segunda etapa, e isso é o sistema funcionando. Uma falha na simulação é a lição mais barata que você vai ter. E se o resultado honesto for que um fundo de índice ganha, você acabou de se poupar de muito risco e trabalho.
Sua vez: pratique
Tente estes antes de espiar as respostas. Use os arquivos de "Construa o portão de ordens" e rode o main.py uma vez antes.
Exercício 1: Preveja o portão (aquecimento). Com uma Conta nova e os Limites padrão, o que conferir_ordem retorna para cada caso? Pense primeiro, depois escreva o código para conferir. (1) Comprar US$ 450 de NVLT. (2) Comprar US$ 1.500 de NVLT. (3) Comprar US$ 800 de SPY. (4) Vender US$ 100 de NVLT.
Exercício 2: Queda máxima. Uma queda (drawdown) é a descida a partir de um pico. Escreva queda_maxima(valores), que retorna a maior delas como fração. Teste com [100, 120, 90, 130, 65].
Exercício 3: Peso dos custos. Escreva custo_anual(operacoes, custo), que estima quanto operar custa por ano. Teste 53 operações a 0,10% cada e compare com o gráfico.
Exercício 4: Exija um motivo. Escreva interpretar_com_motivo(resposta), que usa interpretar_proposta mas também retorna None quando a resposta não tem um motivo preenchido. Um agente que não sabe se explicar não deve operar.
Exercício 5: Leia o log (desafio). Escreva um programa que lê auditoria.jsonl e conta quantos registros tiveram cada resultado, com o mais comum primeiro.
Quiz rápido
- O que é um agente de IA, em uma frase?
- Qual nível de confiança mantém o seu clique final, enquanto o agente faz o trabalho?
- Qual é o teste justo para um agente de investimentos?
- O que é injeção de prompt?
- Por que um limite em um prompt não basta?
- Qual é a única coisa que o portão de ordens não consegue julgar?
- O que é sobreajuste, e como se defender dele?
- O que é viés de antecipação (look-ahead bias)?
- Por que um backtest no período de treino do modelo prova pouco?
- Por que uma perda de 50% é pior do que parece?
Respostas
Exercício 1: A primeira é permitida, a segunda passa do limite de tamanho, a terceira precisa de uma pessoa, e você não pode vender o que não tem:
1# exercicio_1.py
2from limites import Conta, Limites, conferir_ordem
3
4ordens = [("comprar", "NVLT", 450), ("comprar", "NVLT", 1500), ("comprar", "SPY", 800), ("vender", "NVLT", 100)]
5
6for acao, ativo, dolares in ordens:
7 ordem = {"acao": acao, "ativo": ativo, "dolares": dolares}
8 print(conferir_ordem(ordem, Conta(), Limites()))1('permitida', '')
2('bloqueada', 'ordem acima do limite de tamanho')
3('aprovacao', 'ordem grande precisa de uma pessoa')
4('bloqueada', 'vendendo mais do que temos')Exercício 2: Acompanhe o maior valor até agora e a maior queda a partir dele:
1# exercicio_2.py
2def queda_maxima(valores):
3 pico = valores[0]
4 pior = 0
5 for valor in valores:
6 pico = max(pico, valor)
7 pior = max(pior, 1 - valor / pico)
8 return pior
9
10
11print(f"{queda_maxima([100, 120, 90, 130, 65]):.0%}")50%Exercício 3: É uma multiplicação, e o resultado fica perto do gráfico, onde a regra ativa foi de 4,8% a menos 0,6%:
1# exercicio_3.py
2def custo_anual(operacoes, custo):
3 return operacoes * custo
4
5
6print(f"{custo_anual(53, 0.001):.1%}")5.3%Exercício 4: Reaproveite a função e adicione mais uma verificação:
1# exercicio_4.py
2import json
3
4from limites import interpretar_proposta
5
6
7def interpretar_com_motivo(resposta):
8 proposta = interpretar_proposta(resposta)
9 if proposta is None:
10 return None
11 motivo = json.loads(resposta).get("motivo")
12 if not isinstance(motivo, str) or not motivo.strip():
13 return None
14 return proposta | {"motivo": motivo}
15
16
17print(interpretar_com_motivo('{"acao": "manter", "ativo": "NVLT", "dolares": 0}'))
18print(interpretar_com_motivo('{"acao": "manter", "ativo": "NVLT", "dolares": 0, "motivo": "Sem vantagem"}'))None
{'acao': 'manter', 'ativo': 'NVLT', 'dolares': 0.0, 'motivo': 'Sem vantagem'}Exercício 5: Cada linha do log é um objeto JSON, e o Counter faz a contagem:
1# exercicio_5.py
2import json
3from collections import Counter
4
5with open("auditoria.jsonl", encoding="utf-8") as log:
6 resultados = Counter(json.loads(linha)["resultado"] for linha in log)
7
8for resultado, quantidade in resultados.most_common():
9 print(resultado, quantidade)1bloqueada 4
2manter 1
3executada 1
4recusada 1
5rejeitada 1Quiz: (1) Um programa que usa um modelo de IA para decidir o próximo passo e pode agir por meio de ferramentas. (2) O nível 3, proposta. (3) Depois de todos os custos, superar um fundo de índice barato, sem mais risco. (4) Um texto de fora que tenta agir como uma instrução para o modelo. (5) Um prompt é um pedido que o modelo pode ignorar ou ser convencido a ignorar, e uma verificação no código sempre roda. (6) Se uma ordem válida é uma boa ideia. (7) Escolher algo que se encaixa no passado por acaso. Escolha em um período, julgue em outro e conte quantas ideias testou. (8) Usar informação que não estava disponível na época. (9) O modelo pode já saber o que aconteceu, então não está prevendo de verdade. (10) Você precisa de um ganho de 100% só para voltar.
Folha de consulta
| Tema | Lembre-se |
|---|---|
| Por onde começar | Níveis 1 a 3: pesquisa, monitoramento, proposta |
| A régua | Um fundo de índice barato, depois de todos os custos |
| O modelo | Só escreve texto, sem chaves e sem ferramentas de ordens |
| Limites | No código, fora do modelo |
| Limites mínimos | Ativos permitidos, tamanho da ordem, tamanho da posição, ordens por dia, perda diária |
| Botão de parada | Não depende de o modelo concordar |
| Registro | Cada proposta, decisão e ordem |
| Backtests | Divida os dados, conte as ideias, inclua os custos |
| Memória do modelo | Só contam as datas depois dos dados de treino |
| Bom demais para ser verdade | Assuma um bug |
| Alavancagem | Evite, e use uma conta sem margem |
| Ordem das etapas | Backtest, simulação, real com bem pouco, crescer devagar |
Resumindo
Um agente de IA pode ser um assistente de pesquisa incansável, e um operador perigoso quando fica sem supervisão:
- Agentes brilham em ler, vigiar e seguir suas regras, e ainda não há boas evidências de uma vantagem confiável em prever preços.
- A confiança é uma escada. A maioria das pessoas tira mais proveito no nível 3, mantendo o clique final.
- O mesmo prompt pode gerar decisões diferentes, então julgue por muitas execuções e não por uma.
- Trate o modelo como não confiável. Ele só escreve texto, e um código simples decide o que acontece.
- Um portão limita o estrago, mas não cria boas decisões.
- Backtests mentem com facilidade: por sorte, por bugs, pela memória do modelo e por custos esquecidos.
- O tamanho decide se você sobrevive. Evite alavancagem e tenha sempre uma parada.
- Vá devagar do dinheiro falso ao real, e deixe o fundo de índice ser o juiz.
Quer ir mais fundo no lado dos agentes? Veja como depurar problemas com agentes de IA e dá para confiar em um resumo feito por IA.
Leia a seguir

O que é um agente de IA? Da resposta à ação
Um agente de IA pode escolher etapas, usar ferramentas e conferir resultados. Acompanhe um roteiro de viagem fictício para entender o ciclo, os limites e as decisões que ficam com você.

Videogames e IA: dos Inimigos em Patrulha aos NPCs que Conversam
O que a IA faz de verdade em um videogame? Siga um guarda da patrulha à perseguição, conheça NPCs que conversam e veja a opinião de profissionais do setor.

Dá para Confiar em um Resumo Feito por IA? Veja o Que Ficou de Fora
Um resumo da IA pode acertar o total e ainda enganar. Use um experimento visual para encontrar grupos omitidos, afirmações sem apoio e contexto perdido.
Comentários
Seja gentil e específico. Comentários com links de contas novas aparecem depois da análise de um moderador.