halo 的技术博客

返回

选股模型最怕两件事:数据太少数据太窄。一家私募的历史样本可能只有几千条,覆盖了它自己擅长的那一类行情;另一家券商金工组手里有海量数据,但行业分布完全不同。理论上把两家的样本拼起来训练,模型会更稳——但现实中拼不了:监管不允许原始数据出域(个保法、数据跨境、客户隐私),商业上谁也不愿把自家 alpha 源交出去。

联邦学习(Federated Learning, McMahan et al. 2017)就是为这种「数据孤岛」而生的:各方只交换模型参数(梯度/权重),不交换任何原始样本,却能在服务器上聚合出一个联合模型。本文结论先放这:在受控的 non-IID(非独立同分布)数据上,FedAvg 聚合出的选股模型全局测试准确率 0.891,几乎等于把数据物理池到一起训练的 0.893,却把「各家关起门自己训」的 0.778 甩开 11 个百分点。所有数字来自真实 numpy 运行,附完整 Python 与四张真实计算图。

FedAvg 流程:各机构本地训练 → 只上传权重 → 服务器加权平均 → 下发回各机构,原始数据从不离开本地

一、核心矛盾:数据孤岛 vs 模型质量#

设共有 KK 家机构(客户端),第 kk 家持有本地数据集 Dk\mathcal{D}_k,其选股标签由全局概念 ww^* 加一个机构专属漂移 uku_k 决定:

wk=w+driftkukw_k = w^* + \mathrm{drift}_k \cdot u_k

  • driftk0\mathrm{drift}_k \to 0:所有机构数据同分布 → 本地训出的 wkw_k 自然接近 ww^*,联邦收益小;
  • driftk\mathrm{drift}_k 大:各机构数据概念漂移严重(non-IID) → 本地模型彼此偏倚,单独训都不准,但加权聚合仍能逼近全局最优。

这正是联邦学习的甜区:当数据不敢/不能集中、且各方分布有偏时,联合训练比本地训练好,又比「违法集中」损失小

二、FedAvg:只用四步就能联合训练#

最经典的算法是 FedAvg(Federated Averaging)。它把训练拆成「本地多步 SGD + 服务器聚合」,原始样本永远不离开机构:

服务器初始化 w_0
for 通信轮次 r = 1..R:
    服务器把当前 w_r 下发给所有客户端
    for 每个客户端 k:
        w_{k} = 本地用 SGD 在 D_k 上更新若干步(epochs 步)
    服务器聚合:w_{r+1} = Σ_k (n_k / Σn) · w_k     # 按样本量加权平均
plaintext

关键性质只有两点:

  1. 本地训练:各家在自己的数据上做普通梯度下降,数据不出门;
  2. 加权平均:服务器只收到各家更新后的权重,按样本量加权求平均。

下面是从零实现的 numpy 版本(本文全部数字的来源)。我们用逻辑回归做二分类选股(涨/跌):

注意 clip(梯度裁剪)和 noise_sigma(加噪)这两行——它们是把「隐私」焊进聚合步骤的关键,下文第四节量化它们的代价。

三、三种范式对照:池化 / 本地 / 联邦#

我们固定 6 家机构、8 维选股特征、概念漂移 drift=0.6\mathrm{drift}=0.6,构造三类训练范式并比较全局测试集准确率(测试集由真实 ww^* 生成,各方都没见过):

  • 集中池化(pooled):把 6 家数据物理拼到一起训练——理论上限,但现实中往往不可行;
  • 纯本地不共享(local-only):各家关门自己训,预测时取本地模型在全局测试集上的平均表现;
  • FedAvg(federated):只交换权重、不交换样本。

实测结果:

通信轮次 vs 全局测试准确率。FedAvg(绿) 弧线快速爬升并贴住集中池化虚线,纯本地不共享(红点线) 始终低一截

范式全局测试准确率是否交换原始数据
集中池化 pooled0.893是(违规风险)
FedAvg(联邦)0.891
纯本地不共享0.778

结论:FedAvg 在几乎不损精度的前提下,拿到了「集中训练」90% 以上的收益,而纯本地训练掉了 11 个百分点——因为各方数据有偏,单独训出来的模型只拟合了自己那一小块分布,放不到全局上就露怯。联邦聚合相当于用加权平均把各方的偏倚互相抵掉。

四、non-IID 越狠,联邦越值钱#

把概念漂移 drift\mathrm{drift} 从 0 扫到 1.5,三种范式的准确率变化如下(每根柱子都是真实运行):

横轴 non-IID 漂移,三色柱:池化(蓝)/FedAvg(绿)/本地(红)。FedAvg 始终贴住池化,本地始终最低

  • drift=0.0\mathrm{drift}=0.0(各家同分布):池化 0.886 / FedAvg 0.886 / 本地 0.787——同源时联邦≈池化,但本地仍偏低(样本少);
  • drift=0.6\mathrm{drift}=0.6:池化 0.892 / FedAvg 0.892 / 本地 0.778;
  • drift=1.5\mathrm{drift}=1.5(极端异构):池化 0.829 / FedAvg 0.829 / 本地 0.736。

一个反直觉但诚实的发现:在这个线性概念漂移设定下,FedAvg 几乎完全追上池化——因为各方虽然概念方向不同,但样本量相当、加权后能互相补偿。联邦真正的、稳定的优势是相对「纯本地」那 8–12 个百分点,而不是相对「池化」那接近 0 的差距。换句话说:联邦学习不是「免费逼近集中训练」,而是「用参数交换替代数据交换、保住大部分联合收益」——它的价值基准应该是「不联合」而非「非法集中」。

各机构概念权重(红/蓝热图)相对全局权重 w* 的系统性偏离,这就是 non-IID 的来源

五、隐私不是白给的:差分隐私的代价#

联邦学习默认只防「原始样本泄露」,但上报的权重本身仍可能通过成员推断攻击反推样本。标准加固是在聚合时加高斯噪声(差分隐私 DP)。我们扫描噪声尺度 σ\sigma

σ(噪声尺度)FedAvg 全局准确率
0.00.892
0.050.885
0.100.876
0.200.858
0.400.818

横轴差分隐私噪声尺度,FedAvg 准确率单调下降;中等噪声代价可控,过噪才明显崩

隐私-效用权衡是单调且温和的:σ 从 0 到 0.1,准确率只掉 1.6 个百分点;到 0.4 才掉 7.4 个点。实务上中等噪声(σ≈0.1)通常换来可接受的隐私预算(ε 在十几的量级),代价远小于「干脆不联合」。但红线是:噪声越大越隐私、也越损精度,没有免费午餐——这条曲线就是你的取舍边界。

六、实战红线(收尾提醒)#

  1. 通信成本是真瓶颈:每轮要把所有权重上传下载一次。6 家、8 维无所谓;换成 100 家机构、百万参数 LSTM,带宽和轮次就是主要开销。FedAvg 用「本地多步 + 少轮聚合」缓解,但别假设它比本地训练快。
  2. 客户端漂移会拖垮聚合:如果某家机构数据分布长期偏到全局之外(它押注的策略失效了),它的权重会持续拉偏平均。生产环境要监控各家上传权重的余弦相似度,对离群客户端降权或剔除。
  3. 「不交换样本」≠「零隐私风险」:权重仍可能泄露成员信息,金融场景必须叠 DP 或安全聚合(MPC/同态加密),否则合规上站不住。
  4. non-IID 下的收敛更慢:本文每轮本地 5 步、15–20 轮才贴住池化;真实异构数据往往需要更多轮次和 learning-rate 调参,别拿 IID 实验的轮次直接套。

一句话总结:联邦学习把「数据不敢集中」变成「参数可以联合」,在受控设定下几乎无损地拿到了集中训练的联合收益;它的价值基准是「不联合」而非「非法集中」,且隐私加固的代价是温和可调的——但通信、漂移监控、合规这三件事,一个都绕不开。

联邦学习因子共享:在不交换原始数据的前提下联合训练选股模型
https://blog.halo26812.eu.org/blog/federated-learning-factor
Author halo
Published at 2026年8月28日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