import numpy as np
from pprint import pprint # pretty print para visualizar melhor os dicionários
from scipy.optimize import root
from termcolor import colored
import matplotlib.pyplot as plt
Oferta de Trabalho Intertemporal
Modelo de dois períodos
Considere a seguinte economia padrão de dois períodos \((t=0,1)\). Há um contínuo de agentes de medida \(1\). Cada agente é dotado de uma unidade de tempo em cada período, que pode ser usada para lazer \(l\) ou horas trabalhadas \(h\). As preferências são sobre consumo \(c\) e lazer \(l\) e são representadas por:
\[ U=\sum_{t=0}^{1} \beta^{t}\left(u\left(c_{t}\right)+\gamma v\left(l_{t}\right)\right), \gamma>0 \text { e } \beta \in(0,1) \]
com \(u(c)=\frac{c^{1-\sigma}-1}{1-\sigma}\) e \(v(l)=\frac{l^{1-\sigma}-1}{1-\sigma}\) com \(\sigma>0\).
Do lado da produção, há um contínuo de empresas de medida 1, cada uma com acesso a uma tecnologia para produzir o bem de consumo:
\[ Y_{t}=A_{t} L_{t}^{\alpha}, A_{t}>0 \text { e } \alpha \in(0,1) \]
onde \(Y_{t}\) é a produção, \(L_{t}\) denota o insumo trabalho e \(A_{t}\) é um fator de produtividade. Cada família tem direito a uma parcela igual dos dividendos das empresas. Suponha que existe um mercado de ativos em que os agentes podem negociar títulos de um período, de modo que as restrições orçamentárias possam ser escritas como:
\(c_{0}+a_{1}=w_{0} h_{0}+\pi_{0}\) e \(c_{1}=w_{1} h_{1}+(1+r) a_{1}+\pi_{1}\), onde \(\pi_{t}\) são os lucros e são tomados como dado pelas famílias.
Existem três requisitos para um equilíbrio competitivo, correspondentes a:
- As famílias maximizam a utilidade;
- as empresas maximizam seu lucro;
- os “mercados se equilibram” (market clearing) no preço de equilíbrio.
Começamos com o problema das famílias, que é maximizar a utilidade sujeita a um orçamento.
Problema das Famílias
\[ \begin{align*} \max_{c_t,l_t,h_t,a_1}&U = u(c_0) + \gamma v(l_0) + \beta \left[u(c_1) + \beta \gamma v(l_1)\right]\tag{HP}\\ s.t\quad &c_0+a_1 = w_0h_0+\pi_0\\ &c_1 = w_1h_1+\pi_1+(1+r)a_1\\ &l_t+h_t=1 \end{align*} \]
Problema das Firmas
\[ \begin{align*} \max_{L_t}\quad &\pi_t = p_tA_tL_t^\alpha - w_tL_t\quad t=\{0,1\}\tag{FP} \end{align*} \]
Equilíbrio de Mercado
O consumo total mais a poupança deve ser igual à produção total mais o juro em um determinado período
3.1 \(c_0+a_1=Y_0\)
3.2 \(c_1=(1+r)a_1+Y_1\)
e a oferta de trabalho corresponde à demanda
3.3 \(h_t=L_t\)
Resolvendo o Modelo
Vamos derivar as condições de primeira ordem do problema de cada agente e ir o mais longe possível na resolução das condições de equilíbrio de mercado.
O Problema das Famílias
As condições de primeira ordem (FOC) do problema das famílias são: \[ \begin{align*} &\mathcal{L} = u(c_0) + \gamma v(l_0) + \beta u(c_1) + \beta\gamma v(l_1) + \lambda_0 [w_0 h_0 + \pi_0 - c_0 - a_1] + \lambda_1[w_1 h_1 + \pi_1 + (1+r) a_1 - c_1]+\lambda_2[1-l_0-h_0]+\lambda_3[1-l_1-h_1]\\ &c_0: u'(c_0) - \lambda_0 = 0\\ &c_1: \beta u'(c_1) - \lambda_1= 0\\ &l_0: \gamma v'(l_0) - \lambda_2 = 0\\ &l_1: \beta\gamma v'(l_1) - \lambda_3 = 0\\ &h_0: \lambda_0 w_0 - \lambda_2 = 0\\ &h_1: \lambda_1 w_1 - \lambda_3 = 0\\ &a_1: -\lambda_0 + \lambda_1(1+r) = 0 \end{align*} \]
E não nos esqueçamos das restrições do problema HP que também fazem parte do sistema de equações a ser resolvido.
Resolvendo essas equações, chegamos à equação de Euler e a equação de substituição intertemporal da oferta de trabalho que caracterizam o problema.
\[ \begin{equation*} \left. \begin{aligned} u'(c_0)=\gamma\frac{v'(1-h_0)}{w_0}\\ u'(c_1)=\gamma\frac{v'(1-h_1)}{w_1} \end{aligned} \right\rbrace \implies u'(c_0)=\beta(1+r)u'(c_1)\qquad\text{Equação de Euler} \end{equation*} \]
\[ \begin{equation*} v'(1-h_0) w_1 = \beta(1+r) v'(1-h_1)w_0 \qquad\text{Substituição intertemporal da oferta de trabalho} \end{equation*} \]
Temos então 5 variáveis endógenas oriundas do problema das famílias: \(c_0\), \(c_1\), \(h_0\), \(h_1\) e \(a_1\), sendo que temos 5 equações:
\[ \begin{align} c_0&=w_0h_0+\pi_0-a_1\\ c_1&=[(1+r)\beta]^{1/\sigma}c_0\\ h_0&=1-(\gamma/w_0)^{1/\sigma}c_0\\ h_1&=1-(\gamma/w_1)^{1/\sigma}c_1\\ a1&=(c1-w_1h_1-\pi_1)/(1+r)\\ \end{align} \]
Esse sistema pode ser resolvido escrevendo todas as variáveis endógenas, \(c_1\), \(h_0\), \(h_1\) e \(a_1\) em função de \(c_0\) e considerando que as famílias tomam como dado os salários e lucros distribuídos, \(w_t\) e \(\pi_t\). Basta então substituir recursivamente para encontrar todas as outras variáveis endógenas. Ou, como faremos neste exercício, podemos utilizar métodos numéricos para encontrar as soluções.
O Problema das Firmas
A condição de primeira ordem para FP é:
\[ \begin{equation} \frac{w_t}{p_t} = \alpha A_t L_t^{\alpha-1} \quad t=\{0,1\} \end{equation} \]
Aqui podemos ver que o FP é estático e estamos assumindo que as empresas são tomadoras de preço em qualquer período. Além disso, como há apenas um bem nesta economia, ele será o numerário, portanto \(p_t=1, \forall t\). Logo, os salários reais são dados pela produtividade marginal do trabalho. Esta expressão para os salários pode ser substituída novamente na função lucro para encontrarmos a relação:
\[ \begin{equation} \pi_t=(1-\alpha)A_tL_t^{\alpha}. \end{equation} \]
Equilíbrio de Mercado
Finalmente, o equilíbrio de mercado implica em outras três condições: i) a demanda por trabalho é igual à oferta de trabalho, ii) o consumo mais poupança é igual a produção no período 0, e iii) o consumo no período 1 é igual a produção no período 1 mais a poupança do período 0 acrescida da renda do capital. Essas condições são expressas pelas seguintes equações:
\[ \begin{align} &h_t=L_t\\ &c_0+a_1=A_0 L_0^\alpha\\ &c_1=(1+r)a_1 + A_1 L_1^\alpha\\ \end{align} \]
Simulando o Equilíbrio
Agora, deixe \(A_{0}=1, A_{1}=1, \alpha=2 / 3, \sigma=2, \beta=0.98^{25}\) (taxa de desconto subjetiva de \(2 \%\) ao ano, sendo um período do modelo equivalente a 25 anos) e \(\gamma=1 .\)
Iremos encontrar todas as alocações (consumo, trabalho e ativos), os preços \(\left(w_{0}, w_{1}\right)\) e os lucros \(\left(\pi_0, \pi_1\right)\) para esta economia. Precisaremos fazer isso numericamente, ou seja, através da solução do sistema de equações não-lineares utilizando programação.
Utilizando as 5 equação do HP, 4 do FP e as 3 condições de equilíbrio, após mais algumas manipulações algébricas chegamos em um total de 9 equações não lineares que o equilíbrio deve satisfazer. Neste modelo a taxa de juros, \(r\), é exógena (imagine que as famílias tem acesso a um grande mercado internacional de fundos), portanto, temos 9 variáveis endógenas e o mesmo número de equações para resolver o sistema. As variáveis endógenas são: \(c_0, c_1, h_0, h_1, a_1, w_0, w_1, \pi_0, \pi_1\), enquanto os parâmetros exógenos são: \(\alpha, \beta, \gamma, \sigma, r, A_0, A_1\).
As 9 equações que esta economia deve satisfazer são:
\[ \begin{align} c_0&=w_0h_0+\pi_0-a_1\\ c_1&=[(1+r)\beta]^{1/\sigma}c_0\\ h_0&=1-(\gamma/w_0)^{1/\sigma}c_0\\ h_1&=1-(\gamma/w_1)^{1/\sigma}c_1\\ a1&=(c1-w_1h_1-\pi_1)/(1+r)\\ w_0&=\alpha A_0 h_0^{\alpha-1}\\ w_1&=\alpha A_1 h_1^{\alpha-1}\\ \pi_0&=(1-\alpha)A_0h_0^\alpha\\ \pi_1&=(1-\alpha)A_1h_1^\alpha \end{align} \]
Programa em Python
class twop_economy():
def __init__(self, A0, A1, alpha, sigma, beta, gamma, r, tol=1e-4) -> None:
self.A0 = A0
self.A1 = A1
self.alpha = alpha
self.sigma = sigma
self.beta = beta
self.gamma = gamma
self.r = r
self.tol = tol
self.eq = None # Equilibrium values
# Métodos para calcular as funções de utilidade e seus gradientes
def u(self, c):
return (c**(1-self.sigma)-1)/(1-self.sigma)
def v(self, l):
return (l**(1-self.sigma)-1)/(1-self.sigma)
def du(self, c):
return c**(-self.sigma)
def dv(self, l):
return l**(-self.sigma)
# Método de resolução do equilíbrio
def solve_eq(self, x0) -> None:
"""_Resolve o sistema de equações não lineares do modelo. A solução é armazenada no atributo eq_
:param x0: _Estimativa inicial para as variáveis do modelo. Ordem das variáveis para x0 deve ser: c0, c1, h0, h1, a1, w0, w1, pi0, pi1_
:type x0: _array_
"""
def obj_fun(x):
= np.empty(9)
F = x
c0, c1, h0, h1, a1, w0, w1, pi0, pi1 # Solving the system of nonlinear equations
= np.array([
F #################################################
# Using one equation for each endogenous variable
- (w0*h0+pi0-a1),
c0 - (((1+self.r)*self.beta)**(1/self.sigma)*c0),
c1 - (1-(self.gamma/w0)**(1/self.sigma)*c0),
h0 - (1-(self.gamma/w1)**(1/self.sigma)*c1),
h1 - (c1-w1*h1-pi1)/(1+self.r),
a1 - (self.alpha*self.A0*(h0)**(self.alpha-1)),
w0 - (self.alpha*self.A1*(h1)**(self.alpha-1)),
w1 - ((1-self.alpha)*self.A0*(h0)**self.alpha),
pi0 - ((1-self.alpha)*self.A1*(h1)**self.alpha)
pi1
])return F
self.eq = root(obj_fun, x0, method='hybr')
# Método para checar as restrições do equilíbrio
def check_constraints(self) -> None:
= self.eq.x
c0, c1, h0, h1, a1, w0, w1, pi0, pi1 print(colored("Checando o Equilíbrio!", "blue"))
print(f"Equação de Euler: {abs(self.du(c0)-(1+self.r)*self.beta*self.du(c1)) < self.tol}")
print(f"Restrição Orçamentária t0: {abs(c0+a1-w0*h0-pi0 < self.tol)}")
print(f"Restrição Orçamentária t1: {abs(c1-w1*h1-(1+self.r)*a1 - pi1 < self.tol)}")
# Método para calcular curva de oferta de trabalho no equilíbrio
def oferta_trabalho(self, h):
if self.eq is None:
print(colored("É necessário resolver o equilíbrio primeiro!", "red"))
return
else:
= self.gamma*(self.eq.x[0]/(1-h))**self.sigma
w return w
# Método para calcular curva de demanda por trabalho no equilíbrio
def demanda_trabalho(self, h):
if self.eq is None:
print(colored("É necessário resolver o equilíbrio primeiro!", "red"))
return
else:
= self.alpha*self.A0*(h**(self.alpha-1))
w return w
Agora que temos o programa feito, vamos executá-lo com os parâmetros definidos anteriormente.
= {
parameters 'A0':1, 'A1':1, 'alpha': 2/3, 'sigma': 2, 'beta': 0.98**25, 'gamma': 1, 'r': 1.05**25-1
}
# Instanciando a economia com os parâmetros definidos
= twop_economy(**parameters)
econ # Definindo a estimativa inicial
# Ordem para x0: c0, c1, h0, h1, a1, w0, w1, pi0, pi1
= np.array([0.5, 0.9, 0.5, 0.5, 0.2, 0.9, 0.9, 0.5, 0.5])
x0 # Calcula o equilíbrio
econ.solve_eq(x0)# Verificando se o algoritmo convergiu
print(colored(f"Algoritmo convergiu? {econ.eq.success}", "green"))
print(colored("Resultado do Equilíbrio:", "cyan"))
= dict(zip(["c0", "c1", "h0", "h1", "a1", "w0", "w1", "pi0", "pi1"], econ.eq.x))
result # print("\n")
=4)
pprint(result, indentprint("\n")
# Checando as restrições
econ.check_constraints()
Algoritmo convergiu? True
Resultado do Equilíbrio:
{ 'a1': 0.08653783165675656,
'c0': 0.506067279610891,
'c1': 0.7234365436457177,
'h0': 0.456192445867716,
'h1': 0.2823523037514032,
'pi0': 0.19753503708937253,
'pi1': 0.14346290994987504,
'w0': 0.8660162564198662,
'w1': 1.0161979061983475}
Checando o Equilíbrio!
Equação de Euler: True
Restrição Orçamentária t0: True
Restrição Orçamentária t1: True
Plotando as curvas de oferta e demanda de trabalho
Dado o ponto de equilíbrio encontrado, podemos plotar as curvas de oferta e demanda de trabalho. Vamos nos concentrar no período 0. As equações que representam a oferta de trabalho por parte dos trabalhadores e a demanda de trabalho por parte das firmas são, respectivamente:
\[ \begin{align} h_0 &= 1-\left(\gamma/w_0\right)^{1/\sigma} c_0\\ w_0 &= \alpha A_0 L_0^{\alpha-1} \end{align} \]
Para o ponto de equilíbrio temos um consumo \(c_0\) dado. Podemos então fazer variar o trabalho entre \([0,1]\) e calcular o salário correspondente para ambas as relações. O código abaixo faz isso e plota as curvas de oferta e demanda de trabalho.
= np.linspace(0.01, 0.99, 99)
h = econ.oferta_trabalho(h)
w_oferta = econ.demanda_trabalho(h)
w_demanda
= plt.subplots(figsize=(10, 6))
fig, ax 0.35, 0.55)
ax.set_xlim(0, 1.5)
ax.set_ylim(='Oferta de trabalho', color='blue')
ax.plot(h, w_oferta, label='Demanda de trabalho', color='red')
ax.plot(h, w_demanda, label'h0'], result['w0'], 'o', color='black')
ax.plot(result['Horas trabalhadas')
ax.set_xlabel('Salário')
ax.set_ylabel( ax.legend()
<matplotlib.legend.Legend at 0x7f1e9d1b0ee0>
Simulando contrafactuais
Deixe \(A_0\) diminuir de 1 para 0.90 e mantenha o valor de todos os outros parâmetros como antes. Refaça todos os seus cálculos e comente seus resultados.
"A0"] = 0.9
parameters[= twop_economy(**parameters)
econd
econd.solve_eq(x0)= dict(zip(["c0", "c1", "h0", "h1", "a1", "w0", "w1", "pi0", "pi1"], econd.eq.x))
resultd =4) pprint(resultd, indent
{ 'a1': 0.06344992939885682,
'c0': 0.474224150763333,
'c1': 0.67791594984235,
'h0': 0.46175848762507804,
'h1': 0.31509724168732817,
'pi0': 0.1792246933729288,
'pi1': 0.1543506560384243,
'w0': 0.7762702719270494,
'w1': 0.979701726926152}
A redução da produtividade no período t=0 faz com que o salário nesse período caia, o que por sua vez aumenta a oferta de trabalho para compensar o consumo, embora não compense completamente. A poupança também é reduzida. No período t=1, o salário e o consumo são reduzidos, mesmo que a oferta de trabalho e o lucro sejam maiores.
Agora, deixe \(A_1\) diminuir de 1 para 0.90 e retorne \(A_0\) ao seu valor original. Mantenha o valor de todos os outros parâmetros como antes. Refaça todos os seus cálculos e comente seus resultados.
"A1"] = 0.9
parameters["A0"] = 1.0
parameters[= twop_economy(**parameters)
econe
econe.solve_eq(x0)= dict(zip(["c0", "c1", "h0", "h1", "a1", "w0", "w1", "pi0", "pi1"], econe.eq.x))
resulte =4) pprint(resulte, indent
{ 'a1': 0.10087542783698347,
'c0': 0.4979997498073686,
'c1': 0.7119037966929674,
'h0': 0.4634516887900684,
'h1': 0.2639207137291082,
'pi0': 0.19962505921324936,
'pi1': 0.1234345976670139,
'w0': 0.8614708460446086,
'w1': 0.9353915128952682}
Tarefa
Agora retorne \(A_1\) igual a 1 e faça \(\sigma = 1.5\) e resolva o novo equilíbrio. Compare os resultados com o equilíbrio inicial. O parâmetro \(\sigma\) é uma medida de aversão ao risco no consumo futuro. Valores maiores de \(\sigma\) indicam maior aversão ao risco. O que acontece com o consumo e a poupança quando reduzimos a aversão ao risco de 2 para 1.5?