📝 与单 agent 动态结构(Rust)的关键区别:每家企业的 Bellman 方程里不仅有自己的状态,还有对手状态;均衡要求所有企业的策略函数互为最优反应。求解从"单不动点"升级为"不动点的不动点"——这是本页全部方法论的出发点。
📚 前置条件与学习依赖 / Prerequisites
① 数学/统计基础:单 agent 动态规划(先读 05 动态结构模型总览 的 Rust/NFXP/Hotz-Miller)、博弈论中的 Markov Perfect Equilibrium、压缩映射与不动点定理。
② 经济学理论前置:产业组织(IO):企业投资、进入/退出、沉没成本、市场集中度演化;Hopenhayn (1992) 竞争均衡进入退出模型;Pakes 系列动态产业模型。
③ 软件/计算前置:Python(numpy 向量化 + scipy 优化);理解嵌套迭代与维数灾难;MPEC 见 14 MPEC 方法
④ 站内前置页面:05 动态结构模型(单 agent)→ 本页(多 agent 博弈);14 MPEC 是本页求解方法之一的工具页。
⑤ 难度分级:困难(前沿) 单 agent 动态结构已属前沿,动态博弈再叠加均衡约束,是结构估计计算负担最重的分支之一。

01 经济环境与假设

Ericson and Pakes (1995, Review of Economic Studies) 提出的动态产业模型(以下简称 EP 框架)回答一个问题:在一个由异质企业构成、企业可以投资改善自身生产率、可以选择进入或退出市场的行业里,市场结构与企业规模分布会如何随时间演化?它把单 agent 的 Rust 动态规划推广到多企业博弈环境。

1.1 时间、企业与状态空间

  • 时间:离散时间 $t=0,1,2,\dots$,无限期(infinite horizon)。无限期假设的设定理由:产业没有"最后一期",企业做投资决策时面向永久的未来利润流,这与有限期生命周期模型(见教育与人力资本页)形成对照。
  • 企业数量:行业内有 $N_t$ 家在位企业,$N_t$ 本身是内生的(企业进入退出会改变它)。EP 原版假设行业最多容纳 $\bar N$ 家企业。
  • 企业状态变量:每家在位企业 $j$ 在 $t$ 期有一个离散的生产率/质量/资本状态 $a_{jt}\in\mathcal{A}=\{0,1,\dots,\bar a\}$。经济直觉:$a_{jt}$ 可以理解为"质量阶梯"上的位置——数值越高,边际成本越低或产品质量越高。它是企业可观察的状态变量,对应数据中可测的 TFP 分箱、资本存量分箱或质量评级。
  • 行业状态:整个行业的状态是所有在位企业状态的向量 $s_t=(a_{1t},\dots,a_{N_t t})$。为了求解可行,实证上通常利用对称性假设,把行业状态压缩为状态的分布(histogram)而非完整向量。

1.2 状态转移与投资

企业 $j$ 每期选择投资 $x_{jt}\ge 0$,投资成本为 $c(x)$(递增、凸,如 $c(x)=\gamma x$)。给定投资,企业自身状态按马尔可夫过程演化:

Eq. 1.1 — 企业自身状态转移
$$P(a_{jt+1}=a' \mid a_{jt}=a,\; x_{jt}=x) = \Pr\big(a' = a + \xi(x) - \eta\big), \qquad \xi(x)\in\{0,1\}$$

变量定义:$\xi(x)=1$ 表示投资"成功"使状态上一阶,概率随 $x$ 上升(如 $\Pr(\xi=1)=x/(1+x)$);$\eta\in\{0,1\}$ 为外生的折旧/技术过时冲击。设定理由:用"成功/失败"二元过程代替连续 Brownian 运动,使状态空间保持离散、Bellman 可网格求解。参数含义:$x$ 越大成功概率越高;$\eta$ 捕捉技术进步使旧资本贬值。经济直觉:研发不是确定性提升生产率,而是"买彩票"——投得多中奖概率大,但仍可能失败。

1.3 进入与退出

  • 退出:每期期初,在位企业观察到一个退出清算价值(scrap value)$\Phi$(如厂房设备残值),比较"继续经营的期望价值"与 $\Phi$ 后决定是否退出。
  • 进入:每期有一批潜在进入者,各自抽取一个进入成本 $c^e$(i.i.d. 分布),若"进入后的期望价值 $\ge c^e$"则支付沉没成本并以初始状态 $a^0$ 进入行业。

