4. 纳什均衡求解:纯策略纳什均衡、混合策略纳什均衡、求解算法与工具(Python实现)
好,咱们进入博弈论最核心的部分——纳什均衡求解。
说实话,很多新手一听到「纳什均衡」就觉得高深莫测。其实没那么玄乎。说白了,纳什均衡就是一个状态:谁先改变策略,谁就吃亏。你不动,我也不动,大家就这么僵着。
我在做量化交易策略回测时,经常遇到这种场景。两个做市商互相盯着对方的报价,谁先降价谁就被收割。嗯,这就是典型的纳什均衡困境。
4.1 纯策略纳什均衡
纯策略,就是每个玩家只选一个确定的行为。比如剪刀石头布,你选「石头」,我选「布」——这就是纯策略。
怎么找纯策略纳什均衡?我教你一个笨但管用的方法:划线法。
划线法三步走:
- 对于每个玩家,固定对手的策略,找出自己的最优反应
- 在最优反应对应的收益下划线
- 所有收益都被划线的格子,就是纯策略纳什均衡
举个例子。经典的「囚徒困境」收益矩阵:
| 囚徒B:沉默 | 囚徒B:背叛 | |
|---|---|---|
| 囚徒A:沉默 | (-1, -1) | (-10, 0) |
| 囚徒A:背叛 | (0, -10) | (-8, -8) |
咱们来划线:
- 如果B沉默,A选背叛得0 > 沉默得-1 → 在(0, -10)的A收益下划线
- 如果B背叛,A选背叛得-8 > 沉默得-10 → 在(-8, -8)的A收益下划线
- 如果A沉默,B选背叛得0 > 沉默得-1 → 在(-10, 0)的B收益下划线
- 如果A背叛,B选背叛得-8 > 沉默得-10 → 在(-8, -8)的B收益下划线
看到没?只有(-8, -8)这个格子被划了两条线。所以纯策略纳什均衡就是(背叛,背叛)。
个人经验:我在做高频交易策略时,经常用划线法快速判断对手的「死穴」。比如两个流动性提供商互相压价,最后都赚不到钱——这就是囚徒困境的现实版。
4.2 混合策略纳什均衡
但有些博弈没有纯策略均衡。比如剪刀石头布——你出什么我都能克制你。这时候就需要混合策略了。
混合策略,就是给每个纯策略分配一个概率。比如我以30%的概率出石头,50%出剪刀,20%出布。
混合策略均衡的核心思想:让对手无论选什么策略,期望收益都一样。这样对手就没有动机去改变。
怎么算?我直接上公式:
假设玩家1选策略A的概率为p,选策略B的概率为(1-p)。
玩家2选策略C的概率为q,选策略D的概率为(1-q)。
令玩家2选C和选D的期望收益相等 → 解出p
令玩家1选A和选B的期望收益相等 → 解出q
举个例子。一个简单的「协调博弈」:
| 玩家2:左 | 玩家2:右 | |
|---|---|---|
| 玩家1:上 | (2, 1) | (0, 0) |
| 玩家1:下 | (0, 0) | (1, 2) |
假设玩家1选「上」的概率为p,选「下」的概率为1-p。
玩家2选「左」的期望收益 = p × 1 + (1-p) × 0 = p
玩家2选「右」的期望收益 = p × 0 + (1-p) × 2 = 2(1-p)
令两者相等:p = 2(1-p) → p = 2/3
同理,假设玩家2选「左」的概率为q,可得q = 1/3。
所以混合策略纳什均衡是:玩家1以2/3概率选上,玩家2以1/3概率选左。
避坑指南:我曾经在写交易策略时,直接用混合策略概率去下单,结果亏了不少。后来才意识到——混合策略是让你「随机化」,不是让你「固定比例」。你想想看,如果你每次都按固定比例出牌,对手很快就能摸清你的规律。
4.3 求解算法与Python实现
手工算小矩阵还行,但实际博弈动辄几十个策略,必须上算法。
常用的求解算法:
- 线性规划法:适用于双人零和博弈,用单纯形法求解
- Lemke-Howson算法:适用于双人非零和博弈,复杂度较高
- 迭代消除法:逐步剔除严格劣策略,缩小博弈规模
- 支持枚举法:枚举所有可能的策略组合,检查是否满足均衡条件
我个人最常用的是支持枚举法,因为它直观、好调试。咱们用Python实现一个:
import numpy as np
from itertools import product
def pure_nash_equilibrium(payoff_matrix_a, payoff_matrix_b):
"""
求解纯策略纳什均衡
payoff_matrix_a: 玩家1的收益矩阵
payoff_matrix_b: 玩家2的收益矩阵
"""
n_actions_a = payoff_matrix_a.shape[0]
n_actions_b = payoff_matrix_a.shape[1]
equilibria = []
for i in range(n_actions_a):
for j in range(n_actions_b):
# 检查玩家1是否愿意改变
a_best = True
for i2 in range(n_actions_a):
if payoff_matrix_a[i2, j] > payoff_matrix_a[i, j]:
a_best = False
break
# 检查玩家2是否愿意改变
b_best = True
for j2 in range(n_actions_b):
if payoff_matrix_b[i, j2] > payoff_matrix_b[i, j]:
b_best = False
break
if a_best and b_best:
equilibria.append((i, j))
return equilibria
# 测试:囚徒困境
A = np.array([[-1, -10], [0, -8]]) # 玩家1收益
B = np.array([[-1, 0], [-10, -8]]) # 玩家2收益
result = pure_nash_equilibrium(A, B)
print("纯策略纳什均衡:", result)
# 输出:[(1, 1)] 即(背叛,背叛)
代码说明:这个函数遍历所有策略组合,检查每个玩家是否有动机单方面改变。如果有,就不是均衡。我在项目中经常用这个函数做快速验证,比如检查两个交易策略是否「互相克制」。
再来一个混合策略的求解器:
from scipy.optimize import linprog
def mixed_nash_zero_sum(payoff_matrix):
"""
求解双人零和博弈的混合策略纳什均衡
使用线性规划
payoff_matrix: 玩家1的收益矩阵(玩家2的收益为负)
"""
n_actions_a, n_actions_b = payoff_matrix.shape
# 玩家1的线性规划:最大化最小收益
c = [0] * n_actions_a + [-1] # 目标函数:最大化v(即最小收益)
# 约束:每个对手策略下,期望收益 >= v
A_ub = []
for j in range(n_actions_b):
row = [-payoff_matrix[i, j] for i in range(n_actions_a)] + [1]
A_ub.append(row)
b_ub = [0] * n_actions_b
# 概率和为1
A_eq = [[1] * n_actions_a + [0]]
b_eq = [1]
# 概率非负
bounds = [(0, 1)] * n_actions_a + [(None, None)]
result = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds)
if result.success:
probs = result.x[:n_actions_a]
value = -result.fun
return probs, value
else:
return None, None
# 测试:剪刀石头布
# 收益矩阵(玩家1的视角)
RPS = np.array([
[0, -1, 1], # 石头
[1, 0, -1], # 剪刀
[-1, 1, 0] # 布
])
probs, value = mixed_nash_zero_sum(RPS)
print("混合策略概率:", probs)
print("博弈价值:", value)
# 输出:[0.333, 0.333, 0.333] 每个策略概率1/3
注意:线性规划法只适用于零和博弈。如果是非零和博弈,需要用Lemke-Howson算法。我曾经踩过这个坑——直接用线性规划去解合作博弈,结果算出来的概率全是错的。
4.4 知识体系总览
我把本章的核心逻辑画成了一张图,方便你理解:
这张图把本章的知识点串起来了。你从「纳什均衡」出发,分两条路走:纯策略和混合策略。每条路都有对应的求解方法。最后,所有方法都落到「算法与工具」这个工具箱里。
我个人建议你先把划线法练熟,这是基础。然后再去理解混合策略的「期望收益相等」原理。至于算法实现,能用现成库就用现成库,别自己造轮子——除非你想深入理解底层逻辑。
核心要点回顾:
- 纯策略纳什均衡:谁先变谁吃亏,用划线法找
- 混合策略纳什均衡:让对手无差异,解概率方程组
- 零和博弈用线性规划,非零和博弈用Lemke-Howson
- Python实现时注意矩阵维度匹配,别搞反了行和列
好了,纳什均衡求解就讲到这里。代码可以直接拿去用,但记得根据你的实际博弈场景调整收益矩阵。嗯,动手试试吧。
公众号:蓝海资料掘金营,微信deep3321