Last month H&R Block (NYSE: HRB) sold off hard on AI fears.

Implied volatility soared to a new 1-year high.
I wouldn’t have noticed if I wasn’t prepping materials for the kids’ Investment Beginnings Class. In the class, we learn how growth expectations as embodied by P/E multiples combined with what earnings materialize to generate a return that is some mix of reality and how those expectations are revised as investors “see the flop”.
HRB is a low P/E, high earnings yield company whose growth days are a distant memory. It doesn’t have a lot of upside but if it can maintain its current earnings and multiple its earnings yield of 16% (P/E ~ 6) looks like a super, super distressed bond. I know bonds and stocks have different hockey stick diagrams, but stay with me.
Selling a cash-secured put has similar risk characteristics as buying a bond. You collect some yield, your upside is capped at the yield, and you risk the notional amount of the strike if the stock zeroes. With the implied vol jacked, my thinking is all that vol belongs to the left of the distribution. I’m not bullish on the company. I’m not really anything as I’m not studying the company in any fundamental depth but my sling-from-the-hip trading attitude is:
This company has survived every existential threat thrown at it — the transition from brick-and-mortar to internet filing, the rise of TurboTax, and a significant increase in the standard deduction. Looks like a cockroach.
And they don’t fancy themselves more than that. Between buybacks and dividends, their shareholder yield is similar to their earnings yield. They are distributing all the cash back to shareholders so those earnings aren’t trapped inside a melting ice cube.
With implied vol jacked, I decided instead of buying the stock outright I’d skim the yield by “selling my own version of a bond”. I sold some 40 delta puts and sized it such that if I were assigned on them, it would not amount to more than 1% of my portfolio.
That’s all storytime background. I’ve written about seasonality in the context of commodities and futures spreads but HRB is a dramatic example of seasonality in an equity.
Today:
- We’ll explore how to even observe the pattern and consider how it influences option pricing.
- The post will include 2 Jupyter notebooks you can fork and let Codex or Claude Code run the same analysis on any tickers you like. They will automatically pull yfinance. One notebook is focused on stocks and another is focused on commodity ETFs.
A seasonal business
For as long as I can remember, I’ve heard that there are many retailers that make most of their earnings during the holidays. I’ve never verified the numbers but it makes sense. This suggests to me that much of a retailer’s annual volatility should be concentrated around Q4 results.
I never thought about how a company like HRB would also have extremely lumpy earnings. HRB’s fiscal year ends June 30. FQ3 (Jan–Mar) and FQ4 (Apr–Jun) together account for roughly 90% of annual revenue. FQ3 alone, peak tax season, is about 60% while FQ1 (Jul–Sep) is a rounding error.

Revenue has been stable around $3.4B since recovering from a 2022 restructuring. Net income sits around $554M. EPS has grown from $3.08 to $3.51 over the last few years despite flat earnings (shrinking share count).
The natural question: does the stock’s realized volatility reflect this extreme business seasonality?
Vol Has A Tax Season Too
I computed 20-day realized volatility (annualized) for HRB from 2016–2025 and broke it out by calendar month. I used SPY and IWM as control groups.

The green-shaded bands are tax season. I only show that chart for larger context but I find it hard to see clearly in that view.
Instead, I will show charts with more granular groupings with the observations that pertain to each.

- Not suprising, but HRB’s median RV20 runs about 10 to 20 points above IWM in every month. This stock is always noisier than the market.
- The most excess vols occur in May/Jun, Sep, Nov/Dec. This makes sense. Earnings are reported in Feb, May, Aug, Nov and the subsequent realized vol is much higher than non-earnings months.
What about March? This one is curious. Perhaps there are possibly real-time tea leaves that fundamental PMs might look at during the heart of tax prep that can lead them to trade. Or maybe this is when analysts write about tax season. For now it’s a puzzling observation.

The IQR band widens in June, Sep, and Dec meaning not only is the ratio higher, but the variance of the ratio is higher. More uncertainty about the uncertainty. Dec isn’t explained by earnings, so that’s another strange observation to note.
We can observe higher volatility related to earnings. But I would expect this for any stock. I’m suprised the earnings/post-earnings period in May-Jun doesn’t stand out as far more volatile since that report contains the bulk of the year’s earnings information.
I asked Claude for some statistical treatment even though I don’t really think “doing stats” on this little data beyond casual inspection provides marginal informational warrants raising your confidence. Turns out just asking the question did lead to some education but not how I intended.
I asked Claude to hypothesis test and generate z-scores for each month vs the mean mean log ratio of HRB to IWM vol for the entire sample. It went off and performed a t-test that generated 5 sigma z-scores in the most volatile months.
From what we’ve seen so far, that just sounds ridiculous. When I pushed back on Claude it explained that the standard error denominator in the z-scores as shrunk by √n.
Do you see the problem?
For 10 years of data, if you compute 20d trailing RV for each day in the month you will have about 200 observations per month which shrinks the denominator by a factor of √200 ~ 14. But 19/20 days overlap in the data from one day to the next. You really only have about 10 samples. Basically, one month per year when your window is 20 days.
Instead of totally putting the breaks on a statistical output, I was curious how Claude would deal with this.

- It computed a stat called Cohen’s d which treats N as 10 for each month.
- June (d = 0.50) is the only month approaching a “medium” effect size. December (d = 0.42) is close.
- The percentile chart: a typical June sits at the 69th percentile of all month-medians. September at the 67th.
- The scatter plot is a sanity check. Each dot is one year. June and September have consistently elevated dots, not one crazy year pulling the mean.
Finally, we use a heatmap to look under the surface. We can visually inspect trends or outliers, and can even be a launch point for specific inquiries like “Gee, what happened in Spring of 2020?”


The first chart, which doesn’t control for IWM, shows the impact of Covid. The second chart invites you to say, “Let’s toss 2016 and 2017, and see how the seasonality would reveal itself”. Small sample size, but May through Sep, Nov and Dec do seem more volatile.
That said, I’m not sold on May earnings being even more significant than later earnings, which is to say seasonality embedded in HRB’s revenue calendar does NOT seem to bleed into one of its earnings being that much more special than the others.
As December goes, I sparred a bit with ChatGPT on possible causes for elevated HRB volatility, even controlling for benchmarks and it gave 5 reasons that me groan. This was the best one and it feels meh:
Tax names can be unusually sensitive in December because investors are thinking about rule changes, credits, deductions, IRS readiness, and filing complexity for the coming season. Even when nothing dramatic happens, the possibility of change can raise uncertainty around demand for assisted prep versus DIY.
Wrapping up with stock seasonality
As promised, here’s the notebook to replicate the study or apply to another ticker of your choice
It pulls data from yfinance, computes 20-day realized vol, and generates all the charts you’ve seen here.
It also partitions return analysis by month. Example charts:


I didn’t go into that here since my bias is that seasonal features of volatility are more reliable than return seasonality, but you’re free fork it and play around.
Extensions
- I measured realized vol, not implied vol. None of this pretends the option market isn’t aware of the seasonality. I didn’t study IV at all so the questions are green space.
- The title of this post is “does revenue seasonality translate to vol seasonality?” I looked at one relatively small company in the grand scheme of things. Lots of cross-sectional green space to examine. Hopefully, there’s some inspiration in this post that you can extrapolate to broader studies.
- Commodity ETF seasonal volatility
I forked and modified the notebook into one more tuned for ETFs (for example, it doesn’t control for equity benchmark volatility).
The US Natural Gas Fund (UNG) regales us with its wildly seasonal behavior:



Go run it on WEAT.
It makes sense. Commodities make sense. I don’t know what to make of stocks. Maybe that makes me crazy for being short those HRB puts.
They were originally May puts, but I rolled them forward to April. Don’t want the earnings risk and because giant sell-off was recent the April’s still had a fat bid.
Let’s leave it there.