1.4 需求与利润函数

企业当期利润取决于自身状态与对手状态分布。常见两种需求设定:

Eq. 1.2 — 利润函数(对数需求 / Bertrand 竞争)
$$\pi(a_t, s_t) = \max_{p_t}\big\{ (p_t - mc(a_t))\cdot D(p_t; \{p_{jt}\}_{j\ne t}) \big\},\qquad D(p)=\exp(\alpha_0-\alpha_1 p + \dots)$$

变量定义:$mc(a)$ 为边际成本($a$ 越高成本越低),$D(\cdot)$ 为对数需求或 CES 需求。设定理由:利润被压缩为状态的静态缩减式函数(reduced-form),把价格博弈解析地解出,只留动态部分。参数含义:$\alpha_1$ 是需求价格弹性的倒数度量。经济直觉:状态 $a$ 高的企业(低成本/高质量)在当期定价博弈中获得更高利润份额——这是投资的当期回报。

1.5 共同知识与理性预期

EP 框架假设:(1) 所有企业知道整个行业状态 $s_t$;(2) 所有企业知道状态转移规则与利润函数;(3) 所有企业对对手的未来行为持理性预期——即正确预期对手会按均衡策略行事。这与静态古诺博弈的共同知识假设一致,但多了动态维度:企业今天投资,不仅影响明天自己的成本,还通过改变明天的行业结构影响明天对手的行为。

02 完整推导:Bellman、MPE 与 EP 存在性

2.1 在位企业的 Bellman 方程

考虑一家代表性在位企业,状态为自身生产率 $a$,行业中对手的状态分布为 $\bar s$。它的期望折现利润价值函数满足:

Eq. 2.1 — 多企业 Bellman 方程(本页核心公式之一)
$$V(a,\bar s) = \max\left\{\Phi,\;\; \max_{x\ge 0}\Big[\pi(a,\bar s) - c(x) + \beta\,\mathbb{E}\big[V(a',\bar s')\mid a,\bar s, x\big]\Big]\right\}$$

变量定义:$\Phi$ 为退出清算价值(等式左侧花括号第一项);$\pi(a,\bar s)$ 为当期利润;$c(x)$ 为投资成本;$\beta$ 为贴现因子;$\bar s'$ 为下一时期对手状态的分布。与 Rust 单 agent 方程的区别:期望值里的 $\bar s'$ 不仅取决于本企业的投资 $x$,还取决于所有对手企业的均衡投资/进入/退出决策——这就是"博弈"的数学含义。

2.2 最优投资策略、进入价值与退出价值

由 Eq. 2.1 得到三个决策规则:

Eq. 2.2 — 策略函数、进入价值与退出边界
$$x^*(a,\bar s) = \arg\max_{x\ge 0}\Big\{\pi(a,\bar s)-c(x)+\beta\,\mathbb{E}[V(a',\bar s')\mid a,\bar s,x]\Big\}$$ $$\chi(a,\bar s)=\mathbf{1}\{V(a,\bar s)>\Phi\}\quad(\text{继续=1,退出=0}),\qquad V^e(\bar s)=\mathbb{E}_{c^e}\big[\max\{0,\;V(a^0,\bar s)-c^e\}\big]$$

变量定义:$x^*$ 为投资策略函数;$\chi$ 为退出指示;$V^e$ 为潜在进入者的进入期权价值(对进入成本 $c^e$ 分布取期望)。经济直觉:$V^e$ 刻画"行业有吸引力"——当在位企业价值高时,更多潜在进入者的 $c^e$ 被超过,行业企业数上升,这是内生产业结构的来源。

2.3 行业均衡:对称马尔可夫完美均衡(MPE)

EP 框架的均衡是一个不动点:给定对手的策略函数 $\{x^*,\chi^*, V^e\}$,每家企业解自己的 Bellman 方程得到最优策略;要求这些最优策略恰好等于给定的对手策略。正式定义:

Eq. 2.3 — 对称马尔可夫完美均衡(MPE)
$$\text{一组策略函数 } \big(x^*(a,\bar s),\,\chi^*(a,\bar s),\,V^e(\bar s)\big) \text{ 构成 MPE,当且仅当:}$$ $$\forall (a,\bar s):\quad x^*(a,\bar s),\,\chi^*(a,\bar s) \text{ 是 Eq.2.1 在对手按 } (x^*,\chi^*,V^e) \text{ 演化下的最优解}$$

