Una guía de codificación para construir una herramienta de análisis de finanzas para extraer datos financieros de Yahoo, computar análisis financieros y crear informes de PDF personalizados

Extraer y analizar datos de acciones es clave para la toma de decisiones informadas en el panorama financiero. Este tutorial ofrece una guía completa para construir una herramienta de análisis financiero e informes integrados en Python. Aprenderemos a extraer datos del mercado histórico de las finanzas de Yahoo y calcular indicadores técnicos esenciales, como promedios móviles simples, bandas de Bollinger, MACD y RSI. La guía lo guía a través de la generación de visualizaciones perspicaces y compilándolas en informes de PDF de varias páginas personalizados. Ya sea que sea un entusiasta de los datos, un analista financiero o un desarrollador de Python que busque expandir su juego de herramientas, este tutorial lo equipará con habilidades que ayudan a convertir los datos del mercado en bruto en ideas procesables.

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

Importamos bibliotecas esenciales de Python para análisis y visualización de datos financieros. Aquí, YFinance se utiliza para obtener datos del mercado de valores, pandas para la manipulación de datos, matplotlib y numpy para crear y manejar gráficos numéricos y PDFFPAGS para compilar múltiples gráficos en un solo informe PDF.

def compute_indicators(df):
    """
    Computes technical indicators for the DataFrame:
    - 20-day and 50-day Simple Moving Averages (SMA)
    - Bollinger Bands (using 20-day SMA ±2 standard deviations)
    - MACD (12-day EMA minus 26-day EMA) and its 9-day Signal Line
    - RSI (Relative Strength Index) over a 14-day lookback period
    """
    df['SMA20'] = df['Close'].rolling(window=20).mean()
    df['SMA50'] = df['Close'].rolling(window=50).mean()
   
    df['STD20'] = df['Close'].rolling(window=20).std()
    df['UpperBand'] = df['SMA20'] + 2 * df['STD20']
    df['LowerBand'] = df['SMA20'] - 2 * df['STD20']


    df['EMA12'] = df['Close'].ewm(span=12, adjust=False).mean()
    df['EMA26'] = df['Close'].ewm(span=26, adjust=False).mean()
    df['MACD'] = df['EMA12'] - df['EMA26']
    df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
   
    delta = df['Close'].diff()
    gain = delta.copy()
    loss = delta.copy()
    gain[gain < 0] = 0
    loss[loss > 0] = 0
    loss = loss.abs()
    avg_gain = gain.rolling(window=14).mean()
    avg_loss = loss.rolling(window=14).mean()
    rs = avg_gain / avg_loss
    df['RSI'] = 100 - (100 / (1 + rs))
   
    return df

Esta función calcula los indicadores técnicos clave, incluidos SMA, bandas de Bollinger, MACD y RSI, para los datos del precio de las acciones contenidos en el marcado de datos de entrada. Actualiza el marco de datos con columnas adicionales para cada indicador, lo que permite un análisis técnico en profundidad del rendimiento de las acciones históricas.

def create_cover_page(pdf):
    """
    Creates and saves a cover page into the PDF report.
    """
    fig = plt.figure(figsize=(11.69, 8.27))  
    plt.axis('off')
    plt.text(0.5, 0.7, "Financial Analysis Report", fontsize=24, ha="center")
    plt.text(0.5, 0.62, "Analysis of 5 Stocks from Yahoo Finance", fontsize=16, ha="center")
    plt.text(0.5, 0.5, "Includes Technical Indicators: SMA, Bollinger Bands, MACD, RSI", fontsize=12, ha="center")
    plt.text(0.5, 0.4, "Generated with Python and matplotlib", fontsize=10, ha="center")
    pdf.savefig(fig)
    plt.close(fig)

Esta función crea una portada visualmente atractiva utilizando matplotlib y la agrega como la primera página del informe PDF a través del objeto PDFPages proporcionado. Luego cierra la figura para liberar recursos.

def plot_price_chart(ticker, df):
    """
    Generates a price chart with SMA and Bollinger Bands for a given ticker.
    """
    fig, ax = plt.subplots(figsize=(14, 7))
    ax.plot(df.index, df['Close'], label="Close Price", linewidth=1.5)
    ax.plot(df.index, df['SMA20'], label="SMA (20)", linewidth=1.2)
    ax.plot(df.index, df['SMA50'], label="SMA (50)", linewidth=1.2)
    ax.plot(df.index, df['UpperBand'], label="Upper Bollinger Band", linestyle="--")
    ax.plot(df.index, df['LowerBand'], label="Lower Bollinger Band", linestyle="--")
    ax.fill_between(df.index, df['LowerBand'], df['UpperBand'], color="lightgray", alpha=0.3)
    ax.set_title(f'{ticker}: Price & Moving Averages with Bollinger Bands')
    ax.set_xlabel('Date')
    ax.set_ylabel('Price')
    ax.legend()
    ax.grid(True)
    return fig

