A call debit spread (short strike > long strike) is bullish and the price you pay for the spread is your debit. If you have a 5 point spread, and spot is, like, 3 points above your short strike, with no extrinsic left, and you get assigned, you are now short the underlying at the short strike, so you are down 3 points. If you then exercise your long call, you would be long the underlying at the long strike and up 8 points. The long would automatically close the short, putting you flat the underlying. So you made 5 points minus your debit, with little or no commissions. I think...
For me it was a hard work to understand and implement just the Put Credit Spread in to my program. But now I see I also need to add Put Debit Spread as well, b/c w/o it I would miss half of opportunities with Put Spread trading (short + long). And there are even two more very similar ones: Call Credit Spread and Call Debit Spread. Meaning: still much much work ahead... This journey never ends... But I'll make a cut after completing the Puts (both credit & debit). ...b/c one also needs some "Peace of Mind"...
Made some progress in coding the above: Put Spread : both Put Debit Spread and Put Credit Spread handled in same code. The code is for results at expiry only, not for results before. For the abbreviations see my prev. posting. Excerpt from the C++ class definition: Code: // Constructor: ... fDebit = LP_K > SP_K; ... NetPremium = SP_Pr - LP_Pr; MaxPL = fDebit ? (LP_K - SP_K) - -NetPremium : NetPremium; MinPL = fDebit ? NetPremium : -((SP_K - LP_K) - MaxPL); MarginReq = fDebit ? -NetPremium : SP_K - LP_K; CostBasis = MarginReq - (fDebit ? 0.0 : max(0.0, MaxPL)); ... Sx_at_BE = fDebit ? LP_K - -NetPremium : SP_K - MaxPL; dPctSx_at_BE = pct(Sx_at_BE - SP_S, SP_S); ... S0_PL = get_y(SP_S); S0_PLpct = pct(S0_PL, CostBasis); ... // Member function: double get_y(const double x) const { // returns PL @ Sx if (fDebit) { // Formula for Put Debit Spread: y = MinPL + (LP_K - x) if (cmp(x, LP_K) >= 0) return MinPL; if (cmp(x, SP_K) <= 0) return MaxPL; return MinPL + (LP_K - x); } // Formula for Put Credit Spread: y = MinPL + (x - LP_K) if (cmp(x, LP_K) <= 0) return MinPL; if (cmp(x, SP_K) >= 0) return MaxPL; return MinPL + (x - LP_K); } Not throughly tested yet. Very first results indicate that there are significantly much more lucrative Put Debit Spread candidates than Put Credit Spread candidates. But this can also be caused by my watchlist with just only 139 pre-filtered tickers. Or maybe still a bug in this very early code version. If you spot a possible bug let me know. Thx. Here are 2 fictitious examples: Put Credit Spread example: Code: SP(S=100.0000 DTE=365.00 K=100.0000 Pr=12.0000 IV=30.1938) LP(S=100.0000 DTE=365.00 K=90.0000 Pr=5.0000 IV=24.2061) MarginAcct CreditSpread NetPremium=7.0000 MarginReq=10.0000 CostBasis=3.0000 MaxPL=7.0000(233.33%) MinPL=-3.0000(-100.00%) BE(Sx=93.0000(-7.00%)) S0(PL=7.0000(233.33%)) Put Debit Spread example: Code: SP(S=100.0000 DTE=365.00 K=100.0000 Pr=12.0000 IV=30.1938) LP(S=100.0000 DTE=365.00 K=110.0000 Pr=18.0000 IV=29.6414) MarginAcct DebitSpread NetPremium=-6.0000 MarginReq=6.0000 CostBasis=6.0000 MaxPL=4.0000(66.67%) MinPL=-6.0000(-100.00%) BE(Sx=104.0000(4.00%)) S0(PL=4.0000(66.67%))
It seems my above definition Code: fDebit = LP_K > SP_K; for Put Debit Spread (or Put Credit Spread) is incorrect... B/c whether the NetPremium is < 0 or >= 0 has (also? or instead?) to be considered (too)?... Here's an example that demonstrates the problem: SP(S=100.0000 DTE=180.00 K=75.0000 Pr=13.4102 IV=100.0000) LP(S=100.0000 DTE=180.00 K=100.0000 Pr=6.9949 IV=25.0000) MarginAcct PutDebitSpread NetPremium=6.4153 For a Put Debit Spread I was expecting a negative NetPremium, but the above one is positive... like in a Credit case. So there's clearly something fishy in the above definition... Update: But it could also be correct... Maybe only the definition itself is "irritating"... B/c the calcs seem to be correct (except the Sx for B/E, as this gets funny ). See also this. It clearly is an arbitrage case.
I solved the problem simply by replacing "fDebit" by "fBearSpread". The code handles only the Put cases, ie. now calling the 2 cases: PutVerticalBearSpread and PutVerticalBullSpread Bear is when LP.K > SP.K Bull is when LP.K <= SP.K