"对称"指所有在位企业使用同一策略函数(只依赖自身与对手状态分布,不依赖企业身份);"马尔可夫"指策略只依赖当期状态,不依赖历史。经济直觉:MPE 是动态版的纳什均衡——每个人都在对手按均衡策略行动的假设下做最优反应,且这个假设在均衡处自我实现。

2.4 Ericson–Pakes (1995) 存在性定理

EP 在合理的技术条件下证明了 MPE 的存在性:(1) 状态空间有限离散;(2) 利润函数连续有界;(3) 投资成本连续;(4) 转移概率关于投资单调。在此条件下,均衡策略函数构成的算子是上半连续映射,由 Kakutani 不动点定理保证至少一个 MPE 存在。关键警示:存在性不等于唯一性——EP 模型可能存在多个 MPE,这是后续估计最大的识别难题之一(见第 8 节常见错误)。

2.5 与单 agent 动态结构(Rust)的本质区别

维度单 agent(Rust 1987)多 agent 博弈(EP 1995)
状态空间自身状态 $x$(如 bus 里程)自身状态 $a$ + 对手状态分布 $\bar s$
Bellman 方程单个不动点每家企业一个,且互相嵌套
均衡约束无(单人优化)所有企业策略互为最优反应(MPE 不动点)
识别$\beta$ 与 flow utility 部分不可识别叠加多均衡问题、交互参数识别
求解VFI / NFXP需在 VFI 外层再加"均衡不动点"循环

03 求解方法:VFI、BBL 两步法与 MPEC

3.1 同构(homogeneous)方法:值函数迭代与策略函数迭代

"同构"指把整个 MPE 一次求解——从猜测的均衡策略出发,反复迭代直到策略函数不再变化。Pakes and McGuire (1994, RAND) 给出了 EP 模型的第一个可计算算法:

Step 1:猜测策略
初始猜测每家企业的投资策略 $x^{(0)}(a,\bar s)$ 与退出规则 $\chi^{(0)}(a,\bar s)$(可设为全零投资、不退出)。
Step 2:给定策略,构造行业状态转移
由所有人的策略 $\{x^{(k)},\chi^{(k)}\}$,计算从当前行业状态 $s$ 到下一状态 $s'$ 的转移概率矩阵(含对手投资的期望与进入者数量)。
Step 3:解 Bellman 方程
在给定的行业状态转移下,对代表性企业用 VFI 解 Eq. 2.1,得到新的价值函数 $V^{(k)}$。
Step 4:策略改进
由 $V^{(k)}$ 重新求 argmax,得到新策略 $x^{(k+1)},\chi^{(k+1)}$。若与 $x^{(k)},\chi^{(k)}$ 一致则收敛(找到 MPE);否则回 Step 2。

这本质是双层不动点:内层 VFI 解企业 Bellman,外层迭代均衡策略。Pakes–McGuire 用这个算法求了一个 2–3 企业的随机扰动 EP 模型。

3.2 异构(heterogeneous)方法:BBL 两步法

Bajari, Benkard and Levin (2007, Econometrica,简称 BBL) 提出了不需要每次都全解 MPE 的两步估计法,是动态博弈估计的里程碑:

