跳至正文
全部策略

策略

ETH Deribit 周度看跌信用价差 — 波动率风险溢价 + 下行偏度收割(限定风险期权、偏度门控、3 参数)

结局: 已放弃

EthDeribitWeeklyPutCreditSpreadSkewVrp

ETH Deribit 周度看跌信用价差 — 波动率风险溢价 + 下行偏度收割(限定风险期权、偏度门控、3 参数)

假设

一种 DEFINED-RISK、单场所期权策略,针对 DERIBIT ETH 周度到期,卖出加密货币波动率曲面中持续被高估的下行端。每个周度周期(最近到期约 5-7 DTE)一次,且 ONLY 在下行保险显著昂贵时(25-delta 看跌期权 IV 比 ATM IV 贵,偏度差 AND ATM IV 高于滞后已实现波动率)执行,开仓 PUT CREDIT SPREAD:SELL 一份约 25-delta 的看跌期权,BUY 一份约 10-delta 的、相同到期日的看跌期权。最大亏损被限制在(行权价差 − 净信用),因此账户不会被尾部行情清算 — 直接回应了空头波动率策略在风险审查中最大的担忧。该策略有意填补工厂组合中最大的单一缺口:期权在投资组合中仅占 4.7%,而配额为 ≥15%,此前基本无覆盖。它刻意区别于普通的空头宽跨式 — 不同的标的(ETH)、不同的结构(风险有限垂直价差,而非裸露双边)、不同的信号(看跌 SKEW 溢价 + VRP,而非原始 IV/RV)。仅 3 个可调参数以抵御导致 259 个先前假设被淘汰的过拟合。NOT 资金费率 carry(L33),NOT 一个动量/趋势共振端口(已穷尽),NOT 一个价格反转/回调 — 盈亏来源是结构性保险溢价加上加密货币看跌偏度溢价,而非方向性价格预测。

Layer-3“未产生交易 / 已评估 0 根 K 线”有两个具体原因,而且都不是入场阈值(反馈正确地指出不应放宽阈值)。首先,“0 根已评估 K 线”这一行对这一类策略具有误导性:RollingOptionsStrategy.on_bar 完全覆盖了 FactoryStrategy.on_bar,且永远不会到达 _process_primary,因此对于所有滚动期权策略(包括正常交易的策略),bars_seen 都是 0 ——我通过阅读 rolling_options_template.py 和 base_template.py 确认了这一点,而不是添加 super().on_bar() 调用;后者会把主 K 线导入基类的跨腿对齐屏障,在那里间歇性出现的期权腿(与主腿相同的 1-DAY 时间周期)会永远阻塞处理。其次,实际阻塞因素是:(a) ANNUALIZATION MISMATCH ——继承的已实现波动率设置为小时级(rv_window=168、bars_per_year=8760),而本次运行使用 1-DAY K 线,因此日对数收益率使用 sqrt(8760) 而非 sqrt(365) 进行年化,使 RV 被……展开收起

Layer-3“未产生交易 / 已评估 0 根 K 线”有两个具体原因,而且都不是入场阈值(反馈正确地指出不应放宽阈值)。首先,“0 根已评估 K 线”这一行对这一类策略具有误导性:RollingOptionsStrategy.on_bar 完全覆盖了 FactoryStrategy.on_bar,且永远不会到达 _process_primary,因此对于所有滚动期权策略(包括正常交易的策略),bars_seen 都是 0 ——我通过阅读 rolling_options_template.py 和 base_template.py 确认了这一点,而不是添加 super().on_bar() 调用;后者会把主 K 线导入基类的跨腿对齐屏障,在那里间歇性出现的期权腿(与主腿相同的 1-DAY 时间周期)会永远阻塞处理。其次,实际阻塞因素是:(a) ANNUALIZATION MISMATCH ——继承的已实现波动率设置为小时级(rv_window=168、bars_per_year=8760),而本次运行使用 1-DAY K 线,因此日对数收益率使用 sqrt(8760) 而非 sqrt(365) 进行年化,使 RV 被 4.90x 放大(正常的 3%/日 ETH 行情读数为 281% 而非 57%);随后 VRP 门控条件 iv >= rv*(1+margin) 每个周期都将约为 60% IV 与约为 281% RV 进行比较,结果始终为 False。修复方式是根据配置的 K 线类型推导 bars_per_year,并以日历日表示 RV 窗口,从而任何时间间隔都不会再次出现该漂移(已验证:1-DAY -> 365、1-HOUR -> 8760、4-HOUR -> 2190,且该门控现在会在正常行情中通过)。(b) ROLE MAPPING ——继承的脚手架按期权类型为腿建立键,并要求一个看涨期权加一个看跌期权(宽跨式),因此看跌价差的两个 P 腿在同一键上发生冲突,第二个被拒绝为重复项,就绪检查要求一个不存在的看涨腿,而所有腿都以 SELL 提交(两个裸卖看跌期权,而非限定风险的垂直价差)。现在腿按行权价映射为短腿/长腿,以相同的缓存合约数量原子地卖出短腿并买入长腿。我还移除了继承的权利金倍数止损:长翼已经限定了损失,因此对有上限结构设置止损只会提前实现有界损失并增加费用。仓位计算已端到端验证(150 宽价差、$22 权利金、$128 最大损失 -> 15 张合约 = 1.9% 的权益风险)。我保留了通过 Layer 1-2 的所有内容:干净的导入、修复 Layer-2 staticmethod 重绑定 TypeError 的模块级 _bar_ts 自由函数、DVOL 解析器、Black-Scholes IV 反演,以及连续的 calculate_signal。lookback_days 是 49(7 个周期、14 条期权腿),因为按 K 线类型划分的目录加载器每条腿耗时约 10 秒,更大的链会有超出 Layer-3 墙钟时间的风险;这限制了初始样本,是加载器属性,而不是假设属性。

verification_loop: 验证未通过(Layer 4 — QA 复核)[class=code_defect]: - [edge_concern] 沙盒 avg_trade_return_pct 在 2 笔交易上为 -45.45%,metrics_reliable=false 且 data_days=1 — 这并非业绩判定(对期权腿而言,单位名义收益率无意义,因为权利金名义 << 翼端名义,且沙盒为 1 天的冒烟测试)。仅作为背景信息保留:若下方 loader/lookback 问题得以解决且真实周度期权样本累积,分析师应重新核查所收取的净信用是否能覆盖 Deribit 每单边 0.03% 的往返成本,共计 4 腿(开仓+平仓 × 卖+买)以及任何指派滑点,因为看跌信用价差的单位名义收益在结构上偏薄。 - [critical] rolling_options.lookback_days=49 将 ANY 回测中可解析的 ENTIRE 期权链限制在以「现在」为终点的约 49 天内 = 约 7 个周度周期 / 约 14 条期权腿,无论 Deribit 拥有 6.5 年的 ETH……展开收起

verification_loop: 验证未通过(Layer 4 — QA 复核)[class=code_defect]: - [edge_concern] 沙盒 avg_trade_return_pct 在 2 笔交易上为 -45.45%,metrics_reliable=false 且 data_days=1 — 这并非业绩判定(对期权腿而言,单位名义收益率无意义,因为权利金名义 << 翼端名义,且沙盒为 1 天的冒烟测试)。仅作为背景信息保留:若下方 loader/lookback 问题得以解决且真实周度期权样本累积,分析师应重新核查所收取的净信用是否能覆盖 Deribit 每单边 0.03% 的往返成本,共计 4 腿(开仓+平仓 × 卖+买)以及任何指派滑点,因为看跌信用价差的单位名义收益在结构上偏薄。 - [critical] rolling_options.lookback_days=49 将 ANY 回测中可解析的 ENTIRE 期权链限制在以「现在」为终点的约 49 天内 = 约 7 个周度周期 / 约 14 条期权腿,无论 Deribit 拥有 6.5 年的 ETH 期权历史。策略在其余窗口内保持空仓,仅在尾部交易。沙盒以经验数据确认了这一点:bars_processed=2400(约 6.5 年),但 data_days=1 且 total_trades=2(trades_count=4)。在约 7 个周期 / 约 14 条腿的样本上,方差风险溢价 + 偏度优势无法与噪声区分 — 远低于可测量期权样本所需的约 30-100 笔交易。这正是导致近乎相同的 BtcDeribitWeeklyDeltaHedgedAtmStraddleVrp(同一场所,同一 lookback_days=49)于 4 天前在 Layer 被放弃的 loader 成本与样本量两难-22。开发者自身的论证也承认了这一上限(「lookback_days 为 49(7 周期,14 条期权腿),因为每根 K 线类型的目录加载器每条腿成本约 10 秒,更大的期权链存在超出 Layer-3 时钟限制的风险」)。按当前配置,该策略永远无法产出可测量的完整回测。— 修复:不要在约 7 个周期的情况下通过。在重新提交前解决 loader 成本与样本量的两难-22:对每条腿的 catalog.bars() 加载进行批处理/并行化或跨 K 线缓存,以便 lookback_days 可在不超出沙盒时钟限制的前提下覆盖多年周度周期(约 200-300 个周期),然后将 lookback_days 设为覆盖完整测试窗口。若加载器在时间预算内确实无法解析出可测量的周度期权历史,则该策略族在当前框架下以周度频率不可测试,应重新设计(例如在整个时间跨度上使用更少、更长期限的月度周期),而不是

实现

Deribit ETH 上的限定风险周度看跌信用价差。每个周度到期周期(约 7 DTE),滚动期权框架解析两条看跌腿(约 5% 和约 10% OTM);策略按行权价将其映射为短腿(较高行权价、约 25-delta)和长腿(较低行权价、约 10-delta),以相同的 1:1 合约数量SELLS短腿并BUYS长腿,并持有至滚动缓冲期结束后进行欧洲式现金结算。入场条件由在周期入场窗口测量的两项丰厚度测试控制:下行偏度(短看跌期权 IV >= Deribit DVOL ATM IV x (1 + skew_margin))和方差风险溢价(ATM IV >= 过去 14 日已实现波动率 x (1 + vrp_margin))。各腿的 IV 根据其自身的 USD 权利金 K 线,使用 Black-Scholes 反演。每个价差的最大损失为(行权价宽度 - 净权利金),在入场时固定;仓位规模正好承担该风险:contracts = floor(equity x risk_frac / max_loss),并设置上限,使总价差宽度处于权益的 50% 以内,同时设置下限以满足 Deribit 的 1 合约 ETH 最低要求。3 可调参数(skew_margin、vrp_margin、risk_frac);杠杆 1.0;无永续合约/标的交易路径。

验证结果

验证失败(层 4 — QA 审查)[class=code_defect]: - [edge_concern] 沙箱 avg_trade_return_pct 在 2 笔交易上为 -45.45%,其中 metrics_reliable=false 且 data_days=1 — 这不是绩效结论(按名义金额计算的收益率对期权腿没有意义,因为权利金名义金额 << 翼部名义金额,并且沙箱是 1 天的冒烟测试)。这里只作为背景信息沿用:如果下面的加载器/回溯区间问题得到解决,并积累了真实的周度期权样本,分析师应重新检查收取的净权利金是否在 4 个腿(开仓+平仓 x 空头+多头)之间超过 Deribit 每边 0.03% 的往返费用,以及任何行权滑点,因为卖出看跌价差按名义金额计算的优势在结构上很薄。 - [关键] rolling_options.lookback_days=49 将 ENTIRE 可解析的 ANY 回测期权链限制在截至“现在”的约 49 天内 = 约 7 个周度周期 / ~14 个期权腿,无论 Deribit 拥有 6.5 年的 ETH……展开收起

验证失败(层 4 — QA 审查)[class=code_defect]: - [edge_concern] 沙箱 avg_trade_return_pct 在 2 笔交易上为 -45.45%,其中 metrics_reliable=false 且 data_days=1 — 这不是绩效结论(按名义金额计算的收益率对期权腿没有意义,因为权利金名义金额 << 翼部名义金额,并且沙箱是 1 天的冒烟测试)。这里只作为背景信息沿用:如果下面的加载器/回溯区间问题得到解决,并积累了真实的周度期权样本,分析师应重新检查收取的净权利金是否在 4 个腿(开仓+平仓 x 空头+多头)之间超过 Deribit 每边 0.03% 的往返费用,以及任何行权滑点,因为卖出看跌价差按名义金额计算的优势在结构上很薄。 - [关键] rolling_options.lookback_days=49 将 ENTIRE 可解析的 ANY 回测期权链限制在截至“现在”的约 49 天内 = 约 7 个周度周期 / ~14 个期权腿,无论 Deribit 拥有 6.5 年的 ETH 期权历史。策略在窗口的其余时间保持空仓,只在尾部交易。沙箱对此进行了实证确认:bars_processed=2400(约 6.5 年),但 data_days=1 且 total_trades=2(trades_count=4)。在约 7 个周期 / 14 个腿上,无法将方差风险溢价 + 偏度优势与噪声区分开来 — 远低于获得可测量期权样本所需的约 30-100 笔交易。这正是导致几乎相同的 BtcDeribitWeeklyDeltaHedgedAtmStraddleVrp(相同场所、相同 lookback_days=49)在 4 天前的层级被放弃的加载器成本与样本量权衡-22。开发者自己的理由承认了这一上限(“lookback_days 为 49(7 个周期,14 个期权腿),因为每种 Bar 类型的目录加载器每个腿耗时约 10 秒,更大的链会带来层级 -3 的墙钟时间限制”)。按当前配置,该策略永远无法产生可测量的完整回测。— 修复:不要停留在约 7 个周期。重新提交前解决加载器成本与样本量的权衡-22:对每个腿的 catalog.bars() 加载进行批处理/并行化,或跨 Bar 缓存这些加载,以便 lookback_days 能够触及多年的周度周期(约 200-300 个周期)而不突破沙箱墙钟时间,然后将 lookback_days 设置为覆盖完整测试窗口。如果加载器确实无法在时间预算内解析出可测量的周度期权历史,那么该系列在当前测试框架的周度频率下不可测试,应重新设计(例如在整个跨度内采用更少但期限更长的月度周期),而不是

迭代历史

验证失败(层 2 — 合成场景): 使用的参数:['contracts', 'leg_sides', 'risk_frac', 'rv_window', 'atm_offset', 'skew_margin', 'iv_rv_margin', 'bars_per_year', 'min_contracts', 'iv_stale_hours', 'rv_slow_window', 'long_put_offset', 'rolling_options', 'short_put_offset', 'max_notional_frac', 'min_bars_required', 'roll_buffer_hours', 'entry_window_hours'] 检查 __init__ 是否从 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - zero_volume: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - price_gap: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000)

验证失败(层 2 — 合成场景): 使用的参数:['contracts', 'leg_sides', 'risk_frac', 'rv_window', 'stop_mult', 'put_offset', 'call_offset', 'iv_rv_margin', 'bars_per_year', 'min_contracts', 'iv_stale_hours', 'rv_slow_window', 'max_delta_ratio', 'rolling_options', 'max_notional_frac', 'min_bars_required', 'roll_buffer_hours', 'entry_window_hours'] 检查 __init__ 是否从 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - zero_volume: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000) - price_gap: TypeError: FactoryStrategy._bar_ts() 接受 1 个位置参数,但给出了 2 个(Bar 时间戳:1735691040000)

验证失败(第 3 层 — 沙盒回测):未产生任何交易 使用的Bar类型:ETH-PERPETUAL.DERIBIT-1-DAY-LAST-EXTERNAL,已处理的Bar数量:2400 诊断信息:calculate_signal() 从未被调用(0 个已评估的Bar)-> 没有主Bar到达基础模板的信号路径 -> 如果你重写了 on_bar(),请调用 super().on_bar(bar);请检查 bar_type 是否与合约的数据匹配。NOT放宽入场阈值 — 入场逻辑从未运行。 请确保你的策略在给定的数据和参数下能够产生交易。

验证未通过(Layer 4 — QA 复核)[class=hypothesis_mismatch]: - [edge_concern] 这并非判定的依据 — 该段讨论的是保真度,而非业绩。(补充记录:沙盒同样为负:-2.9%,PF 0.13,胜 0.125,在一个本应设有止损的账簿上出现了 -$2,149 的尾部 — 但那是错误策略的结果。) - WHOLE-STRATEGY SWAP / MISLINK。假设为 ETH Deribit 周度 PUT CREDIT SPREAD(卖出约 25 天看跌期权,BUY 约 10 天看跌期权 — 风险有限垂直价差)。代码为 BTC Deribit 周度 delta 中性 SHORT STRANGLE(类名、docstring、iter-3 论证以及每个机制均为宽跨式)。标的 AND 机制均不同 → 生成错误/链接错误的产物,而非该假设。重新生成/重新链接正确的 ETH 看跌信用价差。 - 错误标的:假设为 ETH,但 instrument_id 与 bar_type 为 BTC-PERPETUAL.DERIBIT 与 rolling_options,.underlying 为「BTC」。任何位置均无 ETH。 - 错误结构 / 非风险有限:假设通过 PURCHASED 约 10 天的看跌翼端限制最大亏损。代码提交 TWO SELL 腿,翼端为 NO 买入;尾部仅由软性的下一根 K 线权利金止损约束(沙盒 largest_loss -$2,149 对比 avg_win ~$214 显示其并未限制尾部) — 正是假设所规避的未设上限的分布形态。 - 核心优势缺失:假设的信号为下行 SKEW 溢价(25 天看跌期权 IV 对比 ATM IV)加上 IV>RV。代码未计算偏度 — 仅有均值宽跨式 IV/RV VRP。区分该假设的看跌偏度收益未被实现。

放弃原因

verification_loop: 验证未通过(Layer 4 — QA 复核)[class=code_defect]: - [edge_concern] 沙盒 avg_trade_return_pct 在 2 笔交易上为 -45.45%,metrics_reliable=false 且 data_days=1 — 这并非业绩判定(对期权腿而言,单位名义收益率无意义,因为权利金名义 << 翼端名义,且沙盒为 1 天的冒烟测试)。仅作为背景信息保留:若下方 loader/lookback 问题得以解决且真实周度期权样本累积,分析师应重新核查所收取的净信用是否能覆盖 Deribit 每单边 0.03% 的往返成本,共计 4 腿(开仓+平仓 × 卖+买)以及任何指派滑点,因为看跌信用价差的单位名义收益在结构上偏薄。 - [critical] rolling_options.lookback_days=49 将 ANY 回测中可解析的 ENTIRE 期权链限制在以「现在」为终点的约 49 天内 = 约 7 个周度周期 / 约 14 条期权腿,无论 Deribit 拥有 6.5 年的 ETH……展开收起

verification_loop: 验证未通过(Layer 4 — QA 复核)[class=code_defect]: - [edge_concern] 沙盒 avg_trade_return_pct 在 2 笔交易上为 -45.45%,metrics_reliable=false 且 data_days=1 — 这并非业绩判定(对期权腿而言,单位名义收益率无意义,因为权利金名义 << 翼端名义,且沙盒为 1 天的冒烟测试)。仅作为背景信息保留:若下方 loader/lookback 问题得以解决且真实周度期权样本累积,分析师应重新核查所收取的净信用是否能覆盖 Deribit 每单边 0.03% 的往返成本,共计 4 腿(开仓+平仓 × 卖+买)以及任何指派滑点,因为看跌信用价差的单位名义收益在结构上偏薄。 - [critical] rolling_options.lookback_days=49 将 ANY 回测中可解析的 ENTIRE 期权链限制在以「现在」为终点的约 49 天内 = 约 7 个周度周期 / 约 14 条期权腿,无论 Deribit 拥有 6.5 年的 ETH 期权历史。策略在其余窗口内保持空仓,仅在尾部交易。沙盒以经验数据确认了这一点:bars_processed=2400(约 6.5 年),但 data_days=1 且 total_trades=2(trades_count=4)。在约 7 个周期 / 约 14 条腿的样本上,方差风险溢价 + 偏度优势无法与噪声区分 — 远低于可测量期权样本所需的约 30-100 笔交易。这正是导致近乎相同的 BtcDeribitWeeklyDeltaHedgedAtmStraddleVrp(同一场所,同一 lookback_days=49)于 4 天前在 Layer 被放弃的 loader 成本与样本量两难-22。开发者自身的论证也承认了这一上限(「lookback_days 为 49(7 周期,14 条期权腿),因为每根 K 线类型的目录加载器每条腿成本约 10 秒,更大的期权链存在超出 Layer-3 时钟限制的风险」)。按当前配置,该策略永远无法产出可测量的完整回测。— 修复:不要在约 7 个周期的情况下通过。在重新提交前解决 loader 成本与样本量的两难-22:对每条腿的 catalog.bars() 加载进行批处理/并行化或跨 K 线缓存,以便 lookback_days 可在不超出沙盒时钟限制的前提下覆盖多年周度周期(约 200-300 个周期),然后将 lookback_days 设为覆盖完整测试窗口。若加载器在时间预算内确实无法解析出可测量的周度期权历史,则该策略族在当前框架下以周度频率不可测试,应重新设计(例如在整个时间跨度上使用更少、更长期限的月度周期),而不是

Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。