diff --git a/.translate/state/market_diffusion.md.yml b/.translate/state/market_diffusion.md.yml
new file mode 100644
index 0000000..8608a34
--- /dev/null
+++ b/.translate/state/market_diffusion.md.yml
@@ -0,0 +1,6 @@
+source-sha: e46fa7fc93bcdee2ed317811cf72e1645259dd4f
+synced-at: "2026-08-02"
+model: claude-sonnet-5
+mode: NEW
+section-count: 10
+tool-version: 0.24.0
diff --git a/.translate/state/pricing_information.md.yml b/.translate/state/pricing_information.md.yml
new file mode 100644
index 0000000..4ba1905
--- /dev/null
+++ b/.translate/state/pricing_information.md.yml
@@ -0,0 +1,6 @@
+source-sha: e46fa7fc93bcdee2ed317811cf72e1645259dd4f
+synced-at: "2026-08-02"
+model: claude-sonnet-5
+mode: NEW
+section-count: 9
+tool-version: 0.24.0
diff --git a/lectures/_toc.yml b/lectures/_toc.yml
index d447729..25c1a17 100644
--- a/lectures/_toc.yml
+++ b/lectures/_toc.yml
@@ -48,6 +48,8 @@ parts:
- file: navy_captain
- file: merging_of_opinions
- file: survival_recursive_preferences
+ - file: pricing_information
+ - file: market_diffusion
- caption: Linear Programming
numbered: true
chapters:
@@ -65,7 +67,8 @@ parts:
- file: wealth_dynamics
- file: kalman
- file: kalman_2
- - file: kalman_filter_var
+ - file: kalman_filter_var
+ - file: var_subsets
- file: organization_capital
- file: measurement_models
- caption: Search
@@ -116,12 +119,14 @@ parts:
- file: lq_permanent_income
- file: lq_bewley_complete_markets
- file: lq_robust_smoothing
+ - file: lq_robust_bewley
- file: lq_inventories
- caption: Bounded Rationality in Macroeconomics
numbered: true
chapters:
- file: bounded_rationality
- file: olg_adaptive_money
+ - file: learning_approximation
- file: exchange_rate_learning
- file: genetic_classifier
- file: marimon_mcgrattan_sargent
@@ -184,6 +189,7 @@ parts:
- file: mle
- file: unemployment_linear
- file: unemployment_shocks
+ - file: sargent_surico
- caption: Auctions
numbered: true
chapters:
diff --git a/lectures/market_diffusion.md b/lectures/market_diffusion.md
new file mode 100644
index 0000000..07ce2ab
--- /dev/null
+++ b/lectures/market_diffusion.md
@@ -0,0 +1,900 @@
+---
+jupytext:
+ text_representation:
+ extension: .md
+ format_name: myst
+ format_version: 0.13
+ jupytext_version: 1.16.7
+kernelspec:
+ display_name: Python 3 (ipykernel)
+ language: python
+ name: python3
+translation:
+ title: 双向学习下的市场扩散
+ headings:
+ Overview: 概述
+ The market: 市场
+ Two-sided learning: 双向学习
+ Two-sided learning::Learning as a likelihood ratio process: 作为似然比过程的学习
+ Efficient experimentation: 有效实验
+ Equilibrium: 均衡
+ Equilibrium::Who values information more?: 谁更看重信息?
+ Too much experimentation, then too little: 先过度实验,后不足实验
+ Diffusion over time: 时间上的扩散
+ Martingale properties: 鞅性质
+ Concluding remarks: 结束语
+ Exercises: 练习
+---
+
+(market_diffusion)=
+```{raw} jupyter
+
+```
+
+# 双向学习下的市场扩散
+
+```{index} single: Information; strategic experimentation
+```
+
+```{index} single: Learning; two-sided
+```
+
+```{contents} Contents
+:depth: 2
+```
+
+## 概述
+
+在 {doc}`pricing_information` 中,垄断者*拥有*信息并出售它。
+
+本讲研究一个没有人出售信息、但每个人都在生产信息的市场。
+
+我们遵循 {cite:t}`BergemannValimaki1997` 的研究,他们研究了一个双寡头模型,其中一家老牌企业与一家销售未知质量新产品的企业进行价格竞争。
+
+买方只有通过使用产品才能了解新产品的价值,而他们经验的总体记录是公开的。
+
+因此,每一次新产品的购买同时既是一个消费决策,又是一次实验,其信息价值溢出给所有人。
+
+市场的双方都从同一个公开记录中学习,这正是这里"双向学习"的含义:买方和卖方在每个时点都持有相同的信念,从不会出现信息不对称的情况。
+
+三个结果构成了本讲的主线。
+
+第一,两家企业都*希望*获得更多信息,但只有新企业的销售才能产生信息。
+
+这种不对称使价格竞争趋于缓和:老牌企业的定价不如在一次性博弈中那样激进,而新进入者在早期能占据更大的市场份额。
+
+第二,当信念悲观时,均衡实验是**过度**的;当信念乐观时,均衡实验是**不足**的,二者之间存在一个单一的交叉点。
+
+第三,成功新产品的扩散路径呈**S形**,这与长期的经验研究传统相吻合,且其拐点恰好出现在一个我们可以精确确定的信念处。
+
+```{note}
+本节其余内容与本讲的联系是通过*信息的价值*建立起来的。
+
+{doc}`blackwell_kihlstrom` 表明,当决策问题的价值函数在信念上是凸的时候,决策者恰好能从信息量更大的实验中获益,因为信息量更大的实验会以凸序使后验分布扩散得更开。
+
+在这里,信念是一个鞅,实验控制着信念扩散的速度,因此每家企业从实验中获得的收益都由其价值函数的凸性所决定。
+
+信念本身由 {doc}`likelihood_ratio_process` 中研究的那种对数似然比过程驱动,只是现在在连续时间中运行。
+```
+
+让我们从导入相关模块开始。
+
+```{code-cell} ipython3
+import matplotlib.pyplot as plt
+import numpy as np
+
+plt.rcParams['figure.figsize'] = (10, 5)
+np.set_printoptions(precision=4, suppress=True)
+```
+
+## 市场
+
+买方在 $[0, 1]$ 上均匀分布,每个买方每单位时间需求一单位商品。
+
+老牌产品为买方 $n$ 提供价值
+
+$$
+s_n = s + n h
+$$ (eq:md_established)
+
+而新产品提供
+
+$$
+\mu_n = \mu + (1 - n) h .
+$$ (eq:md_new)
+
+参数 $h > 0$ 衡量水平差异化程度,因此靠近 $n = 0$ 的买方自然倾向于新产品,而靠近 $n = 1$ 的买方倾向于老牌产品。
+
+这是标准的霍特林结构,只有一个转折:新产品的垂直质量 $\mu$ 是**未知的**,可能取两个值之一,
+
+$$
+\mu \in \{\mu_L, \mu_H\},
+\qquad
+0 < s - h < \mu_L < s < \mu_H < s + h .
+$$ (eq:md_condition4)
+
+内部不等式表明新产品可能比老牌产品更好或更差。
+
+外部不等式表明在完全信息下,两家企业都将保有正的市场份额,也就是说这项创新不是颠覆性的。
+
+两家企业的边际成本均为零。
+
+如果新企业为 $[0, n]$ 区间内的买方服务,则每种产品交付的平均流量价值为
+
+$$
+\bar\mu(n) = \mu + \frac{(2 - n)h}{2},
+\qquad
+\bar s(n) = s + \frac{(1 + n)h}{2} ,
+$$ (eq:md_averages)
+
+因此每单位时间的总剩余为 $n \bar\mu(n) + (1-n)\bar s(n)$。
+
+用 $\mu(\alpha)$ 表示在信念 $\alpha = \Pr[\mu = \mu_H]$ 下的预期质量,经过一些代数运算,可将流量剩余化为便于处理的二次形式,
+
+$$
+F(n, \alpha) = s + \frac h2 + n\bigl(\mu(\alpha) - s + h\bigr) - n^2 h .
+$$ (eq:md_flow)
+
+```{code-cell} ipython3
+class Market:
+ """The duopoly of Bergemann and Valimaki (1997)."""
+
+ def __init__(self, s=4.0, h=1.0, mu_L=3.1, mu_H=4.9, sigma=1.0):
+ self.s, self.h = s, h
+ self.mu_L, self.mu_H, self.sigma = mu_L, mu_H, sigma
+ assert 0 < s - h < mu_L < s < mu_H < s + h, 'condition (4) fails'
+
+ def mu(self, a):
+ """Expected quality of the new product under belief a."""
+ return (1 - a) * self.mu_L + a * self.mu_H
+
+ def flow_surplus(self, n, a):
+ return (self.s + self.h / 2 + n * (self.mu(a) - self.s + self.h)
+ - n ** 2 * self.h)
+```
+
+## 双向学习
+
+单个买方的个人经验是对 $\mu$ 的带噪声的采样,由于每个买方的测度为零,只有*总体*记录才重要。
+
+当一部分买方(比例为 $n$)使用新产品时,累积市场结果 $X$ 按下式演化,
+
+$$
+dX = n \mu \, dt + \sigma \sqrt{n} \, dB ,
+$$ (eq:md_signal)
+
+因此漂移项和方差都按实验规模 $n$ 进行缩放。
+
+每个人都能观察到 $X$,所以信念保持共同。
+
+由于 $\mu$ 只取两个值,信念 $\alpha_t = \Pr[\mu = \mu_H \mid \mathcal F_t]$ 是一个充分统计量。
+
+```{prf:proposition} 后验信念
+:label: md_prop_belief
+
+信念 $\alpha_t$ 是一个漂移为零的鞅,其瞬时方差为
+
+$$
+n \Sigma^2(\alpha) = n\left[\frac{\alpha(1-\alpha)(\mu_H - \mu_L)}{\sigma}\right]^2 .
+$$ (eq:md_variance)
+```
+
+这是通过扩散过程观察到的两点先验的标准滤波结果;参见 {cite:t}`LiptserShiryaev1977`。
+
+{eq}`eq:md_variance` 有两个特征驱动着一切。
+
+方差**关于 $n$ 是线性的**,因此信息按实验规模的比例到达,并且只有新企业的销售才会产生信息。
+
+方差与 $\alpha^2(1-\alpha)^2$ 成正比,因此当信念最为分散时学习最快,而当 $\alpha$ 接近 $0$ 或 $1$ 时学习几乎停滞。
+
+### 作为似然比过程的学习
+
+值得看一下 {eq}`eq:md_variance` 是从何而来的,因为其机制正是 {doc}`likelihood_ratio_process` 中所研究的机制,只是移植到了连续时间中。
+
+在长度为 $\Delta$ 的短时间区间内,无论在哪种假设下,增量 $\Delta X$ 都是正态分布的,均值为 $n \mu \Delta$,方差为 $\sigma^2 n \Delta$,因此**对数似然比**的增量为
+
+$$
+\Delta \ell
+= \log\frac{f_H(\Delta X)}{f_L(\Delta X)}
+= \frac{(\mu_H - \mu_L)\,\Delta X - \tfrac12 n \Delta (\mu_H^2 - \mu_L^2)}{\sigma^2} .
+$$ (eq:md_loglr)
+
+然后信念按照对数几率形式的贝叶斯法则演化,与离散时间讲座中的做法完全相同,
+
+$$
+\log\frac{\alpha_{t+\Delta}}{1 - \alpha_{t+\Delta}}
+= \log\frac{\alpha_t}{1 - \alpha_t} + \Delta \ell .
+$$ (eq:md_logodds)
+
+我们直接实现 {eq}`eq:md_loglr` 和 {eq}`eq:md_logodds`,这样每一步都是*精确*的贝叶斯更新,而不是随机微分方程的离散化。
+
+```{code-cell} ipython3
+def simulate_beliefs(mkt, alpha0, T, dt, mu_true, rng, policy):
+ """Simulate beliefs by exact Bayesian updating of the log odds.
+
+ `mu_true` holds the true quality for each path, so the paths run in parallel.
+ Returns an array of shape (number of paths, number of steps + 1).
+ """
+ mu_true = np.atleast_1d(np.asarray(mu_true, dtype=float))
+ M, steps = len(mu_true), int(T / dt)
+ a = np.empty((M, steps + 1))
+ a[:, 0] = alpha0
+ ell = np.full(M, np.log(alpha0 / (1 - alpha0)))
+ dmu, half = mkt.mu_H - mkt.mu_L, (mkt.mu_H ** 2 - mkt.mu_L ** 2) / 2
+ for k in range(steps):
+ n = policy(a[:, k])
+ dX = n * mu_true * dt + mkt.sigma * np.sqrt(n * dt) * rng.standard_normal(M)
+ ell += (dmu * dX - n * dt * half) / mkt.sigma ** 2
+ a[:, k + 1] = 1 / (1 + np.exp(-ell))
+ return a
+```
+
+在使用它之前,我们通过蒙特卡洛方法来验证 {prf:ref}`md_prop_belief`。
+
+```{code-cell} ipython3
+def Sigma2(mkt, a):
+ return (a * (1 - a) * (mkt.mu_H - mkt.mu_L) / mkt.sigma) ** 2
+
+
+mkt = Market()
+rng = np.random.default_rng(0)
+dt, n_draw = 1e-4, 400_000
+
+print(f'{"alpha":>7s}{"simulated var/dt":>19s}{"formula n*Sigma^2":>20s}'
+ f'{"mean/dt (s.e.)":>22s}')
+for a0 in [0.2, 0.5, 0.8]:
+ n = 0.5 # hold the experiment size fixed
+ ell0 = np.log(a0 / (1 - a0))
+ steps = []
+ for mu_true, w in [(mkt.mu_H, a0), (mkt.mu_L, 1 - a0)]:
+ k = int(n_draw * w)
+ dX = n * mu_true * dt + mkt.sigma * np.sqrt(n * dt) * rng.standard_normal(k)
+ ell = ell0 + ((mkt.mu_H - mkt.mu_L) * dX
+ - n * dt * (mkt.mu_H ** 2 - mkt.mu_L ** 2) / 2) / mkt.sigma ** 2
+ steps.append(1 / (1 + np.exp(-ell)) - a0)
+ d = np.concatenate(steps)
+ se = d.std() / np.sqrt(len(d)) / dt
+ print(f'{a0:7.2f}{d.var() / dt:19.6f}{n * Sigma2(mkt, a0):20.6f}'
+ f'{d.mean() / dt:14.4f} ({se:.3f})')
+```
+
+模拟得到的方差与 {eq}`eq:md_variance` 相吻合,且均值增量与零没有明显区别,这证实了信念确实构成一个鞅。
+
+## 有效实验
+
+一个选择 $n(\alpha)$ 的计划者需要在当前剩余和销售产生的信息之间进行权衡。
+
+{cite:t}`BergemannValimaki1997` 通过在**无贴现**极限下工作,利用 {cite:t}`Dutta1991` 的强长期平均准则,避开了贴现会产生的非线性微分方程。
+
+在这个极限下的最优策略是贴现率趋于零时贴现策略的极限,因此跨期权衡依然存在。
+
+贝尔曼方程变为
+
+$$
+\max_{n} \left\{ F(n, \alpha) - v(\alpha)
++ \tfrac12 n \Sigma^2(\alpha) V''(\alpha) \right\} = 0 ,
+$$ (eq:md_bellman)
+
+其中 $v(\alpha)$ 是完全信息下可达到的长期平均值,最后一项是**信息的价值**:实验规模 $n$ 乘以学习速度 $\Sigma^2$ 再乘以影子价格 $V''$。
+
+由于信念是一个鞅,因此不会出现一阶导数项。
+
+由于 $\mu$ 最终会被了解,$v$ 恰好是两个完全信息值的线性插值,
+
+$$
+v(\alpha) = \frac{s + \mu(\alpha) + \frac32 h}{2}
++ (1 - \alpha)\frac{(\mu_L - s)^2}{4h} + \alpha\frac{(\mu_H - s)^2}{4h} .
+$$ (eq:md_vsocial)
+
+巧妙之处在于 {eq}`eq:md_bellman` 中被最大化的括号项等于零,因此我们可以对整体除以 $n$ 而不改变最大化点。
+
+这样做能将 $V''$ 完全从一阶条件中消去,剩下
+
+$$
+\max_n \left\{ \frac{s + \frac h2 - v(\alpha)}{n} - h n \right\} + \text{与 } n \text{ 无关的项} ,
+$$
+
+其一阶条件给出了有效策略的闭式解。
+
+```{prf:proposition} 有效实验
+:label: md_prop_efficient
+
+新产品的有效市场份额为
+
+$$
+n^*(\alpha) = \sqrt{\frac{v(\alpha) - s - \frac h2}{h}} .
+$$ (eq:md_nstar)
+```
+
+忽略销售信息价值的短视计划者则设定 $m^*(\alpha) = \arg\max_n F(n,\alpha)$。
+
+```{code-cell} ipython3
+def v_social(mkt, a):
+ s, h = mkt.s, mkt.h
+ return ((s + mkt.mu(a) + 1.5 * h) / 2
+ + (1 - a) * (mkt.mu_L - s) ** 2 / (4 * h)
+ + a * (mkt.mu_H - s) ** 2 / (4 * h))
+
+
+def n_star(mkt, a):
+ """Efficient share, equation (nstar)."""
+ return np.sqrt((v_social(mkt, a) - mkt.s - mkt.h / 2) / mkt.h)
+
+
+def m_star(mkt, a):
+ """Myopically efficient share."""
+ return (mkt.mu(a) - mkt.s + mkt.h) / (2 * mkt.h)
+```
+
+在 $\alpha \in \{0, 1\}$ 处不再有可学习的内容,因此二者必须一致,事实也的确如此。
+
+```{code-cell} ipython3
+for a, mu_i in [(0.0, mkt.mu_L), (1.0, mkt.mu_H)]:
+ direct = (mu_i - mkt.s + mkt.h) / (2 * mkt.h)
+ print(f'alpha = {a}: n* = {n_star(mkt, a):.6f} '
+ f'full-information share = {direct:.6f}')
+
+A = np.linspace(1e-6, 1 - 1e-6, 4001) # full grid, for plotting
+A_int = np.linspace(0.05, 0.95, 1801) # strictly interior grid
+
+gap_myopic = n_star(mkt, A_int) - m_star(mkt, A_int)
+print(f'\nn*(alpha) - m*(alpha) on [0.05, 0.95]: '
+ f'min {gap_myopic.min():.5f}, at alpha = 0.5 it is '
+ f'{float(n_star(mkt, 0.5) - m_star(mkt, 0.5)):.5f}')
+```
+
+计划者总是比短视基准**实验更多**,这正是信息的跨期价值以新产品额外销售的形式体现出来。
+
+## 均衡
+
+现在让两家企业设定价格 $p_1$ 和 $p_2$,并让买方进行选择。
+
+当 $s + nh - p_1 = \mu(\alpha) + (1-n)h - p_2$ 时,边际买方 $n$ 无差异,这将市场份额与价格联系起来。
+
+每家企业都求解一个动态规划问题,其中出现了自身的信息价值,而同样的"除以 $n$"技巧将二阶导数从一阶条件中消去。
+
+```{prf:proposition} 均衡
+:label: md_prop_equilibrium
+
+存在唯一的马尔可夫完美均衡,其中
+
+$$
+p_1(\alpha) = \tfrac23\bigl(s - \mu(\alpha)\bigr) + \sqrt{2 h v_2(\alpha)},
+\qquad
+p_2(\alpha) = \tfrac13\bigl(\mu(\alpha) - s\bigr) + h ,
+$$ (eq:md_prices)
+
+新企业的市场份额为
+
+$$
+n(\alpha) = \sqrt{\frac{v_2(\alpha)}{2h}} ,
+$$ (eq:md_share)
+
+其中 $v_i(\alpha)$ 是企业 $i$ 在完全信息下的长期平均收入。
+```
+
+```{code-cell} ipython3
+def v1(mkt, a):
+ s, h = mkt.s, mkt.h
+ return ((1 - a) * ((s - mkt.mu_L) / 3 + h) ** 2 / (2 * h)
+ + a * ((s - mkt.mu_H) / 3 + h) ** 2 / (2 * h))
+
+
+def v2(mkt, a):
+ s, h = mkt.s, mkt.h
+ return ((1 - a) * ((mkt.mu_L - s) / 3 + h) ** 2 / (2 * h)
+ + a * ((mkt.mu_H - s) / 3 + h) ** 2 / (2 * h))
+
+
+def n_eq(mkt, a):
+ return np.sqrt(v2(mkt, a) / (2 * mkt.h))
+
+
+def p1(mkt, a):
+ return 2 / 3 * (mkt.s - mkt.mu(a)) + np.sqrt(2 * mkt.h * v2(mkt, a))
+
+
+def p2(mkt, a):
+ return (mkt.mu(a) - mkt.s) / 3 + mkt.h
+
+
+def p1_myopic(mkt, a):
+ return (mkt.s - mkt.mu(a)) / 3 + mkt.h
+
+
+def n_myopic(mkt, a):
+ return ((mkt.mu(a) - mkt.s) / 3 + mkt.h) / (2 * mkt.h)
+```
+
+将动态均衡与逐期博弈的静态均衡进行比较,会揭示这篇论文的核心不对称性。
+
+```{code-cell} ipython3
+print('comparing the dynamic equilibrium with the static one, on [0.05, 0.95]')
+print(f' max |p2 - p2_myopic| {np.abs(p2(mkt, A_int) - p2(mkt, A_int)).max():.2e}')
+print(f' min (p1 - p1_myopic) {(p1(mkt, A_int) - p1_myopic(mkt, A_int)).min():.5f}')
+print(f' min (n_eq - n_myopic) {(n_eq(mkt, A_int) - n_myopic(mkt, A_int)).min():.5f}')
+```
+
+新企业的价格*恰好*等于其短视价格,这是线性偏好结构和无贴现假设所导致的一个刀锋结果。
+
+老牌企业收取的价格*高于*它在一次性博弈中会收取的价格,因此让出了市场份额。
+
+这就是令人瞩目的结果:老牌企业软化竞争并非出于弱势,而是因为新进入者的销售是唯一的信息来源,而老牌企业想要这些信息。
+
+### 谁更看重信息?
+
+贝尔曼方程表明,每家企业的信息价值等于其完全信息下的预期收入与当前收入之间的差距。
+
+```{code-cell} ipython3
+voi_1 = v1(mkt, A) - (1 - n_eq(mkt, A)) * p1(mkt, A)
+voi_2 = v2(mkt, A) - n_eq(mkt, A) * p2(mkt, A)
+
+print(f'established firm, minimum value of information {voi_1.min():.3e}')
+print(f'new firm, minimum value of information {voi_2.min():.3e}')
+print(f'ratio voi_1 / voi_2: min {np.min(voi_1 / voi_2):.6f}, '
+ f'max {np.max(voi_1 / voi_2):.6f}')
+```
+
+两者均为正,因此两个价值函数在信念上都是凸的。
+
+这正是 {doc}`blackwell_kihlstrom` 逻辑的体现:信念是一个鞅,更多的实验使其分散得更开,而拥有凸价值函数的企业能从这种分散中获益。
+
+更令人惊讶的是,无论在何种信念下,这个比率都恰好为 $2$。
+
+**老牌**企业对信息的估值是新进入者的两倍,因为在均衡中,正是老牌企业相对于不确定性解决后的收入放弃了当前的收入。
+
+## 先过度实验,后不足实验
+
+现在我们可以将均衡份额与有效份额进行比较。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Equilibrium versus efficient experimentation
+ name: fig-md-efficiency
+---
+gap = n_star(mkt, A) - n_eq(mkt, A)
+cross = A[np.argmin(np.abs(gap))]
+
+fig, axes = plt.subplots(1, 2, figsize=(12, 4.2))
+axes[0].plot(A, n_star(mkt, A), lw=2, label=r'efficient $n^*(\alpha)$')
+axes[0].plot(A, n_eq(mkt, A), lw=2, label=r'equilibrium $n(\alpha)$')
+axes[0].plot(A, m_star(mkt, A), lw=1.5, ls='--', color='0.5',
+ label=r'myopic planner $m^*(\alpha)$')
+axes[0].set(xlabel=r'$\alpha$', ylabel='market share of the new firm',
+ title='experimentation policies')
+axes[0].legend(fontsize=9)
+
+axes[1].plot(A, gap, lw=2, color='C3')
+axes[1].axhline(0, color='0.3', lw=1)
+axes[1].axvline(cross, color='0.6', ls=':', lw=1.5)
+axes[1].fill_between(A, gap, 0, where=gap < 0, alpha=0.15, color='C3')
+axes[1].fill_between(A, gap, 0, where=gap > 0, alpha=0.15, color='C0')
+axes[1].annotate('equilibrium\nexperiments too much', (0.05, gap.min() / 2),
+ fontsize=9)
+axes[1].annotate('too little', (0.75, gap.max() / 2), fontsize=9)
+axes[1].set(xlabel=r'$\alpha$', ylabel=r'$n^*(\alpha) - n(\alpha)$',
+ title=f'single crossing at ' + rf'$\alpha = {cross:.3f}$')
+fig.tight_layout()
+plt.show()
+
+print(f'gap is monotone increasing: {np.all(np.diff(gap) > 0)}')
+print(f'number of sign changes: {int(np.sum(np.diff(np.sign(gap)) != 0))}')
+```
+
+直觉在于是谁必须降价才能争取到一个买方。
+
+在悲观信念下,新进入者规模较小,因此多吸引一个买方对其平均收入的损失很小,而老牌企业规模较大,不愿意通过对所有买方降价来捍卫其份额。
+
+因此新进入者会积极扩张,市场出现过度实验。
+
+在乐观信念下,情形正好相反,老牌企业竞争得更激烈,实验低于有效水平。
+
+## 时间上的扩散
+
+到目前为止,一切都是状态 $\alpha$ 的函数。
+
+要沿日历时间跟踪一个产品,我们需要在产品确实优质时信念的运动规律。
+
+在 $\mu = \mu_H$ 的条件下,信念获得向上的漂移,因为数据是由 $\mu_H$ 生成的,而市场仍将权重 $1 - \alpha$ 放在 $\mu_L$ 上,
+
+$$
+d\alpha = \frac{n(\alpha)(\mu_H - \mu_L)^2 \alpha (1-\alpha)^2}{\sigma^2}\, dt
++ \frac{(\mu_H - \mu_L)\alpha(1-\alpha)\sqrt{n(\alpha)}}{\sigma}\, dB .
+$$ (eq:md_conditional)
+
+去掉噪声项就得到平均信念的确定性路径。
+
+```{code-cell} ipython3
+def mean_belief_path(mkt, alpha0, T, dt, policy):
+ """Deterministic path of the mean posterior when mu = mu_H."""
+ steps = int(T / dt)
+ a = np.empty(steps + 1)
+ a[0] = alpha0
+ dmu2 = (mkt.mu_H - mkt.mu_L) ** 2 / mkt.sigma ** 2
+ for k in range(steps):
+ drift = policy(a[k]) * dmu2 * a[k] * (1 - a[k]) ** 2
+ a[k + 1] = min(max(a[k] + drift * dt, 1e-12), 1 - 1e-12)
+ return a
+```
+
+```{prf:proposition} S形扩散
+:label: md_prop_sshape
+
+在产品优质的条件下,平均市场份额 $\hat n(t)$ 随时间递增。
+
+当 $\hat\alpha(t) \leq 1/3$ 时,其增长速率本身是递增的,此后则递减。
+```
+
+这个S形是两种力量共同作用的结果。
+
+随着信念远离零,学习加速,这加快了新进入者份额的增长;但均衡份额 $n(\alpha)$ 是凹的,因此信念的进一步改善转化为越来越小的份额增益。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: The S-shaped diffusion path of a successful new product
+ name: fig-md-diffusion
+---
+T, dt, alpha0 = 8.0, 1e-3, 0.03
+policy = lambda a: n_eq(mkt, a)
+
+a_mean = mean_belief_path(mkt, alpha0, T, dt, policy)
+t_grid = np.linspace(0, T, len(a_mean))
+
+rng = np.random.default_rng(12)
+paths = simulate_beliefs(mkt, alpha0, T, dt, np.full(6, mkt.mu_H), rng, policy)
+
+fig, axes = plt.subplots(1, 2, figsize=(12, 4.2))
+for pth in paths:
+ axes[0].plot(t_grid, pth, lw=0.7, alpha=0.55, color='C0')
+axes[0].plot(t_grid, a_mean, lw=2.5, color='C3', label='mean path')
+axes[0].axhline(1 / 3, color='0.5', ls=':', lw=1.5)
+axes[0].set(xlabel='time', ylabel=r'$\alpha(t)$', title='beliefs')
+axes[0].legend(fontsize=9)
+
+for pth in paths:
+ axes[1].plot(t_grid, n_eq(mkt, pth), lw=0.7, alpha=0.55, color='C0')
+axes[1].plot(t_grid, n_eq(mkt, a_mean), lw=2.5, color='C3', label='mean path')
+axes[1].set(xlabel='time', ylabel=r'$n(t)$',
+ title='market share of the new firm')
+axes[1].legend(fontsize=9)
+fig.tight_layout()
+plt.show()
+```
+
+拐点恰好出现在 {prf:ref}`md_prop_sshape` 所指出的位置。
+
+```{code-cell} ipython3
+n_mean = n_eq(mkt, a_mean)
+growth = np.gradient(n_mean, t_grid)
+k = np.argmax(growth)
+print(f'share grows fastest at t = {t_grid[k]:.3f}, '
+ f'where alpha = {a_mean[k]:.4f} (theory: 1/3)')
+
+drift = policy(A) * (mkt.mu_H - mkt.mu_L) ** 2 * A * (1 - A) ** 2
+print(f'belief drift peaks at alpha = {A[np.argmax(drift)]:.4f} '
+ f'(theory: between 1/3 and 2/3)')
+```
+
+价格随份额同步变动。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Price paths of the two firms
+ name: fig-md-prices
+---
+fig, ax = plt.subplots()
+for pth in paths:
+ ax.plot(t_grid, p1(mkt, pth), lw=0.7, alpha=0.5, color='C0')
+ ax.plot(t_grid, p2(mkt, pth), lw=0.7, alpha=0.5, color='C1')
+ax.plot(t_grid, p1(mkt, a_mean), lw=2.5, color='C0',
+ label=r'$p_1$, established firm')
+ax.plot(t_grid, p2(mkt, a_mean), lw=2.5, color='C1', label=r'$p_2$, new firm')
+ax.set(xlabel='time', ylabel='price',
+ title='the incumbent retreats as the entrant is vindicated')
+ax.legend()
+fig.tight_layout()
+plt.show()
+```
+
+## 鞅性质
+
+{cite:t}`BergemannValimaki1997` 从概率角度刻画了均衡对象:新进入者的价格是一个鞅,老牌企业的价格和新进入者的份额是上鞅,而两者的收入都是下鞅。
+
+由于 $\alpha$ 是一个鞅,上述每一条性质都源于 $\alpha$ 对应函数的形状,我们可以通过模拟逐一验证。
+
+```{code-cell} ipython3
+rng = np.random.default_rng(3)
+a0, M = 0.5, 20_000
+
+# draw the true quality from the prior, one value per path
+mu_true = np.where(rng.random(M) < a0, mkt.mu_H, mkt.mu_L)
+ends = simulate_beliefs(mkt, a0, 4.0, 2e-3, mu_true, rng, policy)[:, -1]
+
+rows = [
+ ('belief', a0, ends.mean(), 'martingale'),
+ ('share of new firm', n_eq(mkt, a0), n_eq(mkt, ends).mean(), 'supermartingale'),
+ ('price of new firm', p2(mkt, a0), p2(mkt, ends).mean(), 'martingale'),
+ ('price of incumbent', p1(mkt, a0), p1(mkt, ends).mean(), 'supermartingale'),
+ ('revenue of incumbent', (1 - n_eq(mkt, a0)) * p1(mkt, a0),
+ ((1 - n_eq(mkt, ends)) * p1(mkt, ends)).mean(), 'submartingale'),
+ ('revenue of new firm', n_eq(mkt, a0) * p2(mkt, a0),
+ (n_eq(mkt, ends) * p2(mkt, ends)).mean(), 'submartingale')]
+
+print(f'{"":24s}{"t = 0":>10s}{"E[t = 4]":>11s}{"change":>10s} prediction')
+for name, x0, xT, pred in rows:
+ print(f'{name:24s}{x0:10.4f}{xT:11.4f}{xT - x0:+10.4f} {pred}')
+```
+
+每个符号都与预测的一致。
+
+新进入者的预期份额随时间*下降*,尽管在产品优质的条件下其份额随时间上升,这是因为早期的激进行为反映的是信息的价值,而不是对产品的信心。
+
+两家企业都预期未来能赚取更多,这正是它们牺牲当前利润以换取信息的意义所在。
+
+## 结束语
+
+本节中现有两讲聚焦于价值完全出于工具性目的的信息。
+
+在 {doc}`pricing_information` 中,卖方设计并为实验定价,其中有趣的经济学源于布莱克维尔序不完备这一事实。
+
+而在这里,没有人为信息定价,有趣的经济学源于只有一家企业的销售才能产生信息这一事实。
+
+两者都建立在 {doc}`blackwell_kihlstrom` 相同的基础之上:信息对决策者的价值恰恰取决于决策问题的价值函数在信念上是否为凸。
+
+{cite:t}`BergemannValimaki1997` 独具特色的启示是,这种凸性是被*竞争对手*共同拥有的。
+
+由于两家企业都宁愿面对一个已经解决了新产品质量不确定性的市场,垂直质量的不确定性缓和了价格竞争,其效果与 {cite:t}`ShakedSutton1982` 中确定性差异化的效果类似。
+
+这就是为什么老牌企业在初期让新进入者以低价进入市场,以及为什么成功的产品会沿着S形路径扩散。
+
+本讲使用的连续时间技巧,特别是取无贴现极限以保持贝尔曼方程可处理性的做法,源自 {cite:t}`BoltonHarris1999`,他们是最早在连续时间中研究策略性实验的学者。
+
+一篇相关论文 {cite:t}`BergemannValimaki2000` 研究了同一个双寡头模型,但假设存在一个由*同质*消费者构成的连续统。
+
+那里的同质性排除了市场分割,因此本讲中产生扩散路径的水平差异化在那篇论文中并不存在,分析转而集中在信息外部性如何影响市场效率上。
+
+## 练习
+
+```{exercise-start}
+:label: md_ex1
+```
+
+条件 {eq}`eq:md_condition4` 要求两个质量水平都满足 $|\mu_i - s| < h$。
+
+1. 用代数方法证明这将完全信息下新企业的均衡份额限制在区间 $(1/3, 2/3)$ 内,从而对每个信念都有 $n(\alpha) \in (1/3, 2/3)$。
+
+2. 对若干组符合条件的 $(\mu_L, \mu_H)$ 数值组合进行数值验证。
+
+3. {cite:t}`BergemannValimaki1997` 用 $s = 4$、$h = 1$、$\mu_L = 2$ 和 $\mu_H = 6$ 绘制他们的扩散图。
+
+ 检验这些数值是否满足 {eq}`eq:md_condition4`,计算在 $\alpha \in \{0, 1\}$ 处的均衡份额,并计算每个质量水平下短视有效份额 $m^*$。
+
+ 这里出了什么问题,本讲的哪些结果依然成立?
+
+```{exercise-end}
+```
+
+```{solution-start} md_ex1
+:class: dropdown
+```
+
+以下是一种解法:
+
+在质量为 $\mu_i$ 的完全信息下,均衡份额为
+$n_i = \bigl(\tfrac13(\mu_i - s) + h\bigr)/(2h)$。
+
+条件 {eq}`eq:md_condition4` 给出 $-h < \mu_i - s < h$,因此
+$\tfrac13(\mu_i - s) \in (-h/3, h/3)$,从而
+$n_i \in \bigl(\tfrac{2h/3}{2h}, \tfrac{4h/3}{2h}\bigr) = (1/3, 2/3)$。
+
+由于 $n(\alpha)^2$ 是 $n_0^2$ 和 $n_1^2$ 的凸组合,因此对每个 $\alpha$,均衡份额都落在 $n_0$ 和 $n_1$ 之间。
+
+```{code-cell} ipython3
+for mu_L, mu_H in [(3.1, 4.9), (3.4, 4.6), (3.9, 4.1)]:
+ m_ = Market(mu_L=mu_L, mu_H=mu_H)
+ lo, hi = n_eq(m_, 0.0), n_eq(m_, 1.0)
+ print(f'(mu_L, mu_H) = ({mu_L}, {mu_H}): n_eq ranges over '
+ f'[{lo:.4f}, {hi:.4f}] inside (1/3, 2/3): {1/3 < lo and hi < 2/3}')
+```
+
+```{code-cell} ipython3
+class LooseMarket(Market):
+ def __init__(self, **kw): # skip the assertion
+ self.s, self.h = kw['s'], kw['h']
+ self.mu_L, self.mu_H, self.sigma = kw['mu_L'], kw['mu_H'], kw.get('sigma', 1.0)
+
+
+paper = LooseMarket(s=4, h=1, mu_L=2, mu_H=6)
+print(f'condition (4) needs s - h < mu_L: {paper.s - paper.h} < {paper.mu_L}? '
+ f'{paper.s - paper.h < paper.mu_L}')
+print(f'condition (4) needs mu_H < s + h: {paper.mu_H} < {paper.s + paper.h}? '
+ f'{paper.mu_H < paper.s + paper.h}')
+print(f'\nequilibrium shares: n(0) = {n_eq(paper, 0.0):.4f}, '
+ f'n(1) = {n_eq(paper, 1.0):.4f}')
+for mu_i, nm in [(paper.mu_L, 'mu_L'), (paper.mu_H, 'mu_H')]:
+ print(f'myopically efficient share at {nm}: '
+ f'{(mu_i - paper.s + paper.h) / (2 * paper.h):+.4f}')
+```
+
+论文图示所用的参数在两端都违反了 {eq}`eq:md_condition4`。
+
+其后果是*有效*配置处于一个角点解:当 $\mu = \mu_L$ 时,它会将所有买方分配给老牌产品,而当 $\mu = \mu_H$ 时会将所有买方分配给新产品,因此内部公式 {eq}`eq:md_nstar` 不再适用,{prf:ref}`md_prop_efficient` 中的效率比较也随之失效。
+
+关于*均衡*的一切结果都得以保留,因为均衡份额在 $1/6$ 和 $5/6$ 处依然严格处于内部。
+
+这也是为什么这些参数适合用来绘制扩散路径——这正是论文使用它们的唯一目的——以及为什么它们能画出比任何符合条件的参数集都更为戏剧化的S形曲线。
+
+```{solution-end}
+```
+
+```{exercise-start}
+:label: md_ex2
+```
+
+本讲发现存在一个信念,均衡实验在该处从过度转为不足。
+
+1. 编写一个通过二分法定位这一交叉点的函数。
+
+2. 在保持均值 $\tfrac12(\mu_L + \mu_H) = s$ 固定的情况下,计算质量差距 $\mu_H - \mu_L$ 扩大时该交叉点的变化;再计算水平差异化参数 $h$ 变化时该交叉点的变化。
+
+3. 每当比率 $(\mu_H - \mu_L)/h$ 一致时,两组实验都会产生相同的数字。
+
+ 猜测该交叉点的闭式表达式,并进行数值验证。
+
+4. 当质量均值偏离 $s$ 时,你的公式是否仍然成立?
+
+```{exercise-end}
+```
+
+```{solution-start} md_ex2
+:class: dropdown
+```
+
+以下是一种解法:
+
+```{code-cell} ipython3
+def crossing(mkt, tol=1e-13):
+ """Belief at which n*(alpha) = n(alpha), by bisection."""
+ lo, hi = 1e-12, 1 - 1e-12
+ f = lambda a: n_star(mkt, a) - n_eq(mkt, a)
+ if f(lo) > 0 or f(hi) < 0:
+ return np.nan
+ while hi - lo > tol:
+ mid = (lo + hi) / 2
+ lo, hi = (mid, hi) if f(mid) < 0 else (lo, mid)
+ return (lo + hi) / 2
+
+
+print('widening the quality spread, midpoint fixed at s = 4, h = 1')
+for spread in [0.4, 0.8, 1.2, 1.6, 1.9]:
+ m_ = Market(s=4, h=1, mu_L=4 - spread / 2, mu_H=4 + spread / 2)
+ print(f' (mu_H - mu_L)/h = {spread / 1:.3f}: crossing = {crossing(m_):.6f}')
+
+print('\nvarying horizontal differentiation, mu = (3.4, 4.6)')
+for h_ in [0.65, 0.8, 1.0, 1.5, 2.5]:
+ m_ = Market(s=4, h=h_, mu_L=3.4, mu_H=4.6)
+ print(f' (mu_H - mu_L)/h = {1.2 / h_:.3f}: crossing = {crossing(m_):.6f}')
+```
+
+按比率 $(\mu_H - \mu_L)/h$ 排序后,两张表对齐了,这说明交叉点仅通过该比率依赖于参数。
+
+这些数值落在一条经过 $1/2$、斜率为 $-1/6$ 的直线上。
+
+```{code-cell} ipython3
+print(f'{"(mu_H-mu_L)/h":>15s}{"bisection":>12s}{"1/2 - ratio/6":>16s}{"error":>12s}')
+for mu_L_, mu_H_, h_ in [(3.4, 4.6, 1.0), (3.1, 4.9, 1.0), (3.8, 4.2, 1.0),
+ (3.4, 4.6, 1.5), (3.4, 4.6, 0.8), (3.05, 4.95, 1.0)]:
+ m_ = Market(s=4, h=h_, mu_L=mu_L_, mu_H=mu_H_)
+ r = (mu_H_ - mu_L_) / h_
+ c, pred = crossing(m_), 0.5 - r / 6
+ print(f'{r:15.4f}{c:12.6f}{pred:16.6f}{c - pred:12.1e}')
+```
+
+所以,当两个质量水平相对 $s$ 对称分布时,转折发生在
+
+$$
+\alpha^{\mathrm{cross}} = \frac12 - \frac{\mu_H - \mu_L}{6h} ,
+$$
+
+条件 {eq}`eq:md_condition4` 将此值严格限制在 $(1/6, 1/2)$ 内,因为该条件要求 $\mu_H - \mu_L < 2h$。
+
+因此,随着质量差距相对于 $h$ 的扩大,过度实验区域会*收缩*。
+
+差距越大,意味着在学习中所面临的风险越大,有效策略会通过大量实验作出反应;而由每家企业私人收入动机所驱动的均衡,除了在最悲观的信念下,都跟不上这个步伐。
+
+提高 $h$ 的作用则相反,因为强黏性的买方会削弱价格工具,让新进入者比计划者所选择的更自由地扩张。
+
+这种对称性至关重要。
+
+```{code-cell} ipython3
+print('moving the quality midpoint away from s, with mu = (3.4, 4.6), h = 1')
+for s_ in [3.9, 4.0, 4.1]:
+ m_ = Market(s=s_, h=1, mu_L=3.4, mu_H=4.6)
+ mid = (3.4 + 4.6) / 2
+ print(f' s = {s_} (midpoint {mid}): crossing = {crossing(m_):.6f}'
+ f' formula = {0.5 - 1.2 / 6:.6f}')
+```
+
+一旦均值不再等于 $s$,该公式便不再成立,因此这是一个刀锋式结果,而非普遍性结果。
+
+```{solution-end}
+```
+
+```{exercise-start}
+:label: md_ex3
+```
+
+本练习将与 {doc}`blackwell_kihlstrom` 的联系具体化。
+
+在那一讲中,决策者恰好在决策问题的价值在信念上为凸时,能从信息量更大的实验中获益,因为信息量更大的实验会产生后验分布的保均值扩散。
+
+在这里,信念是一个鞅,实验控制着它扩散的速度,因此同样的逻辑适用于每家企业。
+
+1. 绘制每家企业的信息价值,即 $v_i(\alpha)$ 减去其当前均衡收入,关于 $\alpha$ 的图形。
+
+2. 确认两者在内部处处为正,并在 $\alpha \in \{0, 1\}$ 处消失,解释为什么它们必须在那里消失。
+
+3. 信息价值也等于 $\tfrac12 n(\alpha)\Sigma^2(\alpha)V_i''(\alpha)$。
+
+ 利用这一点求出 $V_i''(\alpha)$,并确认两个价值函数都是凸的。
+
+```{exercise-end}
+```
+
+```{solution-start} md_ex3
+:class: dropdown
+```
+
+以下是一种解法:
+
+```{code-cell} ipython3
+Ai = np.linspace(0.005, 0.995, 2001)
+voi_1 = v1(mkt, Ai) - (1 - n_eq(mkt, Ai)) * p1(mkt, Ai)
+voi_2 = v2(mkt, Ai) - n_eq(mkt, Ai) * p2(mkt, Ai)
+
+fig, axes = plt.subplots(1, 2, figsize=(12, 4.2))
+axes[0].plot(Ai, voi_1, lw=2, label='established firm')
+axes[0].plot(Ai, voi_2, lw=2, label='new firm')
+axes[0].axhline(0, color='0.3', lw=1)
+axes[0].set(xlabel=r'$\alpha$', ylabel='value of information',
+ title='both firms gain from experimentation')
+axes[0].legend(fontsize=9)
+
+V1pp = 2 * voi_1 / (n_eq(mkt, Ai) * Sigma2(mkt, Ai))
+V2pp = 2 * voi_2 / (n_eq(mkt, Ai) * Sigma2(mkt, Ai))
+axes[1].plot(Ai, V1pp, lw=2, label=r"$V_1''(\alpha)$")
+axes[1].plot(Ai, V2pp, lw=2, label=r"$V_2''(\alpha)$")
+axes[1].set(xlabel=r'$\alpha$', yscale='log',
+ title='second derivatives of the value functions')
+axes[1].legend(fontsize=9)
+fig.suptitle('The value of information to each firm')
+fig.tight_layout()
+plt.show()
+
+print(f'minimum value of information, established firm {voi_1.min():.3e}')
+print(f'minimum value of information, new firm {voi_2.min():.3e}')
+print(f'minimum of V1\'\' {V1pp.min():.4f} minimum of V2\'\' {V2pp.min():.4f}')
+```
+
+两条曲线在内部严格为正,两个二阶导数也都严格为正,因此两个价值函数都是凸的。
+
+信息的价值在 $\alpha \in \{0, 1\}$ 处消失,有两个相互强化的原因。
+
+一是此时已没有可学习的内容,因此均衡与完全信息下的均衡重合,收入差距随之消失。
+
+二是学习速度 $\Sigma^2(\alpha) \propto \alpha^2(1-\alpha)^2$ 也同时消失,因此即使价值函数是凸的,一个不能揭示任何信息的实验也不能带来任何收益。
+
+而二阶导数在端点处*并不*消失,这恰恰是 {doc}`blackwell_kihlstrom` 所强调的要点:对信息的*支付意愿*始终为正,但随着信念趋于退化,信息的*供给*却枯竭了。
+
+```{solution-end}
+```
\ No newline at end of file
diff --git a/lectures/pricing_information.md b/lectures/pricing_information.md
new file mode 100644
index 0000000..29dd8d9
--- /dev/null
+++ b/lectures/pricing_information.md
@@ -0,0 +1,1011 @@
+---
+jupytext:
+ text_representation:
+ extension: .md
+ format_name: myst
+ format_version: 0.13
+ jupytext_version: 1.16.7
+kernelspec:
+ display_name: Python 3 (ipykernel)
+ language: python
+ name: python3
+translation:
+ title: 信息的设计与定价
+ headings:
+ Overview: 概述
+ The decision problem: 决策问题
+ Experiments and their value: 实验及其价值
+ Blackwell's order is only partial: 布莱克韦尔序只是偏序
+ The seller's problem: 卖家的问题
+ Two types: 两种类型
+ Two types::Noncongruent types: 不一致类型
+ A continuum of types: 连续类型
+ A continuum of types::Solving it as a linear program: 将其作为线性规划求解
+ A continuum of types::Uniformly distributed types: 均匀分布的类型
+ A continuum of types::Bimodal types and the case for versioning: 双峰类型分布与版本化的理由
+ Concluding remarks: 结束语
+ Exercises: 练习
+---
+
+(pricing_information)=
+```{raw} jupyter
+
+```
+
+# 信息的设计与定价
+
+```{index} single: Information; pricing
+```
+
+```{index} single: Blackwell; and screening
+```
+
+```{contents} Contents
+:depth: 2
+```
+
+## 概述
+
+本节前面的讲座探讨了决策者*应该*偏好哪种统计实验的问题。
+
+{doc}`blackwell_kihlstrom` 给出了经典答案:当*每一个*贝叶斯决策者使用实验 $\mu$ 都能获得弱意义上更高的期望效用时,实验 $\mu$ 就至少与实验 $\nu$ 一样具有信息量。
+
+本讲座提出了一个不同的问题。
+
+假设某人*拥有*数据并想要出售它。
+
+她应该出售什么,定价多少?
+
+我们研究 {cite:t}`BergemannBonattiSmolin2018`,他们分析了一个垄断数据卖家面对一个已经拥有自己私人信息的买家的情形。
+
+买家的私人信息恰恰是他想要隐藏的东西,因为它决定了他的支付意愿。
+
+因此卖家通过提供一份统计实验*菜单*来进行筛选,为向某些买家收取更高价格而降低出售给其他买家的信息质量。
+
+核心发现是,降低信息质量并不仅仅是添加噪声那么简单。
+
+布莱克韦尔序是一种*偏*序,因此不同的决策者可能对两个实验做出不同的排序。
+
+卖家正是利用这些不可比较的实验对:信息具有**纵向**维度(其质量)和**横向**维度(其位置)。
+
+这一横向维度在普通垄断者对质量或数量的筛选中没有对应物,正是它使卖家能够榨取原本无法获得的租金。
+
+在本讲座中,我们将:
+
+- 计算任意实验对任意信念类型的价值,
+- 通过数值验证布莱克韦尔序无法对卖家想要使用的实验进行排序,
+- 通过暴力搜索求解两类型筛选问题,并与论文中的解析解进行核对,
+- 将连续类型问题作为一个**线性规划**求解,无需手动实现熨平(ironing)过程即可重现论文中的熨平和分组结果。
+
+让我们从导入开始。
+
+```{code-cell} ipython3
+import matplotlib.pyplot as plt
+import numpy as np
+from scipy import stats
+from scipy.optimize import linprog
+
+plt.rcParams['figure.figsize'] = (10, 5)
+np.set_printoptions(precision=4, suppress=True)
+```
+
+## 决策问题
+
+数据买家必须在不知道状态 $\omega$(属于有限集 $\Omega$)的情况下从有限集 $A$ 中选择一个行动 $a$。
+
+我们始终使用**匹配**情形,即买家希望其行动与状态匹配,
+
+$$
+u(\omega_i, a_j) = \mathbb{1}[i = j] \cdot u_i ,
+$$ (eq:pi_matching)
+
+因此匹配状态 $\omega_i$ 支付 $u_i > 0$,任何不匹配都支付零。
+
+从这里开始,我们采用两个状态和两个行动,$\Omega = \{\omega_1, \omega_2\}$ 和
+$A = \{a_1, a_2\}$,这正是 {cite:t}`BergemannBonattiSmolin2018` 完全求解的情形。
+
+买家的**类型**是他的临时信念
+
+$$
+\theta = \Pr[\omega = \omega_1] \in [0, 1] ,
+$$
+
+这是私人信息。
+
+卖家只知道 $\theta$ 所服从的分布 $F$。
+
+没有额外信息时,买家会在两个恒定行动中选择更好的一个,因此他的保留效用为
+
+$$
+u(\theta) = \max\{\theta u_1,\ (1 - \theta) u_2\} .
+$$ (eq:pi_outside)
+
+*最*不确定该做什么的类型是两项相等的那个,
+
+$$
+\theta^* = \frac{u_2}{u_1 + u_2} .
+$$ (eq:pi_thetastar)
+
+高于 $\theta^*$ 的类型会自行选择 $a_1$,低于 $\theta^*$ 的类型会自行选择 $a_2$。
+
+```{note}
+买家的信念 $\theta$ 可以由共同的先验加上私下观察到的信号生成,正如 {doc}`likelihood_bayes` 中所述。
+
+拥有非常精确的私人信号的买家其 $\theta$ 接近 $0$ 或 $1$;一无所获的买家则位于接近 $\theta^*$ 的位置。
+
+因此,本讲座中的"高类型"意味着*信息不良*,而信息不良的买家愿意支付最高的价格。
+```
+
+## 实验及其价值
+
+统计实验是将状态映射到信号的随机矩阵。
+
+在两个状态和两个行动的情形下,考虑两个信号就足够了,我们写作
+
+$$
+E = \begin{pmatrix} \pi_1 & 1 - \pi_1 \\ 1 - \pi_2 & \pi_2 \end{pmatrix},
+$$ (eq:pi_experiment)
+
+其中第 $i$ 行给出状态 $\omega_i$ 下的信号分布。
+
+因此 $\pi_1 = \Pr[s_1 \mid \omega_1]$,$\pi_2 = \Pr[s_2 \mid \omega_2]$。
+
+我们采用归一化 $\pi_1 + \pi_2 \geq 1$,这仅仅是说信号 $s_1$ 在状态 $\omega_1$ 中相对于状态 $\omega_2$ 更可能出现。
+
+**完全信息**实验 $\overline{E}$ 具有 $\pi_1 = \pi_2 = 1$。
+
+看到信号 $s_k$ 后,买家选择期望收益最高的行动,因此他的总价值是通过逐个信号求和所能做到的最好结果而得到的。
+
+减去他的保留效用 {eq}`eq:pi_outside` 得到**信息的净价值**
+
+$$
+V(E, \theta)
+= \max\{\theta \pi_1 u_1,\ (1-\theta)(1-\pi_2) u_2\}
++ \max\{\theta (1-\pi_1) u_1,\ (1-\theta)\pi_2 u_2\}
+- \max\{\theta u_1,\ (1-\theta) u_2\} .
+$$ (eq:pi_value)
+
+```{code-cell} ipython3
+def value(pi1, pi2, theta, u1=1.0, u2=1.0):
+ """Net value of experiment (pi1, pi2) to a buyer with belief theta."""
+ theta = np.asarray(theta, dtype=float)
+ s1 = np.maximum(theta * pi1 * u1, (1 - theta) * (1 - pi2) * u2)
+ s2 = np.maximum(theta * (1 - pi1) * u1, (1 - theta) * pi2 * u2)
+ return s1 + s2 - np.maximum(theta * u1, (1 - theta) * u2)
+```
+
+如果买家只是简单地服从每个信号隐含的建议,在 $s_1$ 之后采取 $a_1$,在 $s_2$ 之后采取 $a_2$,则该价值简化为
+
+$$
+V(E, \theta) = \max\bigl\{\theta \pi_1 u_1 + (1-\theta)\pi_2 u_2
+- \max\{\theta u_1, (1-\theta)u_2\},\ 0\bigr\} ,
+$$ (eq:pi_value_obedient)
+
+这正是论文所使用的表达式。
+
+```{code-cell} ipython3
+def value_obedient(pi1, pi2, theta, u1=1.0, u2=1.0):
+ """Value when the buyer follows the recommendation, or ignores the signal."""
+ theta = np.asarray(theta, dtype=float)
+ return np.maximum(theta * pi1 * u1 + (1 - theta) * pi2 * u2
+ - np.maximum(theta * u1, (1 - theta) * u2), 0.0)
+```
+
+这两个表达式在归一化 $\pi_1 + \pi_2 \geq 1$ 下完全一致,而在没有该归一化的情况下则可以有很大差异,这正是归一化的目的所在。
+
+```{code-cell} ipython3
+grid = np.linspace(0, 1, 2001)
+worst_ok = worst_bad = 0.0
+for p1 in np.linspace(0, 1, 51):
+ for p2 in np.linspace(0, 1, 51):
+ gap = np.abs(value(p1, p2, grid) - value_obedient(p1, p2, grid)).max()
+ if p1 + p2 >= 1:
+ worst_ok = max(worst_ok, gap)
+ else:
+ worst_bad = max(worst_bad, gap)
+
+print(f'largest gap where pi1 + pi2 >= 1: {worst_ok:.2e}')
+print(f'largest gap where pi1 + pi2 < 1: {worst_bad:.4f}')
+```
+
+从这里开始,我们使用一般形式 {eq}`eq:pi_value`,因为一个*谎报*自己类型的买家通常不会想要服从别人实验中内置的建议。
+
+以下是信息价值作为买家类型函数的图示。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Value of full and partial information
+ name: fig-pi-value
+---
+theta = np.linspace(0, 1, 1001)
+
+fig, axes = plt.subplots(1, 2, figsize=(11, 4))
+for ax, (p1, p2), ttl in zip(
+ axes, [(1.0, 1.0), (0.5, 1.0)],
+ [r'fully informative $(\pi_1,\pi_2)=(1,1)$',
+ r'partially informative $(\pi_1,\pi_2)=(1/2,1)$']):
+ ax.plot(theta, value(p1, p2, theta), lw=2)
+ ax.axvline(0.5, color='0.6', ls='--', lw=1)
+ ax.set(xlabel=r'$\theta$', ylabel=r'$V(E,\theta)$', title=ttl)
+fig.suptitle('Value of information, $u_1 = u_2 = 1$')
+fig.tight_layout()
+plt.show()
+```
+
+这些图形有三个特征决定了接下来的所有内容。
+
+价值在 $\theta$ 中是**分段线性**的,因为类型是概率,而期望效用在概率上是线性的。
+
+价值在 $\theta^*$ 处**最高**,在 $\theta \in \{0, 1\}$ 处降至零:已经知道状态的买家将不会支付任何费用,而知道最少的买家将支付最多的费用。
+
+右图中部分信息实验对高于 $2/3$ 的类型**完全没有价值**,尽管它对刚好低于 $1/2$ 的类型价值很大。
+
+后一个属性正是卖家的主要工具。
+
+## 布莱克韦尔序只是偏序
+
+{doc}`blackwell_kihlstrom` 确立了当且仅当 $E'$ 是 $E$ 的**弱化**(garbling)时,实验 $E$ 在布莱克韦尔的意义下至少与 $E'$ 一样具有信息量,这意味着存在一个随机矩阵 $M$,满足
+
+$$
+E' = E M .
+$$ (eq:pi_garbling)
+
+当 $E$ 可逆时,这很容易验证:求解 $M = E^{-1}E'$ 并检验 $M$ 是否为随机矩阵。
+
+```{code-cell} ipython3
+def experiment(pi1, pi2):
+ return np.array([[pi1, 1 - pi1], [1 - pi2, pi2]])
+
+
+def garbling(E, Ep, tol=1e-9):
+ """Return M with Ep = E @ M if Ep is a garbling of E, else None."""
+ if abs(np.linalg.det(E)) < tol:
+ return None
+ M = np.linalg.solve(E, Ep)
+ if (M > -tol).all() and np.allclose(M.sum(axis=1), 1, atol=tol):
+ return M
+ return None
+
+
+pairs = [((1, 1), (0.8, 1)), ((1, 1), (1, 0.8)),
+ ((0.9, 0.9), (0.8, 0.8)),
+ ((0.8, 1), (1, 0.8)), ((1, 0.8), (0.8, 1))]
+for a, b in pairs:
+ ok = garbling(experiment(*a), experiment(*b)) is not None
+ print(f' is {b} a garbling of {a}? {"yes" if ok else "no"}')
+```
+
+完全信息实验能弱化为任何实验,而 $(0.9, 0.9)$ 能弱化为噪声更均匀的 $(0.8, 0.8)$。
+
+这些是**纵向**比较,布莱克韦尔定理说明每个类型对此都认同。
+
+但 $(0.8, 1)$ 和 $(1, 0.8)$ 在任一方向上都不能相互弱化。
+
+布莱克韦尔序根本无法对它们进行排序,这意味着不同类型可以自由地对它们做出不同的排序。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Two experiments that Blackwell's order does not rank
+ name: fig-pi-blackwell
+---
+va, vb = value(0.8, 1, theta), value(1, 0.8, theta)
+
+fig, ax = plt.subplots()
+ax.plot(theta, va, lw=2, label=r'$E_a = (0.8, 1)$')
+ax.plot(theta, vb, lw=2, label=r'$E_b = (1, 0.8)$')
+ax.fill_between(theta, va, vb, where=va > vb, alpha=0.15, color='C0')
+ax.fill_between(theta, va, vb, where=vb > va, alpha=0.15, color='C1')
+ax.axvline(0.5, color='0.4', ls='--', lw=1)
+ax.set(xlabel=r'$\theta$', ylabel=r'$V(E,\theta)$',
+ title='Types below $1/2$ prefer $E_a$, types above prefer $E_b$')
+ax.legend()
+fig.tight_layout()
+plt.show()
+
+for t in [0.2, 0.35, 0.65, 0.8]:
+ pref = 'E_a' if value(0.8, 1, t) > value(1, 0.8, t) else 'E_b'
+ print(f' theta = {t}: V(E_a) = {value(0.8, 1, t):.4f},'
+ f' V(E_b) = {value(1, 0.8, t):.4f} prefers {pref}')
+```
+
+$E_a$ 更擅长排除状态 $\omega_2$,而 $E_b$ 更擅长排除状态 $\omega_1$。
+
+已经认为 $\omega_1$ 更可能的买家想要帮助区分他*尚未*排除的可能性,因此他重视 $E_b$;而倾向于另一方的买家则重视 $E_a$。
+
+这就是信息的**横向**维度。
+
+在普通的关于质量或数量的非线性定价中,所有类型都认同产品的排序,卖家只能沿着单一梯度上下移动。
+
+在这里,卖家有第二个操纵杆,转动它可以让她把对某一类型毫无价值的东西交给另一类型。
+
+## 卖家的问题
+
+卖家承诺提供一份菜单 $\{E(\theta), t(\theta)\}$,为每个报告的类型分配一个实验和一个价格。
+
+支付不能以状态、信号或买家的行动为条件,因此一个实验对买家的价值仅由他的信念决定。
+
+写 $V(\theta) = V(E(\theta), \theta) - t(\theta)$ 表示买家的租金,卖家求解
+
+$$
+\max_{\{E(\theta),\, t(\theta)\}} \int t(\theta) \, dF(\theta)
+$$ (eq:pi_sellerproblem)
+
+约束于激励相容性和个体理性,
+
+$$
+V(\theta) \geq V(E(\theta'), \theta) - t(\theta') \ \ \forall \theta, \theta',
+\qquad
+V(\theta) \geq 0 \ \ \forall \theta .
+$$ (eq:pi_icir)
+
+{cite:t}`BergemannBonattiSmolin2018` 确立了两个结构性结果,我们将在计算的每一份菜单中看到它们得到证实。
+
+```{prf:proposition}
+:label: pi_prop_structure
+
+在任何最优菜单中:
+
+1. 完全信息实验 $\overline{E}$ 被提供;
+2. 每个实验都是**非分散的**,意味着对某些 $i \neq j$ 有 $\pi_{ij} = 0$;
+3. 在匹配情形下,每个实验都是**集中的**,意味着对某些 $i$ 有 $\pi_{ii} = 1$。
+```
+
+第三部分说明在我们的二元设置中,菜单上的每个实验都有 $\pi_1 = 1$ 或 $\pi_2 = 1$。
+
+最优的降级从不在各处添加无偏噪声;它使一个状态完全可检测,同时模糊另一个状态。
+
+## 两种类型
+
+考虑两个类型 $\theta^L$ 和 $\theta^H$,其中 $\theta^H$ 是*高价值*类型,因为他更看重完全信息实验,
+
+$$
+V(\overline{E}, \theta^H) \geq V(\overline{E}, \theta^L) .
+$$
+
+当 $u_1 = u_2$ 时,这说明 $|\theta^H - 1/2| \leq |\theta^L - 1/2|$,因此高类型是那个最初信息更不充分的类型。
+
+设 $\gamma = \Pr[\theta = \theta^H]$。
+
+如果 $\theta^* < \theta^H < \theta^L$,则称这些类型是**一致的**,因为两者不加额外信息也会采取相同的行动;如果 $\theta^L < \theta^* < \theta^H$,则称这些类型是**不一致的**。
+
+一个最优菜单具有熟悉的形态:高类型购买 $\overline{E}$,低类型的参与约束绑定,高类型的激励约束绑定。
+
+这三个事实一旦确定低类型的实验,就能确定两个价格。
+
+```{code-cell} ipython3
+def two_type_revenue(pi1, pi2, tL, tH, gamma, u1=1.0, u2=1.0):
+ """Revenue when the high type buys E_bar and the low type buys (pi1, pi2)."""
+ VbarH, VbarL = value(1, 1, tH, u1, u2), value(1, 1, tL, u1, u2)
+ VL_L, VL_H = value(pi1, pi2, tL, u1, u2), value(pi1, pi2, tH, u1, u2)
+ t_low = VL_L # low type's IR binds
+ t_high = VbarH - VL_H + t_low # high type's IC binds
+ if t_high > VbarH + 1e-12: # high type must participate
+ return -np.inf
+ if VbarL - t_high > 1e-12: # low type must not deviate
+ return -np.inf
+ return gamma * t_high + (1 - gamma) * t_low
+```
+
+### 不一致类型
+
+设 $\theta^L = 1/5$ 且 $\theta^H = 7/10$,$u_1 = u_2 = 1$,使得 $\theta^* = 1/2$
+位于两者之间。
+
+由于两个类型自行会采取*不同*的行动,卖家可以构造一个对一种类型有价值而对另一种类型毫无价值的实验。
+
+选择 $\pi_2 = 1$ 及
+
+$$
+\pi_1' = \frac{u_1 \theta^H - u_2 (1 - \theta^H)}{u_1 \theta^H}
+$$ (eq:pi_zerovalue)
+
+使高类型在信号 $s_1$ 之后恰好对他的两个行动无差异,因此该实验对他毫无价值,而低类型则严格地重视它。
+
+这是可行的,但并非最优。
+
+卖家通过让高类型的激励约束绑定来做得更好,这给出
+
+$$
+\pi_1'' = \frac{u_1 \theta^H - u_2 (1 - \theta^H)}{u_1 (\theta^H - \theta^L)} .
+$$ (eq:pi_optimal2type)
+
+```{code-cell} ipython3
+tL, tH, u1, u2 = 0.2, 0.7, 1.0, 1.0
+pi1_zero = (u1 * tH - u2 * (1 - tH)) / (u1 * tH)
+pi1_opt = (u1 * tH - u2 * (1 - tH)) / (u1 * (tH - tL))
+
+print(f'zero-value-to-high experiment pi1 = {pi1_zero:.4f} (= 4/7)')
+print(f'binding-IC experiment pi1 = {pi1_opt:.4f} (= 4/5)')
+print(f'\n V(E_zero, theta_H) = {value(pi1_zero, 1, tH):.4f}')
+print(f' V(E_opt, theta_L) = {value(pi1_opt, 1, tL):.4f}'
+ f' V(E_opt, theta_H) = {value(pi1_opt, 1, tH):.4f}')
+```
+
+第二个实验给予*两个*类型相同的总价值,因此卖家可以按信息的实际价值向每个人收费,且不留任何租金。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Net value of the two menus as a function of the buyer's type
+ name: fig-pi-menus
+---
+fig, axes = plt.subplots(1, 2, figsize=(12, 4.2))
+for ax, p1, ttl in zip(axes, [pi1_zero, pi1_opt],
+ ['suboptimal menu: partial experiment worth zero to $\\theta^H$',
+ 'optimal menu: high type indifferent between the two items']):
+ t_hi = value(1, 1, tH) # price of E_bar
+ t_lo = value(p1, 1, tL) # price of partial item
+ ax.plot(theta, value(1, 1, theta) - t_hi, lw=2, label='fully informative')
+ ax.plot(theta, value(p1, 1, theta) - t_lo, lw=2, ls='--',
+ label=f'partial, $\\pi_1={p1:.3f}$')
+ ax.axhline(0, color='0.3', lw=1)
+ for t, nm in [(tL, r'$\theta^L$'), (tH, r'$\theta^H$')]:
+ ax.axvline(t, color='0.7', ls=':', lw=1)
+ ax.annotate(nm, (t, ax.get_ylim()[0]), fontsize=9)
+ ax.set(xlabel=r'$\theta$', ylabel=r'$V - t$', title=ttl, ylim=(-0.35, 0.25))
+ ax.legend(fontsize=8, loc='upper left')
+fig.tight_layout()
+plt.show()
+```
+
+在左图中,高类型对完全信息实验的净价值严格高于其对部分实验的净价值,因此他的激励约束是松弛的,卖家在浪费机会。
+
+在右图中,两条曲线恰好在 $\theta^H$ 处相交。
+
+现在我们把闭式解 {eq}`eq:pi_optimal2type` 与对*所有*实验的暴力搜索进行对照。
+
+```{code-cell} ipython3
+def brute_force(tL, tH, gamma, n=301, u1=1.0, u2=1.0):
+ """Search over all (pi1, pi2) for the best low-type experiment."""
+ g = np.linspace(0, 1, n)
+ best, arg = -np.inf, None
+ for p1 in g:
+ for p2 in g:
+ if p1 + p2 < 1:
+ continue
+ r = two_type_revenue(p1, p2, tL, tH, gamma, u1, u2)
+ if r > best:
+ best, arg = r, (p1, p2)
+ return best, arg
+
+
+print(f'{"gamma":>7s}{"brute force":>13s}{"argmax":>18s}'
+ f'{"eq (20) menu":>14s}{"E_bar to both":>15s}')
+for gamma in [0.10, 0.25, 0.30, 0.50, 0.90]:
+ best, arg = brute_force(tL, tH, gamma)
+ closed = two_type_revenue(pi1_opt, 1.0, tL, tH, gamma)
+ both = two_type_revenue(1.0, 1.0, tL, tH, gamma)
+ print(f'{gamma:7.2f}{best:13.5f} ({arg[0]:.3f}, {arg[1]:.3f})'
+ f'{closed:14.5f}{both:15.5f}')
+print(f'\nthe paper: discriminate iff gamma > theta_L / theta_H = {tL / tH:.4f}')
+```
+
+只要区别定价有利可图,暴力搜索的最优解总是位于 $(\pi_1, \pi_2) = (0.8, 1)$,与
+{eq}`eq:pi_optimal2type` 完全一致,否则位于 $(1, 1)$。
+
+这一转变恰好发生在 $\gamma = \theta^L / \theta^H$ 处。
+
+当低类型很常见时,卖家更愿意以较低价格向所有人出售完全信息;当高类型很常见时,卖家更愿意通过降低低类型获得的信息质量来保护高价格。
+
+还要注意,最优菜单中的两个实验都有 $\pi_2 = 1$,这证实了 {prf:ref}`pi_prop_structure` 的第三部分。
+
+## 连续类型
+
+现在设 $\theta$ 在 $[0,1]$ 上分布,密度为 $f$,分布函数为 $F$。
+
+关键的简化在于,实验的价值仅通过标量
+
+$$
+q = \pi_1 u_1 - \pi_2 u_2 \in [-u_2,\ u_1] ,
+$$ (eq:pi_q)
+
+依赖于 $(\pi_1, \pi_2)$,{cite:t}`BergemannBonattiSmolin2018` 称之为实验的**差异信息量**。
+
+用 $q$ 表示,价值变为
+
+$$
+V(q, \theta) = \max\bigl\{\theta q + u_2 + \min\{u_1 - u_2 - q,\ 0\}
+- \max\{\theta u_1,\ (1-\theta) u_2\},\ 0 \bigr\} .
+$$ (eq:pi_valueq)
+
+完全信息实验对应 $q = u_1 - u_2$。
+
+两个端点 $q = -u_2$ 和 $q = u_1$ 是在两种状态下都以概率一出现同一信号的实验,因此它们不传递任何信息。
+
+```{code-cell} ipython3
+def value_q(q, theta, u1=1.0, u2=1.0):
+ """Value of the experiment with differential informativeness q."""
+ theta = np.asarray(theta, dtype=float)
+ gross = theta * q + u2 + np.minimum(u1 - u2 - q, 0.0)
+ return np.maximum(gross - np.maximum(theta * u1, (1 - theta) * u2), 0.0)
+
+
+def q_to_experiment(q, u1=1.0, u2=1.0):
+ """Recover (pi1, pi2) from q using pi1 = 1 or pi2 = 1."""
+ return (1.0, (u1 - q) / u2) if q >= u1 - u2 else ((q + u2) / u1, 1.0)
+
+
+for q in [-1.0, -0.5, 0.0, 0.5, 1.0]:
+ p1, p2 = q_to_experiment(q)
+ print(f' q = {q:+.2f} -> (pi1, pi2) = ({p1:.3f}, {p2:.3f}),'
+ f' max value over types = {value_q(q, theta).max():.4f}')
+```
+
+现在菜单是一个函数 $q(\theta)$,激励相容性要求它是非递减的。
+
+认为 $\omega_1$ 更可能的类型想要具有更高 $q$ 的实验,这些实验会对他们认为*较不*可能的状态提供更清晰的证据。
+
+还有第二个不太常见的限制。
+
+由于信息对类型 $\theta \in \{0, 1\}$ 毫无价值,在 $[0, \theta^*]$ 和
+$[\theta^*, 1]$ 上分别应用包络定理,并将临界类型 $\theta^*$ 的两个租金表达式相匹配,得到
+
+$$
+\int_0^1 q(\theta) \, d\theta = u_1 - u_2 .
+$$ (eq:pi_integral)
+
+请注意,此积分是关于 $d\theta$ 而不是 $dF(\theta)$ 求取的。
+
+有了这两个约束,卖家的问题简化为
+
+$$
+\max_{q(\cdot)} \int_0^1
+\Bigl[\bigl(\theta f(\theta) + F(\theta)\bigr) q(\theta)
++ \min\bigl\{\bigl(u_1 - u_2 - q(\theta)\bigr) f(\theta),\ 0 \bigr\}\Bigr] d\theta
+$$ (eq:pi_reduced)
+
+约束于 $q$ 非递减以及 {eq}`eq:pi_integral`。
+
+### 将其作为线性规划求解
+
+{eq}`eq:pi_reduced` 的被积函数在 $q$ 中是**凹的且分段线性的**,因为
+$\min\{(d - q) f, 0\} = -f \max\{q - d, 0\}$,其中 $d = u_1 - u_2$ 且 $f \geq 0$。
+
+在线性约束下最大化一个凹的分段线性目标函数就是一个线性规划。
+
+引入 $z(\theta) \geq \max\{q(\theta) - d,\ 0\}$ 并在 $\theta$ 上离散化网格,得到
+
+$$
+\max_{q, z} \ \sum_n w_n\Bigl[\bigl(\theta_n f_n + F_n\bigr) q_n - f_n z_n\Bigr]
+$$
+
+约束于 $z_n \geq q_n - d$,$z_n \geq 0$,$q_{n+1} \geq q_n$,
+$-u_2 \leq q_n \leq u_1$,以及 $\sum_n w_n q_n = d$。
+
+```{code-cell} ipython3
+def solve_menu(theta, f, u1=1.0, u2=1.0):
+ """Solve the seller's problem on a grid of types by linear programming."""
+ N = len(theta)
+ dth = theta[1] - theta[0]
+ F = np.cumsum(f) * dth
+ F = F / F[-1]
+ w = np.full(N, dth)
+ d = u1 - u2
+
+ c = np.concatenate([-(theta * f + F) * w, f * w]) # linprog minimizes
+ A_ub = np.hstack([np.eye(N), -np.eye(N)]) # q - z <= d
+ b_ub = np.full(N, d)
+ D = np.zeros((N - 1, 2 * N)) # q_n - q_{n+1} <= 0
+ rows = np.arange(N - 1)
+ D[rows, rows], D[rows, rows + 1] = 1.0, -1.0
+ A_ub = np.vstack([A_ub, D])
+ b_ub = np.concatenate([b_ub, np.zeros(N - 1)])
+ A_eq = np.concatenate([w, np.zeros(N)])[None, :] # integral constraint
+ bounds = [(-u2, u1)] * N + [(0, None)] * N
+
+ res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=np.array([d]),
+ bounds=bounds, method='highs')
+ return res.x[:N], res
+```
+
+线性规划自动处理单调性约束。
+
+这一点很重要,因为另一种选择是手动实现迈尔森(Myerson)的**熨平**过程:形成虚拟值
+
+$$
+\phi^-(\theta) = \theta f(\theta) + F(\theta),
+\qquad
+\phi^+(\theta) = (\theta - 1) f(\theta) + F(\theta) ,
+$$ (eq:pi_virtual)
+
+用它们的积分的凸包的导数取代它们,然后求得 {eq}`eq:pi_integral` 上的乘数(参见 {cite:t}`Myerson1981` 和
+{cite:t}`Toikka2011`)。
+
+线性规划隐式地完成了所有这些工作。
+
+我们还需要价格,这来自于位于两个项目边界处的买家必须对二者无差异这一要求。
+
+```{code-cell} ipython3
+def menu_items(theta, q, u1=1.0, u2=1.0, tol=1e-4, min_width=0.01):
+ """Distinct items in the menu, with the interval of types served and the price.
+
+ Values of q taken on a negligible set of types are transition artifacts of the
+ grid, not items on the menu, so we drop them.
+ """
+ qr = np.round(q / tol) * tol
+ vals = [v for v in np.unique(qr)
+ if theta[qr == v].max() - theta[qr == v].min() >= min_width]
+ items = sorted([(v, theta[qr == v].min(), theta[qr == v].max()) for v in vals],
+ key=lambda x: x[1])
+ out, prev_v, prev_t = [], None, 0.0
+ for v, lo, hi in items:
+ if value_q(v, theta, u1, u2).max() < 1e-9: # uninformative item
+ price = 0.0
+ elif prev_v is None:
+ price = 0.0
+ else:
+ price = float(value_q(v, lo, u1, u2)
+ - value_q(prev_v, lo, u1, u2) + prev_t)
+ out.append((v, lo, hi, price))
+ prev_v, prev_t = v, price
+ return out
+```
+
+### 均匀分布的类型
+
+当 $u_1 = u_2 = 1$ 且 $\theta$ 均匀分布时,虚拟值为 $\phi^-(\theta) = 2\theta$
+和 $\phi^+(\theta) = 2\theta - 1$。
+
+两者都严格递增,因此不需要熨平,最优菜单应该只包含一个有信息量的项目。
+
+```{code-cell} ipython3
+N = 2001
+theta_g = np.linspace(0, 1, N)
+q_unif, res = solve_menu(theta_g, np.ones(N))
+
+print('LP status:', res.message)
+print('distinct values of q:', np.unique(np.round(q_unif, 4)))
+for v, lo, hi, p in menu_items(theta_g, q_unif):
+ p1, p2 = q_to_experiment(v)
+ print(f' q = {v:+.4f} (pi1, pi2) = ({p1:.3f}, {p2:.3f})'
+ f' types [{lo:.3f}, {hi:.3f}] price {p:.4f}')
+```
+
+卖家以单一价格向中间范围的类型提供完全信息实验,而对其他人什么都不提供。
+
+临界点和价格与 {cite:t}`BergemannBonattiSmolin2018` 的解析解完全一致:向
+$\theta \in [1/4, 3/4]$ 的类型提供完全信息,价格为 $1/4$。
+
+这就是 {cite:t}`RileyZeckhauser1983` 的"无议价"结果在信息定价中的对应版本。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Optimal menu with uniformly distributed types
+ name: fig-pi-uniform
+---
+fig, axes = plt.subplots(1, 2, figsize=(12, 4))
+axes[0].plot(theta_g, 2 * theta_g, lw=2, label=r'$\phi^-(\theta) = 2\theta$')
+axes[0].plot(theta_g, 2 * theta_g - 1, lw=2, label=r'$\phi^+(\theta) = 2\theta - 1$')
+axes[0].axhline(0.5, color='0.4', ls='--', lw=1, label=r'$\lambda^* = 1/2$')
+axes[0].set(xlabel=r'$\theta$', title='virtual values, both strictly increasing')
+axes[0].legend(fontsize=9)
+
+axes[1].step(theta_g, q_unif, lw=2, where='mid')
+axes[1].set(xlabel=r'$\theta$', ylabel=r'$q^*(\theta)$', ylim=(-1.15, 1.15),
+ title='optimal menu: one informative item')
+axes[1].annotate('no information', (0.06, -0.85), fontsize=9)
+axes[1].annotate('full information', (0.38, 0.12), fontsize=9)
+axes[1].annotate('no information', (0.78, 0.85), fontsize=9)
+fig.tight_layout()
+plt.show()
+```
+
+### 双峰类型分布与版本化的理由
+
+{cite:t}`BergemannBonattiSmolin2018` 的推论 1 说明,仅当虚拟值需要熨平时,才会提供第二个实验。
+
+由于类型是*信念*,打破规则性的一个自然方式是一个大多数买家已经信息充分的群体,使得密度在两端都堆积。
+
+我们遵循论文,取 $\text{Beta}(8, 30)$ 和 $\text{Beta}(60, 30)$ 的等权重混合。
+
+```{code-cell} ipython3
+f_bimodal = (0.5 * stats.beta(8, 30).pdf(theta_g)
+ + 0.5 * stats.beta(60, 30).pdf(theta_g))
+q_bi, res_bi = solve_menu(theta_g, f_bimodal)
+
+print('LP status:', res_bi.message)
+print('distinct values of q:', np.unique(np.round(q_bi, 3)))
+print()
+for v, lo, hi, p in menu_items(theta_g, q_bi):
+ p1, p2 = q_to_experiment(v)
+ label = 'no information' if abs(p) < 1e-9 else (
+ 'full information' if abs(v) < 1e-6 else 'partial information')
+ print(f' q = {v:+.4f} (pi1, pi2) = ({p1:.3f}, {p2:.3f})'
+ f' types [{lo:.3f}, {hi:.3f}] price {p:.4f} {label}')
+```
+
+现在菜单包含**两个**有信息量的项目,这与 {prf:ref}`pi_prop_structure` 一致,也与最优菜单从不包含超过两项的结果一致。
+
+部分信息项目具有 $\pi_2 = 1$,因此信号 $s_1$ 只在状态 $\omega_1$ 中出现并完全揭示它,而信号 $s_2$ 使买家保持不确定。
+
+它被一系列相对信息充分的类型购买,这些类型不愿为卖家想要向 $\theta \approx 0.7$ 附近的大量买家收取的价格买单。
+
+```{code-cell} ipython3
+---
+mystnb:
+ figure:
+ caption: Bimodal type density and the resulting two-item menu
+ name: fig-pi-bimodal
+---
+items = menu_items(theta_g, q_bi)
+
+fig, axes = plt.subplots(1, 2, figsize=(12, 4))
+axes[0].plot(theta_g, f_bimodal, lw=2, color='C2')
+axes[0].fill_between(theta_g, f_bimodal, alpha=0.2, color='C2')
+axes[0].set(xlabel=r'$\theta$', ylabel='density',
+ title='most buyers are already well informed')
+
+axes[1].step(theta_g, q_bi, lw=2, where='mid')
+axes[1].set(xlabel=r'$\theta$', ylabel=r'$q^*(\theta)$', ylim=(-1.15, 1.15),
+ title='optimal menu: two informative items')
+for v, lo, hi, p in items:
+ if p > 1e-9:
+ axes[1].annotate(f'price {p:.3f}', ((lo + hi) / 2, v + 0.12),
+ ha='center', fontsize=9)
+fig.tight_layout()
+plt.show()
+```
+
+我们可以直接看出卖家为何要这样做。
+
+```{code-cell} ipython3
+def revenue(theta, q, f, u1=1.0, u2=1.0):
+ """Expected revenue from the menu q under density f."""
+ dth = theta[1] - theta[0]
+ price = np.zeros_like(theta)
+ for v, lo, hi, p in menu_items(theta, q, u1, u2):
+ price[(theta >= lo) & (theta <= hi)] = p
+ return np.sum(price * f) * dth / (np.sum(f) * dth)
+
+
+q_single = np.where(q_bi < -0.5, -1.0, np.where(q_bi > 0.5, 1.0, 0.0))
+print(f'revenue, optimal two-item menu {revenue(theta_g, q_bi, f_bimodal):.5f}')
+print(f'revenue, best single-item menu '
+ f'{revenue(theta_g, q_single, f_bimodal):.5f}')
+```
+
+去掉部分信息项目而只出售完全信息会使卖家损失收入。
+
+部分实验并非同一产品的更噪声版本;它是一个*定位不同*的产品,对信息充分的类型来说足够便宜,对信息不良的类型来说又足够无用,以至于不会破坏高价格。
+
+## 结束语
+
+布莱克韦尔定理告诉我们*所有*决策者何时都认同一个实验优于另一个。
+
+作为一种设计原则来解读,它真正的内涵在于它保持沉默的那部分范围的大小。
+
+{cite:t}`BergemannBonattiSmolin2018` 表明,出售数据的垄断者恰恰生活在那个范围之中,因为按信念进行筛选需要不同类型排序不同的产品。
+
+有两点经验可以推广到该模型之外。
+
+首先,最优的信息降级是结构化的而非随机的:菜单上的每个实验都使一个状态完全可检测,同时模糊另一个状态,因此数据产品绝不应该通过向数据库添加无偏噪声来构建。
+
+其次,恰恰是在买家已经信息充分时,版本化才变得有价值,因为这正是支付意愿分布足够不规则、需要熨平的时候。
+
+向信息不完全的买家出售信息有着悠久的历史。
+
+{cite:t}`AdmatiPfleiderer1986` 研究了一个面对一系列*事前相同*的交易者的卖家,这些交易者随后交易一种共同价值资产,发现卖家希望提供噪声化且*特异性*的信息,这样每个交易者都保留对其所知信息的局部垄断。
+
+那里的异质性是由卖家创造的;而在这里,异质性来自买家自己的先验信息,正是这一点使问题变成了一个筛选问题。
+
+{cite:t}`BergemannBonatti2015` 研究了同一市场的另一面,即一个买家在数据价格由竞争决定时决定购买哪些查询。
+
+一个有用的对照是 {cite:t}`KamenicaGentzkow2011`,其中发送者也承诺一个信息结构,但没有货币转移,并直接关心接收者的行动;而在这里,卖家只关心收入,且不能以状态、信号或买家的行动为条件设定支付。
+
+想要了解统计背景的读者可以回到 {doc}`blackwell_kihlstrom`,了解经济学、充分性和不确定性减少标准之间的等价关系;回到 {doc}`likelihood_bayes`,了解私人信号如何产生本讲座中作为买家类型的临时信念;以及回到
+{doc}`information_market_equilibrium`,了解当信息通过价格而非直接出售来传递时会发生什么。
+
+## 练习
+
+```{exercise-start}
+:label: pi_ex1
+```
+
+本练习研究**一致**情形,其中两个类型在没有额外信息的情况下会采取相同的行动。
+
+设 $u_1 = u_2 = 1$,$\theta^L = 0.9$ 且 $\theta^H = 0.7$,使得
+$\theta^* = 1/2 < \theta^H < \theta^L$。
+
+由于两个类型都会自行选择 $a_1$,卖家没有理由降低低类型对 $\omega_1$ 的了解,因此设 $\pi_1 = 1$ 并将 $\pi_2$ 作为唯一的选择变量。
+
+1. 针对若干个 $\gamma$ 值,绘制卖家的收入对 $\pi_2 \in [0, 1]$ 的图像,并确认它是*线性*的。
+
+2. 得出结论:最优解总是在端点处,因此低类型要么获得完全信息,要么什么都得不到。
+
+3. {cite:t}`BergemannBonattiSmolin2018` 证明当且仅当
+ $\gamma \leq (1 - \theta^L)/(1 - \theta^H)$ 时,低类型获得完全信息实验。
+
+ 通过二分法数值定位转变点并进行比较。
+
+为什么这里的答案是极端的,而讲座中不一致情形却产生了一个内部解 $\pi_1 = 4/5$?
+
+```{exercise-end}
+```
+
+```{solution-start} pi_ex1
+:class: dropdown
+```
+
+这里是一种解法:
+
+```{code-cell} ipython3
+tL_c, tH_c = 0.9, 0.7
+p2_grid = np.linspace(0, 1, 401)
+
+fig, ax = plt.subplots()
+for gamma in [0.1, 0.25, 1/3, 0.5, 0.7]:
+ r = np.array([two_type_revenue(1.0, p2, tL_c, tH_c, gamma) for p2 in p2_grid])
+ dev = np.abs(r - np.interp(p2_grid, [0, 1], [r[0], r[-1]])).max()
+ ax.plot(p2_grid, r, lw=2, label=rf'$\gamma = {gamma:.3f}$')
+ print(f'gamma = {gamma:.3f}: revenue at pi2=0 is {r[0]:.5f}, '
+ f'at pi2=1 is {r[-1]:.5f}, deviation from linear {dev:.1e}')
+ax.set(xlabel=r'$\pi_2$', ylabel='revenue',
+ title='revenue is linear in $\pi_2$, so the optimum is at an endpoint')
+ax.legend(fontsize=9)
+fig.tight_layout()
+plt.show()
+```
+
+```{code-cell} ipython3
+lo, hi = 0.0, 1.0
+for _ in range(60):
+ mid = (lo + hi) / 2
+ if two_type_revenue(1, 1, tL_c, tH_c, mid) >= two_type_revenue(1, 0, tL_c, tH_c, mid):
+ lo = mid
+ else:
+ hi = mid
+
+print(f'numerical switch point gamma = {lo:.6f}')
+print(f'(1 - theta_L) / (1 - theta_H) = {(1 - tL_c) / (1 - tH_c):.6f}')
+```
+
+收入在 $\pi_2$ 中在机器精度范围内是线性的,因此最优解总是位于
+$\pi_2 \in \{0, 1\}$,且转变恰好如预测的那样发生在 $\gamma = 1/3$ 处。
+
+极端解的原因在于,在一致信念下两个类型无论如何都会选择 $a_1$,因此唯一的问题是卖家对
+$\omega_2$ 的揭示程度。
+
+两个类型随后通过相同的项 $(1 - \theta)\pi_2 u_2$ 来评估实验的价值,这正是目标函数和约束在单一变量 $\pi_2$
+中呈线性的原因,也是 {cite:t}`RileyZeckhauser1983` 的无议价逻辑适用的原因。
+
+在不一致信念下,两个类型自行采取不同的行动,价值函数的拐点位于两者之间,卖家可以定位一个实验,使其对一种类型价值很大,而对另一种类型价值很小。
+
+正是这种可能性使得内部扭曲成为最优选择。
+
+```{solution-end}
+```
+
+```{exercise-start}
+:label: pi_ex2
+```
+
+{cite:t}`BergemannBonattiSmolin2018` 的推论 1 指出,当两个虚拟值 {eq}`eq:pi_virtual`
+都严格递增时,最优菜单只包含单一项目,而对于均匀分布的类型,无论支付
+$(u_1, u_2)$ 是什么,这一点都成立。
+
+1. 通过求解均匀类型下若干组不对称支付对的卖家问题验证这一点,例如
+ $(u_1, u_2) \in \{(1, 1), (2, 1), (1, 3), (5, 1)\}$。
+
+2. 针对每种情形,报告 $\theta^*$、所服务类型的区间以及价格。
+
+3. 确认完全信息实验始终是提供的项目,正如 {prf:ref}`pi_prop_structure` 所要求的那样。
+
+```{exercise-end}
+```
+
+```{solution-start} pi_ex2
+:class: dropdown
+```
+
+这里是一种解法:
+
+```{code-cell} ipython3
+print(f'{"u1":>4s}{"u2":>4s}{"theta*":>9s}{"q offered":>12s}'
+ f'{"types served":>22s}{"price":>9s}')
+for u1_, u2_ in [(1, 1), (2, 1), (1, 3), (5, 1)]:
+ q_a, _ = solve_menu(theta_g, np.ones(N), u1_, u2_)
+ star = u2_ / (u1_ + u2_)
+ served = [it for it in menu_items(theta_g, q_a, u1_, u2_) if it[3] > 1e-9]
+ v, lo, hi, p = served[0]
+ print(f'{u1_:4d}{u2_:4d}{star:9.4f}{v:12.4f}'
+ f'{f"[{lo:.3f}, {hi:.3f}]":>22s}{p:9.4f}')
+ assert abs(v - (u1_ - u2_)) < 1e-3 # the item is fully informative
+print('\nevery menu contains exactly one informative item, '
+ 'and it is the fully informative one')
+```
+
+无论支付是多少,均匀密度的虚拟值都是 $\phi^-(\theta) = 2\theta$ 和
+$\phi^+(\theta) = 2\theta - 1$,因为 $u_1$ 和 $u_2$ 只通过
+$d = u_1 - u_2$ 和 $q$ 的边界进入卖家的问题,而不通过
+$f$ 或 $F$ 进入。
+
+两者都严格递增,因此不需要熨平,单一项目就是最优的。
+
+支付确实会移动 $\theta^*$,从而影响服务哪些类型以及以什么价格,但在均匀密度下它们永远不会使版本化变得有价值。
+
+```{solution-end}
+```
+
+```{exercise-start}
+:label: pi_ex3
+```
+
+本练习将本讲座与 {doc}`blackwell_kihlstrom` 联系起来。
+
+布莱克韦尔定理说明,如果 $E'$ 是 $E$ 的弱化,那么*每个*决策者都弱偏好 $E$。
+
+1. 绘制满足 $\pi_1 + \pi_2 \geq 1$ 的许多随机二元实验对。
+
+2. 对于每一对,使用 `garbling` 判断是否一个是另一个的弱化,并单独计算是否一个在细网格上的每个类型处都在价值上支配另一个。
+
+3. 确认弱化蕴含一致的偏好,并报告布莱克韦尔序无法排序的随机实验对所占的比例。
+
+4. 在未排序的实验对中,验证确实存在一些类型偏好一种实验而另一些类型偏好另一种实验。
+
+```{exercise-end}
+```
+
+```{solution-start} pi_ex3
+:class: dropdown
+```
+
+这里是一种解法:
+
+```{code-cell} ipython3
+rng = np.random.default_rng(0)
+grid_t = np.linspace(0.001, 0.999, 999)
+
+n_pairs, n_garble, n_unranked, n_disagree, violations = 4000, 0, 0, 0, 0
+for _ in range(n_pairs):
+ (a1, a2), (b1, b2) = rng.uniform(0, 1, 2), rng.uniform(0, 1, 2)
+ if a1 + a2 < 1 or b1 + b2 < 1:
+ continue
+ Ea, Eb = experiment(a1, a2), experiment(b1, b2)
+ va, vb = value(a1, a2, grid_t), value(b1, b2, grid_t)
+
+ a_garbles_b = garbling(Ea, Eb) is not None # Eb is a garbling of Ea
+ b_garbles_a = garbling(Eb, Ea) is not None
+ a_dominates = np.all(va >= vb - 1e-9)
+ b_dominates = np.all(vb >= va - 1e-9)
+
+ if a_garbles_b:
+ n_garble += 1
+ if not a_dominates:
+ violations += 1
+ if b_garbles_a:
+ n_garble += 1
+ if not b_dominates:
+ violations += 1
+ if not (a_garbles_b or b_garbles_a):
+ n_unranked += 1
+ if not (a_dominates or b_dominates):
+ n_disagree += 1
+
+print(f'garbling relations found {n_garble}')
+print(f'violations of Blackwell {violations}')
+print(f'pairs unranked by Blackwell {n_unranked}')
+print(f' of which types disagree {n_disagree} '
+ f'({100 * n_disagree / n_unranked:.1f}%)')
+```
+
+布莱克韦尔定理从未被违反:只要一个实验能弱化为另一个实验,每个类型都偏好作为弱化来源的那个实验。
+
+很大一部分随机实验对未被排序,而对于几乎所有这些实验对,类型确实存在真正的分歧,一些偏好一种实验,另一些偏好另一种实验。
+
+这一未排序的区域正是数据卖家所需要的空间。
+
+如果布莱克韦尔序是完备的,那么每个买家都会认同所有信息产品的排序,卖家的问题将退化为针对单一质量指标的标准非线性定价,本讲座中描述的横向筛选将变得不可能。
+
+```{solution-end}
+```
\ No newline at end of file