From a6db2e3736ddd5275885ca723497fd53565b155d Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 7 Aug 2026 11:39:41 +1000 Subject: [PATCH 1/6] Update translation: lectures/market_diffusion.md --- lectures/market_diffusion.md | 910 +++++++++++++++++++++++++++++++++++ 1 file changed, 910 insertions(+) create mode 100644 lectures/market_diffusion.md diff --git a/lectures/market_diffusion.md b/lectures/market_diffusion.md new file mode 100644 index 00000000..e9b54282 --- /dev/null +++ b/lectures/market_diffusion.md @@ -0,0 +1,910 @@ +--- +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 +
+ + QuantEcon + +
+``` + +# 双向学习下的市场扩散 + +```{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{terms free of } n , +$$ + +其一阶条件以封闭形式给出了高效策略。 + +```{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 From 8b7bc2d57e570af84c3b02a7ebc336594e21ccb0 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 7 Aug 2026 11:39:42 +1000 Subject: [PATCH 2/6] Update translation: .translate/state/market_diffusion.md.yml --- .translate/state/market_diffusion.md.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .translate/state/market_diffusion.md.yml diff --git a/.translate/state/market_diffusion.md.yml b/.translate/state/market_diffusion.md.yml new file mode 100644 index 00000000..d8e60d84 --- /dev/null +++ b/.translate/state/market_diffusion.md.yml @@ -0,0 +1,6 @@ +source-sha: e46fa7fc93bcdee2ed317811cf72e1645259dd4f +synced-at: "2026-08-07" +model: claude-sonnet-5 +mode: NEW +section-count: 10 +tool-version: 0.25.0 From e19f8046d752a7d504615502f09dbec63f54489f Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 7 Aug 2026 11:39:43 +1000 Subject: [PATCH 3/6] Update translation: lectures/pricing_information.md --- lectures/pricing_information.md | 998 ++++++++++++++++++++++++++++++++ 1 file changed, 998 insertions(+) create mode 100644 lectures/pricing_information.md diff --git a/lectures/pricing_information.md b/lectures/pricing_information.md new file mode 100644 index 00000000..ccaac284 --- /dev/null +++ b/lectures/pricing_information.md @@ -0,0 +1,998 @@ +--- +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$ 下获得的预期效用弱高于实验 $\nu$ 时,实验 $\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$,低于此值的类型会选择 $a_2$。 + +```{note} +买方的信念 $\theta$ 可以由一个共同先验和一个私下观察到的信号共同生成,正如 {doc}`likelihood_bayes` 中那样。 + +拥有非常精确私人信号的买方的 $\theta$ 接近 $0$ 或 $1$;一个什么都没学到的买方的 $\theta$ 接近 $\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'$ 一样具有信息量,当且仅当 $E'$ 是 $E$ 的**信息降级**(garbling),意味着存在一个随机矩阵 $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$。 +``` + +第3点是说,在我们的二元设置中,菜单中的每个实验都有 $\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` 的第3点。 + +## 连续类型 + +现在设 $\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 +``` + +这个线性规划自动处理了单调性约束。 + +这一点很重要,因为另一种选择是手动实现迈尔森的**熨平**(ironing)程序:构造虚拟值 + +$$ +\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 From fa2195583027c3c9087cba58dee9637738f6741d Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 7 Aug 2026 11:39:44 +1000 Subject: [PATCH 4/6] Update translation: .translate/state/pricing_information.md.yml --- .translate/state/pricing_information.md.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .translate/state/pricing_information.md.yml diff --git a/.translate/state/pricing_information.md.yml b/.translate/state/pricing_information.md.yml new file mode 100644 index 00000000..bbc0670c --- /dev/null +++ b/.translate/state/pricing_information.md.yml @@ -0,0 +1,6 @@ +source-sha: e46fa7fc93bcdee2ed317811cf72e1645259dd4f +synced-at: "2026-08-07" +model: claude-sonnet-5 +mode: NEW +section-count: 9 +tool-version: 0.25.0 From 282d7ad433b3d6e3e15fb3b2a54ea504b9b62919 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 7 Aug 2026 11:39:45 +1000 Subject: [PATCH 5/6] Update translation: lectures/_toc.yml --- lectures/_toc.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lectures/_toc.yml b/lectures/_toc.yml index ba6f0bbe..25c1a17a 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: @@ -124,6 +126,7 @@ parts: chapters: - file: bounded_rationality - file: olg_adaptive_money + - file: learning_approximation - file: exchange_rate_learning - file: genetic_classifier - file: marimon_mcgrattan_sargent From f952cda0582f55cb5c1fce5f15153aba8537f1c1 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 7 Aug 2026 11:59:04 +1000 Subject: [PATCH 6/6] =?UTF-8?q?Drop=20the=20learning=5Fapproximation=20ToC?= =?UTF-8?q?=20entry=20again=20=E2=80=94=20the=20rebase=20automation's=20re?= =?UTF-8?q?generated=20ToC=20reintroduced=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second reintroduction on this PR alone (trail on #210): every regeneration of the full-ToC mirror re-dangles the undelivered lecture. Trimmed on top of the automation's rebase so the preview runs on a buildable head. Co-Authored-By: Claude Fable 5 --- lectures/_toc.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/lectures/_toc.yml b/lectures/_toc.yml index 25c1a17a..7e94f990 100644 --- a/lectures/_toc.yml +++ b/lectures/_toc.yml @@ -126,7 +126,6 @@ parts: chapters: - file: bounded_rationality - file: olg_adaptive_money - - file: learning_approximation - file: exchange_rate_learning - file: genetic_classifier - file: marimon_mcgrattan_sargent