Back to blog
methodology

How to chart a monthly returns heatmap

15 July 2026 6 min read

Quick answer

A monthly returns heatmap is a grid with one row per year and one column per month, each cell coloured by that month's return, plus a final column for the compounded full-year return. Compute each cell from month-end to month-end - compound daily returns within a month, do not add them - and colour it with a diverging scale centred on zero, one hue for gains and another for losses, held symmetrically across every cell so magnitudes stay comparable. Add average, median, and win-rate summary rows, and read the grid as a description of the past rather than a forecast, because each monthly cell is only one observation per year.

A monthly returns heatmap puts every month of an asset's history in one grid: one row per calendar year, one column per month, each cell coloured by that month's return, and a final column for the full year. Read across a row for how a year unfolded, down a column for whether a month carries any seasonal tendency, and across the whole block for how often the asset simply goes up. The chart is easy; the two decisions that make or break it are how you colour it and how honestly you read it.

Lay out the grid

Years run down the side, the twelve months run across, and a thirteenth column holds the compounded full-year return. That layout is fixed by convention for a reason - it is the shape every performance report uses, so readers already know how to scan it. Keep the years in one consistent order, most recent at the top or the bottom, and label the year column with the annual figure so the row and its total sit together.

Compute the cells

Each cell is a single month's return, measured from the previous month-end close to that month-end close. If you are starting from daily data, compound the daily returns within the month rather than adding them: a month that gains 2% then 3% returned 1.02 times 1.03 minus 1, or 5.06%, not 5%. The full-year column compounds the twelve monthly returns the same way. It is a small distinction, but adding returns instead of compounding them drifts visibly across a full grid.

Colour it diverging, from zero

This is where most heatmaps go wrong. A monthly return is signed - it has a natural centre at zero - so it needs a diverging colour scale, one hue for gains and another for losses with white at zero. A sequential scale, the default in many tools, hides the sign that is the whole point. Fix the scale symmetrically, say -10% to +10%, and hold it across every cell so a deep-green August in one year is the same magnitude as a deep-green August in another. A scale that re-normalises per column or per year makes the cells uncomparable and quietly lies about size.

Add the summary rows

Below the year rows, a few summary rows turn the grid from a record into an analysis. Average and median return per month show central tendency - the median matters because a single crash month can drag an average around. A win rate, the share of years in which that month was positive, tells you how reliable any pattern is: a month that averages plus 1% but is green only half the time is not a seasonal signal, it is noise with an outlier. Shade these rows on the same scale as the body.

Read it as history, not a forecast

The honest caveat belongs on the chart, not in a footnote. A returns heatmap is descriptive - it says what happened, across however many years you have, which for a monthly cell is one observation per year. Ten years of data is ten Januaries. Apparent seasonality at that sample size is as likely to be chance as signal, and the well-known calendar effects that survive scrutiny are smaller and less reliable than a colourful grid suggests. Use it to understand an asset's past behaviour and to spot the genuinely brutal months; do not trade a single green column.

[QUADESTO-EMBED: monthly returns heatmap, years as rows and months as columns with a compounded full-year column, diverging red-white-green scale fixed symmetrically at zero, average and win-rate summary rows]

Building it in Quadesto

Point Quadesto at a price or return series and it builds the year-by-month grid with a zero-centred diverging scale, the compounded annual column, and the average and win-rate rows already computed, alongside the correlation heatmap, underwater drawdown, and rolling Sharpe views for the rest of a performance pack. The free tier embeds it live with a Made with Quadesto credit; Pro (149 pounds a month) drops the attribution and adds branded themes for a factsheet.

Ready to try Quadesto?

Connect your data. AI builds the charts. Embed anywhere.

Get Started Free
monthly returnsheatmapseasonalityperformancereturns calendar