Wednesday, February 18, 2009

Finding seasonal spreads

I am pleased to introduce guest blogger Paul Teetor for today's article.


Finding Seasonal Spreads

By Paul Teetor

A seasonal spread is a spread which follows a regular pattern from year to year, such as generally falling in the Spring or generally rising in October. To find seasonal spreads, I've been using ANOVA, which stands for analysis of variance. ANOVA is a well-established statistical technique which, given several groups of data, will determine if the groups have different averages. Importantly, it determines if the differences are statistically significantly.

I start with several years of spread data, compute the spread's daily changes, then group the daily changes by their calendar month, giving me 12 groups. The ANOVA analysis tells me if the groups (months) have significantly different averages. If so, I know the spread is seasonal since it is consistently up in certain months and consistently down in others.

The beauty is that I can automate the process, scanning my entire database for seasonal spreads. A recent scan identified the spread between crude oil (CL) and gasoline (RB), for example. The initial ANOVA analysis indicated the CL/RB spread is very likely to be seasonal. This bar chart of each month's average daily change demonstrates the seasonality. (Click on the graph to enlarge it.)

Barchart of average daily change for CL/RB spread

The lines show the confidence interval for each month's average. Notice how May and June are definitely "up" months because their confidence interval is entirely positive (above the axis). Likewise, November and December are definitely "down" months. For all other months, we cannot be certain because the confidence interval crosses zero, so the true average change could be either negative or positive. The conclusion: Be long the spread during May and June; be short during November and December.

For more details, please see my on-line paper regarding ANOVA and seasonal spreads.

- Paul Teetor


Damian said...

Interesting stuff from Paul - any results on this approach?

Paul Teetor said...

Thanks for your question, Damian. This is not a complete trading system, so I don't have trading results to report. Identifying a seasonal spread is just the first step. Next, we need guidelines for timing our buys and sells to exploit the identified seasonality, and that's what I hope to cover next.

Cole said...

Is multiple testing accounted for?
If not, given a p<.05 cutoff, you would expect ~5% of your tested spreads to exhibit 'seasonality' by chance if the spreads are independent.

Paul Teetor said...

That's a very good point, Cole. We must never blindly believe statistical inference. Common sense and good judgment must play a role, too.

A recent scan of my database, for example, showed that British Pound futures and Live Cattle futures are seasonal by the standards of this ANOVA test. Would I trade the BP/LC spread? Heck no, because I don't see any economic logic in the trade.

I also like seeing the barchart with confidence intervals, shown above, because I see the actual seasonal pattern. The ANOVA just alerts me to possible seasonality which, as you point out, could be a fluke.

Frank Cowperwood said...

Would this method apply when looking for seasonality in outright (that is non-spread) futures prices?

Paul Teetor said...


Yes, this technique applies to out-rights, too. I suppose it could apply to any time series, for that matter. I focus on spreads because I believe they present more opportunities for seasonal trading.

Greg said...

Any progress on on the buy/sell guidelines? I am intrigued.

Anonymous said...

Interesting stuff, but I have a few points Id appreciate if you could clarify.

What way you were calculating the spread. Usually RBOB vs CL would be traded as a crack spread ie RBOB (Converted to BBLs) - CL (BBLS).

There is seasonality in the RBOB contract as there there is a different grade of summer and winter gasoline. ie Mar/Apr spread on RBOB is ~ -13cents at the moment while Sep/Oct is ~ +10cents

Also you mentioned buying on 1st May, so does that mean you would buy the Jul contract of RBOB as that is the nearest future you can trade without having to roll.


Paul Teetor said...


I intended the article as an illustration of a statistical technique, not as a trade recommendation. When trading futures, the technique may lead to different conclusions depending upon how you build your continuous contract data. So the ANOVA analysis is (only) a starting point, directing your attention to examine the contract-level data for seasonal trades.

To answer your specific questions, I formed the spread using an ordinary least squares (OLS) fit, as described in Ernie's book. Yes, I would likely trade the spread using the crack ratios instead. (It so happens that the statistical conclusions are are largely identical.)

Your choice of delivery month and roll times depends upon how you construct your continuous contract. This example used "Perpetual Contract" data from Commodity Systems Inc (CSI). That data is useful for high-level filters such as this, but I cannot recommend it for trading decisions since their splicing algorithm distorts the contract-level information.


Anonymous said...

Sorry Paul, I dont think you are doing it right.

"Notice that I compute the spread change, not the spread return. Quants usually study price returns, but that won’t work with spreads because the spread can be zero, giving an undefined return. The daily change follows a similar bell-shaped distribution, so it’s a reasonable object for study."

Quants would not consider the spread return, but the return of the basket composed with one long leg and one short leg.

This is your PNL and is not at all linked to the spread change.

Paul Teetor said...

@Anonymous: Thanks for your note. You've touched on an important and tricky subject.

My article here uses a price-based definition of spread:

S = P1 - (beta * P2)

where S is the price-based spread, P1 is the price of market #1, and P2 is the price in market #2. If I understand you correctly, you recommend a returns-based definition of spread:

S' = R1 - (gamma * R2)

where S' is the returns-based spread, R1 is the return for market #1, and R2 is the return for market #2.

I sometimes use the returns-based spread myself, especially for my clients who trade stocks. Since you are familiar with returns-based spreads, I'm sure you are aware that they require dynamic adjustment of the hedge ratio (because the correct ratio changes when the stock prices change). That is feasible for stock traders, but implementing dynamic hedge ratios is difficult when trading futures, especially for smaller accounts. This article focused on futures, so the price-based spread seemed more natural.

Speaking of hedge ratios, can you lend any insights into how you handle dynamic hedge ratios yourself? For example, what is your threshold for rehedging? Does it work well?

Finally, I'm sorry but I must disagree that "your PNL ... is not at all linked to the spread change." I trade spreads daily, and I can assure you that my P&L is directly and intimately related to the spread change. Otherwise, what's the point?

Issy said...

hi Paul, great article.

is ANOVA useful for analyzing seasonality in terms of hour of day?

for example; i am working on multi-threshold entry using zscores depending on hour of day. this is due to changes in volatility depending on time of day.

This is in a way similar to VWAP algorithims's use of volume curve.



Paul Teetor said...


I haven't used ANOVA that way. But what you are proposing closely parallels the monthly analysis and seems reasonable to me. Good luck.