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:

  1. As famílias maximizam a utilidade;
  2. as empresas maximizam seu lucro;
  3. 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

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
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):
            F = np.empty(9)
            c0, c1, h0, h1, a1, w0, w1, pi0, pi1 = x
            # Solving the system of nonlinear equations
            F = np.array([
                        #################################################
                        # Using one equation for each endogenous variable
                        c0 - (w0*h0+pi0-a1),
                        c1 - (((1+self.r)*self.beta)**(1/self.sigma)*c0),
                        h0 - (1-(self.gamma/w0)**(1/self.sigma)*c0),
                        h1 - (1-(self.gamma/w1)**(1/self.sigma)*c1),
                        a1 - (c1-w1*h1-pi1)/(1+self.r),
                        w0 - (self.alpha*self.A0*(h0)**(self.alpha-1)),
                        w1 - (self.alpha*self.A1*(h1)**(self.alpha-1)),
                        pi0 - ((1-self.alpha)*self.A0*(h0)**self.alpha),
                        pi1 - ((1-self.alpha)*self.A1*(h1)**self.alpha)
                        ])
            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:
        c0, c1, h0, h1, a1, w0, w1, pi0, pi1 = self.eq.x
        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:
            w = self.gamma*(self.eq.x[0]/(1-h))**self.sigma
            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:
            w = self.alpha*self.A0*(h**(self.alpha-1))
            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
econ = twop_economy(**parameters)
# Definindo a estimativa inicial
# Ordem para x0: c0, c1, h0, h1, a1, w0, w1, pi0, pi1
x0 = np.array([0.5, 0.9, 0.5, 0.5, 0.2, 0.9, 0.9, 0.5, 0.5])
# 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"))
result = dict(zip(["c0", "c1", "h0", "h1", "a1", "w0", "w1", "pi0", "pi1"], econ.eq.x))
# print("\n")
pprint(result, indent=4)
print("\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.

h = np.linspace(0.01, 0.99, 99) 
w_oferta = econ.oferta_trabalho(h)
w_demanda = econ.demanda_trabalho(h)

fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0.35, 0.55)
ax.set_ylim(0, 1.5)
ax.plot(h, w_oferta, label='Oferta de trabalho', color='blue')
ax.plot(h, w_demanda, label='Demanda de trabalho', color='red')
ax.plot(result['h0'], result['w0'], 'o', color='black')
ax.set_xlabel('Horas trabalhadas')
ax.set_ylabel('Salário')
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.

parameters["A0"] = 0.9
econd = twop_economy(**parameters)
econd.solve_eq(x0)
resultd = dict(zip(["c0", "c1", "h0", "h1", "a1", "w0", "w1", "pi0", "pi1"], econd.eq.x))
pprint(resultd, indent=4)
{   '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.

parameters["A1"] = 0.9
parameters["A0"] = 1.0
econe = twop_economy(**parameters)
econe.solve_eq(x0)
resulte = dict(zip(["c0", "c1", "h0", "h1", "a1", "w0", "w1", "pi0", "pi1"], econe.eq.x))
pprint(resulte, indent=4)
{   '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?