Código Python: señal combinada de media móvil y sentimiento del titular

Código Python: señal combinada de media móvil y sentimiento del titular
Este programa responde una pregunta muy concreta: ¿cómo se decide algo con los números delante y no con la corazonada? Junta dos ideas sencillas -la media móvil de veinte y de cincuenta cierres, que no es más que el promedio de los últimos cierres, y el sentimiento del titular del día, que se mide contando las palabras positivas y negativas que el texto trae- y escribe una decisión para cada fecha con titular: comprar, vender o esperar. Está pensado para el dueño de negocio que quiere ver con sus propios ojos cómo se mide una regla, para el contador que desconfía de las cifras que no puede comprobar y para el almacenista que ya sabe leer una tabla de columnas fijas. Aquí no vas a encontrar una fórmula mágica: vas a encontrar una balanza y una hoja de papel.
⬇ Descargar el código (ZIP)Aviso: este es material educativo para practicar Python y no es una recomendación de compra ni de venta. Los precios de ejemplo y los titulares que trae el programa 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.
| Archivo dentro del ZIP | Qué es |
|---|---|
senal_combinada.py | El programa, comentado en español y con solo la biblioteca estándar |
datos/precios.csv | Ciento ochenta cierres diarios de ejemplo, inventados, de enero a junio |
datos/titulares.csv | Treinta titulares inventados con su etiqueta manual |
salida_ejemplo.txt | La salida real que vas a ver en pantalla, tal como se ve |
LEEME.md | Instrucciones, el formato de los datos y el descargo por escrito |
Qué hace el programa
- Lee dos archivos de ejemplo que viajan dentro del ZIP: los cierres diarios y los titulares. Los titulares son inventados y están ahí para practicar, no son noticias reales.
- Calcula la media móvil de veinte y la de cincuenta cierres en cada fecha. Cada media usa solo los cierres anteriores: no mira hacia adelante, porque el futuro no está en el archivo.
- Mide el sentimiento del titular con un léxico propio: dos listas cortas de palabras escritas a mano, positivas y negativas, sin inteligencia artificial de por medio. La ventaja es que tú puedes leer las listas y discutirlas; la desventaja es que la ironía se le escapa.
- Convierte ese puntaje en una señal de tres valores: positivo cuando el titular pesa hacia arriba, negativo cuando pesa hacia abajo y neutro cuando queda en la mitad.
- Escribe la decisión de cada fecha: comprar solo si la señal técnica y el sentimiento son los dos positivos; vender solo si los dos son negativos; esperar en cualquier otro caso.
- Guarda el diario en
salida/diario.csvy cuenta los días de cada decisión. - Compara el capital final de la regla contra comprar y mantener, y dice quién ganó, aunque gane el no hacer nada.
Cómo ejecutarlo
Necesitas Python 3.11 o superior y nada más: el programa usa solo la biblioteca estándar, así que no hay que instalar ninguna librería, ni crear cuentas, ni conectar plataformas. Descomprime el ZIP en una carpeta, abre la terminal en esa misma carpeta y escribe una sola línea:
python senal_combinada.py
Si la terminal contesta que no encuentra el archivo, casi siempre es porque está abierta en otra carpeta: muévete con cd hasta la carpeta que descomprimiste y vuelve a intentarlo. El programa no escribe nada fuera de su propia carpeta: crea salida/ y guarda allí los dos CSV.
El código, explicado
Con cinco trozos del programa se entiende casi todo lo demás. El primero son las constantes de arriba, donde se fija el capital de arranque y la idea de comparar las dos estrategias sobre la misma base:
CAPITAL_INICIAL = Decimal("100.00") # Capital de arranque para comparar las dos ideas con la misma base
El dinero se maneja con Decimal y no con decimales binarios, porque en una cadena de multiplicaciones los errores de centavo se acumulan y al final la comparación deja de ser creíble.
El segundo trozo es la regla de decisión completa: solo seis líneas. Toda la estrategia cabe ahí, y esa es precisamente la idea del ejercicio.
def decidir(tecnica: int, sentimiento: int) -> str:
"""Comprar solo si las dos señales son positivas; vender si las dos son negativas."""
if tecnica == 1 and sentimiento == 1:
return "comprar"
if tecnica == -1 and sentimiento == -1:
return "vender"
return "esperar"
Las tres salidas posibles son comprar, vender y esperar. Comprar exige que las dos señales estén de acuerdo hacia arriba; vender exige que las dos estén de acuerdo hacia abajo; cualquier desacuerdo termina en esperar, que en el diario es la decisión más frecuente.
El tercer trozo es la comparación. Fíjate en que el programa nunca mira el precio del día siguiente:
def comparar(filas: list[dict]) -> dict:
"""Compara el capital de la regla con comprar y mantener, sin mirar el futuro."""
capital_regla = CAPITAL_INICIAL
El capital de la regla se actualiza día a día, pero solo mientras la posición anterior lo tenga dentro del mercado; esperar mantiene la posición que ya había, no la inventa. La comparación se hace contra comprar y mantener, es decir, contra no hacer nada, que es el rival más incómodo.
El cuarto trozo es el veredicto, escrito a propósito para que diga quién ganó. El programa no tiene una rama amable para cuando pierde:
imprimir_parrafo("Veredicto: en estos datos la regla combinada PIERDE contra comprar y mantener. Se dice tal cual: la señal técnica y el sentimiento no alcanzaron a quedarse con la subida.")
Y el quinto trozo es el aviso, que el programa imprime al empezar y al terminar. El descargo va dentro del código, no escondido en un anexo:
imprimir_parrafo("AVISO: " + AVISO)
Qué vas a ver en pantalla
Primero el resumen de decisiones y la comparación de capital. Esta es la salida real con los datos de ejemplo del ZIP:
RESUMEN DE DECISIONES Comprar : 7 días Vender : 3 días Esperar : 15 días Total : 25 días COMPARACIÓN CONTRA COMPRAR Y MANTENER Capital inicial: 100,00 Regla combinada: 113,21 (+13,21 %) Comprar y mantener: 125,45 (+25,45 %) Diferencia del capital: -12,24 Veredicto: en estos datos la regla combinada PIERDE contra comprar y mantener. Se dice tal cual: la señal técnica y el sentimiento no alcanzaron a quedarse con la subida.
Y este es el diario por fecha, con la señal técnica, el sentimiento y la decisión en la última columna. Fíjate en las dos primeras filas y en la última:
Fecha Cierre Titular Media 20 Media 50 Técnica Sentim. Decisión 2026-04-06 93,24 El índice sube con fuerza y mar... 97,00 103,45 -1 +1 esperar 2026-04-09 93,71 La cotización cae por el temor ... 96,60 102,50 -1 -1 vender 2026-06-29 116,97 La empresa aprueba un plan sóli... 118,11 117,75 +1 +1 comprar
El resultado, sin adornos
Aquí está la parte que no se puede maquillar. Con estos datos la regla combinada termina con un capital de ciento trece con veintiuno, es decir, una subida de trece con veintiuno por ciento. Comprar y mantener, que es no hacer absolutamente nada, termina en ciento veinticinco con cuarenta y cinco, o sea, veinticinco con cuarenta y cinco por ciento. La diferencia es de doce con veinticuatro, y va a favor de comprar y mantener. Dicho sin rodeos: la regla combinada PIERDE, y el programa lo escribe con esas mismas palabras.
¿Por qué pierde? Porque juntar dos señales no crea una bola de cristal. La media móvil es un promedio del pasado, así que llega tarde a las subidas por definición; el titular, por su parte, casi nunca cae el mismo día en que el precio se mueve. Cuando las dos señales por fin se ponen de acuerdo, buena parte del movimiento ya ocurrió, y el resto del tiempo la regla se queda esperando fuera del mercado. Y una advertencia más: una sola medición no demuestra nada, ni en contra ni a favor. Puede ser casualidad de estos datos, y por eso lo honesto es decirlo tal cual y volver a medir con otros precios antes de sacar conclusiones.
Del diario salen los números que de verdad sirven en un negocio: siete días decían comprar, tres decían vender y quince decían esperar. Esos quince días de esperar son el corazón del asunto. Cada uno tiene fecha, cierre y motivo escrito, y cualquiera puede abrir el archivo y discutirlo con datos en la mano. El día que tu contador pregunte por qué se compró mercancía justo esa semana, la respuesta no es una corazonada: es una fila del diario con la señal técnica y el sentimiento que la respaldaban. Que después el resultado fuera bueno o malo ya es otra historia, y esa historia solo se puede juzgar con el diario delante. Dejar por escrito por qué se decidió cada cosa es la herramienta más barata y más subestimada que tiene una pyme.
Cómo poner tus propios precios
El ZIP trae datos de ejemplo para que no tengas que descargar nada más, pero el programa está hecho para que reemplaces la carpeta datos/ por tus propios archivos. El formato es un CSV sencillo, con encabezado y una fila por día: se abre y se edita en cualquier hoja de cálculo y se guarda otra vez como CSV. Los precios históricos que se usaron en este taller vienen de CoinGecko (api.coingecko.com) para el bitcoin y de la serie SP500 de la Reserva Federal de St. Louis, en https://fred.stlouisfed.org/series/SP500; los dos se descargaron el 2026-09-25 y se citan aquí solo como datos de práctica.
| Archivo | Columna | Qué lleva |
|---|---|---|
datos/precios.csv | fecha | El día en formato año-mes-día, por ejemplo 2026-01-02 |
datos/precios.csv | cierre | El precio de cierre de ese día, con punto decimal |
datos/titulares.csv | fecha | El día del titular, en el mismo formato |
datos/titulares.csv | titular | El texto completo, entre comillas si lleva comas |
datos/titulares.csv | etiqueta | Lo que tú crees que dice el titular: positivo, negativo o neutro |
Dos advertencias de formato que ahorran una tarde de rabia: los nombres de las columnas no se pueden cambiar, y el archivo tiene que usar coma como separador, no punto y coma. Si tu hoja de cálculo guarda con punto y coma, el programa se detendrá con un error de columna y sabrás exactamente dónde está el problema.
Errores comunes y consejos
- Renombrar una columna del CSV. El programa busca los nombres exactos y se detiene si no están.
- Dejar menos de cincuenta cierres. Sin cincuenta filas no existe media larga y el diario sale vacío: no es un fallo del programa.
- Ejecutar desde otra carpeta. Si la terminal está en otro sitio, el programa encuentra el ZIP pero no los datos.
- Creer que un día de esperar es un error de cálculo. Esperar es una decisión, y en este diario es la más común.
- Leer el resultado como una promesa. Los precios de ejemplo son inventados y los históricos se citan solo para practicar.
- Cambiar el léxico y esperar que el sentimiento mejore. Si quitas o añades palabras, cambian las decisiones: es justamente lo que hace visible el diario.
Cuándo esto no alcanza
Este programa es un cuaderno de práctica, no un sistema de gestión. Si lo que necesitas es ordenar el inventario de verdad -entradas y salidas, costos, existencias por bodega y los informes de siempre-, Kardex Tauro es gratis y está hecho para eso; aquí se practica cómo se mide una regla, no se administra el negocio. Un script enseña a mirar los números; el sistema ordena el día a día, y ninguno de los dos reemplaza el criterio del dueño.
Aviso: vuelvo a decirlo porque importa: esto es material educativo y no es una recomendación de compra ni de venta. La fuente de los datos está citada más arriba en este mismo artículo, el ZIP trae el descargo por escrito y los precios de ejemplo son inventados. Un resultado pasado no garantiza nada en el futuro; antes de invertir, consulta a un profesional autorizado.
⬇ Descargar el código (ZIP)Descarga el ZIP, cambia la carpeta de datos por tus propios precios y mira qué dice el diario. Aunque la regla pierda, habrás aprendido algo que sirve para toda la vida del negocio: cómo se mide una idea antes de creerle.