用Python模拟信号博弈:从厂商进入案例到代码实现(附完整Jupyter Notebook)
·
用Python模拟信号博弈:从厂商进入案例到代码实现
博弈论作为分析策略互动的强大工具,在经济学和商业决策中有着广泛应用。信号博弈作为不完全信息动态博弈的典型代表,常被用于分析市场进入、招聘筛选等现实场景。本文将带您用Python构建完整的信号博弈模型,通过代码实现厂商进入案例的动态模拟,直观展现精炼贝叶斯均衡的形成条件。
1. 信号博弈基础与厂商进入模型
信号博弈的核心在于信息不对称——一方拥有私有信息(发送者),另一方通过观察行为信号做出判断(接收者)。在厂商进入案例中:
- 发送者 :潜在进入厂商(类型θ∈{强θs,弱θw})
- 接收者 :已在位厂商
- 信号 :进入者选择释放的信号强度S/W
- 行动 :在位者选择对抗F或接纳A
收益矩阵可表示为:
| 类型 | 信号 | 行动 | 进入者收益 | 在位者收益 |
|---|---|---|---|---|
| θs | S | A | 3 | 1 |
| θs | S | F | 1 | 0 |
| θw | W | A | 2 | 1 |
| θw | W | F | 0 | 2 |
import numpy as np
# 定义博弈参数
types = ['strong', 'weak'] # 进入者类型
signals = ['S', 'W'] # 可发送信号
actions = ['A', 'F'] # 在位者行动
# 收益函数定义
def payoff(entrant_type, signal, action):
if entrant_type == 'strong':
if action == 'A': return (3, 1)
else: return (1, 0)
else:
if action == 'A': return (2, 1)
else: return (0, 2)
2. 信念系统与策略空间建模
精炼贝叶斯均衡要求信念与策略相互一致。我们需要构建:
- 进入者策略 :类型到信号的映射
- 在位者信念 :观察到信号后对类型的概率判断
- 在位者策略 :信号到行动的映射
# 进入者策略类
class EntrantStrategy:
def __init__(self, strong_signal, weak_signal):
self.strong_signal = strong_signal # 强类型发送的信号
self.weak_signal = weak_signal # 弱类型发送的信号
def get_signal(self, entrant_type):
return self.strong_signal if entrant_type == 'strong' else self.weak_signal
# 在位者信念系统
class BeliefSystem:
def __init__(self, prob_S_strong, prob_W_strong):
self.prob = {
'S': prob_S_strong, # P(θs|S)
'W': prob_W_strong # P(θs|W)
}
def update_belief(self, signal, new_prob):
self.prob[signal] = new_prob
# 在位者策略类
class IncumbentStrategy:
def __init__(self, S_action, W_action):
self.S_action = S_action # 观察到S时的行动
self.W_action = W_action # 观察到W时的行动
def get_action(self, signal):
return self.S_action if signal == 'S' else self.W_action
3. 均衡验证与可视化分析
通过迭代验证不同策略组合下的均衡条件,我们可以找到精炼贝叶斯均衡。关键步骤包括:
- 计算在位者的最优反应
- 检查进入者是否有动机偏离
- 验证信念的一致性
def check_pbe(entrant_strategy, incumbent_strategy, belief_system, p):
# 检查在位者策略是否最优
for signal in signals:
expected_payoff = {}
for action in actions:
# 计算期望收益
prob_strong = belief_system.prob[signal]
strong_payoff = payoff('strong', signal, action)[1]
weak_payoff = payoff('weak', signal, action)[1]
expected_payoff[action] = prob_strong*strong_payoff + (1-prob_strong)*weak_payoff
# 验证当前策略是否为最优
optimal_action = max(expected_payoff, key=expected_payoff.get)
current_action = incumbent_strategy.get_action(signal)
if optimal_action != current_action:
return False
# 检查进入者是否有动机偏离
for entrant_type in types:
current_signal = entrant_strategy.get_signal(entrant_type)
current_action = incumbent_strategy.get_action(current_signal)
current_entrant_payoff = payoff(entrant_type, current_signal, current_action)[0]
# 尝试所有可能的偏离信号
for alt_signal in signals:
if alt_signal == current_signal:
continue
alt_action = incumbent_strategy.get_action(alt_signal)
alt_payoff = payoff(entrant_type, alt_signal, alt_action)[0]
if alt_payoff > current_entrant_payoff:
return False
# 验证信念的一致性
if entrant_strategy.strong_signal == 'S' and entrant_strategy.weak_signal == 'W':
if not (np.isclose(belief_system.prob['S'], 1) and np.isclose(belief_system.prob['W'], 0)):
return False
# 其他策略组合的信念验证...
return True
4. 完整模拟与参数敏感性分析
通过系统性地改变先验概率p,我们可以观察均衡如何随参数变化:
import matplotlib.pyplot as plt
# 模拟不同p值下的均衡
p_values = np.linspace(0, 1, 100)
equilibrium_types = []
for p in p_values:
# 尝试不同的策略组合
if p > 0.5:
# 可能形成混同均衡
entrant_strategy = EntrantStrategy('S', 'S')
belief_system = BeliefSystem(p, 0.5) # 非均衡路径信念任意
incumbent_strategy = IncumbentStrategy('A', 'A')
if check_pbe(entrant_strategy, incumbent_strategy, belief_system, p):
equilibrium_types.append('Pooling (SS)')
continue
# 检查其他可能的均衡...
equilibrium_types.append('Separating (SW)')
# 可视化结果
plt.figure(figsize=(10, 6))
plt.plot(p_values, [1 if eq == 'Pooling (SS)' else 0 for eq in equilibrium_types],
label='Pooling Equilibrium')
plt.plot(p_values, [1 if eq == 'Separating (SW)' else 0 for eq in equilibrium_types],
label='Separating Equilibrium')
plt.xlabel('Prior Probability p (P(θ=strong))')
plt.ylabel('Equilibrium Type')
plt.title('Equilibrium Types vs Prior Probability')
plt.legend()
plt.grid(True)
plt.show()
5. Jupyter Notebook实战技巧
在实际分析中,交互式探索非常关键。以下是几个实用技巧:
-
动态参数调节 :使用IPython widgets创建交互控件
from ipywidgets import interact @interact(p=(0, 1, 0.01)) def analyze_equilibrium(p=0.5): # 动态分析特定p值下的均衡 ... -
收益矩阵可视化
import seaborn as sns payoff_matrix = np.array([ [payoff('strong', 'S', 'A'), payoff('strong', 'S', 'F')], [payoff('weak', 'W', 'A'), payoff('weak', 'W', 'F')] ]) sns.heatmap(payoff_matrix, annot=True, fmt='.1f') -
博弈树绘制 :使用networkx展示决策路径
import networkx as nx G = nx.DiGraph() # 构建博弈树节点和边 ... pos = nx.spring_layout(G) nx.draw(G, pos, with_labels=True)
通过完整的代码实现和可视化分析,我们可以直观理解信号博弈中信息传递的机制,以及不同类型均衡形成的条件。这种将理论模型转化为可执行代码的方法,不仅加深了对博弈论概念的理解,也为实际商业决策提供了可操作的模拟工具。
更多推荐


所有评论(0)