Friday, October 7, 2022
HomeEconomicsIs the Fed new-Keynesian?

Is the Fed new-Keynesian?



window.MathJax = { tex: { tags: ‘ams’ } };

I realize that the title of my last post, Is the Fed Fisherian? was not as clear as it could be. The model I used to understand the Fed’s forecast was, in fact, completely standard new-Keyenesian. The new-Keynesian model has the Fisherian property — a permanent interest rate rise raises inflation, at least eventually — but that is not its core feature. A clearer description is, is the Fed new-Keynesian — and thereby, only incidentally, Fisherian. 

Beyond clearing that up, today I want to add unemployment. In part, I am motivated by a new working paper by Alex Domash and Larry Summers, warning that the Fed will have to raise interest rates to stop this inflation, and doing so will cause a recession. They also point out that scenario in the past, most notably 1980. 

So what model can account for the Fed’s rosy employment scenario? It turns out that the little new-Keynesian model from the last post accounts for its unemployment views as well. And that the same model accounts for its inflation, unemployment, and funds rate forecasts together makes it more credible that this is a reasonable model of how the Fed thinks.  

The Fed, it seems is new-Keyensian. That makes some sense; their models are new-Keynesian. We shall see if those models are right. 

I start today by plotting again the Fed’s projections, this time including unemployment. As well as inflation going away on its own without a period of high interest rates, you see inflation gently converge to the Fed’s view of a long-run 4% natural rate. Is there a model behind this rosy scenario? Yes. 

The model is the same as in my last post, \begin{align} x_t &= -\sigma ( i_t -r – \pi^e_t) \\ \pi_t &= \pi^e_t + \kappa x_t \end{align} There are two variants: the traditional adaptive expectations \[\pi^e_t = \pi_{t-1}\] and  new-Keyensian rational expectations \[\pi^e_t = E_t \pi_{t+1}.\] I translate the output gap \(x_t\) of the model to an unemployment rate using Okun’s law — each 1 percentage point rise in output is a 0.5% decline in unemployment relative to the 4% natural rate, \( u_t = 4 – x_t/2\)

The model’s equilibrium condition is\[\pi_{t}=-\sigma\kappa ( i_{t}-r)+\left(  1+\sigma\kappa\right)  \pi_{t}^{e}.\] With adaptive expectations \(\pi_{t}^{e}=\pi_{t-1},\)the equilibrium condition is\[\pi_{t}=(1+\sigma\kappa)\pi_{t-1}-\sigma\kappa( i_{t}-r).\] With rational expectations, the equilibrium condition is\[E_{t}\pi_{t+1}=\frac{1}{1+\sigma\kappa}\pi_{t}+\frac{\sigma\kappa}{1+\sigma\kappa}(i_{t}-r).\] Now, fire up each model, start out at \(i_1=0.33%\), \(\pi_1=5.5%\), put in the Fed’s interest rate path, and let’s see what inflation and unemployment comes out. (Starting at the observed inflation is the key here. Impulse responses, fiscal theory vs. new Keynesian, active vs. passive, etc. come down to which initial inflation do you pick after a shock. By using the data to pick the initial inflation, we don’t have to worry about any of those issues.) 

These two graphs plot the model response to the Fed’s interest rate forecast using each variant of the model. I use \(\kappa=0.5\) \(\sigma=1\). 

The traditional adaptive expectations model predicts an explosive inflation spiral, as before, and now also an explosive unemployment decline as well. Linear Okun’s law is obviously going to break down past a zero unemployment rate, but the Fed is going to give in and sharply raise rates before that happens, as Domash and Summers predict. 

The new-Keynesian model, by contrast, fits the Fed’s unemployment forecast quite well, as it fits the inflation forecast. For such an incredibly simple model, with parameter values picked out of thin air, that’s a pretty good fit. The Fed is new-Keynesian. 

Rather than feed in the Fed’s rate forecast and see if the model produces the Fed’s unemployment and inflation forecast, let us again find the interest rate path needed to exactly hit the Fed’s inflation forecast. Now we also look at the unemployment rate that interest rate path will produce. 

To make this calculation, I again solve the equilibrium condition for the interest rate\[i_t = r+\frac{1+\sigma\kappa}{\sigma\kappa}\pi^e_t – \frac{1}{\sigma\kappa}\pi_t.\] Then use the Fed’s inflation forecast for \(\pi_t\) and \(pi^e_t\), either one period ahead or one period behind. 

In the traditional adaptive expectations version of the model, we need sharply higher, Taylor-rule style interest rates, now. Those higher nominal rates create higher real rates, which bring inflation down. They also cause a recession — notice unemployment rising over the  4% natural rate. It’s not so bad, because the simulation starts at last year’s PCE inflation, 5.5%, not last month’s CPI inflation, 8%, and not (perhaps) this summer’s 10% inflation, and because the model is incredibly simplified, and I chose a fairly mild price-stickiness parameter. Serious models can easily deliver a much worse recession. 

