How to chart a box plot of monthly returns
Quick answer
To chart a box plot of monthly returns, compute percentage returns rather than plotting price levels, group them by calendar month across every year in the sample, and draw one box per month showing the median, the interquartile range, whiskers to the most extreme values within 1.5 times the IQR, and individual outlier points beyond that. Keep the twelve boxes in calendar order rather than sorting by median, and draw a horizontal line at zero so a reader can see at a glance which months usually made money. The sample size per box is the number of years in your history, so a five-year sample gives five observations per box and is not enough to read seasonality from.
A box plot of monthly returns answers a question a returns table cannot: not what a given month returned in a given year, but how widely that month's returns have been spread across all the years you have. Twelve boxes, one per calendar month, each built from one observation per year. The mechanics are three lines of seaborn and every tutorial covers them. The decisions that make the chart honest are the ones that get skipped.
Plot returns, never prices
Resample the price series to month end, take the percentage change, and box-plot that. A box plot of price levels grouped by month is meaningless: the index drifts upward over a long sample, so every box would just sit higher than the last decade's and the chart would describe inflation and compounding rather than monthly behaviour. Returns are stationary enough to compare across years; prices are not. This is the same rule that governs a correlation matrix and it is broken just as often.
Decide what each box represents
The same chart type answers three different questions depending on the grouping. Group by calendar month and each box holds every January, every February and so on, which is a seasonality view. Group by year and each box holds the twelve months of that year, which is a dispersion-through-time view that shows which years were violent rather than which months were. Group by strategy or fund and you get a side-by-side comparison of return distributions. Pick one and say which in the axis label, because the three look identical at a glance and mean entirely different things.
Calendar order, and a line at zero
Plotting libraries will happily sort your boxes by median, and for most categorical data that is good practice. Here it is wrong. Months carry an order everyone already knows, and a reader scanning for a summer pattern needs January on the left and December on the right. Then draw a horizontal reference line at zero. Without it the eye has no anchor and cannot tell a box sitting mostly above the line from one straddling it, which is the single most useful thing the chart has to say.
State the whisker convention
The default in most libraries is Tukey's: the box spans the first to third quartile, the line inside is the median, the whiskers reach the most extreme observation still within 1.5 times the interquartile range, and anything further out is drawn as an individual point. Other conventions exist, including whiskers at the 5th and 95th percentiles or at the minimum and maximum, and they produce visibly different charts from identical data. Put the convention in the caption. In a returns box plot those outlier points are not blemishes to clip: they are October 1987, October 2008, March 2020. The fat left tail is the whole reason to look, and a QQ plot is the natural companion when you want to quantify what the outlier dots are hinting at.
Count n before you believe the box
In the seasonality version, each box holds exactly one observation per year. Thirty years of history gives thirty points per box, which is a distribution worth reading. Eight years gives eight, and a quartile computed from eight numbers moves if you add one more year. That is not a distribution, it is a picture of eight numbers. Print the sample size in the caption or as a count under each box, and be suspicious of any seasonality claim built on a short history. Statistical significance is not something a box plot can show you.
Median and mean disagree, and that is the point
The line in the box is the median, not the average, and in monthly returns the two often part company. Suppose a month's returns across twenty years are mildly positive in seventeen of them but include one year at minus 20 percent. The median stays comfortably above zero while the arithmetic mean is dragged near or below it. Neither number is wrong; they answer different questions. The median says what a typical year looked like, the mean says what your compounded outcome felt like. If you overlay the mean as a marker alongside the median line, the gap between the two becomes a visible skew indicator, which is more informative than either alone. Those numbers are an illustration of the mechanism rather than a measurement of a specific index.
What it adds over the returns heatmap
A monthly returns heatmap shows every single value in its own cell, so you can find 2008 and follow a year across. It cannot show you a distribution, because colour encodes one number at a time. The box plot does the opposite trade: it collapses the year axis entirely, so you lose the ability to say when, and gain spread, skew and outliers at a glance. Publish them as a pair and each one covers the other's blind spot.
Treat the finished chart as description, not forecast. A month whose box sits above zero in a thirty-year sample tells you what has happened, with a sample of thirty and no control for the regimes those years sat in. It is a good way to frame a question and a poor way to justify a trade. Quadesto takes a return series, groups it the way you choose, and draws the boxes with the whisker convention, the sample size and the zero line already handled. [QUADESTO-EMBED: monthly returns box plot, twelve boxes in calendar order, Tukey whiskers, outlier points labelled by year, mean markers overlaid, zero reference line]. The free tier embeds it live with a Made with Quadesto credit; Pro at 149 pounds a month removes the attribution and adds branded themes.