Strasmore Research
Learn Matt ConnorBy Matt Connor

Put-Call Parity Explained, With Real Numbers

Put-call parity is the fixed link between a call, a put, the stock, and cash. Worked on a real option chain, plus the implied dividend and borrow rate.

Put-call parity is the fixed arithmetic that ties a call, the matching put, the underlying share, and a cash loan into one price. For European options that share a strike and an expiration date, the call price minus the put price equals the discounted difference between the forward price of the stock and that strike. Work the relation on a real chain and it hands back the share price the options imply, which is rarely the price on the tape. The gap between the two is where the dividend and the financing rate sit.

What put-call parity actually says

Written out, the relation is C - P = S - PV(K) - PV(D). C is the call price and P is the put price at the same strike and expiration. S is the share price today. PV(K) is the strike discounted back at the financing rate, and PV(D) is the present value of dividends the share pays before expiration. Call options carry the right to buy at the strike, and put options carry the right to sell at it.

Behind the algebra is a package. Buy the call and sell the put at one strike and you end up owning the share at that strike on expiration day whatever the price does: above the strike you exercise, below it you are assigned. The pair is a synthetic long share position, bought on credit, paying for the share at expiration rather than today, and collecting no dividends in the meantime. Parity prices those two adjustments and nothing else.

Imagine a share at $100, a one year call struck at $100 quoted at $9, the matching put at $5, and no dividend in between. The pair costs $4. Add the strike back and the options imply $104 for a share quoted at $100. That $4 is the interest on a deferred purchase price for a year, at roughly four percent. Those figures are illustrative, picked for round arithmetic.

The share price the options imply

Rearranged, the relation prints a share price of its own: call price minus put price plus the strike. Run that subtraction at every strike on one expiration and the answers land within pennies of each other. That number is the synthetic stock price, and the distance between it and the close on the tape is the basis, or the carry, of the synthetic. Interest to expiration pushes the basis up. Dividends before expiration pull it down.

What sits inside the parity gap

Four things, and only four:

  • Interest to expiration. Paying the strike later instead of now is a loan for the life of the contract, and the pair charges for it.
  • Dividends before expiration. A synthetic holder collects none of them, so every dividend that goes ex before the contract expires comes out of the gap.
  • Borrow cost. Whoever takes the other side and shorts the share pays a stock loan fee, and that fee lands in the same gap.
  • Early exercise value on American contracts, which turns the equality into a band.

The same relation across expirations

Interest accrues by the day and dividends land on specific dates, so the basis is a curve rather than a single number. A chain carries a second readout on that curve. Parity ties the call and the put at one strike to one forward, so a pricer working from the chain's own rate and dividend hands back the same implied volatility for both legs, and daylight between the legs is daylight between assumptions.

The panel is pinned in the past, so the numbers on this page never move: AAPL monthly expirations from July 2026 through January 2027, read off the June 16, 2026 session, at the strike nearest the close for each.

QueryCall and put implied volatility near the money across AAPL monthly expirations, June 16 2026
The exact SQL behind every number
SELECT
    expiry_date,
    days_out,
    concat('$', toString(argMin(strike, atm_gap)))                        AS atm_strike_used,
    round(100 * argMin(call_iv, atm_gap), 1)                              AS call_iv_pct,
    round(100 * argMin(put_iv, atm_gap), 1)                               AS put_iv_pct,
    round(100 * (argMin(call_iv, atm_gap) - argMin(put_iv, atm_gap)), 1)  AS iv_gap_pct
FROM
(
    SELECT
        expiry_date,
        days_out,
        strike,
        call_iv,
        put_iv,
        abs(strike / spot_close - 1) AS atm_gap
    FROM
    (
        SELECT
            toString(expiration_date)                                    AS expiry_date,
            max(dateDiff('day', toDate(date), toDate(expiration_date)))  AS days_out,
            round(toFloat64(strike_price), 2)                            AS strike,
            maxIf(toFloat64(implied_volatility), leg = 'C')              AS call_iv,
            maxIf(toFloat64(implied_volatility), leg = 'P')              AS put_iv,
            max(toFloat64(underlying_close))                             AS spot_close
        FROM
        (
            SELECT
                date,
                expiration_date,
                strike_price,
                implied_volatility,
                underlying_close,
                upper(substring(ticker, length(ticker) - 8, 1)) AS leg
            FROM global_markets.options_greeks
            WHERE underlying_symbol = 'AAPL'
              AND date = '2026-06-16'
              AND expiration_date BETWEEN '2026-07-01' AND '2027-01-31'
              AND toDayOfWeek(toDate(expiration_date)) = 5
              AND toDayOfMonth(toDate(expiration_date)) BETWEEN 15 AND 21
              AND iv_converged = 1
              AND volume > 0
              AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.03
        )
        GROUP BY expiry_date, strike
        HAVING countIf(leg = 'C') > 0
           AND countIf(leg = 'P') > 0
    )
)
GROUP BY expiry_date, days_out
ORDER BY expiry_date
Run this yourself