By contrast, the new-Keynesian model says that in order to hit the Fed’s inflation forecast, interest rates can stay low, and indeed a bit lower than the Fed projects. And that path is perfectly consistent with unemployment slowly reverting to the natural rate. 

In the new-Keyensian model, the output gap and unemployment are related to inflation relative to future inflation. If inflation is high today relative to what people expect in the future, there will be lots of employment and little unemployment. Output is high and unemployment low when inflation is high but expected to decline. In the adaptive expectations model, output and unemployment are related to inflation relative to past inflation. Output is high and unemployment is low when inflation is high and rising. You would think this would be easy to tell apart in the data, but it isn’t.  

That is, however, the key element to understanding these radically different views of inflation dynamics. 

In sum, the Fed’s forecasts, now extended to unemployment, are not necessarily nutty, rosy scenario, etc. There is a model that produces them, and it is the standard new-Keynesian model. Now debate if that model is right, or right in this instance.  

To reiterate, my best guess at the right answer is an expanded version of the new-Keynesian model with a short run negative effect that the Fed could exploit, and somewhat slower dynamics. That makes sense of the 2010s. For this to be an experiment, alas, we need a period with no additional shocks, but additional shocks are likely to happen. 

Update: some more thoughts on Fed psychology in the next post

Code 

Note, I don’t include the data files. If you get then from Fred, replace the – with , in dates (1-1-2020 should be 1, 1, 2020)  and it will work. 

 

clear all

close all

 

%Fed data from https://www.federalreserve.gov/monetarypolicy/fomcprojtable20220316.htm

 

years = [2017 2018 2019 2020 2021 2022 2023 2024 2030]’;

actual = [1.9 2.0  1.5  1.2  5.5 NaN NaN NaN NaN ]’;    

UpperRange = [ NaN  NaN NaN NaN 5.5 5.5 3.5 3.0 2.0]’;

UpperCentral =[ NaN NaN NaN NaN 5.5 4.7 3.0 2.4 2.0]’;

MedianForecast =[NaN NaN NaN NaN 5.5 4.3 2.7 2.3 2.0]’;

LowerCentral= [NaN  NaN NaN NaN 5.5 4.1 2.3 2.1 2.0]’;

LowerRange =[ NaN   NaN NaN NaN 5.5 3.7 2.2 2.0 2.0]’;

% I added last actual to the forecasts

 

fedfunds = [ NaN NaN NaN NaN NaN 1.9 2.8 2.8 2.4 ]’; 

unemp = [ NaN NaN NaN NaN 4.2 3.5 3.5 3.6 4.0 ]’;

unempactual = [ 4.2 3.8 3.6 6.8 4.2 NaN NaN NaN NaN ]’;

 

 

x = load(‘pcectpi.csv’);

x = x(x(:,2)==10,:); % use 4th quarter for year 

pceyr = x(:,1);

pce = x(:,4);

 

x = load(‘fedfunds.csv’);

x = x(x(:,2)==12,:); % use 4th quarter for year 

ffyr = x(:,1);

ff = x(:,4);

fedfunds(5) = ff(end); 

    

 rate_years = years;

 mean_rate_forecast = fedfunds;

 

figure; 

hold on;

plot(years, actual, ‘-r’,‘linewidth’,2);

plot(pceyr,pce,‘-r’,‘linewidth’,2)

plot(years, MedianForecast, ‘-ro’,‘linewidth’,2);

plot(rate_years,mean_rate_forecast,‘-bo’,‘linewidth’,2);

plot(ffyr,ff,‘-b’,‘linewidth’,2)

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

plot([2010 2030],[0 0],‘-k’)

axis([2017 2030 -1 6])

text(2018,5.5,‘Actual \leftarrow’,‘fontsize’,20)

text(2022,5.5,‘\rightarrow Forecast’,‘fontsize’,20);

text(2022,1,‘Fed Funds’,‘color’,‘b’,‘fontsize’,20);

text(2022.5,4,‘Inflation’,‘color’,‘r’,‘fontsize’,20);

ylabel(‘Percent’)

print -dpng actual_and_forecast.png

 

 

 

figure; 

hold on;

plot(years, actual, ‘-r’,‘linewidth’,2);

plot(pceyr,pce,‘-r’,‘linewidth’,2)

plot(years, MedianForecast, ‘-ro’,‘linewidth’,2);

plot(rate_years,mean_rate_forecast,‘-bo’,‘linewidth’,2);

