Código Python: médias móveis de 20 e 50 e o cruzamento (download grátis)

Código Python: médias móveis de 20 e 50 e o cruzamento (download grátis)
Tem uma ideia que aparece em todo vídeo de mercado: quando a média dos últimos vinte dias de um preço fica acima da média dos últimos cinquenta, dizem que surgiu um sinal de compra; quando fica abaixo, um sinal de venda. Chama-se cruzamento de médias móveis e, por mais complicado que o nome soe, a conta é uma soma e uma divisão repetidas com paciência. Neste artigo você baixa um programa em Python que faz essa conta com os seus próprios preços, mostra o resultado na tela em duas tabelas organizadas e, no fim, compara tudo com a opção mais simples de todas: comprar uma vez e não mexer mais.
É para o dono de um negócio, o contador ou o encarregado de estoque que quer ver a conta com os próprios olhos, sem instalar programas novos nem pagar assinatura. O pacote vem com preços de exemplo inventados e também com o caminho para trocá-los pelos seus: um arquivo de texto com uma coluna de data e outra de preço resolve. Você não precisa saber programar para usar, e não precisa acreditar nele também: o próprio programa mostra onde a ideia falha.
⬇ Baixar o código (ZIP)Aviso: isto é material educativo e não é uma recomendação de compra nem de venda. Os preços de exemplo são inventados e os dados históricos aparecem só para praticar. Um resultado passado não garante nada no futuro; antes de investir, consulte um profissional autorizado.
| O que vem no ZIP | Para que serve |
|---|---|
| medias_y_cruces.py | O programa: lê os preços, calcula as duas médias, marca os cruzamentos e faz a comparação final. |
| datos/precos.csv | Cento e oitenta dias de preços de exemplo, inventados, para o programa ter com o que trabalhar. |
| salida_ejemplo.txt | A saída real do programa, exatamente como sai, para você comparar com o que aparecer na sua tela. |
| LEIAME.md | As instruções escritas, passo a passo, caso este artigo deixe algo de fora. |
O arquivo de preços: duas colunas e mais nada
O programa lê um arquivo de texto com extensão .csv. Qualquer planilha abre esse formato, e o editor de texto simples também. Ele só precisa de duas colunas, com os nomes escritos na primeira linha:
| Coluna | O que vai nela |
|---|---|
| data | O dia, escrito no formato ano-mês-dia, por exemplo 2026-01-02. |
| fechamento | O preço de fechamento desse dia, com ponto decimal e duas casas, por exemplo 99.94. |
A primeira linha é o cabeçalho e não se mexe nela. Cada linha seguinte é um dia: primeiro a data, depois uma vírgula e depois o preço. Se o arquivo trouxer colunas a mais, o programa as ignora; se faltar uma dessas duas, ele para e avisa na tela, sem inventar número. Você pode exportar seus preços do Excel com a opção salvar como CSV, ou digitá-los à mão no editor de texto. Para usar os seus dados, troque o arquivo que está dentro da pasta datos pelo seu, com o mesmo nome e na mesma pasta, e rode o programa de novo.
De onde vêm os números reais: as séries históricas usadas para praticar nesta família de artigos vêm do CoinGecko, o serviço aberto de dados de criptomoedas cujo endereço é api.coingecko.com, e do índice SP500 do Reserva Federal de St. Louis, publicado em fred.stlouisfed.org/series/SP500. Os dois foram baixados em 2026-09-25 e aparecem aqui apenas como dados históricos de prática. Nesta peça o arquivo que viaja dentro do ZIP é inventado de propósito: serve para qualquer pessoa repetir o exercício sem depender de download nem de internet.
O que o programa faz
- Abre o arquivo de preços da pasta datos e lê os cento e oitenta dias que vêm de exemplo.
- Calcula a média dos últimos vinte dias para cada data. Essa é a média curta: mexe rápido porque olha só o último mês de negociação.
- Calcula a média dos últimos cinquenta dias. Essa é a longa: mexe devagar e mostra a tendência de fundo.
- Compara as duas dia a dia. No dia em que a curta passa de baixo para cima da longa, ele escreve um sinal de compra. No dia em que passa de cima para baixo, escreve um sinal de venda.
- Salva dois arquivos na pasta salida: medias.csv com as duas médias de cada dia e senales.csv com cada cruzamento encontrado, com sua data e seu preço.
- No fim separa um capital imaginário de mil unidades, segue os sinais e compara isso com comprar uma única vez e nunca vender. É aí que o programa diz, sem enfeite, qual das duas formas terminou na frente e por quanto.
Como executar
Não há nada para instalar além do Python. Baixe a versão 3.11 ou superior no site oficial do Python e deixe as opções que já vêm marcadas. Depois descompacte o ZIP numa pasta cômoda, a área de trabalho serve. Abra o terminal do sistema, entre nessa pasta e escreva o nome do programa:
python medias_y_cruces.py
No Windows o terminal se chama Prompt de Comando ou PowerShell; no Mac e no Linux é o Terminal. O programa usa somente a biblioteca padrão do Python: não há pandas para instalar, nem numpy, nem nada pago. Leva menos de um segundo e não precisa de internet, porque trabalha com o arquivo de preços que já está dentro do ZIP.
O código, explicado
O programa começa escrevendo num único lugar tudo o que você pode ajustar. As duas janelas das médias, quantos dias aparecem na tela e o dinheiro imaginário do exemplo ficam no topo, com nomes claros. Se você quiser testar uma média de trinta e cinco dias, muda um número e pronto:
# As duas janelas das médias, a tabela da tela e o dinheiro do exemplo
VENTANA_CORTA = 20 # média dos últimos 20 dias: é a curta, reage rápido
VENTANA_LARGA = 50 # média dos últimos 50 dias: é a longa, mostra a tendência de fundo
FILAS_TABLA = 10 # quantos dias aparecem na tela
CAPITAL_INICIAL = Decimal("1000.00") # dinheiro imaginário do exemplo, para comparar as duas formas
CENTAVO = Decimal("0.01")
Ali dentro há dois detalhes que evitam muita dor de cabeça. Primeiro, preços e dinheiro são tratados com Decimal, o tipo de dado que os bancos usam: com os decimais binários de sempre, somar centenas de preços vai arrastando erros de centavos até a tabela não fechar. Segundo, todos os caminhos são montados com pathlib a partir da pasta do próprio arquivo, então o programa se comporta igual no Windows, no Linux e no Mac sem mexer numa linha.
A média móvel simples é exatamente o que o nome diz: a média dos últimos N fechamentos. A função recebe a lista de fechamentos, o dia que está sendo olhado e o tamanho da janela; corta o pedaço da lista que pertence àquela janela e divide. Enquanto não houver dias suficientes para encher a janela, ela devolve vazio em vez de inventar um número:
def media_movil(cierres: list, indice: int, ventana: int):
"""Média móvel simples: média dos últimos N fechamentos até o dia indicado."""
if indice + 1 < ventana:
return None # ainda não há dias suficientes para esta média
return redondear(sum(cierres[indice - ventana + 1: indice + 1], Decimal("0")) / ventana)
Esse costume de devolver vazio é o que evita o erro clássico desse tipo de conta: as primeiras linhas da tabela saem sem média, porque ainda não há o que calcular, e isso está certo. A média de cinquenta dias só começa a existir no dia cinquenta, nunca antes.
Aqui está o coração do assunto. O programa percorre o arquivo dia a dia e compara onde as duas médias estão hoje contra onde estavam ontem. Só dois casos interessam:
def detectar_cruces(filas: list) -> list:
"""Procura o dia em que a média curta cruza a longa: para cima é compra e para baixo é venda."""
senales = []
for indice in range(1, len(filas)):
anterior, actual = filas[indice - 1], filas[indice]
if None in (anterior["media20"], anterior["media50"],
actual["media20"], actual["media50"]):
continue # enquanto as duas médias não existirem, não se pode falar de cruzamento
if actual["media20"] > actual["media50"] and anterior["media20"] <= anterior["media50"]:
tipo = "Compra"
elif actual["media20"] < actual["media50"] and anterior["media20"] >= anterior["media50"]:
tipo = "Venda"
else:
continue
senales.append({"tipo": tipo, "fecha": actual["fecha"], "cierre": actual["cierre"],
"media20": actual["media20"], "media50": actual["media50"]})
return senales
O importante é que o cruzamento não se enxerga olhando um único dia, mas o par de dias: hoje a curta está em cima e ontem estava embaixo. Essa condição se escreve com quatro comparações e uma subtração de posições, nada mais. E há um detalhe fino: enquanto as duas médias não existirem, o programa pula o dia em vez de comparar com um buraco.
No fim chega a parte incômoda, a que quase nenhum vídeo mostra: comparar. O programa pega o último preço do arquivo, calcula quanto valeria o capital se tivesse seguido os sinais e quanto valeria se tivesse comprado no dia do primeiro sinal e nunca tivesse vendido. As duas rentabilidades são arredondadas para duas casas, para poderem ser comparadas em pé de igualdade:
ultimo = filas[-1]["cierre"]
final_senal = redondear(unidades * ultimo) if unidades > 0 else capital
# comprar e manter: entra na data do primeiro sinal e nunca mais vende
arranque = senales[0] if senales else filas[0]
final_mantener = redondear(CAPITAL_INICIAL * ultimo / arranque["cierre"])
return {
"operaciones": operaciones,
"final_senal": final_senal,
"final_mantener": final_mantener,
"rent_senal": redondear((final_senal / CAPITAL_INICIAL - 1) * 100),
"rent_mantener": redondear((final_mantener / CAPITAL_INICIAL - 1) * 100),
"arranque": arranque,
}
Esse último bloco é o que transforma o exercício em algo honesto. O programa não se gaba: calcula as duas formas e mostra qual ganhou, mesmo quando a vencedora não é a estratégia de sinais.
O que você vai ver na tela
Ao rodar, a tela mostra primeiro o aviso legal, depois os últimos dez dias com seu fechamento e suas duas médias, em seguida os sinais encontrados e, por último, a comparação. Um trecho real da saída é este:
ÚLTIMOS DIAS (10) =============================================== Data Fechamento Média 20 Média 50 ----------------------------------------------- 2026-06-21 120,85 120,12 115,92 2026-06-22 116,96 119,99 116,22 2026-06-23 118,49 119,76 116,53 2026-06-24 116,43 119,40 116,76 2026-06-25 117,39 119,13 117,00 2026-06-26 115,28 118,76 117,19 2026-06-27 115,53 118,42 117,37 2026-06-28 117,18 118,17 117,56 2026-06-29 116,97 118,11 117,75 2026-06-30 117,24 118,09 117,93
SINAIS ENCONTRADOS: 2 =========================================================== Sinal Data Fechamento Média 20 Média 50 ----------------------------------------------------------- Venda 2026-03-16 97,97 107,93 107,95 Compra 2026-04-29 100,66 97,91 97,76 ----------------------------------------------------------- Cruzamento para cima: a curta passa acima da longa (sinal de compra). Cruzamento para baixo: a curta passa abaixo (sinal de venda).
E a parte que mais interessa, o fecho da comparação:
SINAIS CONTRA COMPRAR E MANTER
================================================================================
Capital inicial: 1.000,00
Comprar e manter entra em: 2026-03-16 a um preço de 97,97
Operações da estratégia de sinais: 1
2026-04-29 Compra 100,66
Capital final seguindo os sinais: 1.164,71 (16,47 %)
Capital final comprando e mantendo: 1.196,69 (19,67 %)
GANHOU comprar e manter, por: 31,98
Nota honesta: o ganhador depende do trecho medido e do primeiro sinal; com
outros preços pode ganhar a outra forma. Um resultado passado não garante
nada.
A comparação, sem enfeite: aqui ganhou comprar e manter
Vamos à verdade do exercício, porque um programa que só mostra o lado bonito não vale nada. Com estes cento e oitenta dias de preços inventados, a estratégia de sinais terminou com 1.164,71 e comprar e manter terminou com 1.196,69. Ganhou comprar e manter, por 31,98. Em rentabilidade, dezenove vírgula sessenta e sete por cento contra dezesseis vírgula quarenta e sete por cento: a forma mais simples tirou quase dois pontos e meio da forma que parece mais esperta.
Por que a estratégia perde se chegou a detectar os dois cruzamentos? Por duas razões fáceis de ver. A primeira: a estratégia fica fora do mercado parte do tempo. Entre o sinal de venda de meados de março e o sinal de compra do fim de abril, o capital ficou parado enquanto o preço fazia o seu movimento, e esse buraco não se recupera sozinho. A segunda: o trecho medido sobe. Quando um preço sobe quase sem pausa, qualquer regra que tire você do mercado por uns dias perde para ficar sentado. Com outro trecho, com outros preços e com outro primeiro sinal pode ganhar a outra forma, e isso o próprio programa diz na sua nota honesta.
Por isso vale dizer bem claro: este programa serve para entender como um sinal é calculado, como é conferido e como uma estratégia é medida contra a alternativa mais simples. Não serve para ganhar dinheiro nem para adivinhar o futuro. Quem termina a leitura sabendo disso sai ganhando muito mais do que com qualquer promessa.
Erros comuns e dicas
- O arquivo com o nome errado: o programa procura exatamente datos/precos.csv. Se você chamar de precos2.csv, ele para e avisa. Renomeie o seu arquivo ou edite essa linha.
- Ponto contra vírgula: os arquivos de exemplo usam ponto decimal, como nos sistemas de faturamento, e as tabelas da tela aparecem com vírgula, porque o programa formata no padrão local. Os dois são o mesmo número.
- Menos linhas que a janela longa: com menos de cinquenta dias o programa roda, mas não acha nenhum cruzamento e a tabela sai meio vazia. Carregue alguns meses.
- Datas fora de ordem: o arquivo deve ir do dia mais antigo para o mais novo. Se estiverem invertidas, as médias saem sem sentido.
- Linhas em branco no fim: uma linha vazia corta a leitura. Abra o arquivo e apague as linhas sobrando.
- Não mude a pasta de saída: o programa cria salida/medias.csv e salida/senales.csv sozinho. Se você abrir no Excel e deixar aberto, a execução seguinte pode falhar na hora de escrever.
Quando isto não basta
Este programa é uma roda de treinamento. Lê um arquivo, calcula duas médias e mostra uma tabela; não leva a ficha de estoque, não sabe quanto você pagou por cada item, não lida com vários depósitos e não fecha o mês para você. A ficha de estoque, em palavras simples, é o registro de tudo o que entra e sai, com o seu custo.
Para um negócio pequeno que ainda vive em planilhas, o Kardex Tauro é um programa grátis que junta estoque, compras, vendas e ficha de estoque num só lugar, com relatórios que podem ser entregues ao contador. O software é o que se usa quando o Excel e um script já não bastam; este código em Python é o que se usa para entender a conta que existe por trás dos sinais antes de acreditar em qualquer gráfico.
Aviso: lembre-se de que isto é material educativo e não é uma recomendação de compra nem de venda. Os preços de exemplo são inventados, os dados históricos aparecem só para praticar e um resultado passado não garante nada no futuro; consulte um profissional autorizado antes de investir. A fonte dos dados reais está citada acima, com o seu endereço, e o ZIP traz este mesmo aviso por escrito dentro do arquivo de instruções.
⬇ Baixar o código (ZIP)Baixe o pacote, abra o arquivo de preços, troque pelos seus números e rode de novo. Ver os seus próprios dados passarem pelas duas médias ensina mais do que qualquer vídeo, e a comparação honesta do final é a parte que quase ninguém chega a ver.