Source code for ogusa.macro_params

"""
This module uses data from FRED to find values for parameters for the
OG-USA model that rely on macro data for calibration.
"""

# imports
from fredapi import Fred
import os
import pandas as pd
import numpy as np
import datetime
import statsmodels.api as sm


[docs] def get_macro_params(): """ Compute values of parameters that are derived from macro data """ # set beginning and end dates for data # format is year (1940),month (1),day (1) start = datetime.datetime(1947, 1, 1) end = datetime.date.today() # go through today baseline_date = datetime.datetime(2025, 12, 31) variable_dict = { "GDP Per Capita": "A939RX0Q048SBEA", "Labor share": "LABSHPUSA156NRUG", "Debt held by foreigners": "FDHBFIN", "Debt held by public": "FYGFDPUN", "BAA Corp Bond Rates": "DBAA", "10 year treasury rate": "DGS10", "Total gov transfer payments": "B087RC1Q027SBEA", "Social Security payments": "W823RC1", "Gov expenditures": "FGEXPND", "Gov investment": "A782RC1Q027SBEA", "Gov interest payments": "A091RC1Q027SBEA", "Real GDP": "GDPC1", "Nominal GDP": "GDP", } # pull series of interest using fredapi api_key = os.environ.get("FRED_API_KEY") if not api_key: raise ValueError( "FRED_API_KEY environment variable is not set. " "A free API key can be obtained at " "https://fred.stlouisfed.org/docs/api/api_key.html" ) fred = Fred(api_key=api_key) series_list = [] for name, series_id in variable_dict.items(): s = fred.get_series( series_id, observation_start=start, observation_end=end ) s.name = name series_list.append(s) fred_data = pd.concat(series_list, axis=1) # make sure all dollar value data are in billions fred_data["Debt held by public"] = fred_data["Debt held by public"] / 1000 # Separate quartely, monthly, and annual dataseries fred_data_q = ( fred_data[ [ "Debt held by public", "Nominal GDP", "Total gov transfer payments", "Social Security payments", "Gov expenditures", "Gov investment", "Gov interest payments", "GDP Per Capita", ] ] .resample("QE") .mean() ) fred_data_a = fred_data[["Labor share"]] fred_data_d = fred_data[["BAA Corp Bond Rates", "10 year treasury rate"]] # initialize a dictionary of parameters macro_parameters = {} # print(fred_data.loc(str(baseline_date))) # find initial_debt_ratio macro_parameters["initial_debt_ratio"] = pd.Series( fred_data_q["Debt held by public"] / fred_data_q["Nominal GDP"] ).loc[baseline_date] # find alpha_T macro_parameters["alpha_T"] = pd.Series( ( fred_data_q["Total gov transfer payments"] - fred_data_q["Social Security payments"] ) / fred_data_q["Nominal GDP"] ).loc[baseline_date] # find alpha_G macro_parameters["alpha_G"] = pd.Series( ( fred_data_q["Gov expenditures"] - fred_data_q["Total gov transfer payments"] - fred_data_q["Gov interest payments"] - fred_data_q["Gov investment"] ) / fred_data_q["Nominal GDP"] ).loc[baseline_date] # find alpha_I macro_parameters["alpha_I"] = pd.Series( fred_data_q["Gov investment"] / fred_data_q["Nominal GDP"] ).loc[baseline_date] # find gamma macro_parameters["gamma"] = 1 - fred_data_a["Labor share"].mean() # find g_y macro_parameters["g_y"] = ( fred_data_q["GDP Per Capita"] .pct_change(periods=4, freq="QE", fill_method=None) .mean() ) # # estimate r_gov_shift and r_gov_scale rate_data = ( fred_data_d[["10 year treasury rate", "BAA Corp Bond Rates"]].dropna()[ -50: ] ) / 100 # divide by 100 bc data in percentage points rate_data["constant"] = np.ones(len(rate_data.index)) mod = sm.OLS( rate_data["10 year treasury rate"], rate_data[["constant", "BAA Corp Bond Rates"]], ) res = mod.fit() macro_parameters["r_gov_scale"] = res.params["BAA Corp Bond Rates"] macro_parameters["r_gov_shift"] = res.params["constant"] * -1 return macro_parameters