Esta función genera una tabla integral de precios de acciones para un ticker dado que incluye el precio de cierre, SMA de 20 y 50 días, y las bandas de Bollinger. Devuelve una figura matplotlib que se puede guardar o procesar más en un informe PDF.

def plot_macd_chart(ticker, df):
    """
    Generates a MACD plot for the given ticker.
    """
    fig, ax = plt.subplots(figsize=(14, 5))
    ax.plot(df.index, df['MACD'], label="MACD", linewidth=1.5)
    ax.plot(df.index, df['Signal'], label="Signal Line", linewidth=1.5)
    ax.set_title(f'{ticker}: MACD')
    ax.set_xlabel('Date')
    ax.set_ylabel('MACD')
    ax.legend()
    ax.grid(True)
    return fig

Esta función genera un gráfico MACD para un ticker especificado al trazar el MACD y su línea de señal con el tiempo. Devuelve una figura matplotlib que se puede incorporar a un informe PDF más grande o se muestra de forma independiente.

def plot_rsi_chart(ticker, df):
    """
    Generates an RSI plot for the given ticker.
    """
    fig, ax = plt.subplots(figsize=(14, 5))
    ax.plot(df.index, df['RSI'], label="RSI", linewidth=1.5)
    ax.axhline(70, color="red", linestyle="--", linewidth=1, label="Overbought (70)")
    ax.axhline(30, color="green", linestyle="--", linewidth=1, label="Oversold (30)")
    ax.set_title(f'{ticker}: RSI')
    ax.set_xlabel('Date')
    ax.set_ylabel('RSI')
    ax.legend()
    ax.grid(True)
    return fig

Esta función genera un gráfico RSI para un ticker de stock dado, trazando los valores de RSI junto con las líneas de referencia horizontales en los niveles de sobrecompra (70) y sobrevendido (30). Devuelve una cifra de matplotlib que se puede incorporar al informe final de análisis financiero.

def main():
    tickers = []
    for i in range(5):
        ticker = input(f"Enter ticker #{i+1}: ").upper().strip()
        tickers.append(ticker)
   
    pdf_filename = "financial_report.pdf"
   
    with PdfPages(pdf_filename) as pdf:
        create_cover_page(pdf)


        for ticker in tickers:
            print(f"Downloading data for {ticker} from Yahoo Finance...")
            df = yf.download(ticker, period='1y')
           
            if df.empty:
                print(f"No data found for {ticker}. Skipping to the next ticker.")
                continue
           
            df = compute_indicators(df)
           
            fig_price = plot_price_chart(ticker, df)
            pdf.savefig(fig_price)
            plt.close(fig_price)
           
            fig_macd = plot_macd_chart(ticker, df)
            pdf.savefig(fig_macd)
            plt.close(fig_macd)
           
            fig_rsi = plot_rsi_chart(ticker, df)
            pdf.savefig(fig_rsi)
            plt.close(fig_rsi)
   
    print(f"PDF report generated and saved as '{pdf_filename}'.")

Aquí, esta función principal solicita al usuario que ingrese a cinco tickers de stock, descarga un año de datos para cada uno de las finanzas de Yahoo, calcula los indicadores técnicos clave y genera gráficos de precios, MACD y RSI correspondientes. Luego compila todos los gráficos en un informe PDF de múltiples páginas llamado “Financial_report.pdf” e imprime un mensaje de confirmación una vez que se guarda el informe.

if __name__ == "__main__":
    main()

Finalmente, este bloque verifica si el script se ejecuta directamente en lugar de importarse como un módulo. Si es así, llama a la función Main ().

En conclusión, hemos demostrado un método para automatizar el análisis financiero utilizando Python. Ha aprendido cómo extraer datos valiosos, calcular indicadores técnicos clave y generar informes visuales integrales en un formato PDF de varias páginas. Este enfoque integrado optimiza el proceso de análisis y proporciona una forma poderosa de visualizar las tendencias del mercado y monitorear el rendimiento de las acciones. A medida que personaliza y amplía en este marco, puede continuar mejorando sus capacidades analíticas y tomar decisiones financieras más informadas.


Aquí está el Cuaderno de colab. Además, no olvides seguirnos Gorjeo y únete a nuestro Canal de telegrama y LinkedIn GRsalpicar. No olvides unirte a nuestro 85k+ ml de subreddit.

🔥 [Register Now] Conferencia virtual de Minicon sobre AI agente: registro gratuito + Certificado de asistencia + Evento corto de 4 horas (21 de mayo, 9 am- 1 pm PST) + Hands on Workshop


Sana Hassan, una pasante de consultoría en MarktechPost y estudiante de doble grado en IIT Madras, le apasiona aplicar tecnología e IA para abordar los desafíos del mundo real. Con un gran interés en resolver problemas prácticos, aporta una nueva perspectiva a la intersección de la IA y las soluciones de la vida real.