@@ -130,7 +130,6 @@ import datetime as dt
130130import numpy as np
131131import pandas as pd
132132import matplotlib.pyplot as plt
133-from pandas_datareader import data as web
134133from scipy.stats import norm
135134from scipy.optimize import brentq
136135```
@@ -2011,8 +2010,12 @@ end_date = dt.datetime(2007, 1, 1)
201120102012201120132012def _read_fred_series(series_id, start_date, end_date):
2014- series = web.DataReader(series_id, "fred", start_date, end_date)[series_id]
2015- series = pd.to_numeric(series, errors="coerce").dropna().sort_index()
2013+ # Download directly from FRED's CSV endpoint. This avoids pandas-datareader,
2014+ # which is unmaintained and incompatible with pandas 3.0.
2015+ url = f"https://fred.stlouisfed.org/graph/fredgraph.csv?id={series_id}"
2016+ df = pd.read_csv(url, index_col=0, parse_dates=True)
2017+ series = pd.to_numeric(df.iloc[:, 0], errors="coerce").dropna().sort_index()
2018+ series = series.loc[start_date:end_date]
20162019 if series.empty:
20172020 raise ValueError(f"FRED series '{series_id}' returned no data in sample window")
20182021 return series