lunes, 11 de septiembre de 2023

Calculando medias móviles de acciones con python - SMA


En el mundo de las finanzas, hay una herramienta llamada Media Móvil Simple (SMA) que nos ayuda a entender si el precio de un acción está subiendo o bajando. Suena complicado, ¿verdad? Pero no te preocupes, es más simple de lo que parece. 


¿Qué es una Media Móvil Simple (SMA)?


Imagina que quieres saber si el precio promedio de una acción ha estado subiendo o bajando durante un período de tiempo. La SMA toma los precios de la acción durante ese tiempo y calcula un promedio (como el promedio de tus calificaciones en la escuela). Este número promedio nos dice si la acción está en una tendencia alcista (subiendo) o bajista (bajando).


Cómo Funciona la SMA:

La SMA toma los precios de una acción durante un período (digamos 10 días) y suma todos esos precios. Luego, divide esa suma por la cantidad de días (10 en este caso) para obtener el promedio.


Ejemplo:

Supongamos que durante los últimos 10 días, los precios de una acción fueron: 50, 52, 54, 53, 55, 56, 57, 58, 59, y 60. La SMA sería:


(50 + 52 + 54 + 53 + 55 + 56 + 57 + 58 + 59 + 60) / 10 = 554 / 10 = 55.4


Entonces, la SMA de 10 días para esta acción es 55.4.  Para este ejemplo como el último precio es 60 que es mayor que la media 55.4 podemos decir que el precio de la acción está subiendo... Realmente, no pero casi casi.  


¿Por qué es Útil la SMA?

La SMA nos ayuda a ver si una acción está en una tendencia alcista o bajista. Si la SMA sube, significa que el precio promedio está subiendo, lo que puede ser una señal de que la acción es una buena inversión. Si la SMA baja, podría ser una señal de que la acción no está yendo tan bien.


Vamos con Python

Repetiremos el procedimiento de artículos anteriores, abriremos Visual Studio Code, nuestra carpeta "Mis Documentos/PythonBursatil"  y crearemos un archivo llamado sma.py


Lo primero será  importar yfinance, datetime y pandas

import yfinance as yf

import pandas as pd

from datetime import datetime, timedelta



Definimos el ticker de la acción a analizar. En este ejempo AAPL. 


ticker_symbol = "AAPL"  # Cambia AAPL por el símbolo de la acción que desees analizar


En dos variables end_date y start_date colocamos el rango a analizar. 


end_date = datetime.today().strftime('%Y-%m-%d')

start_date = (datetime.today() - timedelta(days=730)).strftime('%Y-%m-%d')  # 730 días equivalen a dos años


Descargamos los datos históricos de la acción. 


data = yf.download(ticker_symbol, start=start_date, end=end_date)


Vamos a calcular la media móvil para 5, 15 y 30 días. 


dias  = 5

data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()


dias  = 15

data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()


dias  = 30

data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()


Vamos parte por parte: 

'SMA_' + str(dias) :  Colocamos el nombre de la nueva columna 

data[' Close'] .rolling(window=dias):  Estamos sacando una ventana móvil para ese número de días. 

data[' Close'] .rolling(window=dias).mean():  A esa ventana móvil le sacamos el promedio (mean)



Guardamos el resultado en un archivo de excel


excel_filename = ticker_symbol + "_historico_precios.xlsx"

data.to_excel(excel_filename)

print(f"Los datos se han guardado en el archivo: {excel_filename}")


Pongamos todo junto. 


import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta

# Definir el símbolo de la acción
ticker_symbol = "AAPL"  # Cambia AAPL por el símbolo de la acción que desees analizar

# Calcular las fechas hace dos años y la fecha actual
end_date = datetime.today().strftime('%Y-%m-%d')
start_date = (datetime.today() - timedelta(days=730)).strftime('%Y-%m-%d')  # 730 días equivalen a dos años

# Descargar los datos históricos de la acción
data = yf.download(ticker_symbol, start=start_date, end=end_date)

# Calcular la media móvil de 5 días
dias  = 5
data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()

dias  = 15
data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()


dias  = 30
data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()


# Mostrar los ultimos registros de los datos
print(data.tail(10))

# Guardar los datos en un archivo Excel (.xlsx)
excel_filename = ticker_symbol + "_historico_precios.xlsx"
data.to_excel(excel_filename)

print(f"Los datos se han guardado en el archivo: {excel_filename}")


También podemos agregar una columna con recomendaciones de compra y venta basándonos en el algoritmo de cruce de medias. Por ejemplo el cruce de 5 y 30. Pero solo darémos recomendación si la diferencia entre las medias es de un 5%.  Tanto las medias como el porcentaje son arbitrarios. Use y prueba los propios para sus inversiones. 


data['Recomendacion'] = 'Esperar'  # Valor predeterminado de "Esperar"


# Calcular la diferencia entre las medias móviles

data['Diferencia'] = (data['SMA_5' ] / data['SMA_30' ]) - 1


# Si la diferencia es mayor al 5%, se recomienda "Compra"

data.loc[data['Diferencia'] > 0.05, 'Recomendacion'] = 'Compra'


# Si la diferencia es menor al -5%, se recomienda "Venta"

data.loc[data['Diferencia'] < -0.05, 'Recomendacion'] = 'Venta'



Veamos como queda todo junto.


import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta

# Definir el símbolo de la acción
ticker_symbol = "AAPL"  # Cambia AAPL por el símbolo de la acción que desees analizar

# Calcular las fechas hace dos años y la fecha actual
end_date = datetime.today().strftime('%Y-%m-%d')
start_date = (datetime.today() - timedelta(days=3650)).strftime('%Y-%m-%d')  # 730 días equivalen a dos años

# Descargar los datos históricos de la acción
data = yf.download(ticker_symbol, start=start_date, end=end_date)

# Calcular la media móvil de 5 días
dias  = 5
data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()

dias  = 15
data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()


dias  = 30
data['SMA_' + str(dias)] = data['Close'].rolling(window=dias).mean()



data['Recomendacion'] = 'Esperar'  # Valor predeterminado de "Esperar"

# Calcular la diferencia entre las medias móviles
data['Diferencia'] = (data['SMA_5'] / data['SMA_30' ]) - 1

# Si la diferencia es mayor al 5%, se recomienda "Compra"
data.loc[data['Diferencia'] > 0.05, 'Recomendacion'] = 'Compra'

# Si la diferencia es menor al -5%, se recomienda "Venta"
data.loc[data['Diferencia'] < -0.05, 'Recomendacion'] = 'Venta'

# Mostrar los ultimos registros de los datos
print(data.tail(10))

# Guardar los datos en un archivo Excel (.xlsx)
excel_filename = ticker_symbol + "_historico_precios3.xlsx"
data.to_excel(excel_filename)

print(f"Los datos se han guardado en el archivo: {excel_filename}")


El resultado obtenido es el siguiente. Donde podemos ver que nos recomienda Esperar y hubo recomendaciones de Venta desde Agosto 10 al 23.






Espero les haya gustado. Nos vemos en el próximo post.




No hay comentarios.:

Publicar un comentario

Calculando medias móviles de acciones con python - SMA

En el mundo de las finanzas, hay una herramienta llamada Media Móvil Simple (SMA) que nos ayuda a entender si el precio de un acción está su...