Create a coding guide for financial analysis tools to extract Yahoo financial data, calculate financial analysis and create custom PDF reports

Extraction and analysis of stock data is the key to smart decision-making in the financial landscape. This tutorial provides a comprehensive guide to establishing comprehensive financial analysis and reporting tools in Python. We will learn to get historical market data from Yahoo Finance and calculate basic technical indicators such as simple moving averages, Bollinger Bands, MACD and RSI. This guide walks you through generating visualizations of insights and compiling them into custom multi-page PDF reports. Whether you are a data enthusiast, financial analyst, or a Python developer looking to expand the toolkit, this tutorial will provide you with skills that help turn raw market data into actionable insights.
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
We analyze and visualize the basic Python library in financial data. Here, YFINANCE is used to obtain stock market data, pandas for data manipulation, Matplotlib and Numpy for creating and processing numerical graphs, and PDFPAGE for compiling multiple graphs into a single PDF report.
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
This feature calculates key technical indicators (including SMA, Bollinger Bands, MACD and RSI) for stock price data contained in the input data frame. It updates the data frame for other columns of each metric, thus providing an in-depth technical analysis of historical inventory performance.
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)
This feature uses Matplotlib to create a visually attractive cover page and add it as the first page of the PDF report via the provided PDFPAGES object. It then turns off the numbers to free up resources.
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
This feature generates a comprehensive stock price chart for a given stock, including close-range prices, 20-day and 50-day SMA, and Bollinger Bands. It returns a matplotlib plot that can be saved or further processed in a PDF report.
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
This function generates a MACD chart by plotting the MACD and its signal lines over time. It returns a Matplotlib plot that can be merged into larger PDF reports or displayed independently.
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
This function generates an RSI graph for a given stock, plotting the RSI values and the horizontal reference lines on the horizontal reference lines at the overbought (70) and oversold (30) levels. It returns a Matplotlib number that can be included in the final financial analysis report.
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}'.")
Here, this main feature prompts users to enter five stocks, download data from Yahoo Finance for one year, calculate key technical indicators, and generate corresponding price, MACD and RSI charts. It then compiles all the charts into a multi-page PDF report called “Financial_report.pdf” and prints a confirmation message after saving the report.
if __name__ == "__main__":
main()
Finally, the block checks whether the script is executed directly, rather than importing as a module. If so, it will be called the main() function.
In short, we have demonstrated a way to automate financial analysis using Python. You have learned how to extract valuable data, calculate key technical metrics and generate comprehensive visual reports in multi-page PDF format. This integrated approach simplifies the analytical process and provides a powerful way to visualize market trends and monitor stock performance. As you further customize and expand this framework, you can continue to enhance your analytics and make smarter financial decisions.
This is COLAB notebook. Also, don’t forget to follow us twitter And join us Telegram Channel and LinkedIn GrOUP. Don’t forget to join us 85k+ ml reddit.
[Register Now] Minicon Agesic AI Virtual Conference: Free Registration + Certificate of Attendance + 4-hour Short Event (May 21, 9am-1pm) + Hands-On the Workshop
Postal Code Guide builds a coding guide for extracting Yahoo financial data, calculating financial analysis and creating custom PDF reports, first appeared on Marktechpost.