plot(ffyr,ff,‘-b’,‘linewidth’,2)

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

plot([2010 2030],[0 0],‘-k’)

axis([2017 2030 -0.5 7])

%text(2018,5.5,’Actual \leftarrow’,’fontsize’,20)

text(2022,6.5,‘\rightarrow Forecast’,‘fontsize’,20);

text(2025,3,‘Fed Funds’,‘color’,‘b’,‘fontsize’,20);

text(2025,2,‘Inflation’,‘color’,‘r’,‘fontsize’,20);

text(2025,4.2,‘Unemployment’,‘color’,‘k’,‘fontsize’,20);

ylabel(‘Percent’)

 

plot(years, unempactual,‘-k’,‘linewidth’,2);

plot(years, unemp,‘-vk’,‘linewidth’,2)

print -dpng actual_forecast_unemp.png

 

 

% Theory 

 

 

kap = 0.5; 

sig = 0.5/kap;

r = 0.5; 

T = 11;

tim = (1:T)’;

it = 0*tim;

it(1:5) = mean_rate_forecast(end-4:end); 

it(6:end) = it(5);

pita = it*0; 

pitr = it*0;

xta = it*0;

xtr = it*0; 

pita(1) = 5.5; 

pitr(1)= 5.5;

xta(1) = 4.2;

xtr(1) = 4.2;

for t = 2:T

    pita(t) = (1+sig*kap)*pita(t-1) – sig*kap*(it(t)-r);

    pitr(t) = 1/(1+sig*kap)*pitr(t-1)+sig*kap/(1+sig*kap)*(it(t-1)-r);   

end;

for t = 2:T

    xta(t) = 4+sig*(it(t)-r-pita(t-1))/2;

    if t < T; 

     %    xtr(t) = 4+sig*(it(t)-r-pitr(t+1))/2;%check same result

         xtr(t) = 4-(pitr(t)-pitr(t+1))/(2*kap);

    else;

        xtr(t) = NaN;

    end;   

end;

 

figure; 

hold on

plot(tim+2020,it,‘-b’,‘Linewidth’,2);

plot(tim+2020,pita,‘-r’,‘Linewidth’,2);

plot(tim+2020,pitr,‘-vr’,‘Linewidth’,2);

plot([tim(1:4)+2020; 2030],MedianForecast(end-4:end),‘–r’,‘linewidth’,2);

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

 

axis([2020 2030 0 10])

text(2022.5,8,‘Inflation, adaptive E’,‘color’,‘r’,‘fontsize’,20)

text(2026,1.7,‘Inflation, rational E’,‘color’,‘r’,‘fontsize’,20)

text(2022,4.5,‘–Inflation, Fed forecast’,‘color’,‘r’,‘fontsize’,20)

text(2021.8,1,‘Fed funds, Fed forecast’,‘color’,‘b’,‘fontsize’,20)

ylabel(‘Percent’)

print -dpng inflation_forecast.png

 

 

figure; 

hold on

text(2020.5,-1,‘Fed funds’,‘color’,‘b’,‘fontsize’,20)

plot(tim+2020,xta,‘-k’,‘Linewidth’,2);

plot([tim(1:4)+2020; 2030],unemp(end-4:end),‘–k’,‘linewidth’,2);

plot(tim+2020,it,‘-b’,‘Linewidth’,2);

plot(tim+2020,pita,‘-r’,‘Linewidth’,2);

plot([tim(1:4)+2020; 2030],MedianForecast(end-4:end),‘–r’,‘linewidth’,2);

plot([2021.5 2021.5],[-2 12],‘-k’,‘linewidth’,2);

plot(tim+2020,0*tim,‘-k’)

axis([2020 2030 -2 12])

title(‘Adaptive Expecations’,‘fontsize’,16);

text(2022.5,8,‘Inflation’,‘color’,‘r’,‘fontsize’,20)

%text(2022,4.5,’Inflation forecast’,’color’,’r’,’fontsize’,20)

text(2025, -1, ‘Unemployment’,‘color’,‘k’,‘fontsize’,20); 

ylabel(‘Percent’)

legend(‘Model’,‘Fed Forecast’,‘fontsize’,20);

print -dpng unemp_adaptive.png

 

 

figure; 

hold on

plot(tim+2020,xtr,‘-k’,‘Linewidth’,2);

plot([tim(1:4)+2020; 2030],unemp(end-4:end),‘–k’,‘linewidth’,2);

plot(tim+2020,it,‘-b’,‘Linewidth’,2);

plot(tim+2020,pitr,‘-r’,‘Linewidth’,2);

plot([tim(1:4)+2020; 2030],MedianForecast(end-4:end),‘–r’,‘linewidth’,2);

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

axis([2020 2030 0 6])

text(2026,1.7,‘Inflation’,‘color’,‘r’,‘fontsize’,20)

text(2026,3.5,‘Unemployment’,‘color’,‘k’,‘fontsize’,20)

text(2021.8,1,‘Fed funds’,‘color’,‘b’,‘fontsize’,20)

legend(‘Model’,‘Fed Forecast’,‘fontsize’,20);

title(‘New-Keynesian’,‘fontsize’,16);

ylabel(‘Percent’)

print -dpng unemp_rational.png

 

% plot needed interest rate 

 

tim = (1:12)’;

it = 0*tim;

pit = [MedianForecast(end-4:end);MedianForecast(end)*ones(7,1)]; 

 

ita = it*0; 

itr = it*0;

for t = 2:size(tim,1)-1

    ita(t) = r+ (1+sig*kap)/(sig*kap)*pit(t-1) – 1/(sig*kap)*(pit(t));

    itr(t) = r+ (1+sig*kap)/(sig*kap)*pit(t+1) – 1/(sig*kap)*(pit(t));

end;

ita(1) = NaN;

itr(1) = NaN;

 

xta = it*0;

xtr = it*0; 

for t = 2:size(tim,1)-1

    %xta(t) = 4+sig*(ita(t)-r-pit(t-1))/2;

     xta(t) = 4-(pit(t)-pit(t-1))/(2*kap);

    if t < T; 

         %xtr(t) = 4+sig*(itr(t)-r-pit(t+1))/2;%check same result

         xtr(t) = 4-(pit(t)-pit(t+1))/(2*kap);

    else;

        xtr(t) = NaN;

    end;   

end;

xta(1) = NaN;

xtr(1) = NaN;

 

figure; 

hold on

plot(tim+2020,pit,‘-r’,‘Linewidth’,2);

plot(tim+2020,ita,‘-b’,‘Linewidth’,2);

plot(tim+2020,itr,‘-vb’,‘Linewidth’,2);

plot(tim+2020,0*tim,‘-k’);

plot(rate_years,mean_rate_forecast,‘–bo’,‘linewidth’,2);

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

axis([2020 2030 -0.5 9])

text(2023.5,8,‘Needed rate, adaptive E’,‘color’,‘b’,‘fontsize’,20)

text(2022.5,0.5,‘Needed rate, rational E’,‘color’,‘b’,‘fontsize’,20)

text(2026,1.5,‘Inflation, Fed forecast’,‘color’,‘r’,‘fontsize’,20)

text(2026,4,‘–Rate, Fed forecast’,‘color’,‘b’,‘fontsize’,20)

ylabel(‘Percent’)

print -dpng needed_rate.png

 

figure; 

hold on

plot(tim+2020,xta,‘-k’,‘linewidth’,2)

plot(tim+2020,pit,‘-r’,‘Linewidth’,2);

plot(tim+2020,ita,‘-b’,‘Linewidth’,2);

plot(tim+2020,0*tim,‘-k’);

plot(rate_years,mean_rate_forecast,‘–bo’,‘linewidth’,2);

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

axis([2020 2030 -0.5 9])

title(‘Adaptive Expectations’,‘fontsize’,16)

text(2023.5,8,‘Needed rate’,‘color’,‘b’,‘fontsize’,20)

text(2026,1.5,‘Inflation’,‘color’,‘r’,‘fontsize’,20)

text(2022,1,‘–Fed rate’,‘color’,‘b’,‘fontsize’,20)

text(2026,5,‘Unemployment’,‘color’,‘k’,‘fontsize’,20)

ylabel(‘Percent’)

print -dpng needed_unemp_ok.png

 

figure; 

hold on

plot(tim+2020,xtr,‘-k’,‘linewidth’,2)

plot(tim+2020,pit,‘-r’,‘Linewidth’,2);

plot(tim+2020,itr,‘-b’,‘Linewidth’,2);

plot(tim+2020,0*tim,‘-k’);

plot(rate_years,mean_rate_forecast,‘–bo’,‘linewidth’,2);

plot([2021.5 2021.5],[-1 10],‘-k’,‘linewidth’,2);

axis([2020 2030 -0.5 6])

title(‘New-Keynesian’,‘fontsize’,16);

text(2022.5,0.5,‘Needed rate’,‘color’,‘b’,‘fontsize’,20)

text(2026,1.5,‘Inflation’,‘color’,‘r’,‘fontsize’,20)

text(2026,3,‘–Fed rate’,‘color’,‘b’,‘fontsize’,20)

text(2026,4.2,‘Unemployment’,‘color’,‘k’,‘fontsize’,20);

ylabel(‘Percent’)

print -dpng needed_unemp_nk.png

 

 

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments