Daily Returns
rt = (Pt − Pt−1) / Pt−1
Simple price return for each holding each day. Portfolio daily return = weighted sum of holding returns. In True Historical mode, yesterday's holdings snapshot is used as weights — new capital enters the denominator only on the following day, eliminating distortion from donations/wire transfers.
Replicate in Excel =( B2 - B1 ) / B1 down a daily price column, then =SUMPRODUCT(weights, returns) for the portfolio.
Cumulative Return
Ct = Ct−1 × (1 + rt) , C0 = 1
Chain-linked (geometric) compounding. Reported return = (Cfinal − 1) × 100%. Period sub-returns (1M, 3M, 6M, YTD) use the ratio of cumulative values at the relevant start date.
Replicate in Excel Start with 1 in row 2. Each subsequent row: =C1*(1+r). Final return: =(C_last - 1).
Annualized Volatility
σann = σdaily × √252
Sample standard deviation of daily returns (divides by n−1), annualized by multiplying by √252 (trading days per year). Expressed as a percentage.
Replicate in Excel =STDEV(daily_returns) * SQRT(252)
Sharpe Ratio
S = (r̄excess / σexcess) × √252
Excess return = daily return − (4.3% ÷ 252). The ratio of mean daily excess return to sample std dev of daily excess returns, scaled to annual. Risk-free rate: 4.3% per annum (≈ current T-Bill rate).
Replicate in Excel =AVERAGE(excess_rets)/STDEV(excess_rets)*SQRT(252) where excess_rets = daily_rets - (0.043/252).
Sortino Ratio
Sortino = (r̄excess / σdown) × √252
σdown = √( Σall days min(rexcess, 0)² / n )
Like Sharpe, but penalises only downside volatility. Downside deviation = RMS of negative excess returns, summed over all n days (positive days contribute 0). Dividing by n (all days) — not just the count of negative days — is the standard formula; using negative-day count only would artificially inflate the ratio.
Replicate in Excel =AVERAGE(excess)/SQRT(SUMPRODUCT(MIN(excess,0)^2)/COUNT(excess))*SQRT(252)
Beta
β = Cov(rport, rSPY) / Var(rSPY)
OLS slope of portfolio daily returns on SPY daily returns over the selected period. Benchmark: S&P 500 via SPY ETF. β > 1 = amplified market moves; β < 1 = dampened.
Replicate in Excel =COVARIANCE.P(port_rets, spy_rets)/VAR.P(spy_rets) or use =SLOPE(port_rets, spy_rets).
Jensen's Alpha
α = (Rport − rf) − β × (RSPY − rf)
Annualized excess return above the CAPM expected return. Rport and RSPY are geometric annualizations: (Cfinal)252/n − 1. rf = 4.3%. Positive alpha = outperformance after adjusting for market risk taken.
Replicate in Excel Annualize with =(1+total_ret)^(252/n)-1, then =ann_port - rf - beta*(ann_spy - rf).
Max Drawdown
MDD = maxt( (Peakt − Ct) / Peakt )
Largest peak-to-trough decline in the cumulative return series over the selected period. Peakt = running maximum of the cumulative series up to day t. Expressed as a negative percentage.
Replicate in Excel Add a running-max column with =MAX($C$2:C2), drawdown column =(C2-peak)/peak, then =MIN(drawdown_col).
Effective Positions (HHI)
Neff = 1 / Σ wi²
Inverse of the Herfindahl-Hirschman Index (HHI). Ranges from 1 (100% in one stock) to N (equally weighted across N stocks). Measures concentration: an equally-weighted 30-stock portfolio scores ~30; a portfolio with 80% in one stock scores much lower.
Replicate in Excel =1/SUMPRODUCT(weights^2) where weights are the market-value fractions summing to 1.
Calendar Year Returns
Ryr = (CDec 31 / CDec 31 prior yr) − 1
Computed from the sparkline (weekly-sampled cumulative return series). Each % value is first converted to a multiplier (p/100 + 1), then year-over-year return = (end multiplier / start-of-year multiplier − 1) × 100. Years with fewer than 8 data points are excluded as incomplete.
Replicate in Excel Use the cumulative return column, find Jan 1 and Dec 31 values for each year, then =(dec31/jan1)-1.