At 2026-07-17, 31 days out, the $300 strike carried a call at 21.9 percent against a put at 20.5 percent, a gap of 1.4 points. At 2027-01-15, 213 days out, the gap is 0.3 points. The two legs track each other down the whole calendar.

How to extract an implied dividend or an implied borrow rate

For an implied dividend, take two expirations that straddle a company's ex-dividend date, compute the basis for each, and subtract. The extra interest across the extra days is small and computable from the prevailing bill rate. What remains is the cash the chain expects to go ex in between. Set that against the declared schedule on our ex-dividend dates and options page and the chain's own dividend assumption is on the table.

For an implied borrow rate, run it backwards. Fix the dividend at the declared amount and the financing at the bill rate, compute the basis those two produce, and compare it with the basis the chain quotes. On an easy to borrow share the two land on top of each other. On a hard to borrow one the quoted basis sits below the computed one, and the annualized shortfall is the borrow fee the options are charging.

The prerequisite is knowing which two prices to pull off the screen, and our option chain guide covers the layout.

Where American options break the equality

American options can be exercised on any day up to expiration. European options can be exercised only at expiration, and parity as a strict equality belongs to the European case. On American contracts it relaxes into a band, wider on whichever side holds an early exercise right worth money. An American call is worth exercising early only just ahead of a dividend larger than its remaining time value, which is why early call exercise clusters on the day before an ex-dividend date.

The same volatility test runs across strikes at a single expiration, and that is where the band shows its width.

QueryCall and put implied volatility at matched AAPL strikes, Sep 18 2026 expiry
The exact SQL behind every number
SELECT
    strike,
    round(100 * call_iv, 1)             AS call_iv_pct,
    round(100 * put_iv, 1)              AS put_iv_pct,
    round(100 * (call_iv - put_iv), 1)  AS iv_gap_pct
FROM
(
    SELECT
        round(toFloat64(strike_price), 2)                AS strike,
        maxIf(toFloat64(implied_volatility), leg = 'C')  AS call_iv,
        maxIf(toFloat64(implied_volatility), leg = 'P')  AS put_iv
    FROM
    (
        SELECT
            strike_price,
            implied_volatility,
            upper(substring(ticker, length(ticker) - 8, 1)) AS leg
        FROM global_markets.options_greeks
        WHERE underlying_symbol = 'AAPL'
          AND date = '2026-06-16'
          AND expiration_date = '2026-09-18'
          AND iv_converged = 1
          AND volume > 0
          AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.15
          AND toUInt32(toFloat64(strike_price)) % 5 = 0
    )
    GROUP BY strike
    HAVING countIf(leg = 'C') > 0
       AND countIf(leg = 'P') > 0
)
ORDER BY strike
Run this yourself

The two lines run together across the ladder. At the 255 strike the call implies 30.5 percent and the put 29.3 percent, a gap of 1.2 points. Where a gap opens at the far strikes, the candidates are a stale closing print on one side, a thin market at that strike, an early exercise premium the model does not carry, or a dividend assumption that differs from the one the chain prices.

Conversions and reversals, the flow that enforces it

A conversion is long shares, short call, long put at one strike. A reversal is its mirror. Both packages sit flat to the share price at expiration, and what is left is the financing and dividend terms. Market makers put them on when the pair strays far enough to clear their costs, and that flow pulls the quotes back toward the line. The edge in it belongs to desks with cheap financing and a stock loan book behind them, and this page is not a guide to trading it.

How parity differs from the put/call ratio

The two get confused for each other. Put-call parity is a pricing identity between one call and one put at one strike, and it is arithmetic. The put/call ratio counts volume or open interest across an entire chain and gets read as a sentiment gauge. Parity says what a pair must cost against the share. The ratio says what people traded.

Data notes and method

Figures are daily closing implied volatilities for AAPL contracts on June 16, 2026, matched call to put at each strike, with the underlying close from the same session. Contracts are included only with volume above zero on the day and a converged implied volatility. The strike ladder samples the five dollar grid to stay readable, and the expiration panel takes the strike nearest the close at each monthly expiration. The call or put letter comes from the ninth character from the end of the OCC contract symbol. AAPL listed options are American style, so every figure here carries whatever early exercise premium the market was pricing that day.

FAQ

What is the put-call parity formula?

For European options at the same strike and expiration, the call price minus the put price equals the share price, minus the present value of the strike, minus the present value of dividends paid before expiration. Rearranged: call price minus put price plus the strike gives the share price the options imply.

Does put-call parity hold for American options?

Not as a strict equality. Early exercise rights turn it into a band around the European relation.

How do I calculate an implied dividend from an option chain?

Take the call and the put at one strike and expiration, compute call minus put plus the strike, and subtract the share price. That gap is interest to expiration minus expected dividends. Work out the interest from the bill rate over the same days, and what remains is the dividend the chain is pricing.

Why do a call and a put at the same strike have the same implied volatility?

Parity ties the two prices together with no volatility term in the link, so a model that prices one from a given forward and discount rate prices the other from the same inputs.


Every panel here ships with the SQL underneath it. To run the same ladder on another name or a further expiration, ask for it in plain English on the Strasmore terminal.

#put-call parity#options#arbitrage#dividends#synthetics