Eq. 3.1 — BBL 两步法
$$\textbf{第一步(异质型第一阶段):}\quad \hat P(d\mid s),\;\;\hat P(s'\mid s,d) \leftarrow \text{从数据直接估计}$$ $$\textbf{第二步(结构参数估计):}\quad \hat\theta_{BBL}=\arg\min_{\theta}\sum_{m=1}^{M}\Big[\hat g_m - g_m(\theta;\hat P)\Big]^2$$

变量定义:第一阶段用核估计/多项式 sieve 从面板数据直接估计每个状态下的经验策略函数 $\hat P(d\mid s)$(企业实际怎么投资/进入/退出)与状态转移 $\hat P(s'\mid s,d)$。第二阶段:给定候选结构参数 $\theta$,用第一阶段估计的 $\hat P$ 模拟出企业在"偏离均衡策略"时的长期价值,要求真实均衡策略 $\hat P$ 在 $\theta$ 下是最优的——用不等式矩(偏离策略的价值不得高于均衡策略)或最小距离目标估计 $\theta$。经济直觉:BBL 把"求解 MPE"从估计的内循环里去掉了——数据里观察到的策略已经是均衡策略,我们只需要找一组 $\theta$ 让这套观察到的策略在理论上确实最优。

BBL 的巨大优势:(1) 不需要在每次外层迭代时重解 MPE,把计算量降低一个数量级;(2) 适用于似然函数写不出来的复杂模型;(3) 天然适合高维状态空间。局限:(a) 第一阶段非参数估计需要每个状态都有足够数据(仍受维数灾难困扰);(b) 标准误必须把第一阶段不确定性传给第二阶段;(c) 若第一阶段策略函数误设,第二阶段估计量不一致。

3.3 MPEC 方法(Su & Judd 2012)

Su and Judd (2012, Econometrica,即站内 14 MPEC 方法页的主题) 把"均衡不动点"从优化器的内循环改写成等式约束,一次性求解。对 EP 模型,MPEC 形式为:

Eq. 3.2 — EP 模型的 MPEC 重写
$$\min_{\theta,\{V(a,\bar s),x^*(a,\bar s)\}}\; \ell(\theta; \text{data})$$ $$\text{s.t.}\quad V(a,\bar s) = \max\Big\{\Phi,\;\pi(a,\bar s;\theta)-c(x^*;\theta)+\beta\sum_{s'}P(s'\mid a,\bar s,x^*;\theta)\,V(a',s')\Big\}\quad\forall(a,\bar s)$$

变量定义:优化变量同时包含结构参数 $\theta$ 和全状态价值函数 $V$($V$ 不是内层迭代出来的,而是自由变量);等式约束要求 $V$ 恰好满足 Bellman 方程。目标函数仍是数据似然/矩。求解器:用 IPOPT / KNITRO 这类内点法 NLP 求解器一次性求解。相对 NFXP 的优势:(1) 避免"每次外层迭代都重解内层不动点"的嵌套开销;(2) 求解器可利用稀疏性;(3) 数值更稳定。代价:优化变量维度巨大($|\mathcal{X}|\times$ 状态数),且对初值敏感。

MPEC 概念伪代码(在教学代码中用 scipy 约束优化实现思路):

python · MPEC 概念伪代码
# MPEC 伪代码框架(完整可用 IPOPT/casadi 实现)
# 决策变量: z = [theta (p维), V 展开 (N_states 维), x_star 展开]
# 目标: 负对数似然 -sum log P(d_obs | s_obs; V(theta))
# 约束:
#   (1)  Bellman 等式约束: 对每个状态 (a, sb),
#        V[a,sb] = max(Phi, pi(a,sb;theta) - c(x*) + beta * sum_s' P(s'|...) V)
#   (2)  一阶互补条件:  x* = argmax_x {...}  (KKT 条件)
#
# 求解流程:
# 1. 给定初值 z0 = [theta0, V0, x0]
# 2. 调用 IPOPT:
#      min_z  neg_loglik(z)
#      s.t.   Bellman_eq_constraint(z) == 0
#             KKT_complementarity(z) == 0
#             theta_lb <= theta <= theta_ub
# 3. IPOPT 利用问题的稀疏结构(每个 Bellman 约束只涉及少数状态)
#    用内点法一次性收敛, 无需外层-内层嵌套。
#
# 实践要点:
# - 用自动微分(casadi/jax)提供解析 Jacobian, 否则数值雅可比慢且不准
# - 多初值网格搜索缓解非凸问题陷入局部解
# - 本页 04 节的 VFI 代码是 MPEC 的" warm start "解

04 完整 Python:2 企业 EP 模型 VFI 求解器

下面实现一个简化版 EP 模型:2 家对称企业,每家企业生产率状态 $a\in\{0,\dots,4\}$,选择离散投资水平 $x\in\{0,1,2\}$。我们用"策略函数迭代(Howard policy iteration)"求对称 MPE:内层解给定策略下的价值函数,外层做策略改进。代码纯 numpy,普通笔记本秒级运行。

python · EP 2企业 MPE 求解器(中文注释)
"""
Ericson-Pakes (1995) 简化版 —— 2 对称企业动态博弈 MPE 求解
============================================================
模型设定:
  - 2 家对称企业, 每家状态 a ∈ {0,1,...,NA-1} (生产率/质量阶梯)
  - 每家每期选择投资 x ∈ {0,1,2}, 投资成本 c(x) = [0.0, 0.5, 1.5]
  - 投资"成功"概率 q(x) = [0.0, 0.3, 0.6], 成功则 a 上一阶
    未成功则 a 下一阶 (模拟折旧/技术过时), 截断在边界
  - 当期利润 pi(a, ao) = a - 0.6*ao - 0.1  (自身状态高有利, 对手高不利)
  - 贴现因子 beta = 0.9
对称 MPE: 两家企业使用同一策略表 pol[a, ao] (自身a, 对手ao -> 投资x)
"""
import numpy as np

# ---------- 1. 参数与网格 ----------
NA = 5                 # 每家企业状态数 (0..4)
NX = 3                 # 投资水平数 (0,1,2)
BETA = 0.9             # 贴现因子
INV_COST = np.array([0.0, 0.5, 1.5])          # 各投资水平成本
SUCC_PROB = np.array([0.0, 0.3, 0.6])         # 各投资水平"成功"概率

# ---------- 2. 利润函数 ----------
def profit(a, ao):
    """企业在自身状态 a、对手状态 ao 时的当期利润"""
    return (a - 0.6 * ao - 0.1)

# ---------- 3. 状态转移 ----------
def own_trans(a, x):
    """给定自身 a、投资 x, 返回下一状态 a' 的 (a'取值, 概率) 列表"""
    q = SUCC_PROB[x]
    moves = []
    # 成功: a+1
    a_up = min(a + 1, NA - 1)
    moves.append((a_up, q))
    # 失败: a-1 (折旧)
    a_dn = max(a - 1, 0)
    moves.append((a_dn, 1.0 - q))
    return moves

# ---------- 4. 给定策略, 计算期望未来价值 ----------
def expected_continuation(V, a, ao, x, pol):
    """
    计算企业在 (a, ao) 选 x 时的 beta * E[V(a', ao')]
    自身按 x 转移; 对手按其均衡策略 pol[ao, a] 转移 (对称)
    """
    cont = 0.0
    for a_next, p_a in own_trans(a, x):
        # 对手的投资由其策略决定: 对手看到的是 (自身ao, 对手=a)
        x_opp = int(pol[ao, a])
        for ao_next, p_ao in own_trans(ao, x_opp):
            cont += p_a * p_ao * V[a_next, ao_next]
    return BETA * cont

# ---------- 5. 策略函数迭代 (Howard policy iteration) ----------
def solve_mpe(tol=1e-8, max_outer=50, max_inner=500):
    # 初始化: 所有人都不投资
    pol = np.zeros((NA, NA), dtype=int)
    V = np.zeros((NA, NA))

    for outer in range(max_outer):
        # --- 内层: 给定当前策略 pol, 迭代解价值函数 V ---
        for it in range(max_inner):
            V_new = np.zeros_like(V)
            for a in range(NA):
                for ao in range(NA):
                    x_now = int(pol[a, ao])
                    flow = profit(a, ao) - INV_COST[x_now]
                    V_new[a, ao] = flow + expected_continuation(V, a, ao, x_now, pol)
            diff = np.max(np.abs(V_new - V))
            V = V_new
            if diff < tol:
                break

        # --- 外层: 策略改进 (policy improvement) ---
        pol_new = np.zeros((NA, NA), dtype=int)
        for a in range(NA):
            for ao in range(NA):
                # 对每个投资水平计算总价值, 取 argmax
                vals = np.zeros(NX)
                for x in range(NX):
                    vals[x] = profit(a, ao) - INV_COST[x] \
                              + expected_continuation(V, a, ao, x, pol)
                pol_new[a, ao] = int(np.argmax(vals))

        if np.array_equal(pol_new, pol):
            print(f"[MPE 收敛] 外层迭代 {outer} 次后策略稳定")
            break
        pol = pol_new

    return V, pol

# ---------- 6. 求解并输出 ----------
V, pol = solve_mpe()

print("\n=== 均衡策略表 pol[a, ao] ===")
print("行=自身状态 a, 列=对手状态 ao, 值=均衡投资水平 x*")
print("     ao=0  ao=1  ao=2  ao=3  ao=4")
for a in range(NA):
    print(f"a={a}  " + "  ".join(f"{int(pol[a, j]):>3d}" for j in range(NA)))

print("\n=== 均衡价值函数 V(a, ao) ===")
print("     ao=0    ao=1    ao=2    ao=3    ao=4")
for a in range(NA):
    print(f"a={a}  " + "  ".join(f"{V[a, j]:6.2f}" for j in range(NA)))

# ---------- 7. 均衡统计: 高状态企业投资更多? ----------
mean_inv_by_a = pol.mean(axis=1)
print("\n=== 平均均衡投资随自身状态 ===")
for a in range(NA):
    print(f"  a={a}: 平均投资 x = {mean_inv_by_a[a]:.2f}")
print("经济直觉: 若 a 大的企业投资更多, 说明领先者'百尺竿头',")
print("这与 EP 框架的'追赶/逃避' (escape-the-competition) 机制一致。")
✓ 代码说明

这段代码完整实现了 2 企业对称 MPE 的策略函数迭代:内层在给定对手策略时迭代解价值函数(压缩映射收敛),外层做策略改进,直到策略表不再变化。运行后会打印均衡投资策略表——读者应能观察到:(1) 当对手状态很低时,本企业投资动机弱("躺着赚钱");(2) 当对手逼近时投资上升(escape the competition)。扩展方向:加入退出(与 $\Phi$ 比较)、进入(潜在进入者比较 $V(a^0,\bar s)-c^e$)、把对称假设放松为异质企业。

05 估计与数据

5.1 数据需求

动态博弈估计需要企业-年份面板,且每个企业每年要观察到:(1) 状态变量(可由 TFP 分箱、资本分箱代理 $a_{jt}$);(2) 决策变量(投资额 $x_{jt}$、是否进入、是否退出);(3) 结果变量(产出、价格、利润)。这比单 agent Rust 模型的数据要求更高——必须能识别"同一市场内多家企业的联合动态"。

5.2 常用数据来源

数据集国家覆盖内容典型应用
US Census LBD / ASM美国长期数据库(LBD)追踪企业进入退出;ASM 提供投资、产出、资本EP 类企业动态、生产率分解(Olley-Pakes)
中国工业企业数据库 ASIF中国1998–2007(后续有扩展)全部规模以上工业企业:产值、资本、就业、出口、进入退出中国企业进入退出、出口沉没成本、TFP 分解
Compustat美国上市企业财务:投资、资本、研发研发投资博弈、专利竞争
海关数据库中国企业-产品-目的地层面出口交易出口市场进入/退出动态(Das-Roberty-Tybout 式)

5.3 BBL 第一阶段估计

第一步从面板数据估计两组"简化形式"对象:

  • 策略函数 $\hat P(x\mid s)$:在每个观察到的行业状态 $s$ 下,企业选择投资水平 $x$ 的经验频率。状态稀疏时用核估计(kernel)或多项式 sieve 平滑。对应到中国数据:以"行业-年份-企业 TFP 分位"为状态,统计"该状态下企业投资率"。
  • 状态转移 $\hat P(s'\mid s,x)$:给定当期状态与投资,下一期状态的经验转移频率。通常用离散 transition matrix 或连续状态下的 OLS/局部线性回归。

5.4 BBL 第二阶段估计

第二阶段用两种方式之一估计结构参数 $\theta$:

  • 不等式方法(inequalities):对大量"偏离策略" $\tilde x$(如多投 10%、少投 20%),用第一阶段估计的 $\hat P$ 模拟该偏离下的长期价值流。均衡条件要求:$\forall \tilde x,\; V^*(s;\theta,\hat P) \ge V^{\tilde x}(s;\theta,\hat P)$。把违反不等式的次数/幅度作为矩,做最小化。
  • 最小距离(minimum distance / SMM):用模型模拟出"投资率-状态"曲线、"进入率-市场利润"曲线,与数据对应曲线做距离最小化。

5.5 计算挑战:维度灾难(curse of dimensionality)

⚠ 维度灾难

若每家企业状态有 $K$ 个分箱、行业有最多 $\bar N$ 家企业,则行业状态空间大小约为 $K^{\bar N}$。$K=5,\bar N=10$ 时已是天文数字。标准应对:(1) 利用对称性把状态压缩为状态的分布向量(histogram state);(2) 用随机样本模拟(Pakes-McGuire 2001 的 synchronous arm 方法)在状态子集中求解;(3) BBL/CCP 两步法避免全状态空间迭代;(4) 近些年用神经网络值函数近似(neural Bellman)突破。

06 模拟与反事实

估计出结构参数后,EP 框架的价值在于回答政策反事实

  • 合并模拟(merger simulation):把两家企业合并为一家(行业状态减少一个对手),重新求解 MPE,比较合并前后的均衡投资率、价格、消费者剩余。这是反垄断评估的标准工具(见站内 反事实分析页)。
  • 政策反事实
    • 投资补贴:把 $c(x)$ 乘以 $(1-s)$,重新求解 MPE,看企业投资率、行业生产率分布如何移动;
    • 进入壁垒变化:把进入成本分布 $c^e$ 平移,看行业进入率、稳态企业数、企业规模分布;
    • 退出税/环保管制:改变退出清算价值 $\Phi$,看企业退出选择与行业出清速度。
  • 行业动态演化:从任意初始状态出发模拟 $T$ 期 MPE 路径,观察企业规模分布是否收敛到稳态、周转率(churn rate = 进入+退出 / 平均企业数)、领先企业的"在位优势"能维持多久。
💡 反事实的注意事项

BBL 两步法估计快但反事实慢:第一阶段估计的 $\hat P$ 是"基准政策下的均衡策略",反事实政策改变后必须重新求解新政策下的 MPE,不能直接用旧的 $\hat P$。这一点常被初学者忽略。

07 论文案例

English · Review of Economic Studies 1995
Markov-Perfect Industry Dynamics: A Framework for Empirical Work
Richard Ericson, Ariel Pakes · Review of Economic Studies, 1995, 62(1): 53-82
动态产业博弈的奠基框架。给出了状态转移、投资、进入退出的完整结构,并证明了 MPE 的存在性。所有后续 IO 动态结构论文(含本页)都建立在这篇之上。
English · RAND Journal 1994
Markov Perfect Industry Dynamics: A Numerical Model and Policy Experiment
Ariel Pakes, Paul McGuire · RAND Journal of Economics, 1994, 25(4): 555-589
第一个可计算的 EP 数值算法。展示了如何在离散网格上迭代求解 MPE,并做了政策实验。是所有后续计算方法(含本页 Python 代码)的原型。
English · Econometrica 2007
Estimating Models of Complex Games: A Simulation Estimator for Dynamic Games
Patrick Bajari, Lanier Benkard, Jonathan Levin · Econometrica, 2007, 75(5): 1331-1370
BBL 两步法原文。提出用第一阶段非参数估计的策略函数与转移概率,第二阶段用不等式矩/最小距离估计结构参数,彻底摆脱了每次重解 MPE 的计算负担。是现代动态博弈估计的标准工具。
English · Econometrica 2007
Sequential Estimation of Dynamic Discrete Games
Victor Aguirregabiria, Pedro Mira · Econometrica, 2007, 75(1): 1-53
把 NPL(nested pseudo-likelihood)算法推广到动态博弈,证明了在多 agent 环境下 CCP 两步估计的一致性。与 BBL 并列构成动态博弈"两步估计"两大方法。
English · Econometrica 2012
MPEC: Estimation of Structural Models Without Fixed Point Optimization
Che-Lin Su, Kenneth L. Judd · Econometrica, 2012, 80(2): 581-610
MPEC 方法原文。把 Bellman 不动点写成等式约束,用 IPOPT 一次性求解。站内 14 MPEC 方法页是这篇的中文教学版。
English · Handbook of Industrial Organization 2007
Stochastic Dynamic Games in Industry Organization: A Framework and Examples
Ulrich Doraszelski, Ariel Pakes · Handbook of Industrial Organization, Vol. 3, Ch. 30
EP 框架最权威的现代综述。系统整理了 MPE 计算方法、多均衡问题、行业动态的数值实验,是进入该领域的必读手册章节。
中文 · 世界经济 2011
异质性、沉没成本与中国企业出口决定:来自中国微观企业的经验证据
张杰等 · 《世界经济》,2011 年第 4 期
基于中国工业企业微观数据,用动态 Probit/沉没成本框架检验中国企业出口决定的动态特征:前期出口状态对当期出口决策有显著正效应,证实出口市场存在沉没成本。这是 EP 类"进入/退出/沉没成本"动态框架在中国出口行为上的本土化应用。
中文 · 经济研究 / 管理世界
中国制造业企业进入退出与生产率动态演化(OP/DOP 分解系列)
杨汝岱、聂辉华等 · 基于 1998–2007 中国工业企业数据库的系列研究
国内学者沿用 Olley-Pakes (1996) 的进入退出-生产率分解思路(与 EP 框架同宗),用中国 ASIF 数据库系统分解:存量企业内部效率提升、存量间资源再配置、新企业进入、旧企业退出对加总 TFP 增长的贡献。典型发现:中国制造业新进入企业存在"超增长效应",进入退出是生产率动态演化的重要力量。

08 常见错误与陷阱

✗ 错误 1:忽略多均衡问题

EP 模型可能存在多个 MPE,不同 MPE 下的行业动态(企业数、周转率)完全不同。如果求解器收敛到的均衡不是"数据实际所处的均衡",估计出的结构参数和反事实分析全部无效。应对:(1) 用多个初值反复求解,报告找到的均衡集合;(2) 估计阶段直接承认多均衡,用"似然上界/下界"或 BBL 的不等式矩避免选择单一均衡(BBL 的优势正在于此——它不需要先知道均衡)。

✗ 错误 2:维度灾难下盲目加状态变量

初学者为了"更真实"往状态空间里加资本、年龄、地区、所有制……结果状态空间爆炸,VFI 跑不动,BBL 第一阶段在每个状态上几乎没数据。应对:先用尽可能小的状态空间(2–3 维)验证模型能复现关键数据矩(投资率、进入率),再逐步扩展;多余的异质性放进"不可观察异质性"(fixed effect / finite mixture),不要全部进状态向量。

✗ 错误 3:BBL 第一阶段策略函数误设

BBL 的一致性依赖第一阶段 $\hat P(d\mid s)$ 正确设定。如果用了错误的函数形式(如线性概率而非 logit)、带宽过大/过小、或忽略了未观察异质性,第二阶段估计出的 $\theta$ 是错的,且没有简单诊断。应对:第一阶段做过度识别检验;对比参数化与非参数化第一阶段结果;报告带宽敏感性。

⚠ 陷阱 4:忽略进入/退出选择的内生性

如果只用存活企业样本估计投资方程,会产生选择偏误——只有"好状态"的企业存活下来,存活样本系统性偏向高生产率,投资参数估计有偏。EP 框架把进入退出内生化正是为了处理这个问题;简化版估计时若忽略退出选择,等于丢掉了模型的核心识别来源。

⚠ 陷阱 5:MPEC 初值敏感

MPEC 重写后的问题是非凸的(Bellman 约束使目标非凸),IPOPT 从不同初值出发可能收敛到不同的局部解。常见错误:只试一个初值就报告"收敛了"。应对:(1) 用 VFI/PFI 的解作为 MPEC 的热启动(warm start);(2) 跑 10–20 个初值网格,报告最优解;(3) 检查约束残差是否真的接近零。

⚠ 陷阱 6:把 $\beta$ 当自由参数估计

与单 agent Rust 模型一样,$\beta$ 在动态博弈中与 flow profit 参数高度共线,似然曲面平坦。实践中通常把 $\beta$ 校准为 0.9–0.95(对应 5–11% 年贴现率),不参与估计;如需估计 $\beta$,必须加额外识别约束(如实验性的政策变化、跨期利率变化)。

⚠ 陷阱 7:反事实仍用旧均衡策略

改了补贴/进入成本后,行业均衡策略会移动——企业的最优投资函数变了。如果直接拿基准 MPE 的 $\hat P$ 去"模拟"新政策,等于假设企业行为不变,反事实结果毫无意义。必须重新求解新政策下的 MPE。

09 难度、前置与交叉链接

9.1 学习路径建议

  1. 先读 05 动态结构模型总览,彻底掌握单 agent Rust 模型、Bellman 方程、VFI、NFXP、Hotz-Miller。
  2. 读本页 §1–§2,理解从"单人优化"到"多人博弈 + 均衡约束"的升级。
  3. 运行本页 §4 的 Python 代码,亲手观察 MPE 策略表的形状。
  4. 14 MPEC 方法,理解如何把 Eq. 2.1 写成等式约束。
  5. 读 Bajari-Benkard-Levin (2007) 原文附录,理解两步法的矩构造。
  6. 扩展到 10 生产函数估计(OP/LP/ACF),它是 EP 框架"状态变量 $a_{jt}$ 如何从数据中估计"的姊妹技术。

9.2 交叉链接

9.3 难度评级

困难 · 前沿 本页要求同时掌握动态规划、博弈论、数值计算与结构估计,建议在学完站内结构估计组全部前序页面后再进入。研究级应用通常需要合作者中有 IO 计算专家。