4. 从N人博弈到平均场:Nash均衡、对称性假设、平均场极限推导
好,咱们今天聊点硬核的。从N个交易者互相博弈,到用平均场理论来近似,这中间到底发生了什么?我当年第一次接触这个推导时,也觉得有点绕。但后来在实盘项目中踩过坑,才真正理解——这玩意儿不是纯数学游戏,它直接决定了你的策略能不能跑起来。
4.1 N人博弈的困境:Nash均衡到底在哪?
先想想最原始的场景。市场里有N个交易者,每个人都在做自己的买卖决策。每个人都知道,自己的收益不光取决于自己怎么操作,还取决于其他N-1个人怎么操作。这就是典型的N人博弈。
理论上,我们要找的是Nash均衡——没人愿意单方面改变自己的策略。但问题来了:
- 计算量爆炸:每个人的策略空间是连续的(买卖多少、何时买卖),N个人联合起来,解空间维度是N×连续空间。N=10时还能算,N=1000时直接歇菜。
- 信息需求不现实:每个交易者需要知道所有人的策略才能做最优决策。你想想看,在真实市场里,你连隔壁交易员的持仓都不知道,更别说他的策略函数了。
- 均衡可能不存在:即使存在,也可能有多个均衡,你根本不知道市场会收敛到哪一个。
核心痛点:N人博弈的Nash均衡,在算法交易中几乎无法直接求解。我见过不少团队试图用强化学习硬解,结果训练时间以周为单位,而且泛化能力极差。
4.2 对称性假设:让问题变得可解
那怎么办?我们得做点合理的简化。我个人习惯从对称性入手。
假设所有交易者都是同质的——他们有相同的风险偏好、相同的成本结构、相同的市场接入能力。当然,现实中交易者千差万别,但你会发现,在流动性好的市场里,大部分高频做市商的策略其实长得差不多。嗯,这里要注意,对称性假设不是忽略差异,而是抓住主要矛盾。
对称性假设具体包含:
- 策略对称:所有交易者使用相同形式的策略函数,只是参数可能不同。
- 收益对称:每个人的收益函数结构相同,只取决于自己的状态和市场的整体分布。
- 信息对称:每个人看到的信息集是相同的(虽然具体数值可能不同)。
有了对称性,N人博弈就变成了一个代表性交易者的问题。但这里有个坑——你仍然需要知道其他人的策略分布,才能算自己的最优策略。说白了,还是耦合的。
我的经验:对称性假设在实际项目中最大的价值,是让模型参数从O(N²)降到了O(1)。我曾经在一个期权做市项目里,用对称性假设把状态空间从10^6压缩到了10^3,训练时间从两周缩短到两小时。
4.3 平均场极限:当N→∞时发生了什么
好,现在进入最精彩的部分。当N趋向无穷大时,单个交易者对市场的影响趋近于零。这意味着什么?
每个交易者不再需要关心其他个体,只需要关心市场的整体分布——也就是所有交易者状态的统计量。这个统计量,就是平均场。
数学上,我们定义:
令 μ_t(x) 为时刻t交易者状态x的分布函数
则单个交易者的最优控制问题变为:
max E[∫_0^T f(x_t, a_t, μ_t) dt + g(x_T, μ_T)]
其中 a_t 是控制变量(交易指令)
状态演化:dx_t = b(x_t, a_t, μ_t) dt + σ dW_t
平均场演化:∂_t μ_t + ∇·(b μ_t) = (σ²/2) Δ μ_t
看到没?原来需要解N个耦合的HJB方程,现在只需要解一个HJB方程(对代表性交易者)加上一个Fokker-Planck方程(对平均场)。这两个方程通过μ_t耦合在一起,但复杂度从指数级降到了多项式级。
避坑指南:我曾经在推导平均场极限时,忽略了边界条件对分布的影响。结果策略在极端行情下直接崩了——因为平均场假设在尾部事件中失效。记住,平均场极限要求N足够大,且交易者之间的交互是弱耦合的。如果市场里只有几个大机构,平均场近似就不太靠谱。
4.4 核心逻辑:一张图说清楚
下面这张SVG图,我画了三个层次,帮你把整个推导逻辑串起来:
4.5 从理论到代码:一个最小实现
理论说完了,咱们看看代码。下面是一个简化版的平均场交易策略求解框架。注意,这只是示意,真实项目里HJB和FP方程要用数值方法求解。
import numpy as np
from scipy.optimize import minimize
class MeanFieldTrading:
def __init__(self, n_grid=100, T=1.0, dt=0.01):
self.n_grid = n_grid # 状态空间网格数
self.T = T # 时间 horizon
self.dt = dt # 时间步长
self.x_grid = np.linspace(-1, 1, n_grid) # 状态网格
def solve_hjb(self, mu):
"""求解代表性交易者的HJB方程"""
# 输入:当前平均场分布 mu
# 输出:最优控制策略 a*
V = np.zeros((self.n_grid, int(self.T/self.dt)))
a_opt = np.zeros_like(V)
for t in range(int(self.T/self.dt)-1, -1, -1):
# 对每个状态点求解最优控制
for i, x in enumerate(self.x_grid):
# 定义目标函数(简化版)
def objective(a):
# 瞬时收益 + 未来价值
return -(self.reward(x, a, mu) +
self.dt * self.future_value(x, a, V[:, t+1], mu))
res = minimize(objective, 0.0, method='BFGS')
a_opt[i, t] = res.x[0]
V[i, t] = -res.fun
return a_opt, V
def solve_fp(self, a):
"""求解Fokker-Planck方程,更新平均场"""
mu = np.zeros((self.n_grid, int(self.T/self.dt)))
mu[:, 0] = self.initial_distribution()
for t in range(int(self.T/self.dt)-1):
# 用有限差分更新分布
drift = self.drift_term(a[:, t])
diffusion = self.diffusion_term()
mu[:, t+1] = mu[:, t] + self.dt * (drift + diffusion)
# 归一化
mu[:, t+1] /= np.sum(mu[:, t+1]) * (self.x_grid[1] - self.x_grid[0])
return mu
def iterate(self, max_iter=100, tol=1e-6):
"""迭代求解平均场均衡"""
mu = self.initial_distribution()
for i in range(max_iter):
a_opt, V = self.solve_hjb(mu)
mu_new = self.solve_fp(a_opt)
# 检查收敛
diff = np.max(np.abs(mu_new - mu))
print(f"Iteration {i}: diff = {diff:.6f}")
if diff < tol:
break
mu = mu_new
return a_opt, mu
实用建议:实际项目中,我一般用深度神经网络来近似HJB和FP方程的解,而不是网格法。网格法在状态维度超过3时就会遇到维度灾难。用PINN(物理信息神经网络)可以处理10维以上的状态空间,而且天然支持自动微分。
4.6 对称性假设的局限性
最后说点实在的。对称性假设虽然好用,但它不是万能的。我在一个外汇做市项目里就吃过亏——市场里明明有几个大型银行和几十个小基金,策略行为完全不对称。强行用对称性假设,结果策略在银行大单来临时直接亏钱。
那怎么办?有两个思路:
- 分层平均场:把交易者分成几类(大机构、小基金、散户),每类内部用平均场,类之间用博弈。这样既保留了异质性,又控制了复杂度。
- 有限N校正:当N不是特别大时(比如N=50),平均场近似会有误差。可以用1/N展开来修正,我见过一些论文用这种方法把误差从10%降到了1%以内。
嗯,对称性假设就像一把瑞士军刀——好用,但别指望它解决所有问题。关键是要理解你的市场结构,然后选择合适的建模粒度。
公众号:蓝海资料掘金营,微信deep3321