My dad is an avid options trader — he's been doing it for 30+ years.
When he walks me through his strategy and shows me the volume of positions he manually analyzes, my mind immediately goes to how can this be automated. There are plenty of online screeners (e.g. ThinkOrSwim, StreetSmartEdge 🪦) for this sort of thing, but I've found them to be… not terribly flexible.
In keeping with the theme of this site – I'm just going to build the tool I want.
He's trying to achieve a steady annualized return of 8-10%, with a 20-30% downside protection — so, more conservative than investing in the S&P, but more aggressive than investing in bonds.
One of his strategies is a variation of a deep in the money covered call — where you buy a stock and sell a call option expiring at some point in the future.
He's looking for stocks that:
And a call option that:
Simple enough. The complexity arises when he tries to impose his own expected return calculation under different scenarios which involve some datetime math.
Let's follow an example* to help demonstrate the idea using NextEra Energy (NEE) covered with NEE260116C00055000:
*Note: Data is as of Monday, 5/26/25. For simplicity, I chose a contract that expires within 12 months.
Here comes the crux of the issue—in order to calculate our expected return at different intervals, we need to know when the ex-dividend dates will be. Only a single ex-dividend date is announced at a time so we need to project forward based on their frequency (i.e. quarterly, bi-annually, etc).
Keeping that in mind, our projections would lead to the following timeline:
Given this information—we can now calculate the expected return if the options were to be exercised around each event date, colored in pink.
Before we get into the return calculation, let's look at pieces that will stay constant:
---------------------------------------------------------------------- Market details for covered call using NEE260116C00055000 ---------------------------------------------------------------------- Today: 2025-05-26 Expiration date: 2026-01-16 Upcoming ex dividend: 2025-06-02 Option mid point: $15.14 Equity price: $67.75 Strike price: $55.00 Equity yearly dividend: $2.27 ---------------------------------------------------------------------- Derived details for covered call using NEE260116C00055000 ---------------------------------------------------------------------- Call option intrinsic value: $12.75 Call option time value: $2.39 Covered call cost basis: $52.61 Covered call insurance: 22.35% ----------------------------------------------------------------------
The calculations that don't change here are:
Now that that's covered…🥁… let's jump into the expected return calculation. The only values that are fixed across events in this calculation are the Cost Basis and the Time Value.
Here's a breakdown of the numbers for each event date.
---------------------------------------------------------------------- Calculating return for NEE 260116C00055000 after 1 dividend ---------------------------------------------------------------------- Last dividend date: 2025-06-02 (In 7 days) Next event date: 2025-09-02 (In 99 days) Captured dividend: $0.57 Return after 1 dividends: 20.72% ---------------------------------------------------------------------- Calculating return for NEE 260116C00055000 after 2 dividends ---------------------------------------------------------------------- Last dividend date: 2025-09-02 (In 99 days) Next event date: 2025-12-02 (In 190 days) Captured dividend: $1.13 Return after 2 dividends: 12.86% ---------------------------------------------------------------------- Calculating return for NEE 260116C00055000 after 3 dividends ---------------------------------------------------------------------- Last dividend date: 2025-12-02 (In 190 days) Next event date: 2026-01-16 (In 235 days) Captured dividend: $1.70 Return after 3 dividends: 12.07% ----------------------------------------------------------------------
All of this sounds great, but there are a few caveats to keep in mind:
Now that we know how to calculate that for a single contract, we can apply the same idea across many contracts. To more easily compare different contracts and their expected returns, we can compare them assuming we're going to hold each position until expiration.
Here you can see the expected returns for different strike prices (differentiated by color) — hover over the points to see more details.
Of course, we can slice this however we want. For example, instead of looking at the annualized return vs. time, we might be interested in the annualized return vs. the insurance provided by the position.
For larger groups the best way to consume this information is probably in a spreadsheet format. I'm currently loading output for all tickers into a private Google Sheet, but plan on putting a UI on top of it.
In a future post I'll cover the technical details of my implementation.