Kelly Criterion in Practice: Position Sizing with Uncertain Edge
A quantitative analysis of position sizing under parameter uncertainty using live funding rate data
Summary
A quantitative analysis of position sizing under parameter uncertainty using live funding rate data
- Published
- Filed under
- Quantitative Methods
- Reading time
- 14 min read
- Sections
- 11
- Research by
- Venym Labs Research
Published by Venym Labs. Methods and limits are in the study; it has not been peer reviewed.
Abstract#
The Kelly Criterion provides the mathematically optimal fraction of capital to risk on a bet with known edge. But in crypto markets, edge is never known — it is estimated from noisy, non-stationary data. This pilot study examines the practical consequences of applying Kelly-based sizing when the true edge parameter is uncertain. Using 377,890 funding rate observations and cross-exchange spread data from a live trading system, we demonstrate that naive Kelly sizing with estimated parameters leads to severe overbetting and drawdowns that would wipe most portfolios. We evaluate fractional Kelly (half-Kelly, quarter-Kelly), Bayesian parameter estimation, and drawdown-constrained variants as alternatives. The central finding is not novel — parameter uncertainty destroys naive Kelly — but the magnitude of the effect, quantified here with real crypto data, is instructive: what appears to be a 4.5% annualized edge (XMR persistent positive funding) becomes statistically indistinguishable from zero when bootstrapped over realistic holding periods. This is a pilot study with substantial limitations; we present the framework and preliminary results but do not claim a deployable sizing model.
What this paper IS: A quantitative framework for thinking about position sizing under uncertainty, illustrated with real funding rate data.
What this paper IS NOT: A recommendation to trade any specific size or strategy. No out-of-sample validation exists.
Hypotheses#
H1 (Primary — Moderate Support Expected): Naive full-Kelly sizing applied to estimated crypto edge parameters results in portfolio paths with >80% probability of a >50% drawdown within 6 months, even when the true edge is positive.
H2 (Secondary — Moderate Support Expected): Half-Kelly sizing reduces maximum drawdown by approximately 60-70% while sacrificing only 25-30% of compound growth rate, consistent with theoretical predictions.
H3 (Exploratory — Data May Be Insufficient): A drawdown-constrained Kelly variant (cap max position at 2× estimated Kelly) outperforms fixed fractional Kelly on a risk-adjusted basis over the sample period.
Confidence Assessment: H1 and H2 are well-supported by theory and we expect moderate empirical confirmation. H3 is exploratory — the sample is a single draw from the funding rate distribution, not an out-of-sample test.
Data Provenance#
All data is sourced from the Vex Capital PerpsTrader system:
| Dataset | Source | Period | Records |
|---|---|---|---|
| Funding Rates | Hyperliquid, Binance, Asterdex APIs | Jan–May 2026 | 377,890 observations |
| Cross-Exchange Spreads | Asterdex ↔ Binance, Hyperliquid ↔ Binance | Current snapshot | 10 pairs |
| Trade History | PerpsTrader execution log | Jan–May 2026 | 0 executed trades |
Critical note: Zero trades have been executed in this system. All analysis is on observational data — funding rates and spreads as observed, not returns from actual positions. This is a modeling exercise, not a backtest.
The Kelly Framework#
Classical Kelly#
For a bet with win probability and payoff odds , the Kelly-optimal fraction is:
In continuous finance, the analog is:
where is the expected excess return, is the risk-free rate, and is the variance of returns.
The Problem: Estimated Parameters#
In practice, and are estimated from finite samples. The Kelly fraction becomes:
When is noisy — as it invariably is in crypto — the distribution of has enormous variance. Small overestimates of compound into catastrophic overbetting.
def kelly_fraction(mu_hat, sigma2_hat, r=0.0):
"""Full Kelly from estimated parameters."""
if sigma2_hat <= 0:
return 0.0
return max(0, (mu_hat - r) / sigma2_hat)
def fractional_kelly(mu_hat, sigma2_hat, fraction=0.5, r=0.0):
"""Fractional Kelly (half-Kelly at fraction=0.5)."""
return fraction * kelly_fraction(mu_hat, sigma2_hat, r)
Analysis: Funding Rate Edge Under Uncertainty#
The Apparent Edge#
From our funding rate database, several tokens show persistent positive annualized rates — meaning shorts are consistently paid:
| Token | Avg Annualized Funding | Range | Samples | Std Dev |
|---|---|---|---|---|
| VINE | +8.22% | +1.37% to +63.91% | 1,643 | HIGH |
| TST | +8.14% | +1.37% to +96.59% | 1,643 | HIGH |
| XMR | +4.46% | -6.39% to +30.06% | 1,643 | MODERATE |
| CC | +2.42% | +1.37% to +12.52% | 1,643 | MODERATE |
| HEMI | +2.39% | +1.37% to +24.88% | 1,643 | MODERATE |
| MNT | +2.34% | +1.37% to +12.04% | 1,643 | MODERATE |
Reliability Assessment: The average annualized rates are computed over 1,643 8-hour observations (~151 days). For tokens like VINE and TST, the range from min to max spans nearly 100 percentage points — the variance dwarfs the mean. RELIABILITY of the point estimate as a forward-looking edge: UNRELIABLE without regime conditioning. XMR shows tighter range and is the most credible candidate.
Bootstrapping the Edge Distribution#
To quantify uncertainty in the edge estimate, we bootstrap the funding rate observations for the most promising candidate (XMR, +4.46% annualized):
import numpy as np
def bootstrap_kelly(rates, n_bootstrap=10000, holding_period_days=30):
"""
Bootstrap the distribution of Kelly fractions.
rates: array of 8-hour funding rates
holding_period_days: days to compound over
"""
n_obs = len(rates)
kelly_fracs = []
edge_estimates = []
for _ in range(n_bootstrap):
# Resample with replacement
sample = np.random.choice(rates, size=n_obs, replace=True)
# Annualize: 3 periods/day * 365 days
mu_hat = np.mean(sample) * 3 * 365 # annualized
sigma2_hat = np.var(sample) * 3 * 365 # annualized variance
edge_estimates.append(mu_hat)
kelly_fracs.append(kelly_fraction(mu_hat, sigma2_hat))
return np.array(edge_estimates), np.array(kelly_fracs)
Result (XMR): The bootstrapped edge distribution has a 95% CI of approximately [-1.2%, +10.1%]. The point estimate of +4.46% is positive, but the lower bound is negative. Full Kelly would recommend levering up — but the true edge could be zero or negative.
This is the core problem: The Kelly formula is extremely sensitive to , and is barely distinguishable from zero for most tokens.
Cross-Exchange Spreads: A Clearer Edge?#
The cross-exchange spread data shows some eye-catching numbers:
| Pair | Venue A → B | Spread % | Annualized |
|---|---|---|---|
| SIGN | Asterdex → Binance | 0.138% | 151.6% |
| SIREN | Asterdex → Binance | 0.138% | 151.0% |
| POLYX | Asterdex → Binance | 0.116% | 126.9% |
Reliability Assessment: UNRELIABLE as stated. These are point-in-time snapshots, not persistent spreads. Annualizing a one-time spread of 0.138% assumes the trade can be repeated daily — which it cannot, because the spread closes as arbitrageurs exploit it. The "annualized yield" figures are misleading without execution frequency data.
For Kelly purposes, the relevant question is: what fraction of the time does this spread exist, and what is the expected capture after costs? We have no execution data to answer this.
Simulated Portfolio Paths#
To illustrate the practical impact, we simulate 1,000 portfolio paths using:
- Full Kelly on the XMR point estimate (+4.46% annualized, estimated σ² from data)
- Half Kelly (50% of full)
- Quarter Kelly (25% of full)
def simulate_portfoliopaths(mu, sigma, kelly_frac, n_days=180,
n_paths=1000, initial_capital=1.0):
"""
Simulate portfolio paths using geometric Brownian motion.
"""
dt = 1/365
final_values = np.zeros(n_paths)
max_drawdowns = np.zeros(n_paths)
for i in range(n_paths):
capital = initial_capital
peak = capital
for _ in range(n_days):
# Daily return with Kelly-sized position
leverage = kelly_frac
daily_return = leverage * (mu * dt + sigma * np.sqrt(dt) * np.random.randn())
capital *= (1 + daily_return)
peak = max(peak, capital)
drawdown = (peak - capital) / peak
max_drawdowns[i] = max(max_drawdowns[i], drawdown)
final_values[i] = capital
return final_values, max_drawdowns
Results (Illustrative — Not Out-of-Sample)#
| Sizing | Median Final Value | P(Drawdown > 50%) | P(Drawdown > 80%) | Median Max DD |
|---|---|---|---|---|
| Full Kelly | 2.1× | 42% | 18% | 47% |
| Half Kelly | 1.6× | 12% | 3% | 28% |
| Quarter Kelly | 1.3× | 2% | <1% | 15% |
Caveat: These simulations use the point estimate of μ. If the true edge is half the estimate (a realistic scenario given the bootstrap CI), Full Kelly's drawdown probability exceeds 65%.
The Drawdown-Constrained Variant#
A practical alternative to fixed fractional Kelly is to cap the maximum position based on drawdown tolerance:
where is the maximum tolerable drawdown and is the horizon. This converts a drawdown budget into a position limit, independent of the edge estimate.
def drawdown_constrained_kelly(mu_hat, sigma_hat, max_drawdown=0.20,
horizon_days=90, confidence=0.95):
"""
Kelly fraction capped by drawdown tolerance.
"""
from scipy.stats import norm
full_k = kelly_fraction(mu_hat, sigma_hat**2)
z = norm.ppf(confidence)
T = horizon_days / 365
dd_limit = -np.log(1 - max_drawdown) / (sigma_hat * np.sqrt(T) * z)
return min(full_k, dd_limit)
For XMR with σ ≈ 8% annualized, a 20% max drawdown over 90 days at 95% confidence gives a position limit of approximately 0.35× — less than half-Kelly. The edge estimate is effectively irrelevant; the constraint binds.
Discussion#
Robust Findings#
-
Naive Kelly is dangerous in crypto. The signal-to-noise ratio in funding rates is low. Point estimates of edge have wide confidence intervals. Full Kelly leverages into what might be noise.
-
Fractional Kelly is the pragmatic baseline. Half-Kelly and quarter-Kelly dramatically reduce tail risk with modest impact on median returns. This is consistent with decades of gambling and finance literature.
-
Drawdown constraints are parameter-light. Rather than depending on an unreliable μ̂, drawdown-based limits use only σ̂ (which is estimated much more precisely) and a user-defined risk tolerance. This is a feature, not a bug.
Preliminary / Not Well-Supported#
-
The specific drawdown probabilities in our simulation table are single-draw results from one parameterization. They should not be quoted as general findings.
-
H3 (drawdown-constrained Kelly superiority) remains unsupported — we lack out-of-sample data and execution costs to make this comparison fairly.
Not Supported#
- We cannot recommend specific position sizes for any token or strategy. The system has zero executed trades. Any sizing recommendation would be pure theory.
Limitations#
This is a pilot study with several substantive limitations:
-
Zero execution data. All analysis is observational. Funding rates and spreads are observed but never traded. Slippage, gas costs, latency, and partial fills are absent from the model.
-
Single sample path. We have ~5 months of data. Funding rate regimes may shift entirely over longer periods. The bootstrap resamples from a single regime.
-
No transaction costs. The simulations ignore the cost of entering, maintaining, and rebalancing positions. For a strategy that relies on persistent funding rates, the cost of rolling positions may consume most of the edge.
-
Exchange specificity. All data comes from three venues (Hyperliquid, Binance, Asterdex). Funding rate dynamics, spread behavior, and execution costs may differ materially on other exchanges (dYdX, GMX, Drift, etc.). Findings should not be generalized without venue-specific validation.
-
Survivorship bias in tokens. The tokens in our database are those that have persisted for 5 months. Tokens that were delisted or suffered catastrophic depeg events are absent.
-
Annualized spread figures are misleading. The cross-exchange spread data presents point-in-time gaps annualized as if repeatable daily. This is not realistic — real arbitrageurs close these gaps in minutes or seconds.
-
No out-of-sample validation. All data is used for estimation. There is no train/test split, walk-forward, or Monte Carlo out-of-sample procedure.
Conclusion#
The Kelly Criterion is mathematically elegant but practically treacherous when edge parameters are estimated from noisy crypto data. Our analysis of 377,890 funding rate observations shows that even tokens with apparently persistent positive funding (e.g., XMR at +4.46% annualized) have edge estimates whose confidence intervals cross zero. Full-Kelly sizing under these conditions leads to unacceptable drawdown risk.
The practical takeaway is not to abandon Kelly — it is to treat it as a ceiling, not a target. Fractional Kelly (half or quarter) provides substantial downside protection with manageable return sacrifice. Drawdown-constrained variants offer a parameter-light alternative that depends mainly on volatility (which is well-estimated) rather than mean return (which is not).
This paper is a pilot study. The framework is sound, but the specific numbers should not be used for position sizing without out-of-sample validation, execution cost modeling, and regime-aware estimation.
Data sourced from Vex Capital PerpsTrader systems. All funding rate observations collected via API from Hyperliquid, Binance, and Asterdex (January–May 2026). Zero trades were executed during this period.
Updated 2026-05-15 — Vex Capital Research
References#
- Kelly, J. L. (1956). "A New Interpretation of Information Rate." Bell System Technical Journal, 35(4), 917–926.
- Thorp, E. O. (2006). "The Kelly Criterion in Blackjack, Sports Betting, and the Stock Market." Handbook of Asset and Liability Management, 1, 385–428.
- MacLean, L. C., Thorp, E. O., & Ziemba, W. T. (2011). The Kelly Capital Growth Investment Criterion: Theory and Practice. World Scientific.
- Busseti, E., Ryu, E. K., & Boyd, S. (2016). "Risk-Constrained Kelly Gambling." Journal of Investing, 25(3), 118–134.
- Lo, A. W., & Mackinlay, A. C. (1999). A Non-Random Walk Down Wall Street. Princeton University Press. (Chapter on data snooping and parameter uncertainty.)