ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深度解析 US Equities Panel 案例研究:用 3,200 只美股验证横截面信号规模化的端到端 ML 交易工作流

深度解析 US Equities Panel 案例研究:用 3,200 只美股验证横截面信号规模化的端到端 ML 交易工作流 深度解析 US Equities Panel 案例研究用 3,200 只美股验证横截面信号规模化的端到端 ML 交易工作流【免费下载链接】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本案例研究是《Machine Learning for Trading》(3rd edition) 配套代码仓库中最宽的横截面股票工作流以 NASDAQ Data Link 提供的约 3,200 只美股 1990–2018-Q1 日频 OHLCV 数据为宇宙以主动管理基本定律单只股票边际很小但横截面广度可以补偿为检验命题用 16 折 walk-forward、多周期标签、多家族模型、配对 Bootstrap 置信区间与显式 holdout 窗口回答一个核心问题经过如此多测试仍存活的毛信号能否在考虑选择偏差与交易摩擦后转成一个可交易的策略。读完本文你将掌握该案例研究从可行性分析到策略评估的 21 个流水线阶段、setup.yaml的完整配置语义、运行方式以及最终验证与 holdout 结论的事实依据。案例定位全书最宽的横截面与最长的流水线在九个贯穿第 6–20 章的案例研究中US Equities Panel 有两个之最宇宙最宽约 3,200 只美股NYSE/NASDAQ/AMEX覆盖 1990 年至 2018-Q1折数最多16 折 walk-forward10 年训练、1 年验证是全仓库折叠数最多的案例研究。它的主标签是fwd_ret_1d次日收益另有fwd_ret_5d与fwd_ret_21d两个变体。特征面板混合了动量、均值回归、波动率、流动性、价值代理以及 walk-forward 时序模型输出。策略本身刻意保持朴素日频多空 top-K 横截面排序器美元中性构造叠加依赖时代的有形交易成本十进制化前每腿 15–30 bps之后 5–15 bps。该案例研究的运行框架是主动管理基本定律Fundamental Law of Active Management单票边际很小但横截面广度应当补偿。案例研究的职责就是把这个论断放到实测信号质量、配对 Bootstrap 置信区间和显式 holdout 窗口上去检验——不是背书而是检验。At a Glance属性值资产类别广泛美股NYSE/NASDAQ/AMEX频率日频宇宙约 3,200 只股票价格 $5、ADV $1M点及时刻历史区间1990 – 2018-Q1主标签fwd_ret_1dCV 折数1610 年训练1 年验证成本模型有形成本每腿 5–30 bps时代相关 借券上述概览、流水线表与关键结果均出自 案例研究 README配置细节与结论数据以 config/setup.yaml 及对应 notebook 源码为准。数据宇宙点及时刻过滤与成本时代宇宙过滤的三个阈值声明在 01_feasibility_analysis.py 的参数单元格中MIN_PRICE 5.0 # 价格下限 $5 MIN_ADV_USD 1_000_000 # 日均成交额下限 $1M ADV_WINDOW 21 # 成交额平均窗口21 个交易日要点是点及时刻point-in-time某个决策日期上策略允许持有的股票只能用该日期之前存在的信息判定因此过滤不会引入前视偏差。该 notebook 只做可行性检查——不拟合模型、不做预测也什么都不写证据全部留在 notebook 内部。成本方面setup.yaml将一笔交易花多少钱声明为带band而非点point每次往返按交易金额的一定比例计费取带的中点并翻倍两腿。配对的第二种计费方式——每股固定美分数——作为对照但由于宇宙价格分布极宽$5 到数百美元且历史 bar 价格经过拆股、分红调整每笔费用作用于调整后价格并不等于当年实际支付的费用因此在 19_costs.py 中每份费用仅作探索性对照基点bps体制才是本案例的正式成本模型。评估协议16 折 walk-forward 与 2016–2018 holdoutconfig/cv_config.json 定义了交叉验证协议{ n_splits: 16, train_size: 10Y, test_size: 1Y, embargo_td: P1D, label_horizon: P1D, timestamp_col: timestamp, calendar_id: NYSE, test_start: 2016-01-01, test_end: 2018-03-31 }setup.yaml的evaluation段同步声明n_splits: 16、train_size: 10Y、val_size: 1Y、holdout 区间 2016-01-01 至 2018-03-31、日历 NYSE、年化周期 252。这个 holdout 是设计阶段完全不触碰的一段历史当策略最终在那里被评估时结果不是对已调参数据的排练。标签侧labels段规定主标签fwd_ret_1d缓冲 1 个交易日变体fwd_ret_5d/fwd_ret_21d缓冲 5/21 个交易日。每个标签还有一个向量化回测的抽稀步长rebalance_step1/5/21对应持有期不重叠。流水线全景21 个阶段、21 个 notebook下表完整继承自案例 README并给出各阶段在本书中的章节映射与实际产物路径均以仓库根为起点阶段Notebook章节职责写出可行性01_feasibility_analysisCh6每个决策日期的宇宙广度、成本时代、move-to-cost 尺度、walk-forward 折叠无——证据留在 notebook 内标签02_labelsCh71 日、5 日、21 日前向收益labels/fwd_ret_{1d,5d,21d}.parquet各带.digest.json边车特征03_financial_featuresCh862 个横截面因子动量、波动率、流动性、价值features/financial.parquet时序特征04_model_based_featuresCh9Walk-forward Wasserstein regime 距离、FFD、GARCH 特征features/model_based.parquet评估05_evaluationCh7–9全面板特征-标签 IC 诊断evaluation/triage_ledger.parquet、evaluation/ic_timeseries.parquet线性06_linearCh11全特征矩阵上的 Ridge、LASSO、ElasticNet训练与预测集入run_log/registry.db系数在run_log/training/{hash}/、分数在run_log/predictions/{hash}/GBM07_gbmCh12LightGBM 叶子轮廓 × 损失函数网格训练与预测集booster、learning_curves.parquet、fold_metrics.parquet在run_log/training/{hash}/Tabular DL08_tabular_dlCh12TabM 注意力式集成训练与预测集checkpoint 在run_log/training/tabular_dl/NLinear09_dl_nlinearCh13末值归一化的最小时序基线训练与预测集checkpoint 在run_log/training/deep_learning/LSTM10_dl_lstmCh13日收益窗口上的顺序记忆同上TSMixer11_dl_tsmixerCh1360 日回看上的时间混合与特征混合同上周频 DL12_dl_weeklyCh13周频节奏 LSTM/NLinear 对比同上潜在因子13_latent_factorsCh14PCA IPCA 索引 notebook无——只读注册表PCA13a_pcaCh14收益协方差静态因子提取训练与预测集IPCA13b_ipcaCh14特征条件载荷的器械化 PCA训练与预测集因果 DML14_causal_dmlCh1512-1 动量对日收益的因果效应注册表causal_runs一行模型分析15_model_analysis--跨模型 IC 对比与折叠稳定性诊断无——只读注册表回测16_backtestCh16日频多空 top-K 策略仿真每个预测集与入场方案一个回测daily_returns.parquet、weights.parquet、trades.parquet、fills.parquet、equity.parquet、portfolio_state.parquet、spec.json在run_log/backtest/{hash}/组合管理17_portfolio_managementCh17最高 IC GBM 信号上的配置扫描每种配置方法一个回测同 artifact 布局风险18_risk_managementCh19仓位级与组合级风险叠加每个叠加变体一个回测同布局成本19_costsCh18最优配置组合上的成本网格扫描每个成本水平一个回测同布局策略分析20_strategy_analysisCh20端到端策略评估信号、谱系、holdout、归因results/strategy_assessment.json、20_strategy_synthesis/output/us_equities_panel/us_equities_panel_tearsheet.html注README 的 Pipeline 表中章节号与文件名存在一处错位——实际文件系统中 18_risk_management.py 承载 Ch19 的风险叠加内容19_costs.py 承载 Ch18 的成本扫描内容setup.yaml注释也明确写着read by Ch18 19_costs.py。运行请以实际文件名18_risk_management、19_costs为准。特征工程62 个横截面因子与模型基特征03_financial_features.py 是全书最宽横截面上的特征工程它的任务是让一个特征在数千只股票之间排序而不是对单只股票做择时。源码中可以看到其导入的因子族来自ml4t.engineer.featuresmomentum 族的adx/cci/macd/rsi/stochastic、trend 族的ema/kama/sma、volatility 族的natr等最终汇总为 62 个横截面因子并写入features/financial.parquet。工程细节值得注意顺序敏感按 per-symbol 窗口、资格过滤、横截面排名依次计算使每一步都作用于赋予它意义的那个 frameWinsorize 时机对特征所处的横截面做缩尾而不是对一个策略尚未经历过的样本做缩尾避免泄漏评估封印特征评估在标签终点处封口holdout 在此处不参与评分多重检验与自相关校正分离把 Benjamini-Hochberg FDRbenjamini_hochberg_fdr与 HAC 统计compute_ic_hac_stats分开处理以严格解读主动管理基本定律的两个输入。04_model_based_features 写第二份矩阵features/model_based.parquet与金融因子矩阵并列由utils/modeling.py的load_modeling_dataset在模型阶段加载时拼接。其核心组件在setup.yaml的model_based段逐项声明regimen_clusters: 2平静月与下跌月的二态切分呼应动量崩溃文献、window: 21、overlap: 5、burnin: 756约 3 年、refit_every: 63每季度重估质心garchburnin: 504约 2 年低于此 ML 三参数估计的标准误过大致使持续性项不可靠、refit_every: 63规格为常数均值 GARCH(1,1) Normal 创新p:1, o:0, q:1, dist: Normal。这里刻意不拟合杠杆项o: 0因为宽横截面的单票在两年估计窗口内的大阴线太少无法将 gamma 与 alpha 分开。模型家族从线性基线到深度学习与因果训练配置按标签组织在 config/training/fwd_ret_5d.yaml 中fwd_ret_1d.yaml、fwd_ret_21d.yaml同构每条配置引用 case_studies/config 下的模型预设线性族olsridge_a0.001到ridge_a10000000.0的 11 档 alpha 网格加上lasso_a0.01/0.1与enet_a0.01/0.1GBM 族default_{mse,mae,huber}leaves_{7,15,31,63}_{mse,mae,huber}的容量 × 损失函数交叉深度时序nlinear、lstm_h64、tsmixer、nbeats_weeklyTabular DLtabm_s/m/l潜在因子pca、ipca因果dml。以最终胜出的 leaves_31_huber.yaml 为例其预设揭示了容量控制的完整手段checkpoint_interval: 50 huber_alpha_scale: 0.5 max_iterations: 500 model_class: lightgbm.Booster params: bagging_fraction: 0.8 bagging_freq: 1 feature_fraction: 0.7 lambda_l1: 0.5 lambda_l2: 5.0 learning_rate: 0.05 min_child_samples: 50 num_leaves: 31 objective: huber seed: 4207_gbm.py 明确解释了三个调节旋钮的语义容量由num_leaves决定7 片叶子只能表达少数条件63 片可以切出足以描述训练窗口的分区损失函数决定错在哪——横截面股票收益是厚尾的平方误差会给少数极端行情数百倍权重而 rank IC 恰好对平方误差追逐的量值不敏感因此mse/mae/huber的对比就是尾部能在多大程度上主导拟合的对比何时停由树的数量控制且每个配置沿训练过程取 10 个 checkpoint 分别计分——checkpoint 是配置的一部分把每个配置最佳迭代当一个候选来报等于把十个数的最大值当成一个数。setup.yaml的modeling段还给出本案例特有的工程决策gbm.max_bin: 255LightGBM 的 CPU 默认此前从 GPU 迁移时误带了 63 的 GPU 默认值导致 CPU 拟合把设计矩阵量化到四分之一的桶数latent_factors下调了 SDF 训练轮数n_epochs_unc: 128、n_epochs_moment: 32、n_epochs_cond: 512等使大 N 横截面上的训练时间保持在隔夜预算内。从排序到组合回测、配置与风险16_backtest.py 是全流程中第一次以钱计的阶段每个调仓日按模型预测排序做多 top-k、做空 bottom-k等权建仓。它坚持两点等权是正确的基线而非弱基线——聪明的配置器可以粉饰或埋葬一个排序等权加入的假设最少是任何配置器最难意外击败的对手整个模型群体全部回测而非按 IC 先筛短名单——排序准确性与策略表现是两个问题一个模型可能排序很好但换手率吞噬全部收益。setup.yaml的backtest段定义了从信号到最终策略的递进选取top_n_predictionssignal: 0全部预测、allocation: 10按等权基线 Sharpe 取前 10、cost_sensitivity: 1、risk_overlay: 1每标签取 1top_k_grid三个标签均为[20, 50]更大的宇宙需要更宽的 top-k 网格allocatorsequal_weight、score_weighted、inverse_vol、risk_parity、mvo_ledoit_wolf显式lookback: 126覆盖 6 个月避免 top_k50 时 N/K 2.5 导致 Ledoit-Wolf 收缩退化为恒等目标、hrp、conformal_weighted刻意不加max_weight上限接近 top_k 时封顶会迫使等权毁掉对比cost_grid_bps: [0, 1, 2, 3, 5, 7, 10, 15, 20, 30, 50]配套每股半价差网格[0.0, 0.005, 0.01, 0.025, 0.05, 0.10]risk_controls15 个仓位级叠加——stop_loss_{3,5,10,15}pct、trailing_{1,2,3,5,10,15,20}pct、time_exit_{10,20,40}。17_portfolio_management.py 保持名称不变、只改资金分配score_weighted信任预测幅值conformal_weighted按预测区间宽度倒数加权宽度取当日横截面第一百分位下限避免单一过度自信的名字占满整腿inverse_vol/risk_parity从各自波动率出发mvo_ledoit_wolf/hrp则读取协方差——只有它们能识别总是一起动的两只股票是一个下注押了两次。注意它先按等权 Sharpe 取短名单再做配置对比这是真正的选取决策配置器能拯救被等权埋没的模型是这种设计看不到的。18_risk_management.py 在组合之上叠加风险控制19_costs.py 则是敏感性分析而非又一轮选取先固定每标签一个配置此前三阶段产生的最高验证 Sharpe 者再对该固定策略施以每个声明的成本值且成本扫描不允许替换已选配置——会重排名次的扫描是在用成本假设做选取而不是在测量策略。信号质量IC 结果与跨家族低相关setup.yaml的kill_conditions段先给出门槛IC 下限 0.01、edge-to-cost 下限 1.2×、微市值集中度上限 0.5、借券后净 Sharpe 下限 0.3。实测结果见案例 README信号方向leaves_31_huber5 日变体标签取得最高的跨阶段验证 Sharpe。在fwd_ret_1d网格上日池化 IC 为0.0357HAC 调整 95% CI[0.0293, 0.0421]覆盖 4,018 个日横截面t_HAC 10.96显著远离零IC 随周期单调GBM 的 rank-1 IC 沿 1d→5d→21d 为 0.032→0.043→0.058线性族为 0.016→0.022→0.029且每个 CI 都不含零跨家族低相关树模型与线性家族信号两两相关低因此跨家族集成不会是在合并同一个共享信号。策略阶段表现Bootstrap CI、DSR 与 PBO该谱系的risk_overlay载体score_weightedtop_k20 time_exit_40验证 Sharpe 2.028配对 Bootstrap 95% CI[1.464, 2.549]PSR p ≈ 2e-15分类excludes_zero_strong相对同期等权美股宇宙高出 1.11 [0.48, 1.76]p ≈ 0excludes_zero_strongFF5MOM HAC 回归把验证边际记为alpha 驱动年化 alpha ≈ 0.76、t_HAC ≈ 7.7、残差 Sharpe ≈ 2.04、R² ≈ 0.01选取偏差度量来自cohort_metrics家族队列risk_overlay/fwd_ret_5d/gbmK_variants 20K_eff_MP ≈ 2.0K_eff_ER ≈ 2.5记录DSR_ER 0.106p ≈ 0、PBO 0.012,870 种 CSCV 组合 × 16 折在更宽的标签队列label/fwd_ret_5dK_variants 314上同一领导者 DSR_ER 0.065p ≈ 7e-13K_eff_ER ≈ 12.2——领导者的边际在小的叠加队列修正与跨阶段跨家族修正下都存活。Holdout 闭合验证边际没有穿越时代2016-Q1 至 2018-Q1 holdout 上该谱系 Sharpe 为−0.492相对验证的指数配对差为−2.520 [−3.804, −1.117]p ≈ 5e-4CI 在负侧排除零恶化在统计上已被认定同期等权参考宇宙 Sharpe 高达 1.71远高于其验证期 0.92反映该时期市值加权牛市相对该抬高的基准策略减基准在 holdout 上为−2.363 [−4.591, −0.213]p ≈ 0.03总体结论在所选调仓节奏下验证边际没有跨越 holdout 时代。这正是显式 holdout 的价值——预测性验证证据与单次 holdout 评估被清晰区分。摩擦底线成本曲线的陡峭程度成本敏感性扫描给出中等陡峭的包络数据见案例 README跨阶段 rank-1 预测谱系内零成本毛 Sharpe 2.5035 日标签 / 日计值策略下的毛收益天花板10 bps十进制化后成本区间中点时 Sharpe2.117edge-to-cost 比率稳超 1.2× 淘汰条件evidence_passes。Ch20 全局门全部落定验证 Sharpe 下限1.46高于零holdout 策略对等权基准的 CI 在负侧排除零。成本曲线的陡峭度与日频调仓节奏使该策略处于执行质量是约束性运营瓶颈的区间。运行方式从仓库根目录按顺序运行每个.py是 jupytext 百分号格式的 notebook 脚本.ipynb 与 .py 成对存在uv run python case_studies/us_equities_panel/01_feasibility_analysis.py uv run python case_studies/us_equities_panel/02_labels.py uv run python case_studies/us_equities_panel/03_financial_features.py uv run python case_studies/us_equities_panel/04_model_based_features.py uv run python case_studies/us_equities_panel/05_evaluation.py uv run python case_studies/us_equities_panel/06_linear.py uv run python case_studies/us_equities_panel/07_gbm.py uv run python case_studies/us_equities_panel/08_tabular_dl.py uv run python case_studies/us_equities_panel/09_dl_nlinear.py uv run python case_studies/us_equities_panel/10_dl_lstm.py uv run python case_studies/us_equities_panel/11_dl_tsmixer.py uv run python case_studies/us_equities_panel/12_dl_weekly.py uv run python case_studies/us_equities_panel/13_latent_factors.py uv run python case_studies/us_equities_panel/13a_pca.py uv run python case_studies/us_equities_panel/13b_ipca.py uv run python case_studies/us_equities_panel/14_causal_dml.py uv run python case_studies/us_equities_panel/15_model_analysis.py uv run python case_studies/us_equities_panel/16_backtest.py uv run python case_studies/us_equities_panel/17_portfolio_management.py uv run python case_studies/us_equities_panel/18_risk_management.py uv run python case_studies/us_equities_panel/19_costs.py uv run python case_studies/us_equities_panel/20_strategy_analysis.py其中20_strategy_analysis.py以templatefull写出完整诊断 tear sheetus_equities_panel_tearsheet.html到该案例 gitignore 的输出目录读者可在本地重新生成。关于端到端运行案例、降参测试与 headless 执行的通用模式可参考 docs/running-notebooks.md九个案例研究的目录布局与阶段-章节映射总览见 case_studies/README.md。Run Log内容寻址的结果注册表模型训练、预测与回测结果都记录在内容寻址注册表run_log/registry.db中这是全案例唯一的结果事实源第 6.7 节run log的实现。每个模型运行由其配置 hash 内容寻址run_log/training/{hash}/存放规格、系数、booster、checkpointrun_log/predictions/{hash}/存放预测数组run_log/backtest/{hash}/存放收益、交易、权重与配置。策略分析 notebook 通过注册表重开不可变的验证回测集合、施加确定性选取规则最高验证 Sharpehash 破平从而保证评估独立于注册表行序与后续实验。注册表 schema 与查询 API 见 case_studies/RUN_LOG.mdscripts/download_artifacts.py可在不重训的情况下安装已验收的 run log 与存储产物scripts/create_experiment.py可创建可写的实验副本。结语这条流水线证明了什么US Equities Panel 案例研究把主动管理基本定律拆成了可检验的一串论断信号在统计上显著IC 0.0357t_HAC ≈ 11、在选取修正后仍存活DSR 与 PBO 全过、边际确为 alpha 而非因子暴露FF5MOM 残差 Sharpe ≈ 2.04、摩擦底线足够宽10 bps 下仍有 2.117 的 Sharpe——但显式 holdout 给出了诚实的一击2016–2018 时代该边际消失Sharpe −0.492差分为负且显著。它同时示范了 21 阶段流水线的工程纪律点及时刻宇宙、跨特征缩尾、checkpoint 计入候选数、整个模型群体回测、成本扫描不重排名次、唯一结果事实源注册表。对任何要在大横截面股票数据上做端到端 ML 策略研究的读者这份案例研究都是一份可逐行复现的参考实现。【免费下载链接】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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进