Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import yfinance as yf
- import pandas as pd
- import plotly.graph_objects as go
- # Fetch SPY data for the past 20 years
- spy_data = yf.download('SPY', start='2004-01-01', end='2024-09-08')
- # Resample to monthly data (last business day of each month)
- spy_monthly = spy_data['Adj Close'].resample('M').ffill()
- # Create a DataFrame for percentage changes
- monthly_pct_change = spy_monthly.pct_change().dropna() * 100
- # Add Year and Month columns for grouping
- monthly_pct_change = monthly_pct_change.to_frame(name='Monthly Change')
- monthly_pct_change['Year'] = monthly_pct_change.index.year
- monthly_pct_change['Month'] = monthly_pct_change.index.strftime('%b')
- # Calculate percentage change for each year and month
- yearly_changes = monthly_pct_change.groupby(['Year', 'Month'])['Monthly Change'].mean().reset_index()
- # Create a pivot table for easier plotting, with months sorted correctly
- month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
- pivot_table = yearly_changes.pivot(index='Year', columns='Month', values='Monthly Change')[month_order]
- # Create a DataFrame to store data for plotting
- plot_data = []
- plot_data_totals = []
- # Loop through each month to prepare data for plotting
- for month in month_order:
- # Data for each month across all years
- month_data = pivot_table[month].dropna()
- month_avg = month_data.mean()
- # Add all years' data for the current month
- for year in month_data.index:
- plot_data.append({'Month': month, 'Year': str(year), 'Monthly Change': month_data[year]})
- # Add the total average at the end of the current month's data
- plot_data_totals.append({'Month': month, 'Year': 'Total Avg', 'Monthly Change': month_avg})
- # Convert plot data to DataFrame
- plot_df = pd.DataFrame(plot_data)
- plot_df_totals = pd.DataFrame(plot_data_totals)
- # Define consistent colors for each month
- colors = {
- 'Jan': '#1f77b4', 'Feb': '#ff7f0e', 'Mar': '#2ca02c', 'Apr': '#d62728',
- 'May': '#9467bd', 'Jun': '#8c564b', 'Jul': '#e377c2', 'Aug': '#7f7f7f',
- 'Sep': '#bcbd22', 'Oct': '#17becf', 'Nov': '#1f77b4', 'Dec': '#ff7f0e'
- }
- # Plot data organized by Month, grouped correctly
- fig = go.Figure()
- # Plot each month with grouped years
- for month in month_order:
- month_df = plot_df[plot_df['Month'] == month]
- fig.add_trace(go.Bar(x=month_df['Month'] + ' ' + month_df['Year'],
- y=month_df['Monthly Change'],
- name=month,
- marker_color=colors[month])) # Set color for each month
- # Plot each month's total
- for month in month_order:
- month_df = plot_df_totals[plot_df_totals['Month'] == month]
- fig.add_trace(go.Bar(x=month_df['Month'] + ' ' + month_df['Year'],
- y=month_df['Monthly Change'],
- name=month,
- marker_color=colors[month], # Match color for totals
- showlegend=False)) # Hide legend for total bars
- fig.update_layout(
- title="SPY Monthly Percentage Change Over the Past 20 Years (Grouped by Month)",
- xaxis_title="Month and Year",
- yaxis_title="Percentage Change",
- barmode='group'
- )
- fig.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement