Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 38 additions & 40 deletions lectures/mccall_correlated.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ tags: [hide-output]

## 概述

在本讲座中,我们求解一个具有持续性和暂时性工资成分的{doc}`McCall求职搜索模型 <mccall_model>`。
在本讲座中,我们求解一个工资报价由持续性和暂时性成分组成的{doc}`McCall求职搜索模型 <mccall_model>`。

换句话说,我们放宽了工资随机性在时间上相互独立的假设
换句话说,我们放宽了工资随机性在时间上独立的假设

同时,我们将回到假设工作是永久性的,不会发生离职。

Expand All @@ -60,7 +60,7 @@ from numba.experimental import jitclass

## 模型

每个时间点的工资由下式给出
每个时期的工资由下式给出

$$
w_t = \exp(z_t) + y_t
Expand All @@ -74,13 +74,13 @@ y_t \sim \exp(\mu + s \zeta_t)
z_{t+1} = d + \rho z_t + \sigma \epsilon_{t+1}
$$

这里 $\{ \zeta_t \}$ 和 $\{ \epsilon_t \}$ 都是独立同分布的标准正态分布
这里 $\{ \zeta_t \}$ 和 $\{ \epsilon_t \}$ 都是独立同分布的标准正态随机变量

这里 $\{y_t\}$ 是暂时性成分,$\{z_t\}$ 是持续性成分。

如前所述,劳动者可以:

1. 接受报价并在该工资水平永久工作,或
1. 接受当前工作机会,并在该工资水平永久工作,或
1. 领取失业补偿金 $c$ 并等待下一期。

价值函数满足贝尔曼方程:
Expand All @@ -93,77 +93,75 @@ v^*(w, z) =
\right\}
$$

在这个表达式中,$u$ 是效用函数,$\mathbb E_z$ 是给定当前 $z$ 时下一期变量的期望
在这个表达式中,$u$ 是效用函数,$\mathbb E_z$ 是给定当前 $z$ 时下一期变量的条件期望

变量 $z$ 作为状态进入贝尔曼方程,因为它的当前值有助于预测未来工资
变量 $z$ 作为状态变量进入贝尔曼方程,这是因为它的当前值有助于预测未来工资

### 简化

有一种方法可以减少这个问题的维度,这大大加快了计算速度。
我们可以通过以下方法降低问题维度,显著提升计算效率:

首先,让 $f^*$ 为继续价值函数,定义为:
首先,让 $f^*$ 为延续价值函数,定义为:

$$
f^*(z) := u(c) + \beta \, \mathbb E_z v^*(w', z')
$$

贝尔曼方程现在可以写成
现在贝尔曼方程可以写成

$$
v^*(w, z) = \max \left\{ \frac{u(w)}{1-\beta}, \, f^*(z) \right\}
$$

结合最后两个表达式,我们看到继续价值函数满足
结合上述两个表达式,我们看到延续价值函数满足

$$
f^*(z) = u(c) + \beta \, \mathbb E_z \max \left\{ \frac{u(w')}{1-\beta}, f^*(z') \right\}
$$

我们将通过引入算子来求解这个函数方程
为求解该函数方程,我们引入算子$Q$

$$
Qf(z) = u(c) + \beta \, \mathbb E_z \max \left\{ \frac{u(w')}{1-\beta}, f(z') \right\}
$$

根据构造,$f^*$ 是 $Q$ 的不动点,即 $Q f^* = f^*$。

在温和的假设下,可以证明 $Q$ 是 $\mathbb R$ 上连续函数空间上的[压缩映射](https://baike.baidu.com/item/%E5%8E%8B%E7%BC%A9%E6%98%A0%E5%B0%84/5114126)。
在较弱的假设下,可以证明 $Q$ 是 $\mathbb R$ 上连续函数空间上的一个[压缩映射](https://baike.baidu.com/item/%E5%8E%8B%E7%BC%A9%E6%98%A0%E5%B0%84/5114126)。

根据巴拿赫压缩映射定理,这意味着 $f^*$ 是唯一的不动点,我们可以从任何合理的初始条件开始通过迭代 $Q$ 来计算它
根据巴拿赫压缩映射定理,$f^*$ 是唯一的不动点,我们可以从任何合理的初始条件开始通过迭代 $Q$ 来得到$f^*$

一旦我们有 $f^*$,我们就可以通过在接受报酬超过继续价值时停止来求解搜寻问题,即:
求得 $f^*$后,这一搜索问题的解就是当接受工作的收益超过延续价值时停止求职,即:

$$
\frac{u(w)}{1-\beta} \geq f^*(z)
$$

对于效用函数,我们取 $u(c) = \ln(c)$。

保留工资是最后一个表达式中等式成立的工资。

即:
保留工资是最后一个表达式中等式成立的工资:

```{math}
:label: corr_mcm_barw

\bar w (z) := \exp(f^*(z) (1-\beta))
```

我们的主要目标是求解保留规则并研究其性质和含义
我们的主要目标是求解该保留工资规则,并分析其性质与含义

## 实现

让 $f$ 作为我们对 $f^*$ 的初始猜测。

在迭代时,我们使用{doc}`拟合价值函数迭代 <mccall_fitted_vfi>`算法。

特别地,$f$ 和所有后续迭代都存储为网格上的值向量
特别地,$f$ 和所有后续迭代值都作为向量存储在一个网格

这些点根据需要通过分段线性插值插值成函数
这些点通过分段线性插值转换为函数

$Qf$ 定义中的积分通过蒙特卡洛计算
$Qf$ 定义中的期望项通过蒙特卡洛计算

以下列表通过提供我们将使用的数据类型信息来帮助Numba
以下类型声明帮助 Numba 进行类型推断

```{code-cell} python3
job_search_data = [
Expand All @@ -172,14 +170,14 @@ job_search_data = [
('d', float64), # 持续性状态位移系数
('ρ', float64), # 持续性状态相关系数
('σ', float64), # 状态波动率
('β', float64), # 贴现因子
('c', float64), # 失业补偿金
('β', float64), # 折现因子
('c', float64), # 失业补助
('z_grid', float64[:]), # 状态空间网格
('e_draws', float64[:,:]) # 积分用的蒙特卡洛抽取
]
```

这是一个存储数据和贝尔曼方程右侧的类
这是一个存储数据和贝尔曼方程右侧项的类

默认参数值嵌入在类中。

Expand All @@ -193,8 +191,8 @@ class JobSearch:
d=0.0, # 持续性状态位移系数
ρ=0.9, # 持续性状态相关系数
σ=0.1, # 状态波动率
β=0.98, # 贴现因子
c=5, # 失业补偿金
β=0.98, # 折现因子
c=5, # 失业补助
mc_size=1000,
grid_size=100):

Expand All @@ -208,7 +206,7 @@ class JobSearch:
a, b = z_mean - k * z_sd, z_mean + k * z_sd
self.z_grid = np.linspace(a, b, grid_size)

# 抽取并存储冲击
# 生成并存储冲击
np.random.seed(1234)
self.e_draws = randn(2, mc_size)

Expand Down Expand Up @@ -243,8 +241,8 @@ def Q(js, f_in, f_out):
e1, e2 = js.e_draws[:, m]
z_next = d + ρ * z + σ * e1
go_val = np.interp(z_next, js.z_grid, f_in) # f(z')
y_next = np.exp(μ + s * e2) # y' 抽取
w_next = np.exp(z_next) + y_next # w' 抽取
y_next = np.exp(μ + s * e2) # 生成 y'
w_next = np.exp(z_next) + y_next # 生成 w'
stop_val = np.log(w_next) / (1 - β)
expectation += max(stop_val, go_val)
expectation = expectation / M
Expand Down Expand Up @@ -307,9 +305,9 @@ ax.legend()
plt.show()
```

注意保留工资随当前状态 $z$ 增加
注意保留工资随当前状态 $z$ 单调递增

这是因为更高的状态导致代理人预测更高的未来工资,增加了等待的期权价值
这是因为更高的状态导致代理人预测更高的未来工资,增加了等待的价值

让我们尝试改变失业补偿金并观察其对保留工资的影响:

Expand All @@ -329,7 +327,7 @@ ax.legend()
plt.show()
```

正如预期的那样,更高的失业补偿金在所有状态值下都提高了保留工资
正如预期的那样,更高的失业补偿金在所有状态下都提高了保留工资

## 失业持续时间

Expand All @@ -356,7 +354,7 @@ def compute_unemployment_duration(js, seed=1234):

unemployed = True
while unemployed and t < t_max:
# 抽取当前工资
# 生成当前工资
y = np.exp(μ + s * np.random.randn())
w = np.exp(z) + y
res_wage = np.exp(f_star_function(z) * (1 - β))
Expand All @@ -380,7 +378,7 @@ def compute_unemployment_duration(js, seed=1234):
return compute_expected_tau()
```

让我们用一些可能的失业补偿金值来测试这个
让我们用一些可能的失业补偿金值来计算失业持续时间

```{code-cell} ipython3
c_vals = np.linspace(1.0, 10.0, 8)
Expand All @@ -391,7 +389,7 @@ for i, c in enumerate(c_vals):
durations[i] = τ
```

这是结果图
这是可视化结果

```{code-cell} ipython3
fig, ax = plt.subplots()
Expand All @@ -410,10 +408,10 @@ plt.show()
```{exercise}
:label: mc_ex1

研究平均失业持续时间如何随贴现因子 $\beta$ 变化。
研究平均失业持续时间如何随折现因子 $\beta$ 变化。

* 你的先验预期是什么
* 结果是否符合预期
* 你的预期是什么
* 结果是否符合你的预期
```

```{solution-start} mc_ex1
Expand Down
Loading