Código Python: medias móviles de 20 y 50 y el cruce (descarga gratis)

Código Python: medias móviles de 20 y 50 y el cruce (descarga gratis)
Hay una idea que se repite en todos los videos de mercados: cuando el promedio de los últimos veinte días de un precio se pone por encima del promedio de los últimos cincuenta, aparece una señal de compra; cuando se pone por debajo, aparece una señal de venta. Se llama cruce de medias móviles y, aunque suene complicado, es una suma y una división repetidas con paciencia. En este artículo descargas un programa de Python que hace esa cuenta con tus propios precios, la muestra en pantalla ordenada en dos tablas y al final la compara con la opción más simple de todas: comprar una vez y no mover nada más.
Está pensado para el dueño de un negocio, el contador o el almacenista que quiere ver el cálculo con sus propios ojos, sin instalar programas nuevos ni pagar suscripciones. El paquete trae precios de ejemplo inventados y también la manera de cambiarlos por los tuyos: un archivo de texto con una columna de fecha y otra de precio es todo lo que hace falta. No hay que saber programar para usarlo, y tampoco hay que creerle: el propio programa se encarga de mostrar dónde se equivoca la idea.
⬇ Descargar el código (ZIP)Aviso: todo esto es material educativo y no es una recomendación de compra ni de venta. Los precios de ejemplo son inventados y los datos históricos se citan solo para practicar. Un resultado pasado no garantiza nada en el futuro; antes de invertir, consulta a un profesional autorizado.
| Qué trae el ZIP | Para qué sirve |
|---|---|
| medias_y_cruces.py | El programa: lee los precios, calcula las dos medias, marca los cruces y hace la comparación final. |
| datos/precios.csv | Ciento ochenta días de precios de ejemplo, inventados, para que el programa tenga con qué trabajar. |
| salida_ejemplo.txt | La salida real del programa, tal cual, para que compares con lo que te aparezca a ti en pantalla. |
| LEEME.md | Las instrucciones escritas, paso a paso, por si este artículo se te queda corto. |
El archivo de precios: dos columnas y nada más
El programa lee un archivo de texto con extensión .csv. Ese formato lo abre cualquier hoja de cálculo y también el Bloc de notas. Solo necesita dos columnas, con sus nombres escritos en la primera fila:
| Columna | Qué lleva |
|---|---|
| fecha | El día, escrito en formato año-mes-día, por ejemplo 2026-01-02. |
| cierre | El precio de cierre de ese día, con punto decimal y dos decimales, por ejemplo 99.94. |
La primera fila es el encabezado y no se toca. Cada fila siguiente es un día: primero la fecha, después una coma y después el precio. Si el archivo trae más columnas, el programa las ignora; si le falta alguna de estas dos, se detiene y lo dice en pantalla, sin inventar nada. Puedes exportar tus precios desde Excel con la opción Guardar como CSV, o escribirlos a mano en el Bloc de notas. Para usar tus datos, reemplaza el archivo que viene dentro de la carpeta datos por el tuyo, con el mismo nombre y en la misma carpeta, y vuelve a ejecutar el programa.
De dónde salen los números reales: las series históricas que se usan para practicar en esta familia de artículos vienen de CoinGecko, el servicio abierto de datos de criptomonedas cuya dirección es api.coingecko.com, y del índice SP500 de la Reserva Federal de St. Louis, publicado en fred.stlouisfed.org/series/SP500. Las dos se descargaron el 2026-09-25 y se usan aquí solo como datos históricos de práctica. En esta pieza el archivo que viaja dentro del ZIP es inventado a propósito: sirve para que cualquiera repita el ejercicio sin depender de una descarga ni de internet.
Qué hace el programa
- Abre el archivo de precios de la carpeta datos y lee los ciento ochenta días que trae de ejemplo.
- Calcula la media de los últimos veinte días para cada fecha. Esa es la media corta: se mueve rápido porque solo mira el último mes de negociación.
- Calcula la media de los últimos cincuenta días. Esa es la larga: se mueve despacio y marca la tendencia de fondo.
- Compara las dos día por día. El día en que la corta pasa de estar por debajo a estar por encima de la larga, escribe una señal de compra. El día en que pasa de estar por encima a estar por debajo, escribe una señal de venta.
- Guarda dos archivos en la carpeta salida: medias.csv con las dos medias de cada día y senales.csv con cada cruce encontrado, con su fecha y su precio.
- Al final aparta un capital imaginario de mil unidades, sigue las señales y lo compara con comprar una sola vez y no vender más. Ahí es donde el programa dice, sin adornos, cuál de las dos formas terminó mejor y por cuánto.
Cómo ejecutarlo
No hay que instalar nada más que Python. Descarga la versión 3.11 o superior desde el sitio oficial de Python y deja las opciones que trae por defecto. Después descomprime el ZIP en una carpeta cómoda, el escritorio sirve. Abre la terminal del sistema, entra en esa carpeta y escribe el nombre del programa:
python medias_y_cruces.py
En Windows la terminal se llama Símbolo del sistema o PowerShell; en Mac y Linux, Terminal. El programa usa solo la biblioteca estándar de Python: no hay que instalar pandas, ni numpy, ni ningún paquete de pago. Tarda menos de un segundo y no necesita internet, porque trabaja con el archivo de precios que ya viene dentro del ZIP.
El código, explicado
El programa empieza dejando escrito en un solo sitio todo lo que se puede ajustar. Las dos ventanas de las medias, cuántos días se muestran en pantalla y el dinero imaginario del ejemplo están arriba, con nombres claros. Si quieres probar con una media de treinta y cinco días, cambias un número y ya está:
# Las dos ventanas de las medias, la tabla de pantalla y el dinero del ejemplo
VENTANA_CORTA = 20 # media de los últimos 20 días: es la corta, reacciona rápido
VENTANA_LARGA = 50 # media de los últimos 50 días: es la larga, marca la tendencia de fondo
FILAS_TABLA = 10 # cuántos días se muestran en pantalla
CAPITAL_INICIAL = Decimal("1000.00") # dinero imaginario del ejemplo, para comparar las dos formas
CENTAVO = Decimal("0.01")
Ahí hay dos detalles que ahorran disgustos. Primero, los precios y el dinero se manejan con Decimal, el tipo de dato que usan los bancos: con los decimales binarios de siempre, sumar cientos de precios va arrastrando errores de centavos hasta que la tabla no cuadra. Segundo, todas las rutas se arman con pathlib a partir de la carpeta del propio archivo, así el programa funciona igual en Windows, en Linux y en Mac sin tocar una línea.
La media móvil simple es exactamente lo que su nombre dice: el promedio de los últimos N cierres. La función recibe la lista de cierres, el día que se está mirando y el tamaño de la ventana; corta el pedazo de lista que corresponde y divide. Mientras no haya días suficientes para llenar la ventana, devuelve vacío en vez de inventar un número:
def media_movil(cierres: list, indice: int, ventana: int):
"""Media móvil simple: promedio de los últimos N cierres hasta el día indicado."""
if indice + 1 < ventana:
return None # todavía no hay días suficientes para esta media
return redondear(sum(cierres[indice - ventana + 1: indice + 1], Decimal("0")) / ventana)
Ese detalle de devolver vacío es el que evita el error clásico de estas cuentas: las primeras filas de la tabla salen sin media, porque todavía no hay con qué calcularla, y eso es correcto. La media de cincuenta días empieza a existir a partir del día cincuenta, ni antes ni después.
Aquí está el corazón del asunto. El programa camina el archivo día por día y compara dónde están las dos medias hoy contra dónde estaban ayer. Solo hay dos casos que le interesan:
def detectar_cruces(filas: list) -> list:
"""Busca el día en que la media corta cruza a la larga: al alza es compra y a la baja es venta."""
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 # mientras las dos medias no existan no se puede hablar de cruce
if actual["media20"] > actual["media50"] and anterior["media20"] <= anterior["media50"]:
tipo = "Compra"
elif actual["media20"] < actual["media50"] and anterior["media20"] >= anterior["media50"]:
tipo = "Venta"
else:
continue
senales.append({"tipo": tipo, "fecha": actual["fecha"], "cierre": actual["cierre"],
"media20": actual["media20"], "media50": actual["media50"]})
return senales
Lo importante es que el cruce no se detecta mirando un solo día, sino la pareja de días: hoy la corta está arriba y ayer estaba abajo. Esa condición se escribe con cuatro comparaciones y una resta de posiciones, nada más. Y hay un detalle fino: mientras las dos medias no existan, el programa se salta el día en vez de comparar contra un hueco.
Al final llega la parte incómoda, la que casi ningún video muestra: comparar. El programa toma el último precio del archivo, calcula cuánto valdría el capital si hubiera seguido las señales y cuánto valdría si hubiera comprado el día de la primera señal y no hubiera vendido nunca. Las dos rentabilidades se redondean a dos decimales para poder compararlas en igualdad de condiciones:
ultimo = filas[-1]["cierre"]
final_senal = redondear(unidades * ultimo) if unidades > 0 else capital
# comprar y mantener: se entra en la fecha de la primera señal y no se vende más
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,
}
Ese último bloque es el que convierte el ejercicio en algo honesto. El programa no presume: calcula las dos formas y muestra cuál ganó, aunque la ganadora no sea la estrategia de señales.
Qué vas a ver en pantalla
Al ejecutarlo, la pantalla muestra primero el aviso legal, después los últimos diez días con su cierre y sus dos medias, luego las señales encontradas y al final la comparación. Un trozo real de la salida es este:
ÚLTIMOS DÍAS (10) =============================================== Fecha Cierre Media 20 Media 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
SEÑALES DETECTADAS: 2 =========================================================== Señal Fecha Cierre Media 20 Media 50 ----------------------------------------------------------- Venta 2026-03-16 97,97 107,93 107,95 Compra 2026-04-29 100,66 97,91 97,76 ----------------------------------------------------------- Cruce al alza: la corta pasa por encima de la larga (señal de compra). Cruce a la baja: la corta pasa por debajo (señal de venta).
Y la parte que más interesa, el cierre de la comparación:
SEÑALES CONTRA COMPRAR Y MANTENER
================================================================================
Capital inicial: 1.000,00
Comprar y mantener entra el: 2026-03-16 a un precio de 97,97
Operaciones de la estrategia de señales: 1
2026-04-29 Compra 100,66
Capital final siguiendo las señales: 1.164,71 (16,47 %)
Capital final comprando y manteniendo: 1.196,69 (19,67 %)
GANÓ comprar y mantener, por: 31,98
Nota honesta: el ganador depende del tramo que se mida y de la primera señal;
con otros precios puede ganar la otra forma. Un resultado pasado no garantiza
nada.
La comparación, sin adornos: aquí ganó comprar y mantener
Vamos con la verdad del ejercicio, porque de nada sirve un programa que solo muestre el lado bonito. Con estos ciento ochenta días de precios inventados, la estrategia de señales terminó con 1.164,71 y comprar y mantener terminó con 1.196,69. Ganó comprar y mantener, por 31,98. Dicho en rentabilidades, diecinueve con sesenta y siete por ciento contra dieciséis con cuarenta y siete por ciento: la forma más simple le sacó casi dos puntos y medio a la forma que parece más lista.
¿Por qué pierde la estrategia si llegó a detectar los dos cruces? Por dos razones fáciles de ver. La primera: la estrategia está fuera del mercado parte del tiempo. Entre la señal de venta de mediados de marzo y la señal de compra de finales de abril, el capital se quedó quieto mientras el precio hacía su recorrido, y ese hueco no se recupera solo. La segunda: el tramo que se midió sube. Cuando un precio sube casi sin pausas, cualquier regla que te saque unos días del mercado pierde contra quedarse sentado. Con otro tramo, con otros precios y con otra primera señal puede ganar la otra forma, y eso lo dice el propio programa en su nota honesta.
Por eso conviene decirlo bien claro: este programa sirve para entender cómo se calcula una señal, cómo se comprueba y cómo se mide una estrategia contra la alternativa más simple. No sirve para ganar dinero ni para adivinar el futuro. Un lector que salga sabiendo eso sale ganando mucho más que con cualquier promesa.
Errores comunes y consejos
- El archivo con el nombre equivocado: el programa busca exactamente datos/precios.csv. Si lo llamas precios2.csv, se detiene y lo avisa. Renombra tu archivo o cambia esa línea.
- Punto contra coma: los archivos de ejemplo usan punto decimal, como en los sistemas de facturación, y las tablas de pantalla se ven con coma, porque el programa las formatea a la manera local. Los dos son el mismo número.
- Menos filas que la ventana larga: con menos de cincuenta días el programa corre, pero no encuentra ningún cruce y la tabla sale medio vacía. Carga unos meses.
- Fechas en otro orden: el archivo debe ir del día más viejo al más nuevo. Si están al revés, las medias salen sin sentido.
- Líneas en blanco al final: una fila vacía corta la lectura. Abre el archivo y borra las líneas de sobra.
- No muevas la carpeta de salida: el programa crea salida/medias.csv y salida/senales.csv por su cuenta. Si los abres en Excel y los dejas abiertos, la siguiente ejecución puede fallar al escribir.
Cuándo esto no alcanza
Este programa es una rueda de entrenamiento. Lee un archivo, calcula dos medias y muestra una tabla; no lleva la ficha de inventario, no sabe cuánto pagaste por cada artículo, no maneja varias bodegas y no te cierra el mes. La ficha de inventario, dicho en palabras simples, es el registro de todo lo que entra y sale con su costo.
Para un negocio pequeño que todavía vive en hojas de cálculo, Kardex Tauro es un programa gratis que junta inventario, compras, ventas y ficha de inventario en un solo sitio, con informes que se le pueden pasar al contador. El software es lo que se usa cuando Excel y un script ya no alcanzan; este código de Python es lo que se usa para entender la cuenta que hay detrás de las señales antes de creerle a cualquier gráfico.
Aviso: recuerda que este es material educativo y no es una recomendación de compra ni de venta. Los precios de ejemplo son inventados, los datos históricos se citan solo para practicar y un resultado pasado no garantiza nada en el futuro; consulta a un profesional autorizado antes de invertir. La fuente de los datos reales está citada arriba, con su dirección, y el ZIP trae este mismo descargo por escrito dentro de su archivo de instrucciones.
⬇ Descargar el código (ZIP)Descarga el paquete, abre el archivo de precios, reemplázalo por tus propios números y vuelve a ejecutarlo. Ver tus datos pasar por las dos medias enseña más que cualquier video, y la comparación honesta del final es la parte que casi nadie llega a ver.