The interest model, both for C corporations and pass-throughs, could use serious work to improve it. This work includes modest substantive changes as well as larger refactoring. First, an overview of the economic logic behind it:
The model assumes the existence of an optimal net debt-to-asset ratio. This is consistent with existing evidence, with mild/modest deviations around severe recessions. We assume that debt originated in any given year is retired at a fixed rate, eta
, and that interest paid on that debt henceforth is at the original interest rate prevailing at that time. The interest rate on corporate debt is the 10-year Treasury bond rate plus Moody's Baa corporate bond premium. The firm also earns some interest income from its debt assets, which we assume are Treasury bonds (or pay T-bond rates). The historical data for corporate debt assets and liabilities come from the Financial Accounts, and interest rate and premiums are available from FRED.
We apply a nearly identical process for pass-through businesses, except that we only model the debt liability component because interest income from pass-through debt assets is taxed as interest income on the individual income tax.
The first stage of the process is calculating the adjustment factors (corporate and noncorporate) to rescale net interest based on the Financial Accounts data to match net interest based on IRS data. This could be improved by jointly calculating the adjustment factor and the debt retirement rate eta
, which is currently assumed to be 0.4. (This value of eta
was picked to approximately match existing data, but it should rightly be calculated instead.)
We calculate interest paid and received in the baseline very similarly to how we calculate it for the adjustment factors. These functions are in interest_model.py
. These functions include no policy parameters. Part of refactoring should make the reform interest model functions, which are located in responses.py
, capable of handling this.
We calculate the reform using the functions in responses.py
because previous versions of BRC calculated the baseline and then the reform. These calculations are somewhat more complicated. They first calculate the baseline path of net debt, debt liabilities, and debt assets. They then calculate the marginal tax shield from debt, which is the tax rate in the baseline and is the tax rate multiplied by (1 - haircut)
in the reform (with the haircut being the larger of the haircut on the net interest deduction and the haircut on the interest deductibility of new debt). It then applies the debt semi-elasticity to the change in the marginal tax shield to calculate the new optimal net debt and debt liabilities; I assume that debt assets are unchanged, as this is typically due to cash on hand being stored in liquid assets. Given the optimal path of debt, it then calculates originations of new debt, with originations limited to being nonzero. Using the new originations, we calculate the net interest deduction similarly to how we do in the baseline functions, but with modifications to incorporate the haircuts on the net interest deduction, on interest paid on old debt, and on interest paid on new debt.
Currently, without a change in policy, the "reform" functions located in responses.py
produce the same results as the "baseline" functions located in interest_model.py
. However, we need to switch to using the reform functions in general. Although not a problem pre-TCJA, this will become a problem post-TCJA, as we will need to make some assumption about the elasticity of borrowing to even calculate the new baseline (because CBO does not provide corporate debt forecasts from which to forecast the new baseline). We will also need to add a parameter limiting the net interest deductibility to some fraction of earnings (specifically, EBITDA), which the TCJA set at 30 percent. Although this is not binding for the representative firm, it will be binding if we split the representative firm into separate representative firms for each industry and net profit/loss status.
@andersonfrailey @hdoupe @martinholmer @Abraham-Leventhal @lucassz
Does anyone have suggestions about how to proceed? I would be happy to discuss this in person if that's easier.