# Iniciamos con la importación de bibliotecas necesarias, en este caso yfinance (para los datos) y matplotlib (para cálculos y gráfica).
import yfinance as yf
import matplotlib.pyplot as plt
# Aquí determinamos el símbolo de la acción que queremos evaluar. En este caso consideremos Mercado Libre.
symbol = 'MELI'
# Para obtener el conjunto de datos (Data Frame) históricos de precios de los últimos dos años.
df = yf.download(symbol, start='2021-12-15', end='2023-12-15')
# Fijamos las fechas de inicio y fin de los datos.
fecha_inicio = df.index[0].strftime('%Y-%m-%d')
fecha_fin = df.index[-1].strftime('%Y-%m-%d')
# Ahora, calculamos el cambio diario en porcentaje.
df['Daily Returns'] = df['Close'].pct_change() * 100
# Debemos luego crear una columna para el sentimiento (1 para días alcistas, -1 para días bajistas).
df['Sentiment'] = df['Daily Returns'].apply(lambda x: 'Positivo' if x > 0 else 'Negativo' if x < 0 else 'Neutral' )
# Seguidamente se estima la cantidad de días positivos y negativos.
cantidad_positivos = (df['Sentiment'] ==
'Positivo').sum()
cantidad_negativos = (df['Sentiment'] ==
'Negativo').sum()
# Calculamos el sentimiento predominante en los últimos 20 días.
sentimiento_predominante_20dias = df['Sentiment'].tail(20).mode().iloc[0]
# Procedemos a graficar el sentimiento.
plt.figure(figsize=(10, 6))
sentimiento = df['Sentiment'].apply(lambda x: 1
if x == 'Positivo' else -1 if x == 'Negativo'
else 0)
sentimiento.plot(marker='o', linestyle='',
markersize=5, label='Sentimiento')
plt.title(f'Indicador de Sentimiento para
{symbol}\nPositivos: {cantidad_positivos}
días, Negativos: {cantidad_negativos} días')
# Después, anotamos el sentimiento predominante en los últimos 20 días.
plt.annotate(f'Predominante en últimos 20 días:
{sentimiento_predominante_20dias}',
xy=(1, 0.9), xycoords='axes fraction',
ha='right', va='top',
bbox=dict(boxstyle='round', alpha=0.1),
fontsize=8)
# Colocamos las fechas de inicio y finalización.
plt.annotate(f'Fecha de inicio: {fecha_inicio}\nFecha de
finalización:
{fecha_fin}',
xy=(1, 0.8), xycoords='axes fraction',
ha='right', va='top',
bbox=dict(boxstyle='round', alpha=0.1),
fontsize=8)
plt.axhline(y=0, color='black', linestyle='--', linewidth=2, label='Neutral')
# Etiquetamos los ejes.
plt.yticks([-1, 0, 1], ['Negativo', 'Neutral', 'Positivo'])
# Finalmente, mostramos los resultados.
plt.legend()
plt.show()