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
import pandas_datareader.data as web
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(2023, 3, 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 pandas_datareader
fred_data = web.DataReader(variable_dict.values(), "fred", start, end)
fred_data.rename(
columns=dict((y, x) for x, y in variable_dict.items()), inplace=True
)
# 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