Código Python: bandas de Bollinger com média e desvio (download grátis)

Código Python: bandas de Bollinger com média e desvio (download grátis)
Quase todo gráfico de preços mostra três linhas curvas andando juntas: uma no meio e duas que a abraçam por cima e por baixo. São as bandas de Bollinger, e o nome assusta mais do que o cálculo. Por trás delas existem apenas duas ideias do dia a dia: a média dos últimos vinte dias e o quanto o preço costuma se afastar dessa média. Neste artigo você recebe o programa completo em Python, com os comentários em português, para rodar na sua máquina e ver as três linhas desenhadas sobre uma série de exemplo. Ele foi escrito para o dono de um negócio pequeno, o contador e o estoquista que querem entender o que essas linhas dizem, com ou sem experiência em programação.
⬇ Baixar o código (ZIP)Aviso: este texto é material educativo e não é uma recomendação de compra nem de venda. Os preços da série de exemplo são inventados e os dados históricos são citados apenas para praticar. Um resultado passado não garante nada no futuro: antes de investir ou de colocar dinheiro de verdade, consulte um profissional autorizado.
Antes de entrar no código, veja o que vem dentro do arquivo compactado:
| Arquivo do ZIP | Para que serve |
|---|---|
bandas_bollinger.py | O programa, comentado linha por linha em português |
datos/precos.csv | A série de exemplo com 180 fechamentos diários, pronta para praticar |
salida_ejemplo.txt | A saída que você deve obter ao rodar o programa, para comparar |
LEIAME.md | O guia do pacote, com os passos e dois avisos que valem dinheiro |
O que o programa faz
O programa é curto e faz sempre a mesma coisa, nesta ordem:
- Lê o arquivo
datos/precos.csv, que traz uma data e um fechamento por linha. - Percorre a série com uma janela de vinte fechamentos: os vinte dias que terminam na linha que está sendo olhada.
- Para essa janela calcula a média, que é o valor médio simples, e o desvio padrão, que é um número só para dizer o quanto os fechamentos se movem em volta dessa média.
- Desenha duas bandas: a de cima, que é a média mais duas vezes o desvio, e a de baixo, que é a média menos duas vezes o desvio.
- Mede a largura da banda em porcentagem da média, para ver se o preço está calmo ou agitado.
- Conta quantos fechamentos ficaram acima da banda superior e quantos caíram abaixo da inferior, e confere se a banda inferior fica abaixo da média e esta abaixo da superior em todas as linhas.
- Mostra o resultado na tela e grava tudo em
salida/bollinger.csv, um arquivo que você abre no Excel ou em qualquer planilha.
Como executar
Você precisa de uma coisa só: Python 3.11 ou superior instalado. Nada mais, porque o programa usa somente a biblioteca padrão da linguagem. Os passos são estes: baixe o ZIP no botão acima, descompacte em uma pasta, abra o terminal do sistema e entre nessa pasta. Depois escreva o nome do programa e aperte Enter:
python bandas_bollinger.py
Se o comando python não responder na sua máquina, tente py no Windows ou python3 no Linux e no Mac. Não há nada para instalar, nenhum cadastro e nenhuma necessidade de internet: o programa lê o arquivo que vem dentro do ZIP e grava o resultado ao lado, na pasta salida.
O código, explicado
Estes são os cinco trechos que importam. O resto do arquivo é detalhe de apresentação, para a tabela da tela sair alinhada e ser lida sem torcer o pescoço.
Primeiro, os dois números que definem as bandas: a janela de fechamentos e o fator. A janela é de vinte dias, que é a tradição nessas bandas, e o fator é de dois desvios:
VENTANA = 20 # Janela de 20 fechamentos: a de sempre nessas bandas
FACTOR = Decimal("2") # Fator 2: as bandas ficam a 2 desvios da média
Vale uma explicação sem jargão. A média é o valor médio dos últimos vinte dias. O desvio padrão é um número que resume o quanto o preço costuma se mover em volta dessa média: se os fechamentos pulam muito, o desvio é grande; se ficam colados na média, ele é pequeno. Multiplicar por dois é uma forma de dizer "o intervalo por onde o preço quase sempre andou". Aumente o fator e as bandas alargam; diminua e elas estreitam. O programa sempre imprime com que fator trabalhou, então não sobra dúvida.
Segundo, o cálculo do desvio. Aqui existe um detalhe que confunde muita gente e o próprio código deixa isso escrito em um comentário: divide por vinte, não por dezenove. Esse é o desvio populacional, que dá uma banda um pouco mais estreita e é o usado nessas bandas. Se você preferir o amostral, muda uma linha, mas escolha um e diga sempre qual, porque com o outro o número de toques na banda muda:
def desviacion(valores: list[Decimal], promedio: Decimal) -> Decimal:
"""Desvio padrão populacional dos fechamentos da janela."""
# Desvio PADRÃO populacional: divide por n (os 20 fechamentos), não por n - 1
cuadrados = sum(((valor - promedio) ** 2 for valor in valores), Decimal("0"))
return (cuadrados / Decimal(len(valores))).sqrt()
Terceiro, a janela deslizante. O programa não recalcula a série inteira a cada passo: ele corre a janela um dia por vez. É por isso que a tabela começa na vigésima linha e as primeiras dezenove nunca aparecem: não existem vinte fechamentos atrás delas, então não há banda para calcular. Essa é a razão pela qual sua tabela pode não começar onde você esperava, e não um erro do programa.
def calcular(precios: list[dict]) -> list[dict]:
"""Percorre a série com uma janela deslizante e calcula a média, o desvio e as bandas."""
filas = []
for indice in range(VENTANA - 1, len(precios)):
# A janela são os 20 fechamentos que terminam na linha de hoje
ventana = [precio["cierre"] for precio in precios[indice - VENTANA + 1: indice + 1]]
Quarto, a largura. Ela é simplesmente a distância entre as duas bandas, dividida pela média: quando o preço se agita a banda alarga, e quando ele se acalma a banda fecha. Serve para comparar a agitação de um trecho com a de outro, desde que você use a mesma janela e o mesmo fator:
for fila in filas:
# Largura em porcentagem da média: (superior - inferior) / média
fila["anchura"] = redondear((fila["superior"] - fila["inferior"]) / fila["media"] * CIEN)
Quinto, a contagem dos toques. O programa percorre a tabela já calculada e conta os fechamentos que passaram por cima da banda superior e os que caíram abaixo da inferior. Esses dois números são tudo o que o programa diz sobre o comportamento da série, e ele diz sem enfeite:
arriba = sum(1 for fila in filas if fila["cierre"] > fila["superior"])
abajo = sum(1 for fila in filas if fila["cierre"] < fila["inferior"])
O que você vai ver na tela
A saída é uma tabela com os últimos dez dias, mostrando a data, o fechamento, as duas bandas, a média e a largura; depois vem um resumo com as contagens. Um trecho real da saída que acompanha o pacote aparece assim:
ÚLTIMOS 10 DIAS ----------------------------------------------------------------------- Data Fechamento Banda inf. Média Banda sup. Largura % ----------------------------------------------------------------------- 2026-06-21 120,85 116,01 120,12 124,23 6,84 2026-06-22 116,96 115,66 119,99 124,32 7,22 2026-06-23 118,49 115,63 119,76 123,89 6,90 2026-06-24 116,43 115,42 119,40 123,37 6,66 2026-06-25 117,39 115,38 119,13 122,87 6,29 2026-06-26 115,28 115,02 118,76 122,50 6,30 2026-06-27 115,53 114,80 118,42 122,04 6,11 2026-06-28 117,18 114,97 118,17 121,37 5,42 2026-06-29 116,97 114,86 118,11 121,35 5,49 2026-06-30 117,24 114,84 118,09 121,35 5,51 ----------------------------------------------------------------------- RESUMO Fechamentos acima da banda superior: 15 Fechamentos abaixo da banda inferior: 5 Largura média da banda: 9,80 % Largura mínima: 3,02 % Largura máxima: 22,74 %
Esses números do resumo são os que o programa imprime na série de exemplo: quinze fechamentos passaram por cima da banda superior e cinco caíram abaixo da inferior, em um total de 161 linhas com banda calculada. A largura média ficou em nove vírgula oito por cento, a mais estreita em três vírgula zero dois por cento e a mais larga em vinte e dois vírgula setenta e quatro por cento. O programa também confere se a banda inferior fica abaixo da média e esta abaixo da superior, e essa conferência fecha em todas as linhas.
E aqui está a parte que mais importa entender: tocar a banda não é ordem de compra nem de venda. Um fechamento que passa por cima da banda superior só diz que o preço se moveu mais do que o normal nos últimos vinte dias; um fechamento que cai abaixo diz o mesmo, na direção contrária. Nada além disso. O programa não prevê se amanhã sobe ou desce, e nenhum desses números diz o que fazer com o seu dinheiro. Se você quiser usar as bandas como sinal, terá de escolher a regra por conta própria e escrevê-la, e mesmo assim ela continuará sendo uma regra sua, não uma promessa do programa.
Os dados: o que vem no ZIP e como usar os seus
O ZIP traz uma série de exemplo inventada, com 180 fechamentos, e isso é proposital: serve para praticar o cálculo sem usar nenhum dado real de mercado. O arquivo é um CSV simples, de duas colunas e sem mistério:
| Coluna | O que leva | Exemplo |
|---|---|---|
data | O dia do preço, no formato ano-mês-dia | 2026-01-02 |
fechamento | O preço de fechamento daquele dia, com ponto decimal | 99.94 |
Para trabalhar com os seus próprios preços, troque datos/precos.csv pelo seu arquivo, mantendo esses dois nomes de coluna e a ordem das linhas, da data mais antiga para a mais nova. Se a sua planilha escreve os decimais com vírgula, mude o formato antes de salvar, senão o programa recusa a linha. Também vale dizer de onde vêm os dados reais usados nas outras peças desta oficina: as séries de bitcoin e do índice S&P 500 foram baixadas do CoinGecko (api.coingecko.com) e do Federal Reserve de St. Louis, em fred.stlouisfed.org/series/SP500, no dia 2026-09-25, e são usadas apenas como dados históricos de prática. Se você publicar os seus próprios gráficos, cite a sua fonte como fazemos aqui.
Erros comuns e dicas
- Se ao rodar aparecer um erro citando
datos/precos.csv, quase sempre o terminal está aberto em outra pasta. O programa procura a pastadatosao lado do arquivo.py, então rode a partir de onde você descompactou. - Se a sua tabela começa em uma data inesperada, conte as linhas do arquivo: as primeiras dezenove nunca têm banda, porque são necessários vinte fechamentos para a primeira janela.
- Se você mudar o fator de dois para três, as bandas alargam e os toques diminuem. É um experimento válido; só anote com que fator cada tabela foi gerada.
- Nunca misture no mesmo gráfico o desvio populacional com o amostral. Escolha um e mantenha fixo em todas as execuções.
- O programa calcula com decimais exatos, não com os decimais da máquina. Se você vem do Excel, a diferença aparece como a ausência daquele centavo fantasma que às vezes se infiltra nas somas.
- Guarde o CSV de cada execução com a data no nome do arquivo. Quando quiser comparar duas séries diferentes, você vai agradecer por ter as execuções separadas.
- Antes de tirar conclusões de uma contagem, veja quantas linhas a tabela tem. Quinze toques em 161 linhas se leem de forma bem diferente de quinze toques em vinte linhas.
Quando isso não basta
Este programa serve para explicar o cálculo e para ver as suas próprias séries com três linhas por cima. O que ele não faz é cuidar dos seus preços, do seu estoque ou dos seus custos. Se o problema real do negócio é não saber o que está no depósito, quanto custou cada lote ou com que margem a mercadoria ficou, um script de bandas não resolve. Quando a planilha e os scripts soltos já não bastam, o passo seguinte é um sistema de ficha de estoque como o Kardex Tauro: o programa em si é gratuito e serve para organizar entradas, saídas e saldo de cada produto sem brigar com fórmulas.
Aviso: repetimos o descargo porque ele é a parte séria deste artigo. Isto é material educativo e não é uma recomendação de compra nem de venda; os preços de exemplo são inventados e os históricos são citados apenas para praticar, e um resultado passado não garante nada no futuro. A fonte dos dados reais está citada acima, na seção dos dados, e o ZIP traz este mesmo descargo por escrito no arquivo de instruções. Antes de investir, consulte um profissional autorizado.
⬇ Baixar o código (ZIP)Baixe o pacote, rode com a série de exemplo e só depois troque pelos seus preços. Ver as três linhas saírem dos seus próprios números, entendendo o que elas dizem e o que não dizem, é a melhor maneira de parar de acreditar demais nelas.