Calculation Methodology

Back to Overview

Return Calculations

Simple Return

This is the fundamental calculation showing the total return from when an analyst recommended a stock until now.

Formula:
Return % = ((Current Price - Price at Analysis) / Price at Analysis) × 100
Example:
Analysis Date: January 15, 2025
Price at Analysis: $150.00
Current Price: $200.00
Return = (200 - 150) / 150 × 100 = 33.33%
Annualized Return (CAGR)

Annualization shows what the return would be if compressed to a one-year period. This allows fair comparison between stocks held for different lengths of time.

Formula:
Annualized Return = [(1 + Return/100)^(365/Days) - 1] × 100
Example:
Raw Return: 50%
Days Held: 730 (2 years)
Annualized = ((1 + 0.50)^(365/730) - 1) × 100 = 22.47% per year
When Applied: Annualization is only calculated for holdings longer than 365 days. For shorter periods, the simple return is shown.

Performance Aggregation

Equal-Weighted Average

We use equal-weighted averaging rather than value-weighted. This means each stock pick contributes equally to the average, regardless of company size.

Formula:
Average Return = Sum of all returns / Number of analyses
Example:
An analyst has 3 approved analyses with returns: +33%, -5%, +10%
Average = (33 + (-5) + 10) / 3 = 12.67%
Why Equal-Weighting?
  • Fair Comparison: Each pick represents equal "conviction" regardless of company size
  • Skill Measurement: Measures stock-picking ability, not position sizing
  • Bias Prevention: Prevents large-cap stocks from dominating metrics
  • Industry Standard: Most analyst performance rankings use equal-weighting
Median Return

The median is the middle value when all returns are sorted. It helps identify typical performance without being skewed by extreme outliers.

Odd Count (5 analyses):
Returns: [-15%, -5%, 10%, 15%, 25%]
Median = 10% (3rd value)
Even Count (4 analyses):
Returns: [-10%, 5%, 15%, 20%]
Median = (5% + 15%) / 2 = 10%
Win Rate

The percentage of analyses that resulted in positive returns.

Formula:
Win Rate % = (Number of Positive Returns / Total Analyses) × 100
Example:
Total analyses: 10
Positive returns: 7
Win Rate = 7 / 10 × 100 = 70%

Risk Metrics (Sector Statistics)

Standard Deviation (Volatility)

Risk is measured as the standard deviation of returns within each sector. It indicates how much returns vary from the average—higher values mean more volatile/unpredictable performance.

Formula:
Risk (σ) = √[ Σ(Return - Mean)² / N ]
Step-by-Step Calculation Example:

Given sector returns: [10%, 15%, -5%, 20%, 0%]

  1. Calculate Mean: (10 + 15 + (-5) + 20 + 0) / 5 = 8%
  2. Calculate Deviations:
    • (10 - 8)² = 4
    • (15 - 8)² = 49
    • (-5 - 8)² = 169
    • (20 - 8)² = 144
    • (0 - 8)² = 64
  3. Calculate Variance: (4 + 49 + 169 + 144 + 64) / 5 = 86
  4. Calculate Standard Deviation: √86 = 9.27%
Risk Level Interpretation:
Risk Level Standard Deviation Interpretation
Low 0-5% Very consistent returns
Medium 5-15% Normal volatility
High 15-25% Erratic performance
Very High >25% Unpredictable results
Why This Matters:
Comparing risk across sectors helps identify which sectors provide:
  • Consistent Performance: Low risk sectors (e.g., Utilities)
  • High Reward Potential: Check both return AND risk
  • Balanced Exposure: Medium risk/return sectors

Benchmark Comparisons

We compare our performance against major market indices to determine if we're outperforming (generating alpha) or underperforming the market.

Implemented Benchmarks
Ticker Index Description Approx. Annual Return
SPY S&P 500 500 largest US companies ~10%
VT FTSE All-World Global equity markets ~9%
EEMS MSCI EM Small Cap Emerging markets small cap ~7%
Alpha Generation

Alpha measures how much we outperform (or underperform) the benchmark.

Formula:
Alpha = Analyst Return - Benchmark Return
Positive Alpha
Beating the benchmark
Example: 25% - 15% = +10%
Zero Alpha
Matching the market
Example: 15% - 15% = 0%
Negative Alpha
Underperforming
Example: 10% - 15% = -5%

Portfolio Simulation

We offer two calculation methods for portfolio performance. You can toggle between them on the Overview page.

Incremental Equal-Weight Rebalancing (Recommended)

This method simulates realistic portfolio management where each new stock addition triggers a rebalancing to maintain equal weights. This accurately reflects how an actual portfolio would be managed:

How It Works:
  • First stock: Invest 100% of capital
  • Second stock: Sell 50% of first stock, invest proceeds in second (now 50/50)
  • Third stock: Sell 33% of each existing position, invest in third (now 33/33/33)
  • Nth stock: Rebalance to 1/N weight for each position
Step-by-Step Example:

Starting with $10,000 and three stocks added over time:

Step Action Stock A Stock B Stock C Total Value
1. Start Buy A with $10,000 $10,000 - - $10,000
2. A grows A gains 30% $13,000 - - $13,000
3. Add B Rebalance 50/50 $6,500 (sold $6,500) $6,500 - $13,000
4. Both grow A: +10%, B: +20% $7,150 $7,800 - $14,950
5. Add C Rebalance 33/33/33 $4,983 $4,983 $4,983 $14,950
Why This Method Is More Realistic:
  • Mimics actual portfolio management decisions
  • Captures the impact of rebalancing and position sizing
  • Early positions have larger impact (as they would in reality)
  • Reflects opportunity cost of adding new positions
Simple Equal-Weighted Average

This method calculates a simple average where each stock contributes equally regardless of when it was added. It provides a straightforward measure of stock-picking skill without considering portfolio management dynamics.

Formula:
Portfolio Return = Sum of individual returns / Number of positions
How It Works Over Time:
Time Period Active Stocks Calculation Portfolio Return
Jan 2023 Stock A only Stock A return 30%
Jun 2023 A, B (30% + 10%) / 2 20%
Jan 2024 A, B, C (30% + 10% + (-5%)) / 3 11.67%
When to Use This Method:
  • Comparing pure stock-picking skill across different portfolios
  • When timing of entries shouldn't affect the metric
  • Simple, easy-to-understand performance measure
  • Industry standard for analyst performance rankings
Which Should I Use?
Incremental Rebalancing is recommended for portfolio performance tracking as it reflects how an actual portfolio would be managed. Equal-Weighted is better for comparing analyst stock-picking skill without the noise of portfolio management timing.

Sector Statistics

For each sector, we calculate several metrics to understand sector performance and risk:

Metric Description Formula
Count Number of stocks in sector Simple count
Avg Return Mean of all returns in sector Σ Returns / N
Positive Ratio % of stocks with positive returns (Positive / Total) × 100
Risk (StdDev) Volatility of sector returns √[ Σ(x - mean)² / N ]
Min Worst performing stock Minimum return
Max Best performing stock Maximum return

Analyst Rankings

Ranking Metric Description
Top by Board Approved Count Analyses with 'On Watchlist' status
Top by Total Analyses Count All stock analyses (approved + neutral + refused)
Top by Win Rate Percentage Win rate for analysts with ≥3 analyses
Top by Performance Return % Average return across approved analyses
Note: Win Rate rankings require a minimum of 3 analyses to ensure statistical significance. An analyst with 1 pick and 100% win rate is less meaningful than one with 10 picks and 80% win rate.

Glossary

Alpha
Excess return above benchmark (outperformance)
Annualized
Return normalized to one-year period for comparison
CAGR
Compound Annual Growth Rate (same as annualized return)
Equal-Weighted
Each position contributes equally (vs. value-weighted by market cap)
Median
Middle value in sorted list (outlier-resistant average)
Population Std Dev
Standard deviation using all data points (N, not N-1)
Risk
Measured as standard deviation of returns (volatility)
Win Rate
Percentage of picks with positive returns

Quick Formula Reference

Metric Formula Code Location
Simple Return ((P_current - P_entry) / P_entry) × 100 performance.py:209
Annualized Return ((1 + r/100)^(365/d) - 1) × 100 performance.py:102
Average Return Σ returns / n performance.py:302
Median Middle value (or avg of two middles) performance.py:303
Win Rate (positive / total) × 100 performance.py:305
Standard Deviation √[ Σ(x_i - mean)² / N ] analyst/routes.py:381
Portfolio Return Σ individual returns / n performance.py:471

Implementation Details

Price Handling
  • Price at Analysis Date: Closing price on the exact date (or previous trading day if markets were closed)
  • Current Price: Latest available closing price from Yahoo Finance
  • Delisted Stocks: Use last available price before delisting
Cache Strategy
  • Stock prices: Updated daily
  • Sector information: 3-day cache
  • Performance calculations: Calculated on-demand but stored persistently
Edge Cases
Scenario Handling
Missing ticker Skip analysis, log warning
Missing price data Skip calculation, visible in admin debug
Zero price Skip (division by zero protection)
-100% return Capped at -100%, cannot annualize
Future analysis date Exclude from calculations
Last updated: February 2026 | View on GitHub