Master financial data visualization techniques using Python's powerful plotting libraries
import matplotlib.pyplot as plt
import yfinance as yf
import seaborn as sns
# Download stock data
stock = yf.download('AAPL', start='2023-01-01')
# Create figure with secondary y-axis
fig, ax1 = plt.subplots(figsize=(12,6))
ax2 = ax1.twinx()
# Plot price and volume
ax1.plot(stock.index, stock['Close'], 'b-', label='Price')
ax2.bar(stock.index, stock['Volume'], alpha=0.3, color='gray', label='Volume')
plt.title('AAPL Price and Volume Analysis')
plt.show()
The yield curve "inverts" when short-term rates become higher than long-term rates. This is often considered a recession warning signal.
import pandas_datareader as pdr
import matplotlib.pyplot as plt
import numpy as np
# Get Treasury rates data from FRED
# 10-year minus 2-year spread is a common recession predictor
rates = pd.DataFrame()
rates['10YR'] = pdr.get_data_fred('DGS10') # 10-year rate
rates['2YR'] = pdr.get_data_fred('DGS2') # 2-year rate
rates['Spread'] = rates['10YR'] - rates['2YR'] # Yield curve spread
# Get recession data
recession = pdr.get_data_fred('USREC')
# Create figure with two subplots
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10), height_ratios=[2, 1])
# Plot 1: Treasury Rates
ax1.plot(rates.index, rates['10YR'], 'b-', label='10-Year Treasury')
ax1.plot(rates.index, rates['2YR'], 'r-', label='2-Year Treasury')
# Highlight recession periods in both plots
for i in range(len(recession)-1):
if recession['USREC'].iloc[i] == 1:
ax1.axvspan(recession.index[i], recession.index[i+1],
color='gray', alpha=0.2)
ax2.axvspan(recession.index[i], recession.index[i+1],
color='gray', alpha=0.2)
ax1.set_title('Treasury Rates: 10-Year vs 2-Year')
ax1.set_ylabel('Yield (%)')
ax1.grid(True)
ax1.legend()
# Plot 2: Yield Curve Spread
ax2.plot(rates.index, rates['Spread'], 'g-', label='10Y-2Y Spread')
ax2.axhline(y=0, color='r', linestyle='--', alpha=0.5) # Add zero line
ax2.fill_between(rates.index, rates['Spread'], 0,
where=(rates['Spread'] < 0),
color='r', alpha=0.3,
label='Yield Curve Inversion')
ax2.set_title('Yield Curve Spread (10Y-2Y)')
ax2.set_ylabel('Spread (%)')
ax2.grid(True)
ax2.legend()
plt.tight_layout()
plt.show()
# Let's also show a typical yield curve shape
# Get current Treasury rates for different maturities
maturities = ['1MO', '3MO', '6MO', '1YR', '2YR', '5YR', '10YR', '30YR']
tickers = ['DGS1MO', 'DGS3MO', 'DGS6MO', 'DGS1', 'DGS2', 'DGS5', 'DGS10', 'DGS30']
current_rates = pd.DataFrame()
for ticker in tickers:
current_rates[ticker] = pdr.get_data_fred(ticker)
# Plot current yield curve
plt.figure(figsize=(10, 6))
plt.plot(range(len(maturities)), current_rates.iloc[-1], 'bo-', label='Current')
# Add labels
plt.title('Current Treasury Yield Curve Shape')
plt.xlabel('Maturity')
plt.ylabel('Yield (%)')
plt.xticks(range(len(maturities)), maturities, rotation=45)
plt.grid(True)
# Add annotation about curve shape
if current_rates.iloc[-1]['DGS2'] > current_rates.iloc[-1]['DGS10']:
plt.text(0.6, 0.9, 'Inverted Yield Curve\n(Potential Recession Signal)',
transform=plt.gca().transAxes,
bbox=dict(facecolor='red', alpha=0.2))
else:
plt.text(0.6, 0.9, 'Normal Yield Curve',
transform=plt.gca().transAxes,
bbox=dict(facecolor='green', alpha=0.2))
plt.legend()
plt.tight_layout()
plt.show()
# Create recession highlighting
import pandas_datareader as pdr
from datetime import datetime
# Get GDP data
gdp = pdr.get_data_fred('GDP', start='2000-01-01')
recession = pdr.get_data_fred('USREC', start='2000-01-01')
# Plot GDP with recession highlighting
plt.figure(figsize=(12,6))
plt.plot(gdp.index, gdp['GDP'], 'b-', label='GDP')
# Highlight recession periods
for i in range(len(recession)):
if recession['USREC'].iloc[i] == 1:
plt.axvspan(recession.index[i], recession.index[i+1],
color='gray', alpha=0.2)
plt.title('US GDP with Recession Periods')
plt.legend()
plt.show()
# Create sector performance treemap
import squarify
sizes = [30, 25, 20, 15, 10, 8, 7, 6, 5, 4, 3]
labels = ['Tech', 'Finance', 'Healthcare', 'Consumer', 'Industry',
'Energy', 'Materials', 'Utilities', 'Real Estate', 'Telecom']
colors = sns.color_palette('RdYlBu', len(sizes))
plt.figure(figsize=(12,8))
squarify.plot(sizes=sizes, label=labels, color=colors, alpha=0.8)
plt.title('Market Sector Performance')
plt.axis('off')
plt.show()
Use these prompts to enhance your understanding of financial data visualization:
📚 Research Tip: Use Perplexity.ai to search for "financial data visualization examples Python" or "Treasury yield curve analysis Python"