Calculation Methodology
Back to OverviewQuick Navigation
Return Calculations
Simple Return
This is the fundamental calculation showing the total return from when an analyst recommended a stock until now.
Return % = ((Current Price - Price at Analysis) / Price at Analysis) × 100
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.
Annualized Return = [(1 + Return/100)^(365/Days) - 1] × 100
Raw Return: 50%
Days Held: 730 (2 years)
Annualized = ((1 + 0.50)^(365/730) - 1) × 100 = 22.47% per year
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.
Average Return = Sum of all returns / Number of analyses
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.
Returns: [-15%, -5%, 10%, 15%, 25%]
Median = 10% (3rd value)
Returns: [-10%, 5%, 15%, 20%]
Median = (5% + 15%) / 2 = 10%
Win Rate
The percentage of analyses that resulted in positive returns.
Win Rate % = (Number of Positive Returns / Total Analyses) × 100
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.
Risk (σ) = √[ Σ(Return - Mean)² / N ]
Step-by-Step Calculation Example:
Given sector returns: [10%, 15%, -5%, 20%, 0%]
- Calculate Mean: (10 + 15 + (-5) + 20 + 0) / 5 = 8%
- Calculate Deviations:
- (10 - 8)² = 4
- (15 - 8)² = 49
- (-5 - 8)² = 169
- (20 - 8)² = 144
- (0 - 8)² = 64
- Calculate Variance: (4 + 49 + 169 + 144 + 64) / 5 = 86
- Calculate Standard Deviation: √86 = 9.27%
| 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 |
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.
Alpha = Analyst Return - Benchmark Return
Beating the benchmark
Example: 25% - 15% = +10%
Matching the market
Example: 15% - 15% = 0%
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:
- 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 |
- 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.
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% |
- 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
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 |
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 |