十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

机器学习交易(ML4T)风险工程实战:从 VaR/CVaR 尾部分析到熔断器与治理机制

机器学习交易(ML4T)风险工程实战:从 VaR/CVaR 尾部分析到熔断器与治理机制 机器学习交易ML4T风险工程实战从 VaR/CVaR 尾部分析到熔断器与治理机制【免费下载链接】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导读本文基于 19_risk_management/README.md 及同目录 11 个配套 Notebook.py 可执行版本展开系统梳理本项目第 19 章「风险管理」的完整技术路线它把风险管理从「事后报告」重新定义为「系统设计的一部分」——任何策略在预先定义好上限、升级规则与可审计、点内时间point-in-time安全的治理工件之前都不具备可部署条件。读完本文你将掌握尾部风险度量VaR/CVaR、回撤与路径风险、因子/行业/宏观暴露分解、压力测试、无信息泄漏的自适应风控以及把回测策略推向可交易系统的熔断开关与治理工件并能在ml4t.backtest.risk库之上直接组合仓位级退出规则与组合级限额。19.1 风险管理在 ML4T 工作流中的定位从回测赢家到可交易系统本章开篇即给出全书的风险管理立场策略在界定好其极限、升级规则与治理工件之前不可部署。这里强调三个可审计性要求预先定义限额、触发条件、升级路径必须在策略上线前写死而不是在亏损发生现场临时拍板可审计每一次风险动作谁触发的、为什么触发、成交价多少都留有记录点内时间安全point-in-time safe风控决策只能使用决策时刻可得的信息严禁把未来数据走私进回测。这一节的落地载体是两个 Notebook01_var_cvar.py演示历史法、参数法与 Cornish-Fisher 三种 VaR/CVaR 计算方法并用回测验证估计值是否经得起真实亏损检验。尾部风险指标构成风险预算与监管报告的基础。06_stress_testing.py演示历史危机回放、假设情景与蒙特卡洛模拟三种压力测试方法论把历史危机当作「制度样例regime exemplars」来揭示策略在极端条件下的行为。19.2 量化策略的可操作风险分类法本节把「生产环境里到底可能出什么错」画成一张可用地图将抽象风险类别与可观测代理指标、控制手段一一挂钩。README 中列出的风险维度包括风险类别关注点可观测代理与控制手段市场风险market整体 beta 敞口因子回归 beta、净敞口限额因子风险factor风格/因子暴露市场、规模、价值、盈利、投资五因子回归杠杆风险leverage总敞口放大总敞口限额gross exposure cap集中度风险concentration单一标的占比持仓数量限额、单票权重上限流动性风险liquidity冲击成本与出不了货成交量参与率、滑点建模模型风险model分布假设失配回测例外数、漂移检测操作风险operational执行、系统、流程故障熔断开关、升级流程、治理工件支撑本节的 Notebook04_factor_exposure.py用回归方法把组合风险分解为因子分量估计市场、规模、价值、盈利、投资因子暴露并追踪其随时间的变化06_stress_testing.py压力测试方法论同上节。19.3 度量尾部VaR 与 CVaR为什么 VaR 不完整CVaR 更有信息量01_var_cvar.py 的开篇对二者给出精确定义VaR只回答一个问题接下来一天如果市场走坏但还没到灾难程度头寸最多亏多少给定置信水平例如「20 天里最差的一天」VaR 就是其余 19 天都不会被超过的那个损失分位数——它只是损失分布的一个分位数别无其他。CVaR期望损失expected shortfall回答 VaR 答不出的问题阈值下方是什么样CVaR 是「在阈值被击穿的前提下」的平均损失因此它读取的是整个尾部而不是尾部的单个点。这个 Notebook 在十九年的真实 ETF 收益率上用四种方式同时计算 VaR 与 CVaR从观测收益率直接取分位数历史法、拟合正态参数法、用观测分布形态修正正态Cornish-Fisher、以及蒙特卡洛模拟。随后它回答两个公开发布的 VaR 数字通常回避的问题分散化能消除多少尾部风险、以及在市场真正变坏的状态下风险会恶化多少。关键参数与含义Notebook 的参数格# %% tags[parameters]约 01_var_cvar.py直接决定了整个分析的边界每个参数注释都解释了取舍SYMBOL SPY # 单资产分析标的 SEED 42 # 全局随机种子 PORTFOLIO_SYMBOLS [SPY, AGG, GLD, EFA, EEM] # 美股/美债/黄金/发达国际/新兴市场 START_DATE 2006-01-01 # 刻意早于 2008样本里没有危机的尾部风险 notebook 度量的是错误的东西 END_DATE 2024-12-31 ROLLING_WINDOW 252 # 滚动 VaR 的窗口约一个交易日年 REGIME_WINDOW 63 # 波动率状态读取窗口约一个季度 REGIME_MIN_HISTORY 252 # 拆分波动率三分位所需的最少历史 FORECAST_EVALUATION_START 2020-01-02 # GARCH 严格在此之前估计比较全部样本外 N_MC_SIMULATIONS 10_000 # 蒙特卡洛路径数 CONFIDENCE_LEVELS [0.90, 0.95, 0.99] BACKTEST_CONFIDENCE 0.95 # 进入回测的置信水平 ROLLING_VAR_WINDOW 21 # 波动率预测方法之一 EWMA_LAMBDA 0.94 # RiskMetrics 惯例每日方差保留昨日估计的 94%作者在注释中明确点出关键权衡ROLLING_WINDOW越短对波动率变化反应越快但最深的置信水平99%只由窗口内约两三个最差交易日支撑N_MC_SIMULATIONS只影响模拟 VaR 的精度。用回测例外数检验风险估计风险估计是否正确要通过回测backtesting验证统计损失超过 VaR 的次数例外数并检查该次数是否与声称的置信水平一致。这与监管语境下的 Kupiec/例外计数检验一脉相承。Notebook 还要求掌握一个不对称的评分视角——用「对低估惩罚更重」的损失函数给竞争性波动率预测打分因为风险管理面对的不对称性就在于此低估风险比高估风险代价更高。分散化与制度条件化分散化收益对五资产组合美股、美债、黄金、发达国际、新兴市场计算组合 VaR 与各成分 VaR 之和的差距。Notebook 强调一个精妙结论对 VaR 而言分散化收益是观察值对 CVaR 则是保证——因为 CVaR 是凸的、满足次可加性而 VaR 不满足。制度条件化用「收益率到达时已可知」的标签如滚动波动率三分位把风险估计条件化回答在市场真正变坏的状态下风险有多糟这正是 01_process_is_edge/factor_regimes.py 等制度分析思路在风险端的延伸。19.4 回撤、路径风险与恢复时间本节把视角从「单点损失」转向「投资者的真实体验」。策略失败不仅因为亏钱更因为亏钱的方式令资金方与运营者无法忍受——因此需要回撤深度、回撤时长duration、恢复时间time-to-recovery等路径依赖指标。支撑 Notebook 及分工02_exit_strategies.py在真实 ETF 数据上比较固定止损、移动止损trailing stop、ATR 缩放波动率退出、ML 退出信号与混合方案度量止损触发频率、胜率以及「损失控制 vs 过早离场的磨单whipsaw成本」之间的权衡03_position_sizing_mae_mfe.py实现固定分数仓位与波动率仓位两种 sizing并用交易行程分析MAE/MFE优化止损位——MAE最大不利行程告诉你一笔交易入场后最坏会浮亏多少MFE最大有利行程告诉你最好会浮盈多少二者分位数是止损校准的天然先验10_ml4t_backtest_risk_demo.py演示ml4t.backtest.risk库——第 19 章风险概念的可执行实现提供生产级止损规则、规则组合与组合级熔断开关详见 19.7/19.8 节。19.5 分解风险因子、行业与宏观暴露本节回答「组合风险到底来自哪里」因子、行业、地域与宏观分解能够揭示业绩反映的是有意暴露、意外下注还是原本就不在投资论点里的风险。04_factor_exposure.py基于回归的因子暴露估计与随时间追踪05_trade_shap_diagnostics.py使用ml4t.diagnostic.evaluation中的TradeShapAnalyzer把 SHAP 解释与交易结果挂钩。交易级 SHAP 取证回答风险管理的关键问题这笔交易为什么失败了——让归因从「模型如何预测」推进到「预测如何在持仓中兑现」。19.6 压力测试与情景分析本节把风险度量从「匹配历史」拓宽为「主动设问」。Notebook 06_stress_testing.py 的参数与目标如下SEED 42 N_SIMULATIONS 10_000 HORIZON_DAYS 20 # 多周水平线风控委员会会问的坏结果跨度 CONFIDENCE_LEVELS (0.95, 0.99, 0.999) # 最深分位数只由少数路径支撑应按数量级解读 REGIME_LOOKBACK 60 BEAR_TREND_THRESHOLD -0.05 # 年化 trailing 收益区分牛熊 BULL_TREND_THRESHOLD 0.10 HIGH_VOL_MULTIPLE 1.3 # 高于自身历史中位数多少倍算压力日数据面板为 SPY、EFA、EEM、AGG、TLT、GLD、VNQ 七只 ETF窗口 2007-01-01 至 2024-01-01刻意覆盖 2008 危机。三类压力测试方法历史危机回放historical crisis replay重放 2008 全球金融危机、2020 COVID、2022 美联储紧缩三个窗口对四种参考配置60/40、All Weather 全天候、激进股票、防御型重现组合损失。作者把历史危机当作「制度样例」——它们揭示的是策略在极端制度下的行为而非点预测。假设情景hypothetical scenarios手工定义多资产同时受冲击的情景矩阵通过加权和施加到组合上检验收益、成本、波动率与相关性假设被共同挑战时的脆弱点。蒙特卡洛模拟用峰度匹配自由度kurtosis-matched的对称 Student-t 分布抽样 10,000 条路径读取多周水平线上的损失分位数与期望损失。Notebook 内max_drawdown的实现约 06_stress_testing.py是全书统一的回撤定义相对运行峰值的最负净值曲线点返回百分比——np.maximum.accumulate维护运行峰值equity_curve / running_peak - 1得到回撤序列后取最小值。整个危机回放、敏感性分析与制度表格都复用这一定义。19.7 无信息泄漏的自适应风控本章实战核心这是全章面向实盘部署的运营核心。核心命题波动率目标化、敞口上限、换手收紧、仓位级退出这些自适应控制如何在适应变化条件的同时不把未来信息走私进回测——所有决策只能用决策时点可得的信息。退出策略库ml4t.backtest.risk10_ml4t_backtest_risk_demo.py 把第 19.4/19.7/19.8 节的概念实现为可组合的生产级规则。每个规则接收一个PositionState返回一个PositionActionHOLD/EXIT_FULL/EXIT_PARTIAL/ADJUST_STOP。静态规则阈值在持仓期内固定stop_loss StopLoss(pct0.05) # 从入场价衡量退出线不随盈利上移 take_profit TakeProfit(pct0.10) # 盈利目标镜像对称 time_exit TimeExit(max_bars20) # 无论盈亏20 根 bar 后强制离场动态规则阈值随持仓表现自适应trailing_stop TrailingStop(pct0.05) # 从入场以来最高价衡量退出线上移不回撤 tightening TighteningTrailingStop([ # 盈利越多收得越紧 (0.00, 0.05), # 初始 5% 轨距 (0.10, 0.03), # 10% 收至 3% (0.20, 0.02), # 20% 收至 2% ]) scaled ScaledExit([ # 分批止盈每个目标卖出剩余仓位的给定比例 (0.05, 0.25), (0.10, 0.33), (0.15, 0.50), ])Notebook 特别提醒两处工程细节TrailingStop使用「前一已完成 bar 的 high-water mark」来评估当前 bar评估完再更新状态——保持库默认的滞后时序避免「用当前 bar 的最高价评估它的最低价」这种前视偏差look-aheadScaledExit是有状态规则它记住哪些目标已经触发一个实例服务单笔持仓换仓前必须reset()演示中用0.0501、0.1001这类「略超阈值」的价格避免二进制浮点表示把「跨越阈值」变成「相等巧合」。规则组合优先级与布尔逻辑组合模式把规则编成策略RuleChain按顺序评估返回第一个非 HOLD 的动作。顺序即政策——把止损放第一位意味着同一根 bar 同时击穿止损与目标时记录为止损这是对「bar 内部时序未知」的保守解读AllOf所有规则都触发才退出AND例如「盈利阈值 最短持有期」同时满足才离场AnyOf任一规则触发即退出OR等价于RuleChain。典型链式配置优先级即上到下chain RuleChain([ StopLoss(pct0.05), # 硬止损最后兜底 TakeProfit(pct0.10), # 止盈 TrailingStop(pct0.03), # 移动止损 TimeExit(max_bars20), # 超时离场 ])系统性参数扫描让数据揭示最优风险区间11_systematic_risk_sweep.py 把「手工挑 3-5 个配置」升级为全参数空间扫描用时间分割避免样本复用CALIBRATION_END 2021-12-31之前的窗口用于校准之后的窗口只用于一次性评估1D 扫描检验每个规则宽度StopLoss / TakeProfit / TrailingStop的敏感性2D 网格暴露规则间交互MAE/MFE 分位数校准作为第二种校准方法从已平仓交易的行程分布推导止损与目标先验以CAGR-based Calmar 比率比较预选配置用 Sharpe/Calmar 权衡热力图可视化让数据揭示最优风险制度。其引擎侧使用ml4t.backtest的Engine/BacktestConfig/Strategy与ml4t.backtest.analytics.trades.MAEMFEAnalyzer11_systematic_risk_sweep.py固定五标的面板 SPY、QQQ、IWM、XLF、EEM初始现金 100,000。作者明确标注该面板是「说明性的当下宇宙」而非点内时间成员重建因此它支撑的是规则校准方法课而不是关于历史 ETF 选择的无偏论断。机器学习退出与深度对冲08_ml_exit_signals.py双模型架构——入场模型预测高收益机会退出模型预测不利波动两者分工决定「何时进、何时出」09_deep_hedging.py深度对冲Buehler et al., 2019——神经网络在交易成本约束下学习使终端 PnL 的CVaR 最小化的对冲仓位。19.7 节用规则构建自适应风控波动率目标化、制度上限、止损本节展示同一风险目标可以端到端地由神经网络优化——在「度量19.3」与「学习控制」之间架起桥梁07_drift_detection.py生产 ML 交易系统的漂移检测——当线上数据分布偏离训练数据时模型会静默退化详见 19.8。19.8 熔断开关与风险治理本节把指标与控制转化为机构流程失败条件长什么样、升级如何运转、何时需要重新研究以及为什么漂移检测与书面风险治理对任何「要与市场正面接触而幸存下来」的策略都是必需的。组合级限额kill switches 与 guardrailsml4t.backtest.risk提供作用于整个PortfolioState的限额直接实现 19.8 的熔断语义来自 10_ml4t_backtest_risk_demo.pydd_limit MaxDrawdownLimit(max_drawdown0.20, warn_threshold0.15) # 双阈值把「看看」到「清仓」的升级路径写进规则0.15 警告0.20 清算 daily_limit DailyLossLimit(max_daily_loss_pct0.02) # 相对当前权益计算账面缩水时限额在绝对金额上自动收紧 pos_limit MaxPositionsLimit(max_positions10) # 持仓数上限超出停止开新仓 gross_limit GrossExposureLimit(max_gross_exposure1.5) # 总敞口 各头寸绝对值之和多空各 1 倍计 2 倍而不是净 0因为两者可能同时亏 net_limit NetExposureLimit(max_net_exposure0.10, min_net_exposure-0.10) # 有符号求和 方向性市场敞口。净敞口窄带内可能藏着巨大总敞口两个限额约束不同的事物分层配置范例README 中 19.7/19.8 的完整落地形态# 仓位级决定「单笔交易出问题怎么办」按优先级执行 position_rules RuleChain([ StopLoss(pct0.03), # 3% 硬止损相对入场 TighteningTrailingStop([ # 随盈利收紧的移动止损 (0.00, 0.05), # 初始 5% (0.10, 0.03), # 10% 收至 3% (0.20, 0.02), # 20% 收至 2% ]), TakeProfit(pct0.30), # 30% 止盈 TimeExit(max_bars60), # 60 根 bar 超时离场 ]) # 组合级决定「无论哪笔持仓出事何时整体停摆」 portfolio_limits [ MaxDrawdownLimit(max_drawdown0.15, warn_threshold0.10), DailyLossLimit(max_daily_loss_pct0.02), MaxPositionsLimit(max_positions20), GrossExposureLimit(max_gross_exposure1.0), ]设计要点Notebook 原文强调仓位规则看不到组合组合限额不知道该平哪笔仓——两层回答不同的问题必须同时存在治理所需的升级、审批与恢复流程位于这些类之外由机构流程承担。触发可审计性一次未触发的风控与从未安装的风控必须可区分仓库测试 tests/test_risk_trigger_counts.py 精确刻画了这条治理原则值得完整引用其设计动机一个从未触发的风险叠加层必须与一个从未安装过的风险叠加层可区分。注册表只携带num_trades和绩效指标读者就会把「结果一致」误读为「控制生效」……C17 记录过 56 条crypto_perps_funding/16_risk_management结果与无保护账面在 Sharpe、回撤、交易数上逐位一致因为配置声明的控制形态引擎根本不读等于什么都没装。测试约束RiskTriggerLog未声明控制 ⇒ 指标为None表示这里没有叠加层而不是未测量声明但从未触发 ⇒ 指标为0.0触发 n 次 ⇒ 计数 n计数包装不得改变经纪商实际执行的退出动作observed.action expected.action且fill_price一致组合级限额按「事件」计数而非按 bar 计数——RiskManager每 bar 重检已熔断的书在后续每根 bar 都会再次触发但日志只记 1 次事件。漂移检测与跨案例研究对照07_drift_detection.py实时数据分布偏离训练分布时模型静默退化漂移检测是把「退化」从隐性变成显性的前提也是 19.8 中「何时需要重新研究」的客观触发器跨案例研究的风控叠加层对比见第 20 章 20_strategy_synthesis/07_regime_risk.ipynbREADME 原文以../20_strategy_synthesis/07_regime_risk.ipynb相对链接指向本文已转换为仓库根目录路径。运行方式在仓库根目录执行README「Running the Notebooks」原文# 从仓库根目录运行单个 notebook 的 .py 版本 uv run python 19_risk_management/notebook.py # 测试模式通过 Papermill 使用缩减数据 uv run pytest tests/test_chapter_notebooks.py -v -k 19_risk_management所有 notebook 均可在 Docker 镜像ml4t中运行.py版本为 jupytext percent 格式cell_metadata_filter: tags,-all与同名.ipynb一一对应。注意01_var_cvar.py依赖archGARCH 波动率估计、scipy.stats分布拟合与ml4t.diagnostic.evaluation.distribution.analyze_distribution06_stress_testing.py依赖data.load_etfs()的七标的 ETF 面板起始日必须早于 2008 才能承载危机回放。学习路径建议与参考文献建议按 README 的章节顺序推进先01_var_cvar尾部度量§19.3→02_exit_strategies03_position_sizing_mae_mfe路径风险与止损校准§19.4→04_factor_exposure05_trade_shap_diagnostics风险分解§19.5→06_stress_testing压力测试§19.6→10_ml4t_backtest_risk_demo11_systematic_risk_sweep07/08/09自适应控制§19.7→ 用 §19.8 的限额与治理工件收尾。README 给出的核心学术参考节选均与本章技术点一一对应Rockafellar Uryasev2000的 CVaR 优化奠基论文Moreira Muir2017波动率管理组合Buehler et al.2019深度对冲Daniel Moskowitz2016动量崩溃Alankar et al.2023150 年回撤研究Fairy TailsVarma2025对回撤规则局限性的批判框架以及美联储 SR Letter 11-7 模型风险管理监管指引——后者正是本章「治理工件」要求的监管语境来源。【免费下载链接】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),仅供参考
返回列表