Dynamische Makroökonomik, stochastisches Wachstumsmodell [Datum: 01-06-10]
Dieses Batch-File löst das stochastische Wachstumsmodell mit endogenem Arbeitsangebot und stellt Wertfunktionen aus den Iterationsschritten sowie die Politikfunktion graphisch dar;
Contents
- Sauberer Arbeitsplatz
- Modell:
- Definiere Modellparameter
- Definiere Programmparameter
- Erstellen des Produktivitätsgitters
- Berechne steady state Kapitaleinsatz
- Lege ein Gitter für K fest
- Finde zunächst den optimalen Arbeitseinsatz gegeben k und k'
- Variante 1: Maximieren ohne Gitter
- Code der Unterfunktion util
- Variante 2: Optimale Beschäftigung auf einem Gitter finden
- Wertfunktionsiteration
- Graphische Darstellung
- Simulation
- Auswertung
Sauberer Arbeitsplatz
clc
clear
close all
Modell:
Definiere Modellparameter
beta = (984/1000); % Diskontfaktor alpha = 1/3; % Anteil des Faktors Kapital am Volkseinkommen delta = 1/40; % Abschreibungsrate theta = 3.48;% Arbeitsleid: so gewählt, dass der steady state Arbeitseinsatz % 0.2*24[Stunden/Tag]*7[Tage/Woche]*52/45[Woche/Arbeitswoche]=39 Stunden pro Arbeitswoche beträgt gamma = 1.004; % Arbeitsvermehrendes Trendwachstum rho = 0.979; % Autokorrelation sigma_e = 0.0072; % Standardabweichung der Produktivitätsschocks
Definiere Programmparameter
Nk=500;
Na=17;
addpath('..\Tauchen\')
Erstellen des Produktivitätsgitters
[a_grid,P]=Tauchen(rho,Na,1,0, 'equi');
a_grid=exp(a_grid*(sigma_e/sqrt(1-rho^2)));
Berechne steady state Kapitaleinsatz
Bedingungen erster Ordnung: Intertemporale Optimalität
somit:
Optimaler Kapitaleinsatz
Also:
Optimaler Arbeitseinsatz: ,
Einsetzen:
,
r = (gamma-beta)/beta; % Zinssatz Nss = (1-alpha)/(1-alpha+theta*(1-(delta+gamma-1)*(alpha/(r+delta)))); %Steady state Arbeitseinsatz Kss = (alpha / (r + delta))^(1/(1- alpha))*Nss; % Steady State Kapitaleinsatz Yss = Kss^alpha* Nss^(1-alpha); % Steady state output
Lege ein Gitter für K fest
Kmax=a_grid(end)^(1/(1- alpha))*Kss; % Maximaler Kapitalstock steady state +300% Kmin=a_grid(1)^(1/(1- alpha))*Kss; % Minimaler Kapitalstock steady stae -80% aux=norminv(1/20:18/20/(Nk-1):19/20); k_grid=Kss*exp(2*aux./aux(end)*log(Kmax/Kss)); % Gitter mit vielen Punkten in der Mitte
Finde zunächst den optimalen Arbeitseinsatz gegeben k und k'
Bedingungen erster Ordnung für optimalen Arbeitseinsatz:
(Arbeitsnachfrage)
(Arbeitsangebot)
empl=NaN(Na,Nk,Nk);
sigma=NaN(Na,Nk,Nk); %Nutzen bei optimalem Arbeitseinsatz
Variante 1: Maximieren ohne Gitter
% for m=1:Na % for i=1:Nk % max_y=a_grid(m)*k_grid(i).^alpha+(1-delta).*k_grid(i); %Resourcen bei $N = 1$ % for j=1:Nk % if max_y>k_grid(j)*gamma % Nur Investitionspläne betrachten die bei vollem Arbeitseinsatz durchführbar sind % [empl(m,j,i) sigma(m,j,i)] = fminbnd(@(n)(util(n,k_grid(i),... % k_grid(j),theta,alpha,gamma,delta,a_grid(m))),0.00000001,.99999999999); % else % empl(m,j,i) = 1; % sigma(m,j,i) = Inf; % end % end % end % end % sigma=-sigma; % -Zielfunktion wurde minimiert
Code der Unterfunktion util
% function u=util(n,k,kprime,theta,alpha,gamma,delta,a) % % c=a* k.^alpha .* n.^(1-alpha) + (1-delta) .* k - gamma .* kprime; % % u=log(c)+theta*log(1-n); % % u(c<0)=-Inf; % % u=-u;
Variante 2: Optimale Beschäftigung auf einem Gitter finden
NN=1000; n_grid=linspace(0,1,NN); aux1=gamma.*repmat(k_grid',1,NN); aux2=theta*repmat(log(1-n_grid),Nk,1); aux3=repmat(n_grid.^(1-alpha),Nk,1); for m=1:Na for i=1:Nk c=a_grid(m).* k_grid(i).^alpha *aux3 + (1-delta) .* k_grid(i) - aux1; u=log(c)+aux2; u(c<0)=-Inf; [sigma(m,:,i) empl(m,:,i)]=max(u,[],2); end end empl=n_grid(empl);
Wertfunktionsiteration
dist=99; V=zeros(Na,Nk); %Initialisiere die Werfunktion t=1; while dist>0.001 EV=P*V; [Vnew pol]=max(sigma+beta*repmat(EV,[1,1,Nk]),[],2); Vnew=squeeze(Vnew); pol=squeeze(pol); dist=max(max(abs(Vnew-V))); V=Vnew; end
Graphische Darstellung
figure(1) surf(k_grid,a_grid,V) title('Wertfunktion') xlabel('Kapitalstock') ylabel('Produktivität') figure(2) scrsz = get(0,'ScreenSize'); set(2,'Position',scrsz) title('Politikfunktion') xlabel('Kapitalstock in t') ylabel('Kapitalstock in t+1') plot((k_grid),(k_grid(pol([1 ceil(Na/2) end],:)))) hold on plot(([Kmin Kmin]),([k_grid(1)*.9 k_grid(end)*1.1]),'b--') plot(([Kss Kss]),([k_grid(1)*.9 k_grid(end)*1.1]),'g--') plot(([Kmax Kmax]),([k_grid(1)*.9 k_grid(end)*1.1]),'r--') plot(([k_grid(1)*.95 k_grid(end)*1.05]),([k_grid(1)*.95 k_grid(end)*1.05]),'k') legend({' k_{t+1}(k_t,A_t) falls \newline A_t minimal', ' k_{t+1}(k_t,A_t) falls \newline A_t durchs.',... ' k_{t+1}(k_t,A_t) falls \newline A_t maximal', ' steady state k falls \newline A immer minimal',... ' steady state k falls \newline A immer durchs.', ... ' steady state k falls \newline A immer maximal', '45° Linie'},'Location','EastOutside')


Simulation
Ziehe 5000+500 Shocks auf die Produktivität, berechne jeweils den aus der Politikfunktion folgenden Kapitalstock, bestimme zu letzt Investitionen, Konsum, Löhne, etc.
T=5000; % Simulationsperiode tau=500; % Initialisationsperiode schock=rand(1,T+tau); % Schocks (0,1)-gleichverteilt PR=cumsum(P,2); % Kummulierte Übergangswahrscheinlichkeiten kapital_index=ones(1,T+tau)*ceil(Nk/2); %initialisiere Kapitalvariable auf ca. ss Niveau a_ind=ones(1,T+tau)*ceil(Na/2); n=zeros(1,tau+T); % Die Timing Annahme hier ist, dass _Kapital_index_ den zukünftigen % Kapitalstock mißt. for t=2:T+tau a_ind(t)=min(max(1,sum(PR(a_ind(t-1),:)<schock(t))+1),Na); kapital_index(t)=pol(a_ind(t),kapital_index(t-1)); % Neuer Kapitalstock n(t)=empl(a_ind(t),kapital_index(t),kapital_index(t-1)); end kapital=k_grid(kapital_index(tau:end-1)); %In periode t=1...T zur Produktion eingesetzt a=a_grid(a_ind(tau+1:end)); % Produktivität in t=1...T n(1:tau)=[]; % Lösche die ersten tau Einträge (Beschäftigung für t=1...T) y=a.*kapital.^(alpha).*n.^(1-alpha); % Output I=k_grid(kapital_index(tau+1:end))-(1-delta).*kapital; % Investitionen c=y-I; % Konsum w = (1-alpha)*y./n; r = alpha*y./kapital - delta; figure(3) plot(1:100,[log(y(1:100)); log(c(1:100)); log(I(1:100))]); title('Simulierte Zeitreihe für Aggregate') legend({'Output', 'Konsum', 'Investitionen'})

Auswertung
logDaten=[log(y); log(c); log(I); log(n); log(w); r]; trend=myhpfilter(logDaten',1600); Konjunktur=(logDaten'-trend); [T nvar]=size(Konjunktur); Zweitmomente(:,1)=std(Konjunktur)'; Zweitmomente(:,2)=std(Konjunktur)'./std(Konjunktur(:,1)); Zweitmomente(:,3)=corr(Konjunktur,Konjunktur(:,1))'; for j=1:nvar Zweitmomente(j,4)=corr(Konjunktur(2:end,j),Konjunktur(1:end-1,j)); end Zweitmomente
Zweitmomente = 0.0179 1.0000 1.0000 0.7187 0.0074 0.4106 0.8933 0.7856 0.0712 3.9773 0.9742 0.6911 0.0095 0.5286 0.9590 0.6754 0.0092 0.5153 0.9568 0.7666 0.0008 0.0458 0.9471 0.6993