Raxx · internal docs

internal · gated ↑ index

LCC Income Cycle — Failure Modes and Edge Cases

Strategy ID: lcc-income-cycle Version: 0.1 (research)

This document catalogs known and anticipated failure modes. It is part of the required risk documentation for any strategy that advances to productization. "Failure" here means both outcomes that produce financial loss AND system/data failures that corrupt the paper-trading simulation.


Financial / Strategy Failure Modes

FM-01: Sustained Uptrend with Full Assignment

What happens: Stock trends strongly higher for multiple consecutive weeks. Each cycle, the layered calls are assigned at the same strikes while the underlying advances. The trader re-enters at progressively higher prices and sells calls at similar or slightly higher strikes. Net effect: premium income does not offset the opportunity cost of being repeatedly assigned out of a rising position, and re-entry costs keep rising.

Detection: upside_missed metric trending upward over 4+ consecutive cycles. avg_premium_per_share / avg_reentry_cost_increase ratio falling below 1.0.

Mitigation: The OTM layer in Bullish sentiment reduces this effect. The brief's "5-20% uncovered" rule directly addresses it. Backtest should quantify the magnitude of this drag during AMZN's 2023 bull run.

Severity: High — this is the primary structural weakness of any covered-call strategy in a sustained bull market.


FM-02: Repeated Below-Cost Assignment

What happens: Stock sells off between re-entry and call expiration. The trader re-enters at a high price (post-gap-up), sells calls, and the stock falls such that the short calls expire worthless (good) but the long shares are worth less than purchase price. If the next cycle also sees a sell-off, the stock P/L compounds negatively while premium income is insufficient to offset.

Detection: consecutive_below_cost_assignments alert (≥3 in 30 days). total_stock_pnl cumulative turning negative while total_premium_gross is positive but insufficient.

Mitigation: The re-entry criterion price_not_extended is the primary guard. The not_chasing criterion prevents re-entering immediately at a higher price. These must be enforced deterministically — no discretionary override without a logged reason.

Severity: High — this is how the original single-ITM approach generated the pattern the brief describes ("forced income cycling" that behaved badly).


FM-03: All-ITM Creep

What happens: The trader's sentiment label defaults to "Neutral" every week without deliberate recalibration, and the Neutral structure (2 ITM + 2 ATM/OTM) gradually shifts toward all-ITM as ATM/OTM strikes repeatedly end up ITM by expiration. Over time, the system operates as the original "aggressive ITM" approach the trader wanted to escape.

Detection: itm_overuse pattern detector — 3+ consecutive all-ITM expiration outcomes (not structures at entry; outcomes). Track delta-at-entry vs. delta-at-expiration separately.

Mitigation: Require weekly sentiment label recalibration. The system must prompt for a fresh label each cycle and reject a stale label older than 24 hours.

Severity: Medium — degrades strategy to its prior weaker form. Not catastrophic but undermines the thesis.


FM-04: Early Assignment Risk (American-Style Options)

What happens: AMZN options are American-style. A short ITM call can be exercised at any time. The most common early-assignment trigger is when extrinsic value approaches zero — typically for deep ITM calls, especially near ex-dividend dates (AMZN currently pays no dividend, so ex-div risk is currently zero; relevant for other tickers in the universe).

Detection: Real-time: monitor extrinsic value on all open short calls. Flag if extrinsic < $0.05. Historical backtest: use actual options data to identify days when extrinsic was near zero.

Mitigation: 1. Early-assignment alert triggers if extrinsic < $0.15 (configurable). 2. Consider buying back calls when extrinsic < $0.10 (the cheap-close rule already covers this). 3. For dividend-paying tickers: block new ITM call sells within 5 days of ex-div.

Severity: Medium for AMZN (no dividend). High for dividend-paying tickers in Phase 2.


FM-05: Trading Halt on Expiration Friday

What happens: The underlying halts (circuit breaker, regulatory halt, or news halt) during expiration Friday. OCC has documented procedures for extending exercise windows, but the timing is non-deterministic. A halt that resolves after 4:00 PM ET can cause unexpected assignment or non-assignment depending on the resume price.

Detection: System monitors for halt status on expiration day. If halt is detected, state machine stays at NEAR_EXPIRATION and does not process assignment until confirmed.

Mitigation: 1. Do not process assignment automatically until after 4:30 PM ET confirmation window closes. 2. Flag any expiration-day halt as requiring manual confirmation before state transition. 3. In paper simulation: use 4:00 PM close price regardless of halt. Document that live trading will behave differently.

Severity: Low probability, high operational impact. Must be handled before Phase 3 automation.


FM-06: IV Crush Post-Event

What happens: Broad market catalyst (FOMC, CPI print, earnings from correlated name) causes implied volatility to collapse. An open short call that was worth $3.00 at entry may drop to $0.20 in extrinsic intra-day due to IV compression, even if the stock price hasn't moved much. The cheap-close rule (extrinsic < $0.10) triggers a buy-back — which is the correct response — but the system must handle this gracefully without generating spurious alerts.

Detection: Intra-day: monitor extrinsic on all open calls. If extrinsic drops >50% intra-day, fire IV-crush alert.

Mitigation: The cheap-close buy-back rule (FM-04 also applies) handles IV crush correctly. Ensure the rule can fire intra-day, not just at expiration.

Severity: Low — this is actually a favorable outcome (buy back cheaply, recapture upside). Document as a positive edge case, not a risk.


FM-07: Roll Creates Unfavorable Debit

What happens: Stock surges strongly. Rolling the ITM call up to a higher strike requires paying a significant debit. The trader faces: accept assignment (lose the stock, miss further upside) or pay a debit to roll (cuts into premium income, may not be recoverable this cycle).

Detection: Roll evaluation returns "roll_up" but the net debit exceeds max_roll_debit threshold.

Mitigation: The max_roll_debit config parameter blocks roll recommendations above threshold. System escalates to manual review. The brief says "acceptable debit" — this is the open question for Kristerpher (see Open Questions). Default: $0.25/share max debit.

Severity: Medium — the strategy needs a defined answer here before productization.


FM-08: Concentration Risk (Single-Ticker)

What happens: All exposure is in AMZN. AMZN-specific news (regulatory action, earnings miss, AWS outage) creates a gap down that exceeds the premium cushion. Unlike a diversified options portfolio, there is no cross-ticker premium offsetting the loss.

Detection: Not a dynamic alert — this is a structural characteristic of the strategy. Document clearly in model card.

Mitigation: Phase 2 universe expansion to 5-6 tickers diversifies this risk. Paper cap of 800 shares limits dollar exposure.

Severity: High — the most honest limitation of the strategy as scoped. Must appear in the model card's "what can go wrong" section.


System / Data Failure Modes

FM-09: Stale Options Chain Data in Backtest

What happens: Historical options data (strikes, bid/ask, delta) is sourced from a vendor (ORATS, Tradier) that may have gaps, point-in-time errors, or look-ahead bias in the data construction. Using end-of-day option prices as "fill prices" overstates execution quality.

Detection: Cross-check a sample of backtest fills against CBOE DataShop raw data for the same dates.

Mitigation: Use bid-only fills as a conservative sensitivity run. Document vendor and data version in every backtest run artifact. Never run a backtest without verifying the options chain source has confirmed point-in-time data.

Severity: High for backtest validity. Every backtest result should carry a disclaimer about options data quality.


FM-10: LIFO Lot Method Assumption vs. Broker Reality

What happens: The paper simulation defaults to LIFO. Different brokers implement lot selection differently. Some require explicit per-trade lot selection; some don't support LIFO at all in certain account types (e.g., IRAs). If a live trader relies on LIFO tax-lot behavior that their broker doesn't implement the same way, the simulation's P/L attribution diverges from reality.

Detection: Not detectable in paper sim — it's a documentation gap.

Mitigation: Model card must state clearly: "Tax-lot method simulation is illustrative. Verify your broker's lot selection implementation before relying on this for tax planning. This system does not provide tax advice."

Severity: Medium compliance risk. The CPA disclaimer must be prominent.


FM-11: State Machine Consistency Violation (Naked Call)

What happens: A bug in the state machine allows a short call to be recorded when shares are insufficient (e.g., after partial assignment reduces shares below 100 * calls outstanding). This would represent a naked short call in simulation — which is both wrong and a regulatory concern for live trading.

Detection: NAKED_CALL_DETECTED alert in check_risk_controls. The covered-call constraint check runs before every new call sell and after every assignment.

Mitigation: The constraint check is hard-coded and cannot be disabled in Phase 1-3. In Phase 4 (live), it must be a pre-trade check, not just a post-hoc log. Feature-developer must implement this as a blocking guard, not an advisory.

Severity: Critical — must be treated as a blocking defect if it fires in any environment.


Open Questions for Kristerpher

These questions must be resolved before backtest configuration is finalized and before feature-developer begins implementation.

OQ-1: Maximum acceptable debit on a roll? ✅ ANSWERED 2026-05-05

Default: $0.25/share max debit (per contract: $25; for 4 contracts: $100 max total). Configurable as max_roll_debit_per_share strategy parameter.

Allow a debit roll only if at least one of: 1. The roll meaningfully increases upside participation 2. The current short call is capping a strong move 3. The new strike improves assignment outcome relative to cost basis 4. The roll prevents assignment below a preferred exit level 5. The trader is defending a longer position thesis

Block a debit roll if: 1. The stock is only slightly above the short strike 2. The debit exceeds expected remaining upside 3. The roll is only being used to avoid taking a loss emotionally 4. The trade can be closed or assigned with acceptable full-cycle P/L

max_roll_debit_per_share = 0.25  # default; configurable per strategy instance

OQ-2: Early assignment — same workflow as standard assignment? AMZN options are American-style. Early assignment can happen any day the call is deep ITM with near-zero extrinsic. Should the system treat early assignment identically to expiration-day assignment for P/L, lot selection, and re-entry logic? Or does early assignment trigger a different workflow (e.g., immediate rebuild vs. wait for the original expiration date)?

OQ-3: "Uncovered" shares — no call at all, or far-OTM allowed? When sentiment is "Bullish" or "High-Uncertainty" and the brief calls for leaving 100 shares uncovered: does "uncovered" mean absolutely no call sold against those shares for that cycle, or is a far-OTM call (delta < 0.15) acceptable as a hedge-write? The answer changes the call structure and the P/L profile significantly in Path B scenarios.

OQ-4: Sentiment label staleness threshold? How stale can a sentiment label be before the system should require recalibration? The proposal is 24 hours. Would you accept a label set Friday evening for Monday trading?

OQ-5: Tax-lot method per account or per ticker? Is LIFO the default for all accounts and all tickers, or should it be configurable per account type (e.g., IRA may need different treatment)?