Credit Spread vs Debit Spread: Same Trade?
Credit spread vs debit spread: on the same strikes both verticals pay the same. See the payoff grid, the parity math, and the three things that really differ.
A credit spread and a debit spread built on the same two strikes, in the same expiration, leaning the same way are the same position. One takes cash in at the start and the other pays cash out, and at expiration their profit and loss lines land on top of each other. What survives that fact is a short list of practical differences, and the shape of the payoff is not on it.
What is a vertical spread, in debit and credit form
A vertical spread is two options of the same type, on the same underlying, in the same expiration, at two different strikes. One is bought and one is sold. The gap between the strikes is the width, and the width is the most the structure can ever be worth. (Two expirations instead of two strikes makes a different animal, the calendar spread.)
A bull call spread buys the lower-strike call and sells the higher-strike call. The call being bought costs more than the call being sold, so cash leaves the account: that payment is the debit. A bull put spread sells the higher-strike put and buys the lower-strike put. The put being sold is worth more, so cash arrives: that receipt is the credit. Both structures gain as the stock rises toward the higher strike, and both stop gaining above it. The individual legs are taken apart in buying and selling call options.
Put-call parity ties the two prices together
Put-call parity is arithmetic, not a model. At one strike and one expiration, the call price minus the put price equals the stock price minus the strike discounted back from expiration. Put-call parity works through why an arbitrage desk keeps it honest. The panel below shows the identity on a single AAPL chain, marked at the close on Jun 12, 2026 for contracts expiring Jul 17, 2026.
The exact SQL behind every number
SELECT
concat('$', toString(toFloat64(strike_price))) AS strike,
round(avgIf(toFloat64(option_close), lower(option_type) IN ('call', 'c')), 2) AS call_price,
round(avgIf(toFloat64(option_close), lower(option_type) IN ('put', 'p')), 2) AS put_price,
round(avgIf(toFloat64(option_close), lower(option_type) IN ('call', 'c'))
- avgIf(toFloat64(option_close), lower(option_type) IN ('put', 'p')), 2) AS call_minus_put,
round(any(toFloat64(underlying_close)) - toFloat64(strike_price), 2) AS stock_minus_strike,
round(avgIf(toFloat64(option_close), lower(option_type) IN ('call', 'c'))
- avgIf(toFloat64(option_close), lower(option_type) IN ('put', 'p'))
- any(toFloat64(underlying_close)) + toFloat64(strike_price), 2) AS parity_gap,
formatDateTime(any(date), '%b %e, %Y') AS snapshot,
formatDateTime(any(expiration_date), '%b %e, %Y') AS expiry
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-12'
AND expiration_date = '2026-07-17'
AND volume >= 50
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.04
GROUP BY strike_price
HAVING countIf(lower(option_type) IN ('call', 'c')) > 0
AND countIf(lower(option_type) IN ('put', 'p')) > 0
ORDER BY strike_priceRead the call minus put column against the stock minus strike column. At the $280 strike, the call closed 12.26 above the put, against a stock-minus-strike distance of 11.52. The pairing repeats across all 5 strikes in the panel. The final column holds what is left over, and it sits near zero without sitting at zero. That residue is the interest on the strike over the weeks to expiration, net of any dividend inside the window. Box spreads price that residue on its own.
Do a bull call spread and a bull put spread have the same payoff?
Put the identity to work. The bull call spread costs the lower-strike call minus the higher-strike call. Swap each call for its parity equivalent, a put plus the stock minus a discounted strike, and the stock legs cancel. What is left is the discounted width minus the put spread's credit. In one sentence: the debit paid and the credit taken always add up to the width of the spread.
That claim has a number attached, so here is the number, on every $5-wide vertical in the same chain.
The exact SQL behind every number
WITH chain AS
(
SELECT
toFloat64(strike_price) AS strike,
any(toFloat64(underlying_close)) AS spot,
avgIf(toFloat64(option_close), lower(option_type) IN ('call', 'c')) AS call_px,
avgIf(toFloat64(option_close), lower(option_type) IN ('put', 'p')) AS put_px
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-12'
AND expiration_date = '2026-07-17'
AND volume >= 50
AND toFloat64(strike_price) = round(toFloat64(strike_price) / 5) * 5
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.10
GROUP BY strike
HAVING countIf(lower(option_type) IN ('call', 'c')) > 0
AND countIf(lower(option_type) IN ('put', 'p')) > 0
)
SELECT
concat('$', toString(lo.strike), ' / $', toString(hi.strike)) AS spread_strikes,
round(lo.call_px - hi.call_px, 2) AS call_debit,
round(hi.put_px - lo.put_px, 2) AS put_credit,
round((lo.call_px - hi.call_px) + (hi.put_px - lo.put_px), 2) AS debit_plus_credit
FROM chain AS lo
INNER JOIN chain AS hi ON hi.strike = lo.strike + 5
ORDER BY lo.strikeThe lowest rung sits deep in the money, meaning the strike is far on the profitable side of the stock price. The $275 / $280 call spread cost 3.7 of the $5 width there, while the put spread on the very same strikes paid 1.04, and the two came to 4.74. At the top rung, $315 / $320, the balance inverts: 0.49 of debit against 4.65 of credit, summing to 5.14. Across all 6 rungs the total stays at the $5 width, give or take the pennies that separate one closing mark from another.
The payoff grid, both structures side by side
The ladder is a statement about entry prices. The payoff grid is the same statement at expiration. This panel takes the pair of strikes closest to where the stock was trading that day and prices both structures across a range of expiration prices, in dollars per share.
The exact SQL behind every number
WITH chain AS
(
SELECT
toFloat64(strike_price) AS strike,
any(toFloat64(underlying_close)) AS spot,
avgIf(toFloat64(option_close), lower(option_type) IN ('call', 'c')) AS call_px,
avgIf(toFloat64(option_close), lower(option_type) IN ('put', 'p')) AS put_px
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-12'
AND expiration_date = '2026-07-17'
AND volume >= 50
AND toFloat64(strike_price) = round(toFloat64(strike_price) / 5) * 5
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.12
GROUP BY strike
HAVING countIf(lower(option_type) IN ('call', 'c')) > 0
AND countIf(lower(option_type) IN ('put', 'p')) > 0
)
SELECT
concat('$', toString(px.strike)) AS price_at_expiry,
round(least(greatest(px.strike - lo.strike, 0.0), hi.strike - lo.strike)
- (lo.call_px - hi.call_px), 2) AS debit_structure_pl,
round((hi.put_px - lo.put_px)
- least(greatest(hi.strike - px.strike, 0.0), hi.strike - lo.strike), 2) AS credit_structure_pl,
round(least(greatest(px.strike - lo.strike, 0.0), hi.strike - lo.strike)
- (lo.call_px - hi.call_px)
- (hi.put_px - lo.put_px)
+ least(greatest(hi.strike - px.strike, 0.0), hi.strike - lo.strike), 2) AS pl_gap
FROM chain AS px
INNER JOIN chain AS lo ON lo.strike = floor(px.spot / 5) * 5
INNER JOIN chain AS hi ON hi.strike = lo.strike + 5
ORDER BY px.strikeAt $275, under both strikes, the debit structure prints -2.6 per share and the credit structure -2.09. At $320, above both strikes, they print 2.4 and 2.91. The last column is the one to watch, and it is flat: -0.51 at the bottom of the grid and -0.51 at the top. A constant offset is not a different risk profile. It is one shape, drawn twice.
Worst case and best case add to the width on either row, since neither structure can be worth more than the distance between the strikes. Break-even falls out of the same arithmetic: the lower strike plus the debit for the call version, the higher strike minus the credit for the put version. With debit and credit adding to the width, those two prices are one price.
Credit spread vs debit spread: what actually differs
Three things differ in practice, and the payoff diagram is not among them.
How the capital is posted
The debit version's maximum loss is the debit, and the account has already paid it at entry. Nothing further is held. The credit version's maximum loss is the width minus the credit, and a broker holds that amount as a requirement against the short leg until the position is closed or expires. Same dollars, different label. One statement shows cash gone; the other shows cash arrived with buying power reduced by a larger number. A defined-risk vertical is treated on entirely different terms from an uncovered short option, which is worth understanding before comparing the two: see margin for selling naked options.
Early assignment lands on a different leg
Both structures are short an option, and US equity options are American style, exercisable on any business day. What differs is when that short leg is in the money. In the bull call spread the short leg is the higher-strike call, in the money in the winning scenario, and short calls face early exercise mainly the day before an ex-dividend date, when the dividend on offer exceeds the call's remaining time value. Ex-dividend dates and options covers that mechanic. In the bull put spread the short leg is the higher-strike put, in the money in the losing scenario, and deep in-the-money short puts get exercised early for the interest on the strike proceeds. Assignment does not change the defined maximum loss, since the long leg remains in place. It changes what the account holds overnight, which can be stock and a margin call. American vs European options sorts out which contracts can do this at all.
Execution cost where the chain is thin
Parity says the two structures are worth the same. It says nothing about the price of the fill. Volume is rarely symmetric across a chain.
The exact SQL behind every number
SELECT
concat('$', toString(toFloat64(strike_price))) AS strike,
sumIf(volume, lower(option_type) IN ('call', 'c')) AS call_volume,
sumIf(volume, lower(option_type) IN ('put', 'p')) AS put_volume,
round(100 * sumIf(volume, lower(option_type) IN ('put', 'p')) / sum(volume), 1) AS put_volume_share_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-12'
AND expiration_date = '2026-07-17'
AND volume > 0
AND toFloat64(strike_price) = round(toFloat64(strike_price) / 5) * 5
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.12
GROUP BY strike_price
ORDER BY strike_priceAt $260, the lowest of the 14 strikes shown, puts took 99.5% of the contracts traded. At $325, the highest, the put share was 0%. The thin side of a chain carries a wider quoted market, and that width is paid on the way in and again on the way out. What it costs to trade options puts figures on that, and liquid versus volatile options separates a thin market from a fast one.
Does high implied volatility favor the credit version?
The familiar heuristic runs: sell premium when implied volatility is high, buy it when implied volatility is low. On identical strikes that sentence describes the input, never the structure. Both verticals are priced off the same volatility at the same two strikes, and the ladder above is the receipt. Selling the put spread at a rich implied volatility and buying the call spread on those strikes leave one position on the books, with one break-even and one worst case. A view on the volatility input gets expressed through the strikes chosen and the width, and it lands the same either way. Is high implied volatility good takes the input itself apart.
FAQ
Is a credit spread safer than a debit spread?
On the same strikes and expiration, no. The worst case, the best case and the break-even price are identical. The credit version shows its risk as a margin requirement held against the short leg, while the debit version shows the same risk as cash already spent.
Which one ties up less capital?
Neither, on identical strikes. The debit version costs the debit and holds nothing further. The credit version receives the credit and holds the width minus the credit. Those two amounts are the same money, since the debit and the credit add to the width.
Can a credit spread be assigned early?
Yes. The short leg of a US equity vertical is American style and can be exercised against the account on any business day. The long leg stays in place, so the defined maximum loss holds, though the account can end up holding stock overnight.
When does the choice between the two actually matter?
When the two sides of the chain are not equally liquid, when a dividend falls inside the window, and when a broker's requirement makes one version cheaper to carry. The payoff diagram is never the deciding input.
Every panel here ships with the SQL that produced it, so expand any one to see how the number was counted. Point the same queries at another ticker and expiration on the Strasmore terminal to watch the identity hold there too.