Código Python: bandas de Bollinger con media y desviación (descarga gratis)

Código Python: bandas de Bollinger con media y desviación (descarga gratis)
Casi todos los gráficos de precios que uno encuentra por internet traen tres líneas curvas que se mueven juntas: una en el medio y dos que la abrazan por arriba y por abajo. Son las bandas de Bollinger, y su nombre asusta más de lo que explican. Detrás de ellas solo hay dos ideas de la vida diaria: el promedio de los últimos veinte días y cuánto se suele alejar el precio de ese promedio. En este artículo tienes el programa completo en Python, con los comentarios en español, para que lo ejecutes en tu computador y veas las tres líneas dibujadas sobre una serie de ejemplo. Está pensado para el dueño de un negocio pequeño, el contador y el almacenista que quieren entender qué dicen esas líneas, con o sin experiencia programando.
⬇ Descargar el código (ZIP)Aviso: este texto es material educativo y no es una recomendación de compra ni de venta. Los precios de la serie de ejemplo están inventados y los datos históricos se citan solo para practicar. Un resultado pasado no garantiza nada en el futuro: antes de invertir o de mover dinero real, consulta a un profesional autorizado.
Antes de entrar en el código, esto es lo que viaja dentro del archivo comprimido:
| Archivo del ZIP | Para qué sirve |
|---|---|
bandas_bollinger.py | El programa, comentado línea por línea en español |
datos/precios.csv | La serie de ejemplo con 180 cierres diarios, lista para practicar |
salida_ejemplo.txt | La salida que debes obtener al ejecutarlo, para comparar |
LEEME.md | La guía del paquete, con los pasos y dos advertencias que valen dinero |
Qué hace el programa
El programa es corto y hace siempre lo mismo, en este orden:
- Lee el archivo
datos/precios.csv, que trae una fecha y un cierre por renglón. - Recorre la serie con una ventana de veinte cierres: los veinte días que terminan en la fila que está mirando.
- Calcula, para esa ventana, la media (el promedio) y la desviación estándar, que es la medida de cuánto se mueven los cierres alrededor de ese promedio.
- Dibuja dos bandas: la de arriba, que es la media más dos veces la desviación, y la de abajo, que es la media menos dos veces la desviación.
- Mide la anchura de la banda como porcentaje de la media, para ver si el precio está tranquilo o agitado.
- Cuenta cuántos cierres quedaron por encima de la banda superior y cuántos por debajo de la inferior, y comprueba que la banda inferior quede por debajo de la media y esta por debajo de la superior en todas las filas.
- Muestra el resultado en pantalla y lo guarda en
salida/bollinger.csv, un archivo que abres en Excel o en cualquier hoja de cálculo.
Cómo ejecutarlo
Solo necesitas una cosa: Python 3.11 o superior instalado. Nada más, porque el programa usa únicamente la biblioteca estándar del lenguaje. Los pasos son estos: descarga el ZIP con el botón de arriba, descomprímelo en una carpeta, abre la terminal de tu sistema (en Windows, el símbolo del sistema o PowerShell) y colócate dentro de esa carpeta. Luego escribe el nombre del programa y presiona Enter:
python bandas_bollinger.py
Si el comando python no responde en tu equipo, prueba con py en Windows o con python3 en Linux y en Mac. No hay que instalar librerías, ni registrarse, ni tener internet: el programa lee el archivo que viene dentro del ZIP y escribe su resultado al lado, en la carpeta salida.
El código, explicado
Estos son los cinco pedazos que importan. El resto del archivo son detalles de presentación, para que la tabla de pantalla salga alineada y se lea sin torcer el cuello.
Primero, los dos números que definen las bandas: la ventana de cierres y el factor. La ventana es de veinte días, que es la costumbre de toda la vida en estas bandas, y el factor es de dos desviaciones:
VENTANA = 20 # Ventana de 20 cierres: la de siempre en estas bandas
FACTOR = Decimal("2") # Factor 2: las bandas van a 2 desviaciones de la media
Aquí conviene una explicación sin jerga. La media es el promedio de los últimos veinte días. La desviación estándar es un solo número que resume cuánto se suele mover el precio alrededor de ese promedio: si los cierres saltan mucho, la desviación es grande; si van pegados al promedio, es pequeña. Multiplicarla por dos es una forma de decir «el rango por donde el precio se ha movido casi siempre». Si subes el factor, las bandas se ensanchan; si lo bajas, se estrechan. El programa siempre dice con qué factor está trabajando, así no hay dudas.
Segundo, el cálculo de la desviación. Aquí hay un detalle que confunde a mucha gente y el propio código lo deja por escrito en un comentario: se divide entre veinte, no entre diecinueve. Esa es la llamada desviación poblacional, da una banda un poco más estrecha y es la que se usa en estas bandas. Si prefieres la muestral, cambias una línea, pero escoge una y dila siempre, porque con la otra los toques de banda cambian de número:
def desviacion(valores: list[Decimal], promedio: Decimal) -> Decimal:
"""Desviación estándar poblacional de los cierres de la ventana."""
# Desviación POBLACIONAL: se divide entre n (los 20 cierres), no entre n - 1
cuadrados = sum(((valor - promedio) ** 2 for valor in valores), Decimal("0"))
return (cuadrados / Decimal(len(valores))).sqrt()
Tercero, la ventana deslizante. El programa no vuelve a calcular toda la serie cada vez: va corriendo la ventana un día a la vez. Por eso la tabla empieza en la fila veinte y las primeras diecinueve filas no aparecen: no tienen veinte cierres detrás y no se les puede calcular la banda. Ese es el motivo de que tu tabla no empiece donde esperabas, y no un error del programa.
def calcular(precios: list[dict]) -> list[dict]:
"""Recorre la serie con una ventana deslizante y calcula la media, la desviación y las bandas."""
filas = []
for indice in range(VENTANA - 1, len(precios)):
# La ventana son los 20 cierres que terminan en la fila de hoy
ventana = [precio["cierre"] for precio in precios[indice - VENTANA + 1: indice + 1]]
Cuarto, la anchura. Es simplemente la distancia entre las dos bandas, dividida entre la media: cuando el precio se agita, la banda se ensancha, y cuando se calma, se cierra. Sirve para comparar la agitación de un tramo con la de otro, siempre que uses la misma ventana y el mismo factor:
for fila in filas:
# Anchura en porcentaje de la media: (superior - inferior) / media
fila["anchura"] = redondear((fila["superior"] - fila["inferior"]) / fila["media"] * CIEN)
Quinto, el conteo de toques. El programa recorre la tabla ya calculada y cuenta los cierres que se salieron por arriba de la banda superior y los que se salieron por abajo de la inferior. Esas dos cifras son lo único que el programa dice sobre el comportamiento de la serie, y lo dice sin adornos:
arriba = sum(1 for fila in filas if fila["cierre"] > fila["superior"])
abajo = sum(1 for fila in filas if fila["cierre"] < fila["inferior"])
Qué vas a ver en pantalla
La salida es una tabla con los últimos diez días, donde aparecen la fecha, el cierre, las dos bandas, la media y la anchura; después viene un resumen con los conteos. Un trozo real de la salida que trae el paquete se ve así:
ÚLTIMOS 10 DÍAS ----------------------------------------------------------------------- Fecha Cierre B. inferior Media B. superior Anchura % ----------------------------------------------------------------------- 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 ----------------------------------------------------------------------- RESUMEN Cierres por encima de la banda superior: 15 Cierres por debajo de la banda inferior: 5 Anchura media de la banda: 9,80 % Anchura mínima: 3,02 % Anchura máxima: 22,74 %
Las cifras del resumen son las que imprime el programa con la serie de ejemplo: quince cierres se fueron por encima de la banda superior y cinco por debajo de la inferior, sobre un total de 161 filas con banda calculada. La anchura media quedó en nueve coma ocho por ciento, la más angosta en tres coma cero dos por ciento y la más amplia en veintidós coma setenta y cuatro por ciento. El programa también comprueba que la banda inferior quede por debajo de la media y esta por debajo de la superior, y esa comprobación cuadra en todas las filas.
Y aquí va la parte que más importa entender: tocar la banda no es una orden de compra ni de venta. Que el cierre se salga por arriba de la banda superior solo dice que el precio se movió más de lo normal en los últimos veinte días; que se salga por abajo dice lo mismo, pero en la otra dirección. Nada más. El programa no predice si mañana sube o baja, y ninguna de esas dos cifras te dice qué hacer con tu dinero. Si quieres usarlas como señal, tendrás que decidir tú mismo la regla y escribirla, y aun así seguirá siendo una regla tuya, no una promesa del programa.
Los datos: qué trae el ZIP y cómo poner los tuyos
El ZIP trae una serie de ejemplo inventada, de 180 cierres, y está ahí a propósito: sirve para practicar el cálculo sin usar ningún dato real. El archivo es un CSV sencillo, de dos columnas y sin misterio:
| Columna | Qué lleva | Ejemplo |
|---|---|---|
fecha | El día del precio, en formato año-mes-día | 2026-01-02 |
cierre | El precio de cierre de ese día, con punto decimal | 99.94 |
Para trabajar con tus propios precios, reemplaza datos/precios.csv por tu archivo, respetando esos dos nombres de columna y el orden de las filas, de la fecha más vieja a la más nueva. Si tu hoja de cálculo escribe los decimales con coma, cambia el formato antes de guardar o el programa rechazará la fila. Y vale la pena decir de dónde salen los datos reales que se usan en las otras piezas de este taller: las series de bitcoin y del índice S&P 500 se descargaron de CoinGecko (api.coingecko.com) y de la Reserva Federal de St. Louis, en la dirección fred.stlouisfed.org/series/SP500, el 2026-09-25, y se usan solo como datos históricos de práctica. Si vas a publicar tus propias gráficas, cita tu fuente igual que lo hacemos aquí.
Errores comunes y consejos
- Si al ejecutar te aparece un error que menciona
datos/precios.csv, casi siempre es porque la terminal está abierta en otra carpeta. El programa busca la carpetadatosjunto al archivo.py, así que ejecútalo desde donde lo descomprimiste. - Si tu tabla empieza en una fecha que no esperabas, cuenta las filas de tu archivo: las primeras diecinueve nunca tienen banda, porque hacen falta veinte cierres para la primera ventana.
- Si cambias el factor de dos a tres, las bandas se ensanchan y los toques bajan. Es un experimento válido; solo deja anotado con qué factor corriste cada tabla.
- No mezcles en un mismo gráfico la desviación poblacional con la muestral. Escoge una y mantenla fija en todas las corridas.
- Los números del programa se calculan con decimales exactos, no con los decimales del computador. Si vienes de Excel, la diferencia se nota en que aquí no aparece ese centavo fantasma que a veces se cuela en las sumas.
- Guarda el CSV de salida de cada corrida con la fecha en el nombre. Cuando quieras comparar dos series distintas, vas a agradecer tener las corridas separadas.
- Antes de sacar conclusiones de un conteo, mira cuántas filas tiene la tabla. Quince toques sobre 161 filas se leen muy distinto que quince toques sobre veinte filas.
Cuándo esto no alcanza
Este programa sirve para entender el cálculo y para ver tus propias series con tres líneas encima. Lo que no hace es llevar tus precios, tu inventario ni tus costos. Si el problema real de tu negocio es que no sabes cuánto tienes en bodega, cuánto te costó cada lote o a qué precio te queda la mercancía, un script de bandas no lo resuelve. Cuando ya no alcanza con Excel y con scripts sueltos, el paso siguiente es un sistema de inventario como Kardex Tauro: el programa es gratis y sirve para ordenar entradas, salidas y saldo de cada producto sin pelear con fórmulas.
Aviso: repetimos el descargo porque es la parte seria de este artículo. Es material educativo y no es una recomendación de compra ni de venta; los precios de ejemplo están inventados y los históricos se citan solo para practicar, y un resultado pasado no garantiza nada en el futuro. La fuente de los datos reales queda citada arriba, en la sección de los datos, y el ZIP trae este mismo descargo por escrito en su archivo de instrucciones. Antes de invertir, consulta a un profesional autorizado.
⬇ Descargar el código (ZIP)Descarga el paquete, ejecútalo con la serie de ejemplo y recién después cámbiala por tus propios precios. Ver las tres líneas salir de tus números, entendiendo qué significan y qué no, es la mejor forma de dejar de creerles de más.