DEV Community

TildAlice
TildAlice

Posted on • Originally published at tildalice.io

Sharpe Ratio Breaks in Crypto: 3 Fixes That Work

Sharpe Ratio Assumes Normal Returns (Crypto Laughs at Normal)

The Sharpe ratio breaks in crypto because it assumes returns follow a normal distribution. They don't. Bitcoin's daily returns have kurtosis around 7-10 (vs. 3 for normal), which means extreme moves happen way more often than the Sharpe ratio expects. When I run scipy.stats.kurtosis(btc_returns) on 2020-2024 data, I get values that make the formula $\text{Sharpe} = \frac{\bar{r} - r_f}{\sigma}$ fundamentally misleading.

The denominator $\sigma$ (standard deviation) treats a -2% day the same as a -20% flash crash. In equities, that's mostly fine. In crypto, it's a disaster.

Here's what happens when you rank strategies by Sharpe on Bitcoin:


python
import numpy as np
import pandas as pd
from scipy.stats import skew, kurtosis

# Simulated daily returns for two strategies
np.random.seed(42)
days = 252

# Strategy A: steady small wins, occasional huge loss
strat_a = np.concatenate([
    np.random.normal(0.002, 0.01, 240),  # normal days
    [-0.25, -0.18, -0.15, -0.12, -0.10, -0.08, -0.07, -0.06, -0.05, -0.04, -0.03, -0.02]  # tail events
])

# Strategy B: volatile but symmetric
strat_b = np.random.normal(0.0015, 0.025, days)

print(f"Strategy A Sharpe: {strat_a.mean() / strat_a.std() * np.sqrt(252):.2f}")
print(f"Strategy B Sharpe: {strat_b.mean() / strat_b.std() * np.sqrt(252):.2f}")
print(f"\nStrategy A skew: {skew(strat_a):.2f}, kurtosis: {kurtosis(strat_a):.2f}")

---

*Continue reading the full article on [TildAlice](https://tildalice.io/sharpe-ratio-breaks-crypto-3-fixes/)*
Enter fullscreen mode Exit fullscreen mode

Top comments (0)