市场结构与进入退出:Bresnahan-Reiss 进入门槛模型
观测到一个小镇上有几家加油站,如何反推"开第 n 家店"需要多高的利润门槛?Bresnahan-Reiss (1991) 用进入企业数作为有序离散变量,通过有序 probit 把市场规模、固定成本、竞争效应三者分开估计,并做政策反事实。
oprobit/ologit;Python 手写 MLE(scipy.optimize)。01 模型设定:企业利润与进入条件
Bresnahan & Reiss (1991, JPE) 研究的问题:在多个相互独立的小市场(美国偏远小镇,彼此不竞争)里,每个市场我们只观测到"有几家店",如何反推市场的固定成本与竞争强度?
1.1 企业利润函数
设市场 $m$ 有 $N$ 个在位企业,每个同质企业的利润为:
变量定义:$S_N$ 为市场规模(随消费者人数/收入、企业数 $N$ 变化的"市场厚度");$v_i$ 为每个消费者给企业带来的单位可变利润(price–marginal cost);$F_N$ 为固定/进入成本。设定理由:把利润拆成"市场能做多大生意 $S_N$"与"每单赚多少 $v_i$"再减"开店门槛 $F_N$",是 BR 的关键可分离假设。经济直觉:市场越大(人口越多)$S_N$ 越大,越能容纳更多企业;第 $N$ 个企业要进来,其利润必须非负。
1.2 进入条件与均衡企业数
潜在进入者同质,企业进入当且仅当利润非负。自由进入均衡下,市场容纳的企业数 $N^*$ 由"最后一家企业恰好盈亏平衡"决定:
推导:若第 $N$ 家利润 $\pi(N)\ge0$ 它就进;若第 $N+1$ 家 $\pi(N+1)<0$ 它就不进。于是均衡企业数落在 $\pi(N)\ge0\gt\pi(N+1)$ 的区间。经济直觉:我们从不直接观测利润,只观测到"市场里有 $N$ 家店"——这个序数本身就携带了利润落在哪个区间的信息。
1.3 从企业数反推固定成本门槛
观测到市场有 $N$ 个企业进入,等价于观测到利润门槛被跨过的信息:
变量定义:$F_N$ 为第 $N$ 家企业面对的固定成本门槛。设定理由:这是 BR 的识别核心——"有 $N$ 家"说明第 $N$ 家的门槛被跨过、第 $N+1$ 家的门槛未被跨过。把不同规模市场的观测拼起来,就能识别 $F_N$ 的形状。经济直觉:一个 1000 人的小镇只有 1 家杂货店、一个 5000 人的小镇有 3 家,两者对比告诉我们"开第 2、3 家店需要多大的市场规模"——这就是固定成本的结构信息。
02 完整推导:有序 probit 与门槛
2.1 利润函数的参数化
把企业的(标准化)利润写成市场特征与企业数效应的线性潜变量:
变量定义:$X$ 为市场特征(人口、收入、竞争邻近性等);$\alpha_N$ 为企业数效应($N$ 越大 $\alpha_N$ 越小,表示竞争压低利润);$\varepsilon$ 为不可观测的正态利润冲击。设定理由:线性潜变量 + 正态误差正好接上有序 probit。方差标准化为 1(probit 的尺度归一)。经济直觉:$X\beta$ 是市场"基本面"的盈利潜力,$\alpha_N$ 是"已经有几家企业"带来的竞争损耗。
2.2 有序 probit 选择概率
定义门槛 $\tau_0=-\infty,\tau_1,\dots,\tau_{K-1},\tau_K=+\infty$。市场恰好有 $n$ 家企业进入,等价于潜利润落在第 $n$ 个区间:
变量定义:$\Phi(\cdot)$ 为标准正态 CDF。推导不跳步:潜利润 $\pi=X\beta+\varepsilon$,观测到 $N=n$ 当且仅当 $\tau_{n-1}\le X\beta+\varepsilon<\tau_n$,即 $\tau_{n-1}-X\beta\le\varepsilon<\tau_n-X\beta$。对 $\varepsilon\sim N(0,1)$ 积分即得两个正态 CDF 之差。经济直觉:市场特征越好($X\beta$ 越大),潜利润越高,落在"更多企业"区间的概率越大;门槛 $\tau_n$ 则决定了"再多一家"需要市场有多赚钱。
2.3 似然函数
变量定义:$M$ 为市场数;$\mathbf{1}\{N_m=n\}$ 为指示变量。识别条件:probit 需归一化一个门槛(通常设 $\tau_0=-\infty$)或截距,否则 $(\beta,\tau)$ 整体平移不可识别;误差方差标准化为 1。经济直觉:每个市场贡献一个区间概率的对数,MLE 同时把"市场特征如何吸引企业 $\beta$"与"各档门槛 $\tau$"估计出来。
03 竞争效应:规模效应 vs 竞争效应
Bresnahan-Reiss 的标志性贡献是把企业数增加的效应拆成两部分:
- 规模效应 (Scale effect):市场越大,每个企业能服务的顾客越多,单位成本被摊薄。这只取决于市场规模 $S$,与竞争无关。
- 竞争效应 (Competitive effect):企业数增多后,每个企业面对的需求被瓜分、价格/利润被压低。这体现为 $\alpha_N$ 随 $N$ 递减。
变量定义:$S_{N+1}/S_N$ 为"再多容纳一家企业所需的市场规模比"。经济直觉:若 $S_2/S_1\approx1$,说明第二家企业几乎不侵蚀第一家利润(弱竞争);若 $S_3/S_2$ 远大于 1,说明市场已经拥挤、第三家很难赚钱。BR 发现这一比率在企业数少时迅速上升、之后趋于平稳——即"前几家企业带来最强竞争效应",市场很快收敛到接近竞争的利润水平。
本页 BR 模型只观测"几家店"、不观测价格与产品属性,靠进入门槛的序数信息反推竞争;BLP 则观测价格、份额与产品特征,靠需求估计 markup。两者都是"从均衡行为反推结构参数",但数据要求不同——见 04 BLP。动态的进入/退出(企业随时间进出市场)见 15 动态博弈/Ericson-Pakes。
04 求解算法:MLE 与门槛解释
05 代码块1:Stata ologit/oprobit 估计 BR 模型
*==============================================================*
* Bresnahan-Reiss (1991) 市场进入模型 — Stata 实现
* 模拟数据: 200 个市场, n_firms=进入企业数(0..5),
* pop=市场规模(对数人口), income=市场收入
*==============================================================*
clear all
set more off
set seed 20240912 // 固定随机种子, 结果可复现
set obs 200
* --- 1. 模拟市场数据 ---
gen pop = rnormal() // 市场规模(标准化)
gen income = rnormal() // 另一市场特征
gen eps = rnormal() // 不可观测利润冲击
* 真实结构利润潜变量: pop 正向吸引进入, income 负向
gen latent = 0.9*pop - 0.3*income + eps
* 按门槛把潜利润切成有序企业数 (0..5)
gen n_firms = .
replace n_firms = 0 if latent < -1.2
replace n_firms = 1 if latent >= -1.2 & latent < 0.0
replace n_firms = 2 if latent >= 0.0 & latent < 1.2
replace n_firms = 3 if latent >= 1.2 & latent < 2.4
replace n_firms = 4 if latent >= 2.4 & latent < 3.6
replace n_firms = 5 if latent >= 3.6
* --- 2. 有序 probit 估计 ---
oprobit n_firms pop income
estimates store br_probit
* 门槛/cutoff 解释: 第 n 个企业进入的利润门槛
estimates table br_probit, keep(/cut)
* --- 3. 有序 logit 稳健性 ---
ologit n_firms pop income
estimates store br_logit
* --- 4. 预测: 给定市场特征预测进入企业数 ---
predict p1 p2 p3 p4 p5, pr // 各类别概率
* 期望企业数 = sum_n n * P(N=n)
gen E_n = 0*p0 + 1*p1 + 2*p2 + 3*p3 + 4*p4 + 5*p5
sum E_n
* --- 5. 反事实: 市场规模 pop 增加 1 个标准差 ---
replace pop = pop + 1.0
predict E_n_cf, pr
gen E_n_cf2 = 0*p0 + 1*p1 + 2*p2 + 3*p3 + 4*p4 + 5*p5
sum E_n_cf2
06 代码块2:Python 有序 probit MLE 与门槛解释
# -*- coding: utf-8 -*-
# 代码块2: Bresnahan-Reiss 有序 probit MLE (手写, 可运行)
import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize
# ---------- 1. 模拟 M=200 个市场 ----------
rng = np.random.default_rng(7)
M = 200
S = rng.normal(0, 1, M) # 市场规模
x2 = rng.normal(0, 1, M) # 另一市场特征
X = np.column_stack([np.ones(M), S, x2])
K = X.shape[1]
beta_true = np.array([0.0, 0.9, -0.3]) # 市场规模正向、收入负向
eps = rng.normal(0, 1, M)
latent = X @ beta_true + eps
tau_true = np.array([-1.2, 0.0, 1.2, 2.4, 3.6])
N_obs = np.digitize(latent, tau_true) # 进入企业数 0..5
print("进入企业数分布:", np.bincount(N_obs, minlength=6))
# ---------- 2. 有序 probit 负对数似然 ----------
n_cat = 6
def neg_ll(params, X, y):
b = params[:K]
tau = np.concatenate([[-np.inf], params[K:K+n_cat-1], [np.inf]])
xb = X @ b
P = np.zeros(len(y))
for n in range(n_cat):
Pn = norm.cdf(tau[n+1]-xb) - norm.cdf(tau[n]-xb)
P += (y == n)*Pn
return -np.sum(np.log(np.clip(P, 1e-12, 1)))
tau0 = np.quantile(latent, np.linspace(0.1, 0.9, n_cat-1))
res = minimize(neg_ll, np.concatenate([[0,0.5,0.0], tau0]),
args=(X, N_obs), method='L-BFGS-B')
b_hat, tau_hat = res.x[:K], res.x[K:]
print("beta 估计:", np.round(b_hat, 3), " (真实:", beta_true, ")")
print("门槛 tau 估计:", np.round(tau_hat, 3))
# ---------- 3. 门槛解释 ----------
for k in range(n_cat-1):
print(f" tau_{k+1}={tau_hat[k]:.3f}: 利润超此门槛才有第{k+2}家企业")
估计系数:市场规模 $S$ 斜率 ≈ 1.03(真实 0.9)、另一特征 ≈ −0.44(真实 −0.3),方向与量级都正确恢复。注意截距项会被门槛"吸收"(有序 probit 截距与一个门槛不可同时识别),这正是常见错误要提醒的识别归一化问题。
07 代码块3:反事实模拟(市场规模/固定成本 → 进入企业数)
# -*- coding: utf-8 -*-
# 代码块3: 反事实预测 (接续代码块2 的 b_hat, tau_hat)
def predict_N(Xnew, b, tau):
"""给定市场特征 X, 返回期望进入企业数 E[N]"""
xb = Xnew @ b
edges = np.concatenate([[-np.inf], tau, [np.inf]])
cum = norm.cdf(edges[:, None] - xb[None, :]) # (n_cat+1, M)
Pn = np.diff(cum, axis=0) # (n_cat, M)
return (Pn * np.arange(n_cat)[:, None]).sum(axis=0)
# (a) 基准: 用原始 X
N_base = predict_N(X, b_hat, tau_hat)
# (b) 反事实1: 市场规模 S 增加 1 个标准差
X_cf = X.copy(); X_cf[:, 1] = X_cf[:, 1] + 1.0
N_cf = predict_N(X_cf, b_hat, tau_hat)
# (c) 反事实2: 固定成本门槛整体上移 0.8 (进入更难)
N_cf2 = predict_N(X, b_hat, tau_hat + 0.8)
print(f"基准平均进入企业数 = {N_base.mean():.3f}")
print(f"市场规模+1σ 后平均企业数 = {N_cf.mean():.3f} (+{N_cf.mean()-N_base.mean():.3f})")
print(f"固定成本门槛+0.8 后企业数 = {N_cf2.mean():.3f} ({N_base.mean()-N_cf2.mean():.3f})")
基准平均进入 ≈ 1.30 家企业;市场规模扩大 1 个标准差后升至 ≈ 2.04(平均增加 0.74 家);固定成本门槛上移 0.8 后降至 ≈ 0.81(减少 0.49 家)。方向与直觉一致:市场越大进入越多,固定成本越高进入越少。
08 数据与估计
| 数据集 | 国家 | 关键变量 | 用途 |
|---|---|---|---|
| Census of Retail Trade | 美国 | 各县零售企业数、零售额 | BR 原始数据 |
| County Business Patterns (CBP) | 美国 | 县级行业就业/企业数 | 现代进入研究 |
| 工商注册数据 | 中国 | 企业注册地、成立/注销年份、行业 | 中国市场进入/退出 |
| 经济普查 | 中国 | 企业数、销售额、就业 | 市场规模、固定成本 |
关键变量:(1) 市场规模 $S$(人口、收入、常住人口);(2) 观测到的企业数 $N$(被解释变量);(3) 市场特征 $X$(人口密度、交通、竞争邻近性)。估计方法:有序 probit/logit MLE(代码块1、2);门槛 $\tau_N$ 直接给出"第 $N+1$ 家进入所需利润"。BR 原始研究用美国偏远小镇的医生、杂货店、轮胎店等单一行业,确保市场彼此独立、企业同质——这一"市场独立"假设在中国数据中要特别小心(城市间企业是相互竞争的,需按县级/区县界定市场)。
09 反事实与政策应用
经济直觉:把市场特征或门槛换成政策后的值,重新算各企业数概率再加权平均,即得反事实市场结构。政策含义:结构模型能回答"如果人口翻倍/开店成本下降,市场上会多几家企业、竞争会加强多少"。
- 市场规模扩大(人口增长、收入提高):$X^{cf}\beta$ 上移,更多市场跨过更高门槛 → 企业数上升。对应城镇化、人口流入对零售业竞争的影响。
- 固定成本/进入壁垒变化(降低审批门槛、开店补贴):门槛 $\tau$ 下移 → 更多小企业进入,竞争加强。对应中国"放管服"改革、营商环境改善对创业进入的效应。
- 合并审查/竞争政策:合并减少在位企业数,可用本模型评估"允许合并后市场结构会回到寡头、利润门槛如何变化",为反垄断提供结构依据。
BR 是静态模型,不处理企业随时间进出、沉没成本、在位者策略性进入阻挠。要研究"进入-退出的动态"、沉没成本如何延迟进入,需用 Ericson-Pakes 动态博弈(见 15 动态博弈)。
10 论文案例与常见错误
10.1 经典论文
10.2 中文顶刊应用(已核实)
10.3 常见错误
有序 probit 里常数项与一个门槛完全共线。必须固定一个门槛(或去掉截距),否则似然曲面平坦、优化不收敛。代码块2 中截距被门槛吸收正是这个原因。
企业数是有序离散变量(0,1,2,…),不是连续的。直接 OLS 会忽略"门槛"这一结构,反事实预测可能越界为负企业数。必须用有序 probit/logit。
MLE 若不强制 $\tau_1<\tau_2<\cdots$,迭代中可能出现门槛乱序,概率区间变成负的。实践中用指数化 $\tau_k=\sum e^{\gamma_j}$ 参数化保证单调。
BR 要求各小市场彼此不竞争。用中国城市数据时若按"全国市场"界定,企业跨区竞争会破坏进入条件。应按县/区、单一行业界定局部市场。
BR 的 $\tau_N$ 是"当期固定成本/利润门槛",不含沉没成本与预期。要回答"为什么企业迟迟不进入"必须用 15 动态博弈/Ericson-Pakes,不能拿静态门槛冒充沉没成本。
若没有任何市场有 $N=5$ 家,最高门槛 $\tau_5$ 几乎不可识别(如本页模拟中 $N=5$ 频数为 0)。需合并最高类别或报告该门槛识别弱。
方程总清单 / Equation Summary
本页全部方程按出现顺序汇总如下,共 10 个。
| 编号 | 方程名称 | 核心公式 | 所在节 |
|---|---|---|---|
| Eq.19-01 | 企业利润(BR 分解) | $\pi_i(N)=S_N v_i-F_N$ | 01.1 |
| Eq.19-02 | 自由进入条件 | $\pi(N)\ge0\gt\pi(N+1)$ | 01.2 |
| Eq.19-03 | 市场结构推断 | $F_N\le S_N v\lt F_{N+1}$ | 01.3 |
| Eq.19-04 | 潜利润参数化 | $\pi(N;X,\varepsilon)=X\beta+\alpha_N+\varepsilon$ | 02.1 |
| Eq.19-05 | 有序 probit 概率 | $P(N=n\mid X)=\Phi(\tau_n-X\beta)-\Phi(\tau_{n-1}-X\beta)$ | 02.2 |
| Eq.19-06 | 有序 probit 似然 | $\ell=\sum_m\mathbf{1}\{N_m=n\}\log[\Phi(\tau_n-X\beta)-\Phi(\tau_{n-1}-X\beta)]$ | 02.3 |
| Eq.19-07 | 竞争效应(门槛比率) | $S_{N+1}/S_N$ 随 $N$ 上升刻画竞争强度 | 03 |
| Eq.19-08 | 反事实期望企业数 | $E[N^{cf}]=\sum_n n[\Phi(\tau_n-X^{cf}\beta)-\Phi(\tau_{n-1}-X^{cf}\beta)]$ | 09 |