合成金融数据生成实战:machine-learning-for-trading 第五章的保真度-效用-隐私评估框架与生成模型全览
2026/9/13 14:42:52 网站建设 项目流程

合成金融数据生成实战:machine-learning-for-trading 第五章的保真度-效用-隐私评估框架与生成模型全览

【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading

本章(Chapter 5: Synthetic Financial Data)聚焦于一个根本性矛盾:金融研究只有一条已实现的价格路径,而研究过程却会对这条路径反复搜索,这本身就足以让回测变得脆弱。要生成更多值得信任的路径,需要回答三个问题:生成器必须保留什么、如何判断它是否做到了、以及做到这些要付出多少隐私与算力代价。本指南将带你走完从经典模拟基线(bootstrap 与随机波动率模型)、GAN、扩散模型到 LLM 表格生成的完整路线,并始终用同一套评估协议衡量它们——因为在本章的视角里,验证协议的重要性高于架构选择。读完本文,你将掌握:如何量化回测的路径局限、如何用保真度(fidelity)、效用(utility)、隐私(privacy)三元标准组织生成器评估、如何实施 Train-Synthetic-Test-Real(TSTR)验证,以及如何在仓库中一键运行全部 8 个合成数据实验。

量化困境:为什么回测在生成模型登场之前就已经脆弱

回测的脆弱性来自两个叠加的因素:路径有限搜索自适应

金融资产的历史价格只有一条实现路径,而策略研究是在这条路径上反复试探、调参、筛选,最终把"看起来最好的"那一个方案留下来。当搜索空间很大、被检验的策略很多时,即使所有策略真实期望收益都为零,单纯靠多次检验(multiple testing)也几乎必然出现某个策略在样本内表现惊艳。第七章的 07_multiple_testing.ipynb 对此有专门讨论;而第五章的结论是:在生成任何合成数据之前,必须先承认——强的样本内结果可能只是有利历史与反复搜索的产物

合成数据由此登场:它的作用是超越唯一实现路径,把稳健性分析扩展到更多可能的世界,同时锚定在"任何有用的生成器都必须保留的实证特征(stylized facts)"之上。在 00_classical_simulation.py 的开头,作者列出了模拟的四个典型动机:

  1. 风险管理:VaR、压力测试、尾部风险评估;
  2. 回测:在历史经验之外验证策略;
  3. 数据增强:为 ML 模型训练提供更大数据集;
  4. 隐私:共享不暴露专有信号的合成数据。

评估合成金融数据:为什么"看起来合理"远远不够

合成数据可以看起来完全合理,却仍然不可用。金融中真正要紧的结构不在分布中心,而在稀有事件、依赖关系的突变和条件动态上。因此,第五章在介绍任何生成器之前,先立下全章统一的三条评估标准:

维度含义失败的表现
保真度(Fidelity)合成数据是否复现真实数据的分布与结构边缘分布吻合,但尾部、相关性、条件动态失真
效用(Utility)合成数据在下游任务中是否可用训练出的模型在真实数据上失效
隐私(Privacy)是否泄露单条记录的信息成员推断、记录重现

关键洞察是三者互相权衡而非共同改善:例如差分隐私(DP)会把隐私做上去,但噪声必然压低保真度与效用。这条"不可能三角"贯穿 5.8 节的 DP-GAN 实验,也是全章所有生成器的统一评判坐标。

经典模拟基线:可解释、样本高效、易于验证的基准线

第五章没有直接跳进深度生成器,而是先给出"学术纪律":bootstrap、GBM、跳跃扩散、均值回归、Heston 与 GARCH 之所以仍然重要,是因为它们可解释、样本高效、更易验证。它们是学习型生成器必须在关键诊断指标上打败的基准。对应实验见 00_classical_simulation.ipynb(源码为 00_classical_simulation.py)。

连续时间价格模型

四个 SDE 模型各捕捉一类市场现象:

模型关键特征适用场景
GBM对数正态价格、恒定波动率期权定价、基线
Jump-Diffusion罕见极端波动崩盘场景、尾部风险
Mean-Reversion(OU)价格向均衡漂移价差、商品、利率
Heston随机波动率波动率曲面、杠杆效应

