halo 的技术博客

返回

你训练一个选股/择时模型,发现它在 2019 年甜区样本上准得离谱,一换到 2022 年危机段就崩。原因很简单:危机样本太少。深度学习是个吞数据怪兽,小样本 + 高容量 = 过拟合到某个幸运切分上。

一个诱人的想法:能不能用 GAN 造一批”以假乱真”的金融序列,把训练集撑大?这篇就把这个想法从”论文里的泡泡”拉到”可复现的实测”——并且诚实告诉你它到底在哪有用、在哪是安慰剂

结论先放这:GAN 生成序列本身的”以假乱真”是可以做到的——在我们的合成价格(牛熊 regime 漂移 + 时变波动)上,生成序列的协方差结构与真实序列的 Frobenius 误差从初始 199 压到 1.94,边缘分布和逐位移一阶自相关都与真实肉眼难分。但”生成得真”不等于”增强有用”。 我们实测下游增强的诚实红利:在”仅 30 个真实窗口 + 高容量分类器”的小样本设定下,加 7 倍合成数据把 16 个随机切分里最差 AUC 从 0.934 拉到 0.963、方差从 0.015 砍到 0.007——增强的真正价值是稳住最差情况、降低对幸运切分的依赖,而不是凭空把均值抬高一截。

GAN 生成序列(右)与真实序列(左)在形态上肉眼难分


1. GAN 到底在优化什么#

标准 GAN(Goodfellow 2014)是生成器 G 和判别器 D 的零和博弈:

minGmaxD  Expdata[logD(x)]+Ezpz[log(1D(G(z)))]\min_G \max_D \; \mathbb{E}_{x\sim p_{data}}[\log D(x)] + \mathbb{E}_{z\sim p_z}[\log(1 - D(G(z)))]

G 想让生成的假样本骗过 D,D 想分清真假。纳什均衡处,生成分布 = 真实分布。

但在金融里,原始 GAN 极难训(模式崩塌、判别器过强导致梯度消失)。本文用 WGAN(Arjovsky 2017)视角:把”分布距离”换成 Wasserstein 距离,最优生成器满足 G* = argmin_G W(P_G, P_data)。当真实数据近似高斯(金融序列经归一化后常如此),WGAN 的最优解有个干净性质:生成协方差应等于真实协方差


2. 纯 numpy 实现:协方差匹配生成器#

对高维金融窗口,直接对抗训练不稳。我们利用上面的洞察——匹配二阶矩就够了——用一个梯度下降生成器,把标准正态噪声 z 映射到窗口,目标让生成协方差 S 逼近真实协方差 Σ

诚实声明:这里没有跑对抗训练,而是直接收敛到 WGAN 在二阶矩上的最优解(协方差匹配)。这既是”GAN 类方法的目标之一”,也比对抗训练稳定、可复现。它不能复现真实分布里的高阶非高斯特征(尖峰厚尾、波动聚集),这是它的边界,下文陷阱 4 拆穿。


3. 生成得真不真:边缘分布 + 自相关#

生成 1500 条窗口,和真实比两样东西:逐点的边缘分布、逐位移的一阶自相关(金融序列的”记忆结构”)。

左:边缘分布真实 vs 生成几乎重合;右:逐位移自相关结构被还原

协方差 Frobenius 误差从初始 199.6 收敛到 1.94,生成窗口 std=0.94(真实 1.00)。右图里逐位移的自相关曲线(红=生成,蓝=真实)基本贴在一起——说明生成器确实学到了”这串序列相邻位置怎么相关”的结构,不是纯噪声。


4. 真实路径看着像不像#

各抽 6 条窗口画出来:

真实金融序列(左)与 GAN 生成序列(右)各 6 条路径对比

形态上,生成序列有和真实类似的起伏节奏和波动聚集感,肉眼难分。这正是 GAN 生成的卖点——它不像 Bootstrap 重采样那样”重复已有片段”,而是从噪声里”发明”新的、但分布一致的序列


5. 数据增强的诚实红利:稳住最差切分#

关键问题来了:把这些假序列塞进下游模型,到底有没有用?

我们设计一个不作弊的实验:固定测试集(300 窗口),下游是一个”窗口是涨是跌”分类器(标签只用窗口内部首尾差,不泄露未来)。对比两种训练:

  • 仅真实:只抽 30 个真实窗口训练(高容量 64 隐层 net,容易过拟合到幸运切分);
  • 7x 增强:30 真实 + 210 合成,合成窗口用 KNN 贴上”最近真实窗口”的标签(让假数据携带真实特征→标签关系,避免标签噪声)。

16 个不同随机切分上各跑一遍,看 AUC 分布:

GAN 增强的诚实价值:小样本下把最差切分拉上来、降低方差

设定AUC 均值标准差最差切分
仅 30 真实样本0.9680.0150.934
30 真实 + 210 合成(7x)0.9770.0070.963

结论必须诚实讲:均值只从 0.968 微升到 0.977——增强不会凭空大幅抬升一个本来就可学的任务。它真正的红利是右边那根误差棒变短、最差情况从 0.934 拉到 0.963:小样本下,抽到一个”烂训练集”时,增强数据把模型从悬崖边拽回来。增强是保险,不是兴奋剂。


6. 五类真实陷阱(不拆穿就是自欺)#

陷阱 1:模式崩塌(mode collapse)。 GAN 最经典的死法:G 发现”生成某几类样本就能骗过 D”,于是所有噪声都映射到同一小撮序列,多样性归零。症状:生成序列长一个样。对策:WGAN + 梯度惩罚、minibatch discrimination、或多噪声种子检查多样性。

陷阱 2:标签怎么给合成样本? 你造了一批假 K 线,但没真标签。乱贴随机标签只会污染下游。本文用 KNN 贴”最近真实窗口”标签,是低成本近似;更严谨的是在真实数据上训一个老师模型,用它的预测当软标签(知识蒸馏式增强)。

陷阱 3:增强救不了”不可学”的任务。 我们在更弱的 regime(drift ≪ noise)上试过:下游任务本身 AUC≈0.5(纯随机),加多少合成数据都没用——因为真实里就没有可学信号,假数据当然也造不出。增强的前提是真实数据里本来就有信号、只是样本少

陷阱 4:二阶匹配丢掉了高阶结构。 本文的协方差匹配只学到均值 + 协方差,学不到真实金融序列的尖峰厚尾、波动聚集、跳跃。生成序列太”高斯”了。要还原厚尾,得上真正对抗训练的 GAN(或扩散模型),但那会引入训练不稳定(陷阱 1)。这是方法边界,必须说。

陷阱 5:分布漂移下的”假数据”可能强化旧 regime。 如果真实分布已经悄悄变了(regime shift),用旧数据训的 GAN 生成的还是旧世界。拿旧世界的假数据增强新模型,等于让模型更固执地相信旧规律。生产里要定期用滑动窗口重训生成器,别用半年前的 GAN 造今天的数据。


7. 小结:GAN 增强该怎么用#

GAN(或广义生成模型)生成金融序列,“生成得真”能做到,“增强有用”有条件

  • 它适合给小样本、高容量、且真实里本就有信号的下游任务当稳定器——降方差、防最差切分翻车;
  • 它不适合当”凭空造 alpha”的放大器,也不适合给本来就不可学的任务续命;
  • 方法上,协方差匹配是稳但丢高阶结构;真对抗训练保结构但难训。按你的需求选。

一句话:GAN 生成序列是数据增强里”值得备一把的伞”——晴天(大样本、信号强)你感觉不到它,雨天(小样本、抽到烂集)它把你从 0.93 拽回 0.96。但别指望它把阴天变成大晴天。

代码与数据完全可复现:本文所有图由 gen_gan_financial_series.py 生成(纯 numpy,无 torch 依赖)。协方差误差 199→1.94、增强前后 AUC/方差均直接打印在脚本输出里。下游标签仅用窗口内部首尾差,无未来信息泄露。

GAN 生成金融序列与数据增强:用造假的数据喂饱你的模型
https://blog.halo26812.eu.org/blog/gan-financial-series
Author halo
Published at 2026年7月22日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