用Python和SymPy手把手求解古诺模型:从反应函数到纳什均衡的完整推导
当经济学理论遇上Python代码,抽象的古诺模型突然变得触手可及。本文不是又一篇枯燥的博弈论讲义,而是一份带着油墨香味的代码实验手册——我们将用SymPy这个符号计算库,在Jupyter Notebook里重建整个古诺模型的推导过程,从利润函数求导到反应函数可视化,最终锁定那个神秘的纳什均衡点。经济学专业的学生可以在这里看到数学公式如何变成可执行的代码,而程序员则能理解每行Python背后的经济学逻辑。
1. 环境搭建与基础建模
在开始推导之前,我们需要一个合适的"数字实验室"。推荐使用Anaconda创建Python 3.8+环境,并安装以下核心库:
pip install sympy matplotlib numpy古诺模型描述的是双寡头垄断市场,假设两家公司生产同质产品,通过选择产量来实现利润最大化。让我们先定义模型的基本要素:
from sympy import symbols, Eq, solve, diff # 定义符号变量 q1, q2 = symbols('q1 q2') # 两家公司的产量 c = symbols('c') # 边际成本 P = 8 - q1 - q2 # 市场价格线性反需求函数这里的关键是理解P = 8 - q1 - q2的经济学含义:市场价格随着总产量增加而下降。数字8代表市场最大可能价格(当产量为0时),而-q1 -q2表示每增加一单位产量对价格的负面影响。
2. 利润函数与反应函数推导
每家公司的利润等于收入减去成本。收入是价格乘以产量,而成本我们简化为线性成本函数:
# 定义利润函数 profit1 = P * q1 - c * q1 # 公司1的利润 profit2 = P * q2 - c * q2 # 公司2的利润 print(f"公司1利润函数: {profit1}") print(f"公司2利润函数: {profit2}")输出结果会显示:
公司1利润函数: -c*q1 + q1*(8 - q1 - q2) 公司2利润函数: -c*q2 + q2*(8 - q1 - q2)接下来是最关键的一步——求反应函数。反应函数表示在给定竞争对手产量的情况下,能使自身利润最大化的产量选择。数学上需要对利润函数求导并令导数为零:
# 求公司1的反应函数 dprofit1_dq1 = diff(profit1, q1) # 对q1求导 reaction1 = solve(dprofit1_dq1, q1)[0] # 解一阶条件 # 求公司2的反应函数 dprofit2_dq2 = diff(profit2, q2) reaction2 = solve(dprofit2_dq2, q2)[0] print(f"公司1的反应函数: q1 = {reaction1}") print(f"公司2的反应函数: q2 = {reaction2}")你会得到熟悉的反应函数表达式:
公司1的反应函数: q1 = (8 - c - q2)/2 公司2的反应函数: q2 = (8 - c - q1)/23. 联立求解纳什均衡
纳什均衡是两个反应函数的交点,即两家公司同时选择对对方最优产量做出最佳反应的产量组合。我们需要解这两个方程的联立方程组:
# 定义反应函数方程组 eq1 = Eq(q1, (8 - c - q2)/2) eq2 = Eq(q2, (8 - c - q1)/2) # 解方程组 nash_equilibrium = solve((eq1, eq2), (q1, q2)) print(f"纳什均衡解: {nash_equilibrium}")输出结果为:
纳什均衡解: {q1: (8 - c)/3, q2: (8 - c)/3}这个结果验证了经济学教科书中的经典结论:在对称的古诺模型中,纳什均衡下两家公司会生产相同的产量(8-c)/3。
4. 可视化反应函数与均衡点
理论推导固然重要,但图形展示能带来更直观的理解。我们用Matplotlib将反应函数和均衡点绘制出来:
import numpy as np import matplotlib.pyplot as plt # 假设c=2的具体案例 c_value = 2 q1_values = np.linspace(0, 8, 100) # 计算反应函数曲线 def R1(q2, c): return (8 - c - q2)/2 def R2(q1, c): return (8 - c - q1)/2 # 绘制图形 plt.figure(figsize=(10, 6)) plt.plot(q1_values, [R2(q, c_value) for q in q1_values], label='公司2的反应函数 R2(q1)') plt.plot([R1(q, c_value) for q in q1_values], q1_values, label='公司1的反应函数 R1(q2)') # 标记纳什均衡点 eq_q = (8 - c_value)/3 plt.scatter([eq_q], [eq_q], color='red', label=f'纳什均衡 ({eq_q:.1f}, {eq_q:.1f})') # 图表装饰 plt.xlabel('公司1产量 q1') plt.ylabel('公司2产量 q2') plt.title('古诺模型反应函数与纳什均衡 (c=2)') plt.legend() plt.grid(True) plt.axis([0, 5, 0, 5]) plt.show()这张图会清晰地显示:
- 两条反应函数直线相交于一点
- 交点坐标正是我们计算得到的纳什均衡解
- 当c=2时,均衡产量为(8-2)/3=2
5. 模型扩展与敏感性分析
基础模型假设两家公司对称,但现实世界往往更复杂。让我们探讨几个扩展场景:
场景1:不对称成本假设公司1的成本为c1,公司2的成本为c2:
c1, c2 = symbols('c1 c2') profit1_asym = (8 - q1 - q2)*q1 - c1*q1 profit2_asym = (8 - q1 - q2)*q2 - c2*q2 # 求导并解反应函数 reaction1_asym = solve(diff(profit1_asym, q1), q1)[0] reaction2_asym = solve(diff(profit2_asym, q2), q2)[0] print(f"不对称成本下的反应函数:") print(f"公司1: q1 = {reaction1_asym}") print(f"公司2: q2 = {reaction2_asym}")场景2:n家公司竞争将模型扩展到n家相同公司:
n = symbols('n', integer=True, positive=True) Q = n * q # 总产量 P = 8 - Q # 价格函数 profit_n = (P - c) * q # 求对称均衡 reaction_n = solve(diff(profit_n, q), q)[0] print(f"{n}家公司时的均衡产量: {reaction_n}")这个扩展显示随着竞争者数量增加,单个公司的均衡产量会减少,反映出市场竞争加剧的效果。
6. 实际应用中的注意事项
在将古诺模型应用于真实商业分析时,有几个关键点需要牢记:
- 成本函数假设:我们使用线性成本函数简化分析,但实际成本曲线可能更复杂
- 产品差异化:同质产品假设在现实中很少成立
- 动态竞争:静态模型忽略了多期互动中的策略行为
- 信息对称:现实中公司可能对彼此成本结构了解有限
以下是一个简单的敏感性分析表格,展示不同成本参数下的均衡结果:
| 边际成本c | 均衡产量q* | 均衡价格P* | 总利润(两家公司) |
|---|---|---|---|
| 1 | 2.33 | 3.33 | 10.89 |
| 2 | 2.00 | 4.00 | 8.00 |
| 3 | 1.67 | 3.67 | 5.44 |
| 4 | 1.33 | 3.33 | 3.11 |
这个表格揭示了成本对市场结果的系统性影响——成本上升导致产量下降、价格上升,但总利润减少。