发布

  • 17977 35b32b401e

    Add margin-aware option strategy match selection (#9639)

    frostbyte_neo 发布于 2026-08-04 15:01:40 +00:00 | 2 次提交 在此版本后已推送到 master

    • Add margin-aware option strategy match selection

    OptionStrategyMatcher.MatchOnce greedily matched definitions in
    descending leg-count order, never consulting the objective function
    hook. Books of overlapping debit spreads were carved into ladders
    whose uncovered short leg is charged naked option margin, producing
    phantom margin deltas, inconsistent accept/reject decisions and
    TotalMarginUsed churn on fully covered, defined-risk books.

    MatchOnce now evaluates a second candidate solution that deprioritizes
    definitions leaving a short leg uncovered, and selects the best
    solution via the objective function. The new default objective
    function minimizes the quantity of uncovered short contracts, a
    deterministic proxy for the margin required to hold the positions.
    Ties preserve the previous grouping, so behavior only changes where
    the greedy carve left a short uncovered that another grouping of the
    same positions covers.

    Fixes #9638

    Co-Authored-By: Claude Fable 5 noreply@anthropic.com

    • Cache strategy definition ordering and skip redundant match pass

    Materialize the definition enumerations once per matcher options instead of
    re-sorting them on every MatchOnce call, and only evaluate the second candidate
    solution when some short contract can actually be covered by a long of the same
    right or by the underlying lots held. A book of naked shorts, by far the most
    common one reaching that point, now runs a single matching pass.

    Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

    • Bound credit-side short coverage and add overlapping spreads regression

    The uncovered short proxy treated any same-right long as covering a
    short leg. A long on the credit side (higher strike for calls, lower
    for puts) caps the risk at the strike width, which for a distant long
    can exceed the naked short margin, so preferring it could raise the
    margin required instead of lowering it.

    Coverage from the debit side stays free, while credit-side coverage
    only counts within 10% of the short strike, the price-free stand-in
    for the naked short margin floor of the option margin model. Beyond
    that width the short counts as uncovered, the candidate solutions tie
    and the previous grouping is preserved, so the selection can only ever
    lower the margin required to hold the positions.

    Also adds a regression algorithm for the reported defect: two
    overlapping bull call debit spreads with interleaved strikes resolve
    into two margin free spreads instead of a bull call ladder charging
    naked call margin plus an unmatched long.

    Co-Authored-By: Claude Fable 5 noreply@anthropic.com

    • Skip provably useless match passes and drop scoring allocations

    Matching again cannot help once the first solution already leaves no
    more shorts uncovered than the positions can possibly cover, since a
    long contract covers at most its own quantity of shorts of the same
    right, and so does an underlying lot. Checking that bound generalizes
    the naked shorts precondition it replaces and removes the second pass
    from books holding fewer longs than shorts, such as a plain ladder,
    which measured 2.2x slower than a single pass before and is now level
    with it.

    The credit side width test also subsumes the debit side one, whose
    width is never positive, so coverage collapses into a single predicate
    and one pass over the legs. Strategies with a single short leg, which
    is every spread, butterfly, condor, backspread and covered call, now
    take a fast path that needs neither ordering nor allocation, and the
    remaining ladders and short butterflies sort a small array in place
    instead of allocating lists, objects and sort closures per score.

    Co-Authored-By: Claude Fable 5 noreply@anthropic.com

    • Require a covering long to outlive the short it covers

    The coverage proxy compared strikes only, so a short calendar spread,
    long the near expiration and short the far one at the same strike, read
    as fully covered on a zero strike width. The margin models disagree:
    once the long expires the short is naked for the rest of its life, and
    short calendar spreads are charged the stand-alone naked short margin
    while ordinary calendar spreads, whose long outlives the short, require
    none. Requiring the covering long to expire no earlier than the short
    makes the proxy mirror that distinction exactly, and leaves same expiry
    books untouched.

    The skip added for provably useless second passes reads the score as a
    quantity of uncovered contracts, which only the default objective
    function guarantees, so a custom one now always gets both candidates.

    Also documents that the definition ordering is cached, freezing the
    first output of a user supplied enumerator, and drops the stale claim
    that nothing in the options type is consulted by the matcher.

    Co-Authored-By: Claude Fable 5 noreply@anthropic.com

    • Apply the uncovered short bound to the default objective function only

    A function deriving from the default one is free to score by different
    rules, so taking its score for a quantity of uncovered contracts could
    skip a second candidate it would have preferred. Match the type exactly
    instead, which leaves derived functions always evaluating both.

    Also documents that the legacy objective function scores are not
    bounded above by zero, so configuring it ends candidate evaluation and
    preserves the single matching pass, and describes the regression
    algorithm strikes by their order in the chain rather than as the
    highest ones, which only held for a chain of exactly four strikes.

    Co-Authored-By: Claude Fable 5 noreply@anthropic.com


    Co-authored-by: Claude Fable 5 noreply@anthropic.com
    Co-authored-by: Martin Molinero martin.molinero1@gmail.com

    下载附件