Strategies
BTC Weekly Covered Call Yield Strategy (BINANCE Perp Long + DERIBIT Call Short, Cross-Venue, Options-Premium-Capture)
Outcome: Abandoned
BtcWeeklyCoveredCallBinancePerpDeribitCall
Outcome Summary
This was the factory's first options hypothesis — an institutionally-real weekly BTC covered call pairing a long Binance perp with a short OTM Deribit call to harvest premium, targeting the badly under-represented options and cross-venue quotas. In practice it never got off the ground: the backtest raised a missing-attribute error, processed no bars, and executed zero option-leg trades, degenerating to the underlying/smoke path so the option chain never traded. It was abandoned at the backtest stage under 'options_no_option_trades', never reaching backtest review, optimization, or analyst evaluation. As the first options attempt on record, its failure was a plumbing/wiring problem rather than a verdict on the covered-call edge itself.
Hypothesis
Iteration 2 fix for the Layer-2 synthetic failure (`TypeError: super(type, obj): obj must be an instance or subtype of type`). Root cause: the Layer-2 `_StrategyProxy` transfers bound methods onto a plain `_Wrapper` instance that is NOT an instance of the strategy class, then invokes `on_extra_bar` — the only reachable method that used a zero-arg `super()`. `on_bar`/`on_start` are never called by the proxy, so their `super()` calls are unaffected; `__init__`'s `super()` runs on a real instance. The base `FactoryStrategy.on_extra_bar` is a documented no-op and extra-bar buffering is already done in `on_bar` (real engine) and by the proxy's `feed_extra_bar`, so removing `super().on_extra_bar(bar)` loses nothing while eliminating the crash. This is the smallest possible change — economic/signal logic, imports, class structure, config and the smoke/real-roll gating are all unchanged, so Layer 1 (already passing) stays green and the strategy advances to Layer 3.
options_no_option_trades: options strategy produced 0 option-leg trades (0 underlying trades) — degenerated to the underlying / smoke path; the option chain never traded
Implementation
Weekly covered-call yield harvester on BTC. Each week it SELLS a fresh ~5% OTM weekly BTC call on Deribit (rolling chain, via RollingOptionsStrategy) to collect premium, while holding a matched LONG BTCUSDT Binance perp as the covering underlying. If BTC stays below the strike, the short call expires worthless and the full premium is captured; if BTC breaches the strike, the perp upside is capped but offset by the short call's intrinsic loss (net: keep the time value). The Deribit perp is the primary/roll-clock instrument and is only traded by the Layer-3 verification smoke path (gated off whenever a real option-chain schedule exists).
Verification Results
Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['contracts', 'leg_sides', 'risk_frac', 'cover_frac', 'call_offset', 'min_notional', 'smoke_risk_pct', 'rolling_options', 'smoke_hold_bars', 'cover_instrument', 'roll_buffer_hours', 'smoke_warmup_bars', 'cover_qty_precision'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - steady_downtrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - flat_ranging: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - volatility_spike: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - zero_volume: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - price_gap: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000)
Outcome Summary
A cross-venue options strategy must first prove its real option legs actually trade — the rolling-options chain expansion and required attributes (e.g. _min_notional) have to be wired up and exercised end-to-end, or the strategy silently collapses to its no-op smoke path and never tests the intended premium-capture edge.
Later pipeline stages (backtest review, optimization, analysis, risk review) were not reached because the backtest itself failed to produce any option trades.
It was abandoned at the backtest stage with reason 'options_no_option_trades' — the options strategy produced 0 option-leg trades and 0 underlying trades, degenerating to the smoke/underlying path so the option chain never actually traded; no backtest-review, optimization, or analyst stages were reached.
A cross-venue weekly covered-call yield strategy on BTC — holding a long BTC perp on Binance as the covering underlying while selling a fresh weekly OTM BTC call on Deribit each cycle to capture option premium — intended to fill the portfolio's largest under-represented quotas (options venues and cross-venue scope).
It produced no usable performance: the backtest errored ('BtcWeeklyCoveredCallBinancePerpDeribitCall' object has no attribute '_min_notional'), processed 0 bars and 0 trades, and returned no reliable metrics (metrics_reliable false).
Backtest Review
- Max drawdown
- 0.00%
- Win rate
- 0.0%
- Profit factor
- 0.00
Backtest and paper results are hypothetical. Trading involves risk of loss.