1. Descargar precios históricos con yfinance
Nivel 3: Datos de Mercado y APIs
Cualquier estrategia, por sofisticada que sea, empieza con una tabla de precios. La librería más usada para conseguir esa tabla gratis, sin necesidad de cuenta ni clave de API, es yfinance, que descarga datos históricos y en tiempo real directamente de Yahoo Finance.
import yfinance as yf
import datetime as dt
inicio = dt.datetime(2018, 1, 1)
fin = dt.datetime.now()
datos = yf.download("TSLA", inicio, fin, auto_adjust=False) # auto_adjust=False es necesario para que exista la columna Adj Close
datos.head()El resultado es un DataFrame de pandas — la estructura de tabla que vas a usar constantemente a partir de ahora — con una fila por día de cotización y columnas como Open, High, Low, Close, Adj Close y Volume. Adj Close es el precio de cierre ajustado por dividendos y splits: es el que deberías usar casi siempre para calcular retornos, porque el Close normal puede dar saltos falsos cada vez que una empresa reparte dividendo o divide sus acciones.
Una vez descargados, es buena práctica guardar los datos en un archivo local, para no tener que volver a descargarlos cada vez que ejecutas el script — y para poder trabajar sin conexión, o si la fuente deja de estar disponible.
datos.to_csv("TSLA.csv")
# mas adelante, para volver a cargarlos sin descargar de nuevo:
import pandas as pd
datos_guardados = pd.read_csv("TSLA.csv", parse_dates=True, index_col=0)parse_dates=True le dice a pandas que interprete la primera columna como fechas, no como texto — sin esto, cualquier cálculo que dependa del orden temporal de los datos daría resultados incorrectos.
Con los datos ya en un DataFrame, generar un primer gráfico es una sola línea:
import matplotlib.pyplot as plt
datos["Adj Close"].plot()
plt.show()Es la forma más rápida de comprobar, con solo mirar, si los datos descargados tienen sentido — huecos raros, precios que se disparan sin motivo, o un rango de fechas incompleto son errores que se detectan mucho más rápido con los ojos que leyendo números.