Software de Kardex e Estoque

Kardex Tauro

O software de gestão de estoque Kardex Tauro® foi projetado para gerenciar seu armazém ou depósito de forma eficiente e pode ser aprendido em um curto período de tempo.

O Kardex Tauro é gratuito para uso não comercial.
Não requer conexão com a internet e funciona no Windows.

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 ZIPPara que serve
bandas_bollinger.pyO programa, comentado linha por linha em português
datos/precos.csvA série de exemplo com 180 fechamentos diários, pronta para praticar
salida_ejemplo.txtA saída que você deve obter ao rodar o programa, para comparar
LEIAME.mdO 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:

  1. Lê o arquivo datos/precos.csv, que traz uma data e um fechamento por linha.
  2. Percorre a série com uma janela de vinte fechamentos: os vinte dias que terminam na linha que está sendo olhada.
  3. 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.
  4. 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.
  5. Mede a largura da banda em porcentagem da média, para ver se o preço está calmo ou agitado.
  6. 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.
  7. 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:

ColunaO que levaExemplo
dataO dia do preço, no formato ano-mês-dia2026-01-02
fechamentoO preço de fechamento daquele dia, com ponto decimal99.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 pasta datos ao 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.

Compartilhar
Link copiado
Microsoft Store da Microsoft StoreBaixar grátis
Chatea por WhatsApp