尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

machine-learning-for-trading 案例实战:SP 500 股票 + 期权分析——从点内特征工程到周度组合的全流程研究管线

machine-learning-for-trading 案例实战:SP 500 股票 + 期权分析——从点内特征工程到周度组合的全流程研究管线 machine-learning-for-trading 案例实战SP 500 股票 期权分析——从点内特征工程到周度组合的全流程研究管线【免费下载链接】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本案例sp500_equity_option_analytics是 machine-learning-for-trading 仓库中一个端到端的策略研究示范用 633 只 SP 500 成分股的期权隐含波动率信息IV 水平、偏斜、期限结构与方差风险溢价对股票未来 5 日收益进行横截面排序并最终在股票市场上持有排序靠前的股票。读完本文你将掌握该案例的完整研究契约决策时点、标签体系、特征族、评估协议、21 个阶段的流水线编排方式、基于内容寻址注册表的可复现实验管理以及它对期权信息能否穿越点内特征工程、周度组合构建、成本、风控与 regime 变化这一核心问题的严谨证据边界。案例概览与数据集画像该案例的交易逻辑非常明确读取期权的观点在股票市场下注——每周根据期权曲面摘要排序 SP 500 成分股持有排序靠前的股票从不持有期权本身。研究区间为 2017 至 2021 年输入数据是 AlgoSeek 的 SP 500 日线以及物化后的日频期权曲面。以下是 case_studies/sp500_equity_option_analytics/README.md 中给出的数据画像属性取值资产类别SP 500 股票 期权衍生预测因子频率日频输入每周五收盘决策历史区间2017–2021标的池633 只具备挂牌期权覆盖的股票输入AlgoSeek SP 500 日线 物化的日频期权曲面主标签fwd_ret_5d评估两个 walk-forward fold10 个交易日的 embargo2021 年 holdout执行周五收盘决策下周一开盘成交期权特征滞后一天成本模型配置中点价 13 bps 往返0–50 bps 压力网格当前证据v3.1 验证载体NLinear、score weighted、top 10、5% 尾随止损一个值得注意的细节是纠正后的 v3.1 验证 Sharpe 为 2.08895% 置信区间为 [1.005, 3.117]但由于 2021 年 holdout 已在旧的 IPCA lineage 上被观测过与 NLinear 匹配的 holdout 没有重新运行。因此当前 notebook 只呈现验证证据明确将样本外有效性标记为未决label out-of-sample efficacy unresolved不做任何部署声明与书对齐的 v3.0 记录被保留两个结果版本不混用。这正是该仓库在方法论纪律上的核心态度。研究问题信息是否穿越完整管线这个案例最独特的问题不是期权是否包含信息而是这些信息能否在点内特征工程、周度组合构建、成本、风控和 regime 变化之后依然存活。决策协议在 config/setup.yaml 中声明关键设计包括决策节奏decision.cadence: weekly_friday_close快照时刻为friday_16:00_et执行延迟为monday_open特征滞后iv_feature_lag: 1_day——期权曲面摘要在当日收盘才盖章只能在下一次决策时读取杜绝前视按标签差异化节奏cadence_by_label将两个 10 日标签fwd_ret_10d、fwd_dir_10d调整为双周biweekly网格。原因是 10 日标签在周度网格上两周后才结算新仓会与前一个仍在持有期内的仓位重叠重叠的正是被度量的对象本身映射规则mapping.class: long_only_rank_and_rebalance按 IV 信号排序、等权持有不做空、不做期权。特征体系点内特征注册表setup.yaml中的features块是一份特征规格注册表而非 notebook 内的局部变量。注释明确说明了这样设计的原因特征是本研究案例的特征集声明只有 notebook 持有的声明无法被测试、后续阶段或任何询问变更的人读取。曲面合约选择由data/equities/market/sp500/materialize_options.py固定dte_buckets7d: [5, 10]、30d: [25, 35]、90d: [80, 110]delta_targetsatm: 0.50、25d: 0.25、10d: 0.10窗口配置IV z-score 用 63/252 日窗口、IV 百分位 252 日、IV 动量 5/21 日、偏斜与期限 z-score 63 日、已实现波动 20/63 日、Garman-Klass 21 日、动量在 5/21/63/126/252 五个 horizon 上计算、skip-month 动量取 t-252 到 t-21、风险调整动量设置 0.01 的年度化波动地板防止分母趋零导致单行主导截面百分位、IV 前向填充上限 5 个交易日。排名列映射features.rankediv_30_atm → iv_rank、skew_rr_30_25d → skew_rank、ivrv_spread → vrp_rank、mom_21d → mom_21d_rank、mom_63d → mom_63d_rank、rv_20 → rv_rank、iv_mom_21d → iv_mom_rank、d_iv_30_atm → d_iv_rank命名显式映射而非后缀规则因为后置阶段按这些名字选择列。八大特征族features.families——每个族都同时声明了hypothesis假设、inputs输入、lookback、lag、representation表示形式与failure_mode失效模式这是本案例最有价值的工程实践之一特征族模式滞后表示形式失效模式横截面排名*_rank2521日内在 (0,100) 的百分位薄截面使百分位退化为少数名字的粗排序隐含波动率水平iv_30_atm等11年化 IV方差点报价稀薄的名字由单个陈旧合约决定水平隐含波动率动态d_iv_30_atm、iv_mom_*、z-score/百分位2521一阶差分、多期变化、尾随 z-score 与百分位z-score 在自身离散度趋零时无界偏斜与期限结构skew_*、term_*631曲面点之间差与比、尾随 z-score远端桶读取的是插值而非报价的合约方差风险溢价ivrv_spread、vrp_z_*631波动率点差与尾随 z-score前瞻一个月与后顾一个月在事件附近分歧已实现波动rv_20、gk_vol_*等630年化标准差、极差估计、三阶矩close-to-close 漏掉隔夜跳空股票动量mom_*2520五 horizon 简单收益、skip-month 与波动缩放变体最近一个月反转skip-month 动量将其剔除曲面质量spread_atm_*、qc_converged_share11相对点差、收敛点占比度量报价质量而非流动性到期附近二者背离注意滞后语义每个期权衍生族滞后一个交易日曲面摘要按收盘盖章每个股票价格族滞后为零收盘即决策快照。完整流水线21 个阶段的贪心漏斗整个研究被编排为 21 个 notebook每个都有对应的.py脚本按阶段严格串行。核心原则是不能静默跳过某个模型族也不能从部分基线上启动下游阶段——只有所有模型预测和所有等权基线都存在后贪心漏斗才有效。阶段Notebook章节教学点写出物可行性01_feasibility_analysis6检验期权覆盖、周度节奏以及股票交易成本是否为研究留出空间无证据留在 notebook 内标签02_labels7构建 5/10 日收益、风险调整与方向标签含 walk-forward 边界labels/fwd_ret_5d.parquet等 5 个标签文件金融特征03_financial_features8将滞后 IV 曲面与已实现波动、动量、流动性特征连接features/financial.parquet时变特征04_model_based_features9产出仅前视的 GJR-GARCH 波动特征并记录固定的单起点特征 vintagefeatures/model_based.parquet评估05_evaluation7–9审计覆盖度、陈旧度、日频 IC 与 HAC 不确定性evaluation/triage_ledger.parquet、evaluation/ic_timeseries.parquet线性模型06_linear11在标签面板上建立正则化线性与分类基线run_log/registry.db中的训练与预测记录梯度提升07_gbm12训练 LightGBM 配置并记录 fold 完整验证预测boosters、learning_curves.parquet、fold_metrics.parquet表格深度学习08_tabular_dl12在股票期权联合特征面板上评估 TabM 集成run_log/training/tabular_dl/下的 checkpointLSTM09_dl_lstm13检验循环序列结构是否优于点内特征run_log/training/deep_learning/下的 checkpointPatchTST10_dl_patchtst13检验多尺度 patch 注意力与 checkpoint 稳定性同上潜因子索引11_latent_factors14比较潜因子家族并引导读者到各实现无只读注册表PCA11a_pca14在每个训练 fold 内对持久面板拟合 PCA训练与预测记录IPCA11b_ipca14在 ragged 面板上估计特征条件因子训练与预测记录条件自编码器11c_conditional_autoencoder14学习非线性条件因子暴露不跨越 fold 边界训练与预测记录随机贴现因子11d_stochastic_discount_factor14估计神经 SDF 并比较 checkpoint 稳定性训练与预测记录监督自编码器11e_supervised_autoencoder14学习收益监督潜因子并按 checkpoint 报告不确定性训练与预测记录因果 DML12_causal_dml15用 walk-forward DML 与面板稳健推断估计ivrv_spread效应注册表causal_runs中的一行模型分析13_model_analysis11–15用带 HAC 区间的日频 IC 与特征溯源比较全覆盖家族无只读注册表等权基线14_backtest16运行等权 top-k 基线并应用覆盖感知选择run_log/backtest/{hash}/下daily_returns.parquet、weights.parquet、trades.parquet、fills.parquet、equity.parquet、portfolio_state.parquet、spec.json组合构建15_portfolio_management17在十个推进配置上测试五种替代分配器每种分配方法一个回测布局同上风控16_risk_management19比较 14 个预声明固定风控含配对收益不确定性每个 overlay 变体一个回测成本17_costs18在精确 17 点成本曲面上重放最佳风险阶段配置每个成本水平一个回测Holdout 预测18_holdout_predictions20用 2021 年前全部历史重拟合选中配置并预测 holdout一个训练运行 一个预测集Holdout 回测19_holdout_backtest20原样运行选中策略于 holdout 预测stageholdout的一个回测策略评估20_strategy_analysis20汇总本案例已确立的内容声明 holdout 支持哪些主张无只读注册表漏斗各阶段的工程细节从源码中可以确认各阶段的推进逻辑research_workflow.py 是模型工作流辅助模块published_labels()从setup.yaml读出主标签与变体model_request_catalog()构建标签 × 模型配置的声明式请求目录空标签列表遵循表示全部已发布标签的约定而空配置列表则被拒绝防止静默扩宽require_complete_canonical_requests()在 canonical 执行模式下拒绝不完整的声明请求面——不能悄悄跳过某个模型族run_model_population()在拟合前快照官方群体OfficialPopulation拟合后按内容寻址的预测 hash 做精确比对缺一不可任何移动训练身份的变更都必须显式声明supersedes。模型菜单config/training/fwd_ret_5d.yaml展示了每个标签的配置清单线性族含 OLS、8 档 ridgealpha 0.001 到 1e7、9 档 lasso 与 9 档 elastic-netGBM 含default_mse/mae/huber与 5 档 leaves 数 × 3 种损失的组合深度学习含nlinear、lstm_h64、patchtst表格 DL 含tabm_s/m/l潜因子含pca/ipca/cae/sdf/sae因果含dml。标签体系02_labels.py中有几个容易被忽略的坑标签采用 next-open-to-close 约定r C_{th} / O_{t1} - 1而非书本 7.2 节的 close-to-close——锚定在 t 收盘的标签会把信号与首个可成交价格之间的隔夜跳空记入策略收益方向标签的when(ret 0)在 Polars 中 null 谓词不为真若不加is_not_null()守卫会在每个证券最后一周的每行写入自信的 0且事后drop_nulls无法发现每个标签都做窗口有效性断言与逐行归因对账尾部、窗口空洞、价格缺失三类原因必须恰好覆盖所有未标注行有效性被切在标签结算日而非观测日观测于 holdout 之前、结算于其内的行是 holdout 行。回测引擎协议config/backtest/base.yamlexecution_price: openexecution_mode: next_bar佣金 0.039% 百分比模型、滑点 0.026%NYSE 日频日历。这与周五收盘形成信号、下一 bar周一开盘成交的事件顺序一致防止周五收盘特征获得同 bar 成交。引擎层执行默认值如initial_cash: 1_000_000、share_type: integer统一从setup.yaml读取任何改动都会使既有 backtest_hash 失效。运行方式与数据获取在仓库根目录、锁定环境下运行整条流水线。需要设置ML4T_DATA_PATH指向包含equities/market/sp500/daily_bars.parquet与equities/market/sp500/options_surface_daily.parquet的目录。值得强调的是股票日线随仓库分发在data/equities/market/sp500/daily_bars.parquet经 AlgoSeek 许可再分发无需任何账号、密钥或许可申请若在出版物中使用请注明数据来源为 AlgoSeek。期权曲面加载器在物化研究文件可用时提供该文件缺失数据会报错并附带获取说明。uv sync --frozen for notebook in \ 01_feasibility_analysis 02_labels 03_financial_features 04_model_based_features \ 05_evaluation 06_linear 07_gbm 08_tabular_dl 09_dl_lstm 10_dl_patchtst \ 11_latent_factors 11a_pca 11b_ipca 11c_conditional_autoencoder \ 11d_stochastic_discount_factor 11e_supervised_autoencoder 12_causal_dml \ 13_model_analysis 14_backtest 15_portfolio_management 16_risk_management \ 17_costs 18_holdout_predictions 19_holdout_backtest 20_strategy_analysis do uv run python case_studies/sp500_equity_option_analytics/${notebook}.py done一个完整的生产级运行在 CUDA 机器上是数小时级工作量深度学习和潜因子训练占主导CPU 执行受支持但明显更慢。当仓库自带的注册表与产物存在时已完成 hash 会被复用notebook 会报告每个缓存命中。结果的唯一事实来源是run_log/registry.db内容寻址产物位于run_log/training/、run_log/predictions/、run_log/backtest/下遗留的results/*.json文件已不再使用。每个产物还配套.digest.json边车文件记录值摘要与输入数据摘要用于检测陈旧读取。等权基线基准benchmark/目录给出了等权基准的量化参考benchmark/fwd_ret_5d.json方法为daily_cross_sectional_mean_close_pct_change年化周期 252池内 550 只股票总体Sharpe 0.883CAGR 20.8%波动 25.0%753 期验证窗口2019-01-08 至 2020-12-31Sharpe 0.685CAGR 17.0%波动 29.1%501 期Holdout2021-01-04 至 2021-12-31Sharpe 1.913CAGR 28.9%波动 13.8%252 期。该基准说明等权、无预测的买入持有式基线本身在这段样本上就不弱任何模型/组合改进都必须以超越它为门槛。可行性阶段的关键测量01_feasibility_analysis.py 不拟合任何模型只回答三个问题决策日的标的池是否存在、典型股价波动是否大于交易成本、历史是否足够诚实评估。几个可复现的结论未决值处理供应商把求解失败的 IV 记为负数占位符直接 drop 会留在排序里把该股打到最底。加载器统一将其转为缺失值并断言存在的 IV 必为正、每股每会话至多一行标的池按挂牌日历而非流动性规则波动每月第三个周五的月度到期在窗口内时可排序股票超过 500仅有周度到期时降到 210–260 左右远高于 book 需要的 20 只下限成本13 bps 的百分比往返在按每股计价时对应 0.04 bps最贵股票到 619 bps最便宜股票——跨三个数量级这正是按百分比成为主线模型、按每股仅作对照的原因移动 vs 成本5 日绝对移动中位数 209 bps是 13 bps 往返的 16 倍0.965 的移动超过往返成本排序持久性IV 排序与一周后的自身排序相关系数 0.92八周后仍有 0.75——支持周度而非日度/月度再平衡walk-forwardevaluation.n_splits: 2每 fold 训练 2 年、验证 1 年fold 边界间有 10 个会话的 purgelabels.buffer: 10D对 5 日 horizon是独立所需的两倍断言每个 purge 缺口与声明一致、验证窗口不触及 2021。模型化与因果设计config/setup.yaml 的modeling块声明了各家族的训练契约GBM仅 LightGBMmax_bin: 255显式声明避免把 CPU 默认 255 量化误用成 GPU 的 63 档粗分箱潜因子device: cuda显式声明并参与 hash 计算防止训练身份变成宿主机属性IPCA 配置max_iter: 10000、factor_ridge: 0.01、gamma_ridge: 0.01SDF 的 checkpoint 周期为 [256, 512, 768, 1024]SAE 显式声明batch_size: 10000——因为库默认无批处理会把整个训练窗口约 25 万行当作一个 batch24 GB 显存放不下GJR-GARCH 特征model_based块burnin: 252个会话接近 fold 0 前的 250 会话 run-up若取 504 会把覆盖率从 76.5% 压到 54.7%、每 21 会话重估一次、规格为mean: Constant, vol: GARCH, p:1, o:1, q:1, dist: Normal——o: 1是本案例相对共享 GARCH(1,1)-Normal 默认的声明偏差理由是基于数据的单名股票期权报价围绕负收益比同幅正收益更推高下一期方差的不对称性展开因果 DMLcausal块处理变量为ivrv_spreadtreatment_window: 20由构造直接推导iv_30_atm - rv_20placebo 块必须覆盖该窗口才能保留序列依赖混杂因子为rv_20、mom_21d、skew_rr_30_25d方法walk_forward_dml结果写入注册表causal_runs。组合、风控与成本压力setup.yaml的backtest.sweep定义了漏斗各阶段的扫描广度top_n 递进signal 阶段取全部预测等权基线allocation 阶段取按等权基线 Sharpe 排序的前 10 个模型配置cost 与 risk 阶段每标签取前 1top_k 网格五个标签统一为[5, 10, 20]分配器score_weighted、inverse_vol、risk_parity、mvo_ledoit_wolf显式 126 bar lookback保证 top_k20 时 N/K ≥ 2.5Ledoit-Wolf 收缩不塌缩为恒等目标、hrp、conformal_weighted——其中 conformal 分配器按预测区间宽度而非收益矩定仓是唯一读取模型自身不确定性的分配器同时检验13_model_analysis度量的校准是否好到足以用于定仓成本网格cost_grid_bps: [0, 1, 2, 3, 5, 7, 10, 15, 20, 30, 50]11 点加上配套的每股半价差网格[0.0, 0.005, 0.01, 0.025, 0.05, 0.10]美元14 个预声明风控3 档止损3/5/10/15%、6 档尾随止损1/2/3/5/10/15/20%、3 档时间退出10/20/40 bars再平衡门槛min_weight_change: 0.005且min_trade_value: 100.0时跳过再平衡基准画像禁用门槛以保证 1/N 全池再平衡。标签的有效样本量与基线 IC02_labels.py 对重叠窗口做了量化周度标签 503,079 行开发行对应 101,099 个有效观测比率 0.2010理论完全重叠参考值 0.2000双周标签 500,062 行对应 50,548比率 0.1011。面板自相关从 lag-1 的 0.772 衰减到 lag-5 的 -0.051。风险调整标签把周度标签的峰度从 16.48 降到 7.16。未加工信号滞后一日的 30 日 ATM IV对周度标签的平均 IC 为 -0.0072HAC t 统计量 -0.50p0.614——基线无法与零区分这正是后续特征必须超越的地板。策略评估的纪律与限制20_strategy_analysis.py 作为最后阶段只读注册表、不创建任何东西其学习目标包括从配置的、全覆盖的注册表行而非全局最大 Sharpe重建当前配置把阶段推进、成本存活、配对风险不确定性与选择调整视为不同诊断当方法论修复在 holdout 已被观测后改变验证配置时强制一次 holdout 使用产出区分验证证据与未决样本外有效性的出版级评估。该案例明确声明的人口范围限制是使用**当前成分股名单current-constituent roster**而非点内 SP 500 成员资格历史结果描述的是回顾性名单不确立指数成员流程或前瞻性 SP 500 群体的表现。此外从 Ch11 起每个模型都在期权衍生列与价格列上联合拟合报告的只是同时拿到两类的模型的贡献无法回答期权信息是否比免费的价格历史更有价值——这需要一次剔除期权列的对照拟合本案例未运行13_model_analysis也记录了这一限制。总结可复用的工程模式从本案例中可以提炼出几条适用于任何量化研究项目的模式单点事实来源single source of truth标签、特征窗口、执行默认值、成本模型全部声明在 config/setup.yamlnotebook 只读取不重复杜绝两处拷贝漂移内容寻址 显式继承所有训练、预测、回测产物以 hash 组织在run_log/下registry.db是唯一事实来源任何配置变更使 hash 失效新旧结果版本不混用点内纪律内建为断言特征滞后、按sec_id而非 ticker 界定的实体、按市场会话网格而非行数的窗口、求解失败占位符的加载器级归一化全部以代码断言而非文档约定落地评估诚实性purge 宽度、fold 数、holdout 边界、HAC 标准误、FDR 多重检验、有效样本量、选择调整与一次 holdout 使用共同构成可辩护的证据链数据获取零门槛经许可再分发的 AlgoSeek 日线随仓库提供配合 data 目录 的加载器即可从01_feasibility_analysis一路跑到20_strategy_analysis。【免费下载链接】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),仅供参考
返回列表