A portfolio analytics workflow evaluating returns, volatility, drawdowns, diversification, and risk-adjusted performance across a multi-asset ETF portfolio — translating raw market data into the metrics that drive informed investment decisions.
Pythonpandasnumpyyfinancematplotlibscipy
Client work is confidential. This case study uses publicly available market data to demonstrate my approach to portfolio analytics, risk reporting, and investment decision support.
The Challenge
The business problem
Investors and portfolio managers need to understand not only whether a portfolio has gone up or down, but how much risk was taken to achieve those returns. Raw performance numbers without risk context lead to poor decisions — a portfolio returning 12% annually with 30% volatility is very different from one returning 10% with 8% volatility. The challenge is building a rigorous, end-to-end risk and performance monitoring framework from public market data.
How has the portfolio performed versus the equity market and a balanced benchmark?
Which assets contributed most to return — and which to risk?
How severe and prolonged were historical drawdowns?
Is the portfolio genuinely diversified, or do correlations erode that benefit under stress?
How did portfolio risk levels change across different market regimes?
Approach
How the work was structured
01
Data Collection
Downloaded adjusted daily closing prices for six ETFs (SPY, QQQ, TLT, GLD, VNQ, BIL) using yfinance, covering January 2015 to December 2024 — approximately 2,500 trading days per asset.
02
Data Cleaning
Aligned all price series to common trading dates, calculated daily returns, verified for missing values across all tickers, and resampled to monthly and annual frequencies for multi-period analysis.
03
Portfolio Construction
Applied target weights (SPY 35%, QQQ 20%, TLT 20%, GLD 10%, VNQ 10%, BIL 5%) to compute daily portfolio returns. Built benchmark series for SPY and a 60/40 SPY/TLT blend for comparison.
04
Performance Analysis
Calculated cumulative growth ($10,000 base), annualised return, annualised volatility, and Sharpe ratio. Computed annual returns to assess consistency across calendar years.
05
Risk Analysis
Modelled running drawdowns to quantify the severity and duration of loss periods. Built 30-day and 90-day rolling annualised volatility series to identify changing risk regimes across the decade.
06
Diversification Analysis
Computed pairwise asset correlations and marginal risk contributions using covariance decomposition — assessing whether the portfolio was genuinely diversified or exposed to overlapping risk factors.
Portfolio
The portfolio under analysis
A six-asset ETF portfolio spanning US equities, growth technology, long-duration bonds, gold, real estate, and cash — representing a diversified, multi-asset allocation typical of a balanced investor.
SPY
S&P 500 ETF
35%
US Equities
QQQ
Nasdaq 100 ETF
20%
Growth / Technology
TLT
Long Treasury ETF
20%
Bonds / Duration
GLD
Gold ETF
10%
Defensive / Inflation Hedge
VNQ
Real Estate ETF
10%
Real Estate Exposure
BIL
Cash / T-Bill ETF
5%
Lower-Risk Allocation
Performance Analysis
How the portfolio performed
Risk Analysis
Drawdowns and volatility
Diversification Analysis
Correlation and risk contribution
Benchmark Comparison
Portfolio vs benchmarks
Metric
Portfolio
SPY (Equity)
60/40 Blend
Annual Return
10.1%
13.1%
8.0%
Annual Volatility
12.1%
17.6%
11.0%
Sharpe Ratio
0.67
0.63
0.54
Max Drawdown
-25.9%
-33.7%
-27.2%
Best Calendar Year
26.6%
31.2%
24.7%
Worst Calendar Year
-21.5%
-18.2%
-22.8%
Risk-free rate assumed at 2.0% p.a. for Sharpe ratio. Historical price data accessed using yfinance for analysis and visualisation purposes. Derived analytics only — raw market data is not redistributed. Not investment advice.
Business Insights
What this means in plain English
Equity exposure dominates portfolio risk
Despite SPY and QQQ representing 55% of capital, they drove a disproportionate share of total portfolio volatility — a common structural feature of multi-asset portfolios when equities carry higher volatility than other asset classes.
Drawdowns were reduced but not eliminated
The multi-asset structure softened peak drawdowns relative to a pure equity benchmark, but significant drawdowns still occurred during the COVID crash (2020) and the rate-hike shock (2022).
Bond diversification eroded in the 2022 rate environment
TLT, historically a flight-to-quality asset during equity selloffs, fell sharply alongside equities in 2022 as rising interest rates compressed both asset classes simultaneously — reducing the portfolio's diversification benefit.
Gold provided consistent low-correlation exposure
GLD maintained relatively low correlation to equities across multiple market regimes, providing meaningful diversification benefit during selected stress periods including early 2020 and parts of 2022.
Risk contribution does not match capital allocation
The portfolio's volatility was not evenly distributed across its assets. A risk-parity approach would require significantly reducing equity weights to equalise each asset's contribution to total portfolio risk.
Rolling correlations are regime-dependent
Correlations between equities and bonds shifted meaningfully across different market environments, confirming that static correlation assumptions are insufficient for sound risk management and portfolio monitoring.
Recommendations
Turning analysis into action
Finding
Recommendation
Equity ETFs dominate risk contribution
Rebalance based on risk contribution (risk parity), not capital weight alone
Significant drawdowns during equity selloffs
Implement drawdown monitoring with pre-defined de-risking rules or circuit breakers
Bond-equity correlation turns positive during rate shocks
Incorporate macro regime signals — not just historical correlation — into allocation decisions
Portfolio underperforms SPY in strong bull markets
Clarify investment objective: growth vs. capital preservation vs. risk-adjusted return
Rolling volatility varies materially over time
Use rolling risk metrics for ongoing monitoring rather than static annual figures
Historical price data accessed using yfinance for analysis and visualisation purposes. Derived analytics only — raw market data is not redistributed. Not investment advice.