Bull Put Spread

Bull Put Vertical — Opening

Purpose: how Toll Booth selects, prices, gates, and submits two‑legged bull put vertical opening orders within risk and readiness policies.

Top‑level checks and context

  • Global per‑instrument stops and an internal “order resource is not ready” framework govern safety and sequencing; these rules decide when the system must pause or reject an order before moving forward.
  • Pre‑trade “do‑not‑open” guards are applied before instrument‑specific logic and block openings when high‑level safety conditions are not met.

Underlying symbol and quote selection

Before any bull put spread is priced, Toll Booth first decides which underlyings are even eligible to host bull puts. This filtering is done at the quote level and is intentionally conservative.

Universe and hard exclusions

  • Only symbols in a curated “preferred” universe are considered for bull puts; anything outside that list is ignored for this strategy.
  • Symbols explicitly marked “do not open” or on a bull put exclusion list are never used, even if they look otherwise attractive.
  • Quotes flagged as deficient or with prior option‑processing failures are excluded up‑front.

Basic health and liquidity checks

  • The current price of the underlying must be above approximately $5 per share; names trading below this level are treated as too low‑priced for new bull puts.
  • The options market must be active: the combined open interest across calls and puts must be more than 1,000 contracts. Underlyings with more than 5,000 contracts of open interest on either the call side or the put side are treated as “very liquid” elsewhere in the system.
  • The company or fund must be reasonably large: market capitalization must be greater than roughly $1 billion. Very small or thinly traded names are not used for bull puts.
  • The system also requires a minimum history of options data: there must be more than 5 distinct option expiration dates available (at least 6 dates) before bull puts are allowed, so that pricing and risk metrics are based on more than just a few days.

Valuation sanity (PE filter for non‑indexes)

  • For regular stocks (non‑ETFs), the underlying’s price‑to‑earnings ratio must be a valid positive number in the band (0, 45], i.e., greater than 0 and less than or equal to 45. This excludes both negative‑earnings names and extremely high‑multiple names from bull put consideration.
  • For ETFs, the PE ratio may be 0 or positive as long as it does not exceed 45. This explicitly allows funds whose structural PE is reported as 0 (for example, commodity or miners ETFs such as GDX or GDXJ).
  • If the PE ratio is missing, not a number, or falls outside the allowed band ((0, 45] for stocks, [0, 45] for ETFs), that symbol is skipped for bull puts at this stage. Index products are handled separately and do not rely on this PE‑ratio screen.

Trend alignment (200‑day moving average)

  • By default, bull puts are only opened when the underlying is trading at or above its 200‑day moving average. The 200‑day value itself must be a valid positive number, and the current price must be greater than or equal to that value.
  • If the 200‑day moving average is missing, clearly invalid, or the price is below that long‑term trend line, the symbol is excluded from bull put consideration while this rule is enabled.
  • There is a configuration switch that can relax this 200‑day requirement, but when it is on (the default), trading below the long‑term trend line is a hard stop for new bull puts.

Only underlyings that satisfy all of the following quote‑level conditions are marked as eligible for bull put spreads:

  • In the curated preferred universe and not on any bull put exclusion or "do not open" list.
  • Quote not deficient and without prior option‑processing failures.
  • Underlying price above approximately $5 per share.
  • Options open interest above the internal liquidity threshold (sufficient open interest).
  • Market capitalization above roughly $1 billion.
  • More than five distinct option expiration dates available.
  • For non‑index stocks and ETFs, a valid PE ratio in the appropriate band: (0, 45] for stocks and [0, 45] for ETFs.
  • When the 200‑day rule is enabled, price at or above a valid positive 200‑day moving average.

Everything downstream—chain pairing, pricing, and ordering—runs on this pre‑screened set.

Candidate selection and pairing

  • Chain scan and pruning for vertical opens apply days‑to‑expiration bounds, remove non‑standard chains, enforce delta bands, control bid/ask width, and cap strikes, based on configurable pricing rules.
  • Index underlyings are allowed slightly higher maximum delta levels while still following the same chain‑processing framework used for other symbols.
  • Per‑expiration loops pair the short leg above the long leg within a maximum width, then evaluate each candidate; this mirrors the bull put strike‑selection flow described on the strike‑selection page.

Pricing pipeline summary (opening)

  • Mark and width are derived from the differences between the short and long option chains: one step sets the spread’s quoted mark from the difference in chain marks, and another sets the spread width from the difference in strike prices, as configured in the pricing pipeline.
  • The opening price is set from the mark of the combined short‑long spread and then adjusted by width‑based tiers so that wider spreads can receive a slightly higher target credit, according to the pricing configuration.
  • Guards and adjustments then ensure the opening price is at least the internal mark calculation, apply mover/VIX/RSI/liquidity/retirement/wide‑width adjustments, apply a small randomness term last, and clamp the credit to remain strictly below the maximum allowed width‑based cap, as defined in the pricing configuration.
  • Returns and viability calculations compute theoretical return‑on‑risk, win probability, profit‑to‑loss ratio, and a viability score that is adjusted for bid/ask width, mark‑versus‑last differences, negative beta, non‑five strikes, openPrice‑versus‑mark differences, and minimum/maximum net credit constraints, all driven by the pricing configuration.
  • Minimum PL ratio increases by Days‑To‑Expiration tiers; index underlyings use a 0.02 lower floor; retirement accounts add 0.02 to the floor.

Open‑readiness gates (ordering)

  • Base two‑legged spread readiness is controlled by shared ordering rules that decide when any vertical spread is not ready to be opened.
  • bull put‑specific readiness checks add policy for this particular strategy, including:
    • Liquidation‑change guards and minimum requirements based on EPR Down and EDM Down risk signals.
    • A high‑delta cap on the short put leg.
    • Daily throttles and “filled today” gates that limit how many new bull put orders can be opened in a single day.
    • Concentration caps that limit position counts, per‑underlying count and width, and apply near‑cap throttling when exposure is already high.
    • When enabled, realized‑gain‑governed per‑underlying bull put total width caps that scale allowed exposure by lifetime realized bull put performance.
    • A final “ready” marker that flags the bull put spread as open‑order‑ready once all prior gates have passed.
  • The single‑open net‑delta cap policy limits how much net delta a single new bull put order is allowed to add.

Order construction and order‑level readiness

  • Build a two‑leg LIMIT credit order (short put above long put) after trade resource readiness.
  • Non‑market price validation, mark sanity checks, duplicate and match guards, leg‑level readiness checks, and protective clamps are enforced by a shared set of “order resource is not ready” rules used across the system.

Quantity sizing policy — delta‑weighted (bull put only)

  • Feature gate: (default true). Applies to bull put verticals only.
  • Delta‑weighted math (mark‑notional balanced):
    • netDeltaWeighted = |openPricing.netDelta| × 100 × Quote.mark
    • availableWeighted = availableQuoteDelta × Quote.mark
    • deltaLimitQuantity = floor((availableWeighted / max(netDeltaWeighted, 1)) × availableDeltaPercentageTradeSize)
    • Final open quantity = min(deltaLimitQuantity, 1, shortOptionSpreadMaxOrderQuantity)
  • Observability (telemetry on openPricing): quoteDelta, quoteDeltaWeighted, netDeltaShares, availableQuoteDelta, netDeltaWeighted, availableWeighted, deltaAvailableQuantity.
  • Guard rails:
    • If feature disabled or instrument is not bull put, sizing path returns 1 (legacy behavior preserved).
    • Zero/negative/undefined inputs clamp to safe defaults to avoid divide‑by‑zero.
  • Acceptance:
    • Flag on: quantity respects delta‑weighted cap and never exceeds models.max.
    • Flag off: quantity remains 1 (existing policy).
    • Non‑bull put instruments unaffected.

Trend and net‑delta interplay

  • Bull puts increase portfolio net delta. Allowable position delta is constrained by trend windows that define higher delta limits in bullish regimes and lower delta limits in bearish regimes, using configuration thresholds for both bull and bear trend states.
  • The single‑open net‑delta cap for bull puts ensures one order cannot exceed the per‑trade delta‑impact policy.

Process flow diagram

Start → Scan chains → Filter → Pair → Price → Compute viability → Base‑spread gates → bull put gates → Order‑ready → Submit → Outcome

%%{init: {"theme":"base","flowchart":{"curve":"basis"},"themeVariables":{
  "fontFamily":"Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif",
  "primaryTextColor":"#e5e7eb",
  "primaryColor":"#111827",
  "primaryBorderColor":"#94a3b8",
  "lineColor":"#94a3b8",
  "tertiaryColor":"#0e1729",
  "tertiaryBorderColor":"#22d3ee",
  "edgeLabelBackground":"#00000000"
}}%%
flowchart TB
  A([Start]) --> SC[Scan put chains]
  SC --> FLT[Filter DTE / non‑standard / delta bands / bid‑ask / strike caps]
  FLT -->|No candidates| OUT[Stop: no viable chains]
  FLT --> PR1[Per‑expiration pairing]
  PR1 --> PR2[Pair short above long within max width]
  PR2 --> PRICE[Price: mark diff → openPrice; width‑tier bump; caps]
  PRICE --> VIAB[Compute viability — ROR, PL, winProb, liquidity]
  VIAB -->|No viable| OUT
  VIAB --> BASE[Base two‑leg spread gates]
  BASE -->|Fail| OUT
  BASE --> BP[ bull put specific gates ]
  BP -->|Fail| OUT
  BP --> ORDY[Order resource ready]
  ORDY --> SUB[Submit LIMIT credit]
  SUB --> DONE([Outcome: placed or queued])

  classDef step fill:#111827,stroke:#94a3b8,color:#e5e7eb,stroke-width:1px;
  classDef gate fill:#0e1729,stroke:#22d3ee,color:#e5e7eb,stroke-width:1px;
  classDef out fill:transparent,stroke:#94a3b8,color:#cbd5e1,stroke-dasharray:5 3;

  class A,SC,FLT,PR1,PR2,PRICE,VIAB,BASE,BP,ORDY,SUB,DONE step;
  class OUT out;
                    

Glossary

  • EDM/EPR (Up/Down): engine signals derived from expected directional move and expected price range to gate risk.
  • Delta / net delta: delta is per‑leg sensitivity; net delta is portfolio‑level sum.
  • PL ratio: theoretical profit‑to‑loss ratio of the spread at opening.
  • Return on risk (ROR): theoretical net credit divided by maximum loss.
  • Trend signals: regime flags that bound allowable position delta by trend window.
  • Width: strike distance between short and long legs of the vertical.
  • markCalc: internal calculated mark used for sanity checks and pricing floors.