Metrics & Evaluation Interactive
Sharpe Ratio
Measure risk-adjusted returns. Compare strategies by how much return you get per unit of risk taken.
๐ The Sharpe Ratio Formula
Sharpe = (R_p - R_f) / ฯ_p
- R_p = Portfolio/strategy return
- R_f = Risk-free rate
- ฯ_p = Portfolio volatility (std dev)
Interpretation
- โข > 1.0 = Excellent (hedge fund territory)
- โข 0.5 - 1.0 = Good
- โข 0 - 0.5 = Acceptable
- โข < 0 = Underperforming risk-free
Strategy Parameters
-5 30
5 40
0 10
๐ Result
0.27
Sharpe Ratio
Acceptable
Excess return: 4.0% รท Volatility: 15%
Simulated Cumulative Returns (36 months)
Higher Sharpe = smoother path to the same return. Volatility creates bumpy ride.
Strategy Comparison
Conservative
Return 6%
Volatility 8%
Sharpe 0.25
Balanced
Return 10%
Volatility 15%
Sharpe 0.40
Aggressive
Return 15%
Volatility 25%
Sharpe 0.44
Your Strategy
Return 8%
Volatility 15%
Sharpe 0.27
Note: Aggressive strategy has highest return but worst Sharpe. Risk-adjusted, Conservative may be better!
๐ Sports Betting Applications
Evaluating Betting Strategies
- โ Compare ROI vs variance across strategies
- โ High-volume low-edge vs low-volume high-edge
- โ Parlay strategies have high vol, often low Sharpe
House Perspective
- โ Evaluate pricing strategy risk-adjusted performance
- โ Higher Sharpe = more consistent profits
- โ Guide reserve requirements based on volatility
๐ Related Metrics
Sharpe Ratio
(R - Rf) / ฯ
Return over risk-free, per unit total risk
Information Ratio
(R - Rb) / TE
Return over benchmark, per unit tracking error
Sortino Ratio
(R - Rf) / ฯ_down
Only penalizes downside volatility
R Code Equivalent
# Calculate Sharpe Ratio
sharpe_ratio <- function(returns, rf_rate = 0.04) {
excess_return <- mean(returns) - rf_rate / 12 # Monthly
vol <- sd(returns)
# Annualize
sharpe <- (excess_return * 12) / (vol * sqrt(12))
return(sharpe)
}
# Compare strategies
compare_strategies <- function(returns_list, names, rf = 0.04) {
results <- data.frame(
strategy = names,
return = sapply(returns_list, function(r) mean(r) * 12 * 100),
vol = sapply(returns_list, function(r) sd(r) * sqrt(12) * 100),
sharpe = sapply(returns_list, sharpe_ratio, rf_rate = rf)
)
return(results[order(-results$sharpe), ])
}
# Example
returns <- rnorm(36, mean = 0.006666666666666666, sd = 0.04330127018922194)
cat(sprintf("Sharpe: %.2f\n", sharpe_ratio(returns, 0.04)))โ Key Takeaways
- โข Sharpe = excess return per unit of risk
- โข > 1.0 is excellent, > 0.5 is good
- โข Compare strategies fairly across risk levels
- โข High return with high vol may have low Sharpe
- โข Useful for betting strategy evaluation
- โข Annualize using โtime for volatility