A while back I wanted a single leaderboard that put Bitcoin, gold, the S&P, and crude oil in one column and told me which one was actually leading. Sounds trivial. It is not. The naive version, sort by trailing return and print the list, is worse than useless, because it will tell you crypto is winning every single time and metals are dead every single time, and both of those statements are mostly an artifact of volatility rather than a statement about strength.
The core problem is that these four things do not speak the same language. Bitcoin can move several percent while I am making coffee. Gold considers that a bad quarter. An equity index has a whole ecosystem of circuit breakers and closes on nights and weekends. Crude gets yanked around by inventory reports and a physical delivery mechanism that has nothing to do with the others. If I rank them on raw returns, I am really just ranking them by how loud they are, and the loud one always wins.
Volatility is the thing you have to divide out first
The fix that makes everything downstream sane is to stop measuring moves in percent and start measuring them in units of the asset's own noise. A 4 percent week in Bitcoin and a 4 percent week in gold are not the same event. The gold move is the surprising one. So before I compare anything, I convert each asset's return into how many standard deviations of its own recent behavior that move represents.
Concretely, I take a trailing window, something like 60 to 90 trading days, and compute the standard deviation of that asset's returns over the window. Then the volatility-adjusted return is just the raw return divided by that standard deviation. Now a reading of 2 means the same thing whether I am looking at Bitcoin or gold. It means this asset moved twice its typical amount. That is the unit I can actually rank on.
A couple of things I learned the hard way here. Use a rolling window, not the whole history, because the volatility regime of most of these assets changes and a five year average vol will make a calm asset look more surprising than it is. And annualize consistently or do not annualize at all, but do not mix. If one asset's vol is daily and another's is weekly because of some data quirk, the whole ranking silently tilts and you will not notice until it looks stupid.
The calendars do not line up, and that is the messy part
Here is where most cross-asset comparisons quietly break. Crypto trades every hour of every day forever. Equities close at night, on weekends, and on a pile of holidays that are not the same holidays the commodity market observes. So when Monday's session opens, the equity index has a two day gap baked into its return that Bitcoin filled with 48 hours of live trading.
If you just pull daily closes and diff them, you are comparing a Bitcoin day to an equity day that secretly contains a weekend. Over a week that noise mostly washes out. Over a single day, or when you are computing a short lookback ranking, it absolutely does not, and it will make crypto look artificially strong on Mondays and equities look jumpy at every gap.
The way I handle it is to decide up front what a period means and force every asset onto it, rather than trusting the raw timestamps. A few rules that have held up:
- Rank on a period that is long relative to the gaps. Weekly or biweekly relative strength is far more honest across asset classes than daily, because a weekend is a small fraction of a week and a large fraction of a day.
- When I do want shorter lookbacks, I align everything to a common trading calendar. I pick the intersection of sessions where all four assets have a real close, and I only compute returns between those anchor points. Bitcoin's weekend prints still exist, I just do not let them create a period that the equity index cannot match.
- I treat a holiday gap the same as a weekend gap. The point is not to fill the gap with fake data, it is to make sure the return I attribute to a period was actually earned over the same wall-clock span for every asset.
The failure mode to watch for is forward-filling. It is tempting to carry the last equity close across the weekend so the series has a value for Saturday and Sunday and everything lines up neatly. Do not. A forward-filled price has zero return and near-zero measured volatility for those days, which quietly deflates the equity index's vol estimate and inflates its volatility-adjusted score. You end up rewarding the asset that was closed. Better to have fewer, honest observations than a full grid of half-invented ones.
Building the actual leaderboard
Once returns are volatility-adjusted and everything sits on a shared calendar, the ranking itself is the easy part. My working recipe looks roughly like this:
- Pull closes for each asset, aligned to the common set of trading sessions. Keep the native timestamps, do not fabricate rows.
- Compute rolling volatility per asset over a 60 to 90 day window on returns.
- For the lookback I care about, compute each asset's return over that span and divide by its rolling vol to get a vol-adjusted score.
- Optionally blend two or three lookbacks, say a short and a medium one, so the leaderboard is not whipsawed by a single noisy period. A simple average of the vol-adjusted scores across lookbacks works fine.
- Sort. The top of the list is the asset showing the most strength relative to its own noise, which is the only cross-asset comparison that means anything.
A rule of thumb I use to sanity check the output: over any reasonable window, the leaderboard should not be permanently the same order. If crypto is always first and metals always last no matter what the market did, my normalization is broken and I am still just ranking by raw volatility. A working scale reshuffles. There are stretches where gold quietly leads everything, and if my ranking never shows that, I do not trust it.
One more honest caveat. Volatility-adjusting tells you which asset is moving unusually hard for itself, not which one you should own. A high vol-adjusted score can mean a real trend or it can mean the asset just had one violent day that is still inside the lookback. I usually glance at the underlying price to tell those apart, because the number will not do it for me. The ranking is a filter that tells me where to look, and it is genuinely good at that. It is not a signal I would trade blind, and I have never treated it as one.
If you only take one thing from this, make it the order of operations. Adjust for volatility first, fix the calendars second, rank last. Do it in any other order and the two hard problems contaminate each other, and you will spend a week debugging a leaderboard that was lying to you the whole time.