仓库中的手写实现值得精读,因为每个都藏着可复用的工程细节:

GBMsimulate_gbm):用对数收益率累积再取指数,log_returns = (mu - 0.5*sigma^2)*dt + sigma*sqrt(dt)*Z,其中dt=1/252对应日频,musigma均为年化。注意 GBM 的局限性恰好就是金融收益率三大"实证特征"的反面:肥尾(超额峰度)、波动率聚集、杠杆效应——GBM 一个都不具备。

Jump-Diffusion(Merton)simulate_jump_diffusion):在 GBM 上叠加复合泊松过程,核心是漂移补偿(drift compensator)。补偿项k = exp(mu_jump + 0.5*sigma_jump^2) - 1保证mu仍然表示含跳跃的总期望收益。仓库注释特别强调:这是"改变被模拟对象"的实现细节,而非风格选择——没有补偿项,请求的漂移就不是实际实现的漂移。

Mean-Reversion(OU)simulate_mean_reversion_eulersimulate_mean_reversion_exact):OU 过程存在闭式转移密度,可完全消除离散化误差。仓库用同一股随机数流同时驱动 Euler 与 exact 两种实现,让两条路径的差距恰好等于离散化误差。半衰期由t_1/2 = ln(2)/kappa推导而非手敲,参数改动时诊断信息自动跟随。

Hestonsimulate_heston):波动率本身服从均值回归过程,关键参数是波动率的波动率xi与价格-方差冲击相关性rho(负rho即杠杆效应)。实现采用全截断 Euler(full truncation)——在计算漂移与扩散项之前先对当前方差施加max(v, 0),防止方差为负。仓库还内置了 Feller 条件断言2*kappa*theta > xi^2,参数一旦移入方差可触零的区间,断言立即失败而不是静默改变图示含义。代码注释同时提醒:Feller 条件满足针对的是连续过程,离散 Euler 步在任何参数下都可能提出负方差,因此截断照做不误。

离散时间波动率模型:GARCH(1,1) 的校准

与"选参数"的 SDE 不同,GARCH 通常通过极大似然从数据中拟合。仓库用arch库把 SPY 的对数收益率(以百分比计)拟合 GARCH(1,1):

am = arch_model(spy_log_returns_pct, mean="Constant", vol="GARCH", p=1, q=1) res = am.fit(disp="off")

得到muomega(基础方差)、alpha(新息冲击/新闻效应)、beta(方差持续性/记忆),并要求alpha + beta < 1以保证平稳性。无条件方差为omega / (1 - alpha - beta)。手写simulate_garch从无条件波动率起步,逐期递推方差。

Bootstrap 重采样:不加分布假设地保留经验分布

Bootstrap 直接对历史数据重采样,精确保留经验分布(包括肥尾),但代价是无法生成超出历史极值的场景:

方法块长保留自相关适用
IID Bootstrap1可接受 i.i.d. 假设时
Block Bootstrap固定是(块内)时间序列
Stationary Bootstrap随机是(更平滑)金融收益率

仓库手写了三种实现(iid_bootstrapblock_bootstrapstationary_bootstrap),并同步展示了arch.bootstrap库的等价调用(IIDBootstrapMovingBlockBootstrapStationaryBootstrap)。块长经验法则为b ≈ T^(1/3),金融日频数据常用约 22 天(一个交易月)。Stationary Bootstrap 的块长服从几何分布Geom(1/b),消除了固定块的边界伪影,因此每个位置的边际分布相同——这是它"平稳"的含义。

用诊断区分模型,而不是用一条路径

仓库在 5.3 节做了一个严谨的方法论示范:只画一条路径,无法把"模型的属性"与"这条抽样"分开。因此它用N_PATHS=200条独立路径逐模型统计,并把 GBM 作为零假设:

  • 超额峰度排序(对 GBM p95 的超越比例):Jump-Diffusion > GARCH > Heston,跳跃模型的超额峰度中位数比其他两者高一个数量级;
  • 波动率聚集(前 20 阶平方收益自相关之和):GBM、均值回归、跳跃扩散都处于零假设水平(跳跃独立到达,只增肥尾不增聚集),而 Heston 与 GARCH 在绝大多数路径上显著超越零假设,GARCH 中位数约为 Heston 的三倍且每条路径都超越;
  • 两条性质对模型排序不同:跳跃扩散尾部最重却无聚集;GARCH 聚集最强、尾部次之;Heston 两项都有但均弱于 GARCH;
  • 对 SPY 的对照要求等长窗口(N_STEPS模拟路径 vs 等长 SPY 窗口),否则偏差与方差都不可比。

对于风险工作,结论直接可用:GBM 与均值回归在尾部权重上不超过高斯,从中计算的 VaR/ES 系统性低估尾部损失;而三个尾部模型的量级差距足以影响风险决策。

生成模型分类:从判别到生成的概念地图

5.4 节提供全章其余部分的概念地图:区分判别式建模(学习条件分布p(y|x))与生成式建模(学习联合分布p(x)),并把 VAE、GAN、扩散模型与 LLM 表格生成器定位为"学习联合分布"而非"手工指定"的替代路线。其价值在于方向感:读者可以早早看清,架构选择的本质是保留下游用例所需的结构。经典模拟模型(5.3 节)与学习型生成器不是替代关系而是互补关系——这正是 5.3 节被命名为"baselines"的原因。

金融时间序列的 GAN:从基础对抗到领域变体

5.5 节是全书差异化程度最高的模型综述。它的方法论不是"哪个 GAN 最好",而是哪种归纳偏置匹配任务及其失效模式

TimeGAN:奠基性时序生成架构

01_timegan.ipynb(源码 01_timegan.py)实现了 Yoon, Jarrett & van der Schaar(NeurIPS 2019)的 TimeGAN,针对普通 GAN 的两大缺陷提出两项创新:

  1. 逐步监督损失(Stepwise Supervised Loss):普通 GAN 只学习整体分布,TimeGAN 额外监督t → t+1的时间转移;
  2. 学习型嵌入空间(Learned Embedding Space):对抗训练发生在学到的潜空间而非原始数据上,训练更稳定。

五组件架构在三阶段训练中协同:

模块用途训练阶段
Embedder原始数据 → 潜空间阶段 1(自编码器)
Recovery潜空间 → 原始数据阶段 1(自编码器)
Supervisor预测下一个潜变量阶段 2(时序)
Generator从噪声生成潜序列阶段 3(联合 GAN)
Discriminator判别真假潜序列阶段 3(联合 GAN)

数据侧的关键决策值得注意:使用BA、CAT、DIS、GE、IBM、KO 六只股票的对数收益率面板SEQ_LEN=24HIDDEN_DIM=24NUM_LAYERS=3BATCH_SIZE=128LEARNING_RATE=1e-3TRAIN_STEPS=10000),并设置D_GATING_THRESHOLD=0.15——判别器损失低于该阈值时跳过一步判别器更新,防止判别器过强压垮生成器。

仓库还专门解释了"为什么用收益率而非价格水平":所有模块以 sigmoid 结尾,生成器只能输出[0, 1],输入用训练期拟合的 min-max scaler 缩放到该区间。价格水平有趋势,后置留出期会滑出缩放器拟合的范围,TSTR 得分将混杂"支持集严重漂移"这一混淆因素;对数收益率足够平稳,留出期落在拟合区间内,从而消除混淆。代码用断言out_of_range < 0.01强制这一前提。

TimeGAN 的评估协议封装在 timegan_metrics.py,这是全章验证协议的可复用核心:

  • 预测得分(Predictive Score / 效用):用合成数据训练事后 LSTM 预测下一时刻,在真实留出集上测 MAE,并与 TRTR 基线(真实训练、真实测试)比较,报告比值TSTR_MAE / TRTR_MAE。比值 ≈ 1.0 表示合成数据保留了可预测结构;比值 > 1.5 判为失败。评估前按特征归一化,防止高方差特征(如成交量)主导 MAE;
  • 判别得分(Discriminative Score / 保真度):训练二分类 LSTM 判别真实 vs 合成序列。准确率 ~50% = 不可区分;> 85% = 保真度差。时间序列评估采用固定顺序 80/20 切分以保证时序一致性;
  • Yoon 模式:与官方 TimeGAN 仓库对齐的变体,仅用其他特征预测最后一个特征,GRU + sigmoid,要求数据归一化到[0,1],报告原始 MAE(论文对 GOOG 报告约 0.04)。

Tail-GAN:可微排序保尾部风险

02_tailgan_tail_risk.ipynb(源码 02_tailgan_tail_risk.py)实现 Cont, Xu & Zhang(2022)的 Tail-GAN。它不像 TimeGAN 那样做一般性分布匹配,而是针对特定风险指标(VaR、ES):用**可微排序(differentiable sorting)**让梯度流经分位数计算,并用约束投影强制W · VaR ≤ ES的关系,从而生成保留尾部风险结构的组合 PnL 场景。关键超参数:N_EPOCHS=3000BATCH_SIZE=1000LATENT_DIM=1000N_COLS=100(每场景时间步)、N_STRATEGIES=32。生成器输出被钳制到[-1, 1],因此收益率先除以最大绝对值(MAX_SCALED_RETURN=0.95留出余量),避免极端尾部饱和。评估以相对 VaR/ES 误差为核心。SEED=1被固定以复现 5.5 节正文中的数字(VaR 22.5% / ES 21.0%)。

Sig-CWGAN:路径签名替代判别器

03_sigcwgan_signatures.ipynb(源码 03_sigcwgan_signatures.py)构建无条件 Sig-Wasserstein GAN(Ni et al., Mathematical Finance 2024):用**期望路径签名(expected signature)**之间的解析距离(Sig-W1)替代训练好的判别器作为训练目标,从而绕开对抗训练的不稳定性。条件版 Sig-CWGAN 通过蒙特卡洛期望签名目标扩展(论文核心洞见),在本 notebook 中仅作概念说明。环境要求特殊signatoryesig为 x86-only 包,必须用py312docker profile 运行(见下文运行章节)。

GT-GAN:Neural ODE 处理不规则时间戳

04_gtgan_irregular.ipynb(源码 04_gtgan_irregular.py)实现基于 Jeon et al.(NeurIPS 2022)的 GT-GAN 启发模型,用Neural ODE处理天然带不规则时间戳的时间序列,数据采用第三章的 NVDA 美元柱(Databento 柱采样,见 03_market_microstructure/17_databento_bar_sampling.ipynb)。评估沿用 TimeGAN 的同一套指标(GRU-ODE 生成器适用)。

扩散模型:比对抗训练更稳定的通用候选

5.6 节把扩散模型定位为对抗训练的强有力、且通常更稳定的替代方案。去噪框架天然适配金融收益结构,条件引导(classifier guidance)支持按市场状态的压力测试。

05_diffusion_ts.ipynb(源码 05_diffusion_ts.py)实现 Diffusion-TS(Yuan & Qiao, ICLR 2024),其去噪预测被分解为趋势(多项式回归)+ 季节(Fourier 基)+ 残差三部分:

$$\hat{x}_0 = \text{Trend}(z) + \text{Season}(z) + \text{Residual}(z)$$

这一可解释结构鼓励模型把慢漂移与周期模式分开,类似经典的 STL 分解但端到端在扩散框架内学习。与 vanilla 扩散预测噪声ε不同,Diffusion-TS 直接预测x_0;Fourier 域损失进一步约束频谱保真度——这对保留金融收益率的自相关结构至关重要。仓库记录了两处关键适配:

  1. 移除clamp(-1, 1):原版代码为图像类数据钳制预测x0,而金融收益率用 StandardScaler 归一化(无界),钳制会破坏分布;
  2. 预测x0而非噪声:模型输出趋势+季节,再解析地导出噪声,天然配合条件生成。

工程要点包括:用DDIM 快速采样把反向步数从 500 减到 50;在加噪数据上训练状态分类器并应用 classifier guidance,生成状态条件(regime-conditional)的合成收益率——这正是下游压力测试(第 20 章)所需的输入。评估同时覆盖无条件与条件生成的保真度。

LLM 生成结构化表格数据:GReaT 工作流

5.7 节把合成数据讨论从收益率序列扩展到混合类型金融表格。核心洞见是序列化(serialization):把表格行转成自然语言句子,用 LLM 建模文本分布,再把生成的新"句子"解析回表格行。

06_llm_tabular_great.ipynb(源码 06_llm_tabular_great.py)使用真实的be-great库实现GReaT(Generate Realistic Tabular Data):在序列化的 ETF 财务数据上微调 GPT-2(distilgpt2),生成合成表格并评估保真度,并与 GAN、VAE 等传统方法对比。GReaT 对异构 schema(类别、数值、文本特征混排)建模良好,但也引入新风险:无效行、数值保真度下降、隐私泄漏——这些恰好回到 5.2 节的 FUP 框架去约束。

应用 Fidelity-Utility-Privacy 框架:验证比架构更重要

5.8 节是全章方法论的"重心":论证验证的重要性高于架构,评估围绕保真度、效用、隐私组织,以TSTR 作为主要任务级基准,以泄漏检查或DP(差分隐私)作为隐私控制。

07_dp_gan.ipynb(源码 07_dp_gan.py)用Opacus(PyTorch 官方 DP 库)训练带形式化隐私保证的 GAN,限制关于单条记录的信息泄漏。关键概念:

  1. 差分隐私:隐私保证的数学框架,以隐私预算ε度量;
  2. DP-SGD:逐样本梯度裁剪 + 噪声(而非批量级);
  3. 隐私预算ε:隐私与效用之间的权衡旋钮;
  4. 隐私记账器(Privacy Accountant):训练期间累计追踪隐私成本。

仓库实验的核心是观察ε变化的隐私-效用权衡ε越小隐私越强,但噪声越大,合成数据质量下降。这与 5.2 节"三个标准互相权衡"的论断形成闭环——隐私不是免费获得的。

运行与验证:从仓库根目录一键复现

全部实验以 notebook 与其百分号脚本(.py)成对提供,运行方式见 05_synthetic_data/README.md:

# 从仓库根目录运行单个实验 uv run python 05_synthetic_data/<notebook>.py # 测试模式(经 Papermill 以缩减数据运行) uv run pytest tests/test_notebooks.py -v -k "05_synthetic_data"

运行时注意事项(冷启动、无缓存检查点;数据量、硬件与实现版本不同时实际耗时会有差异,仓库记录的参考值如下):

实验冷启动参考耗时硬件建议
01_timegan~12 minGPU 推荐
02_tailgan_tail_risk~6 min(有缓存检查点 <30 s)GPU 推荐
04_gtgan_irregular~6 minGPU 推荐
05_diffusion_ts~5 minGPU 推荐
06_llm_tabular_great~13 min(distilgpt2 微调)GPU 必需
07_dp_gan~8 minGPU 推荐

03_sigcwgan_signatures需要py312docker profilesignatory/esig仅支持 x86):

docker compose --profile py312 run --rm py312 python 05_synthetic_data/03_sigcwgan_signatures.py

其余实验默认使用ml4t/ml4t-gpu镜像,例如:

docker compose run --rm ml4t-gpu python 05_synthetic_data/01_timegan.py

贯穿全章的三条方法论主线

  1. 验证协议 > 架构选择:从 timegan_metrics.py 的 TSTR/TRTR 与判别得分,到经典模型对 SPY 的等长窗口对照,全章用同一套标准衡量所有生成器。仅匹配单一统计量不等于匹配整个序列——这是整套验证协议存在的理由。
  2. 诊断要跨路径、跨复现:单条路径读不出模型属性;超额峰度与波动率聚集是分离的性质,需分别测量;比较必须在可比的采样长度与参数化下进行。
  3. 实现细节改变结论:跳跃扩散的漂移补偿、Heston 的全截断、TimeGAN 用收益率而非价格水平、Diffusion-TS 移除钳制——这些都不是风格选择,而是决定"被模拟的是什么"以及"评估在测什么"的关键决策。

【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询