Thursday, April 7, 2022

Is the Fed new-Keynesian?

(Update: This post turned in to "inflation past present and future")

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

 

 





10 comments:

  1. Dr Cochrane,
    Thank you for the work. I'd be curious to know whether the model can explain the last 8 or so months, where the Fed was off by a mile?

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. OEE,

      "Or, was some other factor or factors at play that precluded the FOMC from adjusting its monetary playbook?"

      This:

      https://fred.stlouisfed.org/series/A091RC1Q027SBEA
      https://fred.stlouisfed.org/series/FDEFX
      https://fred.stlouisfed.org/series/W006RC1Q027SBEA

      2015-2019 - Federal tax receipts basically flat lined at about $2 Trillion
      2015-2019 - Defense expenditures jump from $730 billion to over $900 Billion
      2015-2019 - Interest expenditures jump from $428 billion to $589 Billion

      Doesn't take long before defense and interest expenditures consume all tax revenue.

      Delete
    2. This comment has been removed by the author.

      Delete
    3. OEE,

      "It would appear that the series cited don't support your contention for this current era, but did so in the past."

      Sure it does. The Fed (under Powell - Republican) began cutting interest rates in 2019 because interest expense on the federal debt along with defense expenditures were growing quickly and likely to consume all available tax revenue within the next few years.

      Powell is a political appointee from George Bush Jr.'s administration. In that administration his job was Treasury Undersecretary for Domestic Finance. That should tell you all you need to know about where his loyalties are placed.

      https://en.wikipedia.org/wiki/Jerome_Powell

      Dress it up with all the "expectations" drivel you want.

      Delete
    4. This comment has been removed by the author.

      Delete
  4. Valter Buffo. Recce'd, MilanApril 8, 2022 at 2:53 AM

    Some fodder about the named additional shocks: why not financial stability?

    Since Jan 22, the aggregate value of Sovereign bonds has been reduced by higher yields in a measure which is not far from 10%.

    Mainstream asset pricing theory is covariance-based and attributes zero relevance to price levels or to stocks of financial assets. But they do matter, today more tha ever. Let's see how.

    A large number of professional and private investors' portfolio choices are still made referring to the over-simplified mean-variance set of tools, who goes back to the 1950s, a setup where stocks are always riskier than bonds (and prices always go up in the long term).

    Then today a large number of portfolios has to be rebalanced to restore the Jan 22 targeted portfolio composition. So: they have to sell stocks, and buy bonds. But, but, but ... now our friends at Eccles Building are selling bonds, at a 100bn-a-month pace (in Frankfurt, "we are not seeing any problem", zzzzzzz....).

    So, where will bond prices go (and here I am deliberately leaving the inflation factor aside)? Many tried to persuade that QE did not "have any influence on asset prices", but will eventually QT matter? Will aggregate portfolio values go upwards or downwards? In the latter case, will additional positions have to be liquidated, to run after market prices and get to that targeted portfolio balance?

    This is exactly how it worked, for a decade, on the way up. It may happen on the way down. What goes around comes around.

    ReplyDelete
  5. This comment has been removed by the author.

    ReplyDelete
  6. what is r? some kind of interest rate? how is it calculated?

    ReplyDelete

Comments are welcome. Keep it short, polite, and on topic.

Thanks to a few abusers I am now moderating comments. I welcome thoughtful disagreement. I will block comments with insulting or abusive language. I'm also blocking totally inane comments. Try to make some sense. I am much more likely to allow critical comments if you have the honesty and courage to use your real name.