A Return Has to Beat Something

Published on: September 18, 2026 | By: Mariusz Skobel

A cash-plus book that presents a Sharpe ratio of 1.68 is at 0.89 once it is charged the rate it was financed at. Nothing in its returns is wrong. The number on top of the fraction was left at zero.

Three horizontal bars showing the annualised Sharpe ratio of the same twenty-year return series against three hurdles: 1.68 with no hurdle, 0.90 against the mean rate and 0.89 against the rate actually paid, beside a line of the cash rate rising from half a per cent to five.

A Sharpe ratio is a fraction, and most of the attention goes to the bottom of it. Volatility gets annualised, deflated, adjusted for autocorrelation and argued over. The top line gets less scrutiny: it is the return in excess of something, and that something is usually zero, or one number typed in once for the whole sample.

For a decade that made little difference, because cash paid almost nothing. It pays something now, and a hurdle left at zero credits a strategy with a return it did nothing to earn.

Twenty years of a cash-plus book

Take the kind of strategy where this matters most: a book that holds collateral and earns the rate on it, plus a spread from whatever it actually does. Its gross return is the cash rate plus the alpha, by construction.

The series is 240 monthly returns. The rate sits at half a per cent for eleven years, rises to five per cent over twenty months, holds, then eases. Each month the book earns that rate plus a draw of gauss(0.0025, 0.0085). Here is the same Sharpe ratio against three hurdles:

HurdlePer-period SharpeAnnualised
None at all0.4863261.6847
The mean rate, subtracted once0.2606100.9028
The rate actually paid, period by period0.2578680.8933
240 months, seeded and reproducible. Annualised at twelve periods a year. Nothing in the return series differs between the rows.
A book that presents as 1.68 is 0.89 once it is charged the cash it was financed at. Forty-six per cent of its gross return was the hurdle. The top row is not wrong arithmetic; it is an answer to a question nobody asked.

The gap against no hurdle has a direction, and it is the flattering one. A non-negative rate can only make the raw figure larger, so the library reports that gap with its sign and calls it what it is.

A constant and a series are different operations

The middle row is the common compromise: take the average rate over the sample and subtract it. It looks like the same thing as the bottom row, and it is not.

Subtracting a constant moves the mean and leaves the volatility exactly where it was. Subtracting the rate that was actually paid changes both, because a moving rate has a variance of its own and a covariance with the returns. The two only agree when the rate never moved — which, for most of the last twenty years, it barely did.

On this series the difference is small: 0.002742 per period, with the constant reading higher. That is a property of this sample. The rate and the returns have a correlation of 0.0515 here, so the excess series ends up slightly more volatile than the raw one. On a book whose return is mostly the rate, subtracting it removes variance instead, and the series figure comes out ahead.

So the library reports the difference and refuses to name a direction for it. The test suite carries one sample of each sign, rather than a sentence claiming both are possible. The direction follows the correlation, which is printed beside the gap so a reader can see why.

A quoted rate is not a per-period rate

Cash rates are quoted annually. Returns are not. Turning one into the other looks like a unit conversion, and there are two of them:

Five per cent a year, 252 periodsPer-period rate
Divided by 2520.000198413
Compounded: (1.05)1/252 − 10.000193631
The gap is small per period and runs one way for the whole sample.

Neither is wrong. Money-market accrual divides; a rate meant to compound to its quote over a year compounds. Which one applies depends on where the number came from, and the library cannot see that. So per_period_rate requires compound=True or compound=False and has no default, for the same reason there is no default annualisation factor anywhere else in it.

Day-count bases

SOFR, EURIBOR and most deposit quotes are on a 360-day year. Used against a 365-day calendar, the same quote understates the hurdle by 365/360 — 1.39 per cent of the rate. Every period, and on the side that makes the strategy look better. rebase converts between bases and refuses to guess which basis a number arrived on, because the convention is attached to the source of a rate, not to its value.

A benchmark is a hurdle too

The same logic applies when the hurdle is an index rather than cash. An information ratio is a statement about a strategy and about the benchmark somebody chose for it. The library reports both means beside the ratio, so the second one stays visible, and requires ddof for the tracking error because the difference between dividing by n and by n − 1 is visible on the two- and three-year samples tracking error is usually computed over. A book that tracks its benchmark exactly has no information ratio, rather than an infinite one.

What the tooling does

from mdnorm import hurdle_comparison, excess_report

cmp = hurdle_comparison(returns, rates, ddof=1)

cmp.sharpe_raw           # 0.486326 — no hurdle at all
cmp.sharpe_constant      # 0.260610 — the mean rate, once
cmp.sharpe_series        # 0.257868 — the rate actually paid
cmp.zero_hurdle_gap      # 0.228458
cmp.constant_series_gap  # 0.002742
cmp.rate_correlation     # 0.051507

excess_report(returns, rates, ddof=1).share_credited_to_cash
                         # 0.464125
$ mdnorm hurdle pnl.csv --rates cash.csv --benchmark index.csv

No cash curve ships with the library and none will, for the same reason no factor data ships with the exposure module: bundling one would make every answer partly a property of whose curve we picked.

Where this sits

The series keeps returning to the same shape. The square root of twelve is an assumption about independence. The average return is a rate nobody received. A maximum drawdown is an order statistic that grows with the sample. And the hurdle under a Sharpe ratio is a decision, usually made by leaving a field blank. Each one produces a plausible figure by a defensible route, each one errs in the direction that flatters, and none raises an exception.

Every figure above came from the hurdle module of our open-source library, released in version 1.44.0 the same day. The series is a seeded pseudo-random draw — 240 monthly returns built as rate + gauss(0.0025, 0.0085) from random.Random(20260918), against a rate path of 0.5 per cent for 132 months, a linear rise to 5 per cent over 20, a hold to month 200 and an easing of 0.0375 points a month after that, each divided by twelve — so every figure reproduces exactly on any machine. MIT licensed, no runtime dependencies, 1,720 tests, type-checked clean.

pip install market-data-normalizer

The source is on GitHub, the package on PyPI, and the reasoning behind what the library will and will not do is in ROADMAP.md beside the code. Longer write-ups are on our Medium, releases on LinkedIn, and the tooling we run against our own data is in the Console.

The rest of the series is in our blog: a maximum drawdown is a maximum, the square root of twelve is an assumption, the average return nobody received, the Sharpe ratio of a residual and the things we have decided not to build. Public comments on the work are quoted in full with a link to each source on the community page, and the team is on the about page.

We are open to everyone, from independent developers to funds. If something here is wrong, an issue with a concrete input and a statement of what the right answer would be is the most useful form to send it in — a failing test has always been worth more to us than a paragraph that is correct.

Frequently asked questions

Why is a Sharpe ratio against zero misleading?

Because the cash that financed the strategy earned something too. A book that holds collateral receives the rate on it, so its gross return mechanically contains the cash rate. Measured against zero, that part is credited to the strategy. In the example in this article it was 46 per cent of the gross return, and it moved the annualised Sharpe ratio from 0.89 to 1.68.

Is subtracting the average risk-free rate good enough?

It is closer, and it is a different operation from subtracting the rate that was actually paid. Subtracting a constant moves the mean and leaves the volatility alone. Subtracting a series changes both, because a moving rate has a variance of its own and a covariance with the returns. The two agree only when the rate never moved.

Which one gives the higher Sharpe ratio?

It depends on the sample, and the library deliberately does not promise a direction. On the series in this article the constant-rate figure was slightly higher. On a series whose returns are mostly the rate itself, subtracting the series removes variance and the series figure comes out higher instead. The test suite carries one sample of each sign.

Does it matter whether a rate is divided or compounded?

Yes, a little per period and in one direction for the whole sample. Five per cent a year over 252 periods is 0.000198413 divided and 0.000193631 compounded. Which one is correct depends on how the rate was quoted, so the library requires the caller to say which.

What is the day-count problem?

Money-market rates such as SOFR and EURIBOR are quoted on a 360-day year. Used against a 365-day calendar the same quote understates the hurdle by 365/360, which is 1.39 per cent of the rate, every period, on the flattering side.

Where can these figures be checked?

The hurdle module of our open-source library, released in version 1.44.0. The series is a seeded pseudo-random draw stated in the article, so every figure reproduces exactly. MIT licensed, no runtime dependencies, 1,720 tests, type-checked clean.

Empowering quantitative research with high-frequency market data and analytics.

AMII LTD
Plac Europejski 1
00-844 Warsaw, Poland

© 2026 HarvestGroup360 — a brand operated by AMII LTD.