Código Python: sinal combinado de média móvel e sentimento do titular

Código Python: sinal combinado de média móvel e sentimento do titular
Este programa responde a uma pergunta bem específica: como se decide algo com os números à frente, e não com o palpite? Ele junta duas ideias simples -a média móvel de vinte e de cinquenta fechamentos, que é só a média dos últimos fechamentos, e o sentimento do titular do dia, medido pela contagem das palavras positivas e negativas que o texto traz- e escreve uma decisão para cada data com titular: comprar, vender ou esperar. Foi feito para o dono de pequeno negócio que quer ver com os próprios olhos como se mede uma regra, para o contador que desconfia de números que não consegue conferir e para o encarregado de depósito que já sabe ler uma tabela de colunas fixas. Aqui não existe fórmula mágica: existe uma balança e uma folha de papel.
⬇ Baixar o código (ZIP)Aviso: isto é material educativo para praticar Python e não é uma recomendação de compra nem de venda. Os preços de exemplo e os titulares que vêm com o programa são inventados, e os dados históricos são citados só para praticar. Um resultado passado não garante nada sobre o futuro: antes de investir, consulte um profissional autorizado.
| Arquivo dentro do ZIP | O que é |
|---|---|
senal_combinada.py | O programa, comentado em português e só com a biblioteca padrão |
datos/precos.csv | Cento e oitenta fechamentos diários de exemplo, inventados, de janeiro a junho |
datos/titulares.csv | Trinta titulares inventados com o seu rótulo manual |
salida_ejemplo.txt | A saída real que você vai ver na tela, tal como aparece |
LEIAME.md | Instruções, o formato dos dados e o aviso por escrito |
O que o programa faz
- Lê dois arquivos de exemplo que viajam dentro do ZIP: os fechamentos diários e os titulares. Os titulares são inventados e estão ali para praticar; não são notícias reais.
- Calcula a média móvel de vinte e a de cinquenta fechamentos em cada data. Cada média usa apenas os fechamentos anteriores: não olha para a frente, porque o futuro não está no arquivo.
- Mede o sentimento do titular com um léxico próprio: duas listas curtas de palavras escritas à mão, positivas e negativas, sem inteligência artificial no meio. A vantagem é que você pode ler as listas e discuti-las; a desvantagem é que a ironia passa batida.
- Transforma essa nota em um sinal de três valores: positivo quando o titular pesa para cima, negativo quando pesa para baixo e neutro quando fica no meio.
- Escreve a decisão de cada data: comprar só se o sinal técnico e o sentimento forem os dois positivos; vender só se os dois forem negativos; esperar em qualquer outro caso.
- Salva o diário em
salida/diario.csve conta os dias de cada decisão. - Compara o capital final da regra com comprar e manter e diz quem ganhou, mesmo quando ganha o não fazer nada.
Como executar
Você precisa do Python 3.11 ou superior e de mais nada: o programa usa apenas a biblioteca padrão, então não há pacote para instalar, nem conta para criar, nem plataforma para conectar. Descompacte o ZIP em uma pasta, abra o terminal nessa mesma pasta e digite uma única linha:
python senal_combinada.py
Se o terminal responder que não encontra o arquivo, quase sempre é porque ele está aberto em outra pasta: vá com cd até a pasta que você descompactou e tente de novo. O programa não grava nada fora da própria pasta: ele cria salida/ e guarda ali os dois arquivos CSV.
O código, explicado
Cinco trechos do programa explicam quase todo o resto. O primeiro é o bloco de constantes do início, que fixa o capital inicial e a ideia de comparar as duas estratégias sobre a mesma base:
CAPITAL_INICIAL = Decimal("100.00") # Capital inicial, para comparar as duas ideias na mesma base
O dinheiro é tratado com Decimal e nunca com decimais binários, porque em uma corrente de multiplicações os erros de centavo se acumulam e a comparação deixa de ser confiável. O arquivo mantém nomes de variáveis em espanhol, como capital_regla e cierres, de propósito, para que as três versões do programa possam ser lidas lado a lado.
O segundo trecho é a regra de decisão inteira: seis linhas. A estratégia toda cabe ali, e é justamente essa a ideia do exercício.
def decidir(tecnica: int, sentimiento: int) -> str:
"""Comprar só se os dois sinais forem positivos; vender se os dois forem negativos."""
if tecnica == 1 and sentimiento == 1:
return "comprar"
if tecnica == -1 and sentimiento == -1:
return "vender"
return "esperar"
Existem três resultados possíveis: comprar, vender e esperar. Comprar exige que os dois sinais concordem para cima; vender exige que os dois concordem para baixo; qualquer discordância termina em esperar, que no diário é de longe a decisão mais frequente.
O terceiro trecho é a comparação. Repare que o programa nunca olha o preço do dia seguinte:
def comparar(filas: list[dict]) -> dict:
"""Compara o capital da regra com comprar e manter, sem espiar o futuro."""
capital_regla = CAPITAL_INICIAL
O capital da regra é atualizado dia a dia, mas só enquanto a posição anterior o mantinha dentro do mercado; esperar conserva a posição que já existia, não inventa uma nova. A referência é comprar e manter, ou seja, não fazer nada, que é o rival mais incômodo que existe.
O quarto trecho é o veredicto, escrito de propósito para dizer quem ganhou. O programa não tem um caminho educado para o caso em que a regra perde:
imprimir_parrafo("Veredicto: nestes dados a regra combinada PERDE para comprar e manter. É dito com essas palavras: o sinal técnico e o sentimento não conseguiram ficar na alta.")
E o quinto trecho é o aviso, que o programa imprime no começo e outra vez no fim. O aviso vive dentro do código, não escondido em um anexo:
imprimir_parrafo("AVISO: " + AVISO)
O que você vai ver na tela
Primeiro o resumo de decisões e a comparação de capital. Esta é a saída real com os dados de exemplo do ZIP:
RESUMO DE DECISÕES Comprar : 7 dias Vender : 3 dias Esperar : 15 dias Total : 25 dias COMPARAÇÃO CONTRA COMPRAR E MANTER Capital inicial: 100,00 Regra combinada: 113,21 (+13,21 %) Comprar e manter: 125,45 (+25,45 %) Diferença do capital: -12,24 Veredicto: nestes dados a regra combinada PERDE para comprar e manter. É dito com essas palavras: o sinal técnico e o sentimento não conseguiram ficar na alta.
Depois o diário por data, com o sinal técnico, o sentimento e a decisão na última coluna. Repare nas duas primeiras linhas e na última:
Data Fechamento Titular Média 20 Média 50 Técnica Sentim. Decisão 2026-04-06 93,24 O índice sobe com força e marca... 97,00 103,45 -1 +1 esperar 2026-04-09 93,71 A cotação cai por medo de alta ... 96,60 102,50 -1 -1 vender 2026-06-29 116,97 A empresa aprova um plano sólid... 118,11 117,75 +1 +1 comprar
O resultado, sem maquiagem
Aqui está a parte que não dá para enfeitar. Com estes dados a regra combinada termina com um capital de cento e treze vírgula vinte e um, isto é, uma alta de treze vírgula vinte e um por cento. Comprar e manter, que é não fazer absolutamente nada, termina em cento e vinte e cinco vírgula quarenta e cinco, ou seja, vinte e cinco vírgula quarenta e cinco por cento. A diferença é de doze vírgula vinte e quatro e fica a favor de comprar e manter. Falando claro: a regra combinada PERDE, e o programa escreve isso com essas mesmas palavras.
Por que perde? Porque juntar dois sinais não cria bola de cristal. A média móvel é uma média do passado, então por definição chega atrasada às altas; o titular, por sua vez, quase nunca cai no mesmo dia em que o preço se move. Quando os dois sinais finalmente concordam, boa parte do movimento já aconteceu, e no resto do tempo a regra fica esperando fora do mercado. E mais um alerta: uma única medição não prova nada, nem contra nem a favor. Pode ser coincidência destes dados, e é por isso que o honesto é dizer isso com todas as letras e voltar a medir com outros preços antes de tirar conclusões.
Do diário saem os números que realmente servem em um negócio: sete dias diziam comprar, três diziam vender e quinze diziam esperar. Esses quinze dias de espera são o coração do assunto. Cada um tem data, fechamento e motivo escrito, e qualquer pessoa pode abrir o arquivo e discutir com os números na mão. No dia em que o seu contador perguntar por que a mercadoria foi comprada justo naquela semana, a resposta não é um palpite: é uma linha do diário com o sinal técnico e o sentimento que a sustentavam. Se o resultado depois foi bom ou ruim já é outra história, e essa história só se pode julgar com o diário à frente. Deixar por escrito por que cada coisa foi decidida é a ferramenta mais barata e mais subestimada que uma pequena empresa tem.
Como usar os seus próprios preços
O ZIP traz dados de exemplo para que você não precise baixar mais nada, mas o programa foi feito para que você troque a pasta datos/ pelos seus próprios arquivos. O formato é um CSV simples, com cabeçalho e uma linha por dia: abre-se e edita-se em qualquer planilha e salva-se de novo como CSV. Os preços históricos usados nesta oficina vêm do CoinGecko (api.coingecko.com) para o bitcoin e da série SP500 do Federal Reserve Bank de St. Louis, em https://fred.stlouisfed.org/series/SP500; os dois foram baixados em 2026-09-25 e são citados aqui apenas como dados de prática.
| Arquivo | Coluna | O que vai nela |
|---|---|---|
datos/precos.csv | data | O dia no formato ano-mês-dia, por exemplo 2026-01-02 |
datos/precos.csv | fechamento | O preço de fechamento do dia, com ponto decimal |
datos/titulares.csv | data | O dia do titular, no mesmo formato |
datos/titulares.csv | titular | O texto completo, entre aspas se tiver vírgulas |
datos/titulares.csv | rotulo | O que você acha que ele diz: positivo, negativo ou neutro |
Dois avisos de formato que economizam uma tarde de irritação: os nomes das colunas não podem ser trocados, e o arquivo precisa usar vírgula como separador, não ponto e vírgula. Se a sua planilha salvar com ponto e vírgula, o programa para com um erro de coluna e você vai saber exatamente onde está o problema.
Erros comuns e dicas
- Renomear uma coluna do CSV. O programa procura os nomes exatos e para quando não os encontra.
- Deixar menos de cinquenta fechamentos. Sem cinquenta linhas não existe média longa e o diário sai vazio: isso não é um defeito do programa.
- Executar de outra pasta. Se o terminal está em outro lugar, o programa acha o ZIP mas não acha os dados.
- Achar que um dia de esperar é erro de cálculo. Esperar é uma decisão e, neste diário, é a mais comum.
- Ler o resultado como promessa. Os preços de exemplo são inventados e os históricos são citados só para praticar.
- Mudar o léxico e esperar que o sentimento melhore. Se você tira ou acrescenta palavras, as decisões mudam: é exatamente isso que o diário deixa visível.
Quando isso não basta
Este programa é um caderno de prática, não um sistema de gestão. Se o que você precisa é organizar o estoque de verdade -entradas e saídas, custos, quantidades por depósito e os relatórios de sempre-, o Kardex Tauro é gratuito e foi feito para isso; aqui se pratica como se mede uma regra, não se administra o negócio. Um script ensina a olhar os números; o sistema organiza o dia a dia, e nenhum dos dois substitui o critério do dono.
Aviso: repito porque importa: isto é material educativo e não uma recomendação de compra nem de venda. A fonte dos dados está citada mais acima neste mesmo artigo, o ZIP traz o aviso por escrito e os preços de exemplo são inventados. Um resultado passado não garante nada sobre o futuro; antes de investir, consulte um profissional autorizado.
⬇ Baixar o código (ZIP)Baixe o ZIP, troque a pasta de dados pelos seus próprios preços e veja o que o diário diz. Mesmo que a regra perca, você terá aprendido algo que serve para a vida inteira de um negócio: como se mede uma ideia antes de acreditar nela.