How AnchorPoint works

Last updated: May 20, 2026

The numbers AnchorPoint shows you come from formulas you can read. This page documents every one of them, including the choices we made about weights and thresholds. Where the algorithm has limitations, we say so honestly.

The two-minute version

How scan scoring works

Each contract gets a composite score between 0 and 1. Higher is “better” in the sense of “closer to what you asked for,” not in the sense of “more likely to be profitable.” The composite is a weighted sum of four sub-scores:

composite = 0.45 × delta_score
          + 0.20 × liquidity_score
          + 0.20 × extrinsic_score
          + 0.15 × budget_efficiency

Delta score (weight: 0.45)

How close the contract’s delta is to your target, capped at the target so you don’t get penalized for going deeper than asked:

if delta ≥ target:
    delta_score = 1.0
else:
    delta_score = delta / target

If you ask for a 0.20 delta and the contract has 0.15, delta_score is 0.75 (15/20). If it has 0.20 or higher, delta_score is 1.0. Higher weight than other factors because delta is what defines the kind of trade you’re making.

Liquidity score (weight: 0.20)

A blend of bid-ask spread tightness and open interest. Tighter spreads mean less slippage when you sell; higher open interest means a real market exists.

mid = (bid + ask) / 2
spread_pct = (ask - bid) / mid
spread_score = max(0, 1 - spread_pct × 15)
oi_score = min(open_interest / 500, 1.0)
liquidity_score = 0.6 × spread_score + 0.4 × oi_score

Spread above ~6.7% drops spread_score to zero. Open interest of 500 or more is “enough” for full credit. These are reasonable defaults for SPY-class options. For thinly-traded single names they may be too strict.

Extrinsic score (weight: 0.20)

How much of the premium is time value (extrinsic) versus how much is real intrinsic value. Less extrinsic means less theta decay risk.

intrinsic = max(0, spot - strike)
extrinsic = ask - intrinsic
extrinsic_pct = extrinsic / ask
extrinsic_score = max(0, 1 - extrinsic_pct / 0.30)

A contract that’s 100% extrinsic (all time value, no intrinsic) scores zero. A contract with 30% or less extrinsic scores 1.0. Most affordable OTM LEAPS are close to 100% extrinsic, so this factor mostly distinguishes deep-ITM “stock replacement” trades from speculation.

Budget efficiency (weight: 0.15)

A small bonus for being able to buy multiple contracts. Not a directional preference — just a reflection that some users prefer multiple smaller positions over one large one.

contracts_buyable = floor(budget / (ask × 100))
if buyable ≥ 3: budget_efficiency = 1.0
elif buyable == 2: budget_efficiency = 0.75
else: budget_efficiency = 0.5

Worked example

Suppose SPY is at $750, you have a $5,000 budget, and your delta target is 0.40. Consider a contract: $720 strike, ask $52.00, delta 0.43, bid $51.80, open interest 6,800.

Now consider $750 strike, ask $30.00, delta 0.38, bid $29.70, OI 9,200:

This contract scores 0.685. The extrinsic_score of zero is dragging it down — every penny is time value. Most affordable OTM contracts have this problem; it’s structural, not a bug.

How the exit signal works

When you track a contract, AnchorPoint computes four independent signal scores from 0 to 100. Each watches a different exit condition. The overall signal is the maximum of the four — any single strong signal is enough to trigger an exit recommendation, you don’t need confluence.

The four signals:

Profit signal

How much the option’s mid-price has moved since you saved it.

pnl_pct = (current_mid - entry_premium) / entry_premium

if pnl_pct ≥ 1.00:  score = 100   (you've doubled)
elif pnl_pct ≥ 0.50: score = 70   (up 50%)
elif pnl_pct ≥ 0.25: score = 35   (up 25%)
else:                score = 0

Why 50%/100% thresholds? Both are common rules of thumb in long-options trading. Doubling your premium is the “home run” outcome a long call is designed for. Either threshold is defensible — these are choices, not optimization.

Delta drift signal

Watches if the contract’s delta has climbed into deep-ITM territory. When delta gets near 1.0, the option behaves like synthetic stock but costs option premium. Time to roll up or close.

if current_delta ≥ 0.95: score = 100
elif current_delta ≥ 0.92: score = 70
elif current_delta ≥ 0.90: score = 35
else:                       score = 0

DTE threshold signal

Theta decay accelerates non-linearly as expiration approaches. A year-out option loses small amounts daily; a 90-day option bleeds noticeably faster. This signal forces an exit consideration when time is running out, regardless of P&L.

if days_to_expiration ≤ 90:  score = 100
elif dte ≤ 120:               score = 70
elif dte ≤ 150:               score = 35
else:                          score = 0

IV crush signal

If implied volatility has collapsed significantly since you bought, your extrinsic premium is shrinking even if the underlying hasn’t moved against you. Common after earnings, Fed meetings, or general market calm-downs.

iv_change = (current_iv - entry_iv) / entry_iv

if iv_change ≤ -0.30:  score = 100  (IV down 30%+)
elif iv_change ≤ -0.20: score = 70
elif iv_change ≤ -0.10: score = 35
else:                    score = 0

How the four combine

overall_score = max(profit, delta_drift, dte, iv_crush)

if overall_score ≥ 80:   recommendation = "Exit signal"
elif overall_score ≥ 50: recommendation = "Consider exit"
else:                     recommendation = "Hold"

The max (not average) is deliberate. If delta drifts to 0.96, you should probably close even if profit is modest. If DTE is 85, you should probably close even if everything else looks fine. Averaging would dilute these.

How the delta suggestion works

When you change your budget on the scan page, AnchorPoint suggests a delta target based on what’s realistically achievable. The formula:

raw = sqrt(budget / (spot × 25))
suggested = clamp(raw, 0.10, 0.80)
            then snap to nearest 0.05

The constant 25 comes from the empirical observation that a 0.80-delta year-out call costs roughly 22-25% of the underlying’s price. Inverting that gives us a rough mapping from budget to maximum achievable delta. The square root smooths the relationship — at low budgets delta scales steeply, at high budgets it asymptotes toward 0.80.

The label that appears with the suggestion reflects the strategy tier:

What the algorithm does not do

Knowing the limits is more important than knowing the formulas. Here’s an honest list:

It doesn’t forecast direction

No part of this tool predicts whether SPY (or any underlying) is about to go up or down. The scores rank contracts by how well they fit your stated criteria. The signals react to what has already happened. Neither is a prediction.

It doesn’t know about news, earnings, or events

The tool sees option chain data, nothing else. If the underlying has earnings tomorrow, a Fed decision next week, or a known regulatory ruling pending — that’s on you to know. The IV crush signal will react after these events, not before.

The thresholds are defaults, not optimized

The choices baked in — 50% profit triggers a Consider signal, 120 DTE is the warning zone, 0.92 delta is “deep” — are sensible defaults derived from common practice in long-options trading. None of them have been backtested against historical performance or validated against a specific market regime. They may be wrong for your situation, your trade, or current conditions.

It doesn’t backtest

AnchorPoint doesn’t replay historical option chains to see how its scoring would have performed. There is no historical validation that “high score” contracts outperform “low score” ones, or that following the exit signals improves outcomes. Adding this would be a meaningful research project on its own.

The data may be delayed or imperfect

Alpaca’s free indicative feed has delayed and approximate quotes. Greeks are Alpaca’s pricing-model estimates, not ground truth. Open interest typically updates once per day. Bid and ask shown in the UI may not be achievable at the moment you try to execute.

It treats your inputs as gospel

If you tell the scan a budget of $500 with a 0.80 delta target, it will faithfully look for something that doesn’t exist and return the closest thing — which will score poorly, but it’ll still be the top result. The algorithm has no “your parameters don’t make sense” check beyond the delta suggestion feature.

The full source is open

The scoring code lives in backend/scorer.py and the exit signal code lives in backend/exit_signal.py. Every formula above is verbatim from those files. If you spot a bug, an unreasonable threshold, or have ideas for improvements, open an issue on the project repo.

Future versions may revisit the weights, add a min-delta filter to filter out lottery tickets, support roll suggestions when delta drifts deep, or add multi-symbol watchlist scanning. None of those are committed plans — they’re possibilities.

Required reading

If you’re using AnchorPoint to inform real trading decisions, please also read the Risk Disclosure. It covers what can happen to a long-options position that this page doesn’t — the practical consequences of theta, IV crush, execution slippage, and the asymmetric loss profile of long calls.