← TAIMOOR ALI Case study
RISK DECISIONS · QUANTITATIVE FINANCE

How much could I lose tomorrow? Three answers to one question

A portfolio risk study built end to end in Python: six assets of Bloomberg data, an efficient frontier traced from 10,000 simulated portfolios, and then the punchline — one-month Value-at-Risk estimated three different ways, producing three different numbers. The gap between them is the real lesson.

6assets · Bloomberg
10,000simulated portfolios
7.6–10.6%1-month 95% VaR range
GARCH(1,1)volatility model

01 · THE DECISIONTwo questions every portfolio must answer

Before anyone debates models, a portfolio has to answer two questions: how should the money be split, and how much of it could disappear in a bad month? The first is an allocation decision; the second is the risk number that makes the allocation honest. This project answers both — and then stress-tests the second answer by computing it three independent ways, because a risk number you've only computed one way is a number you haven't questioned.

02 · MEASUREThe data, made comparable

Daily Bloomberg closing prices (PX_LAST) for six assets spanning deliberately different risk profiles: GOOGL, AMZN, TSLA (growth equities), Goldman Sachs (financials), BNDX (an international bond ETF — the ballast) and the DAX index. The DAX trades in euros, so every observation was converted to USD using the matching EUR/USD rate — skip that step and you're measuring currency noise as equity risk.

Prices were resampled to month-end and converted to simple monthly returns, alongside a synthetic risk-free savings asset compounding at 3.5% a year — the benchmark every risky allocation has to beat to justify its existence.

Five years, rebased to 100
Normalised price history · illustrative reconstruction matched to each asset's actual return/volatility (the notebook used ~5y Bloomberg daily data)
Rebasing every asset to 100 at the start makes growth comparable on one axis. TSLA's path is the wild outlier; BNDX is the near-flat line that earns its place by barely moving when everything else does.

03 · EXPLOREKnow your assets before you weight them

Risk and return by asset
Average monthly return vs monthly volatility (standard deviation)
TSLA: 4.22% average monthly return at 18.4% volatility — a rocket strapped to a rollercoaster. BNDX barely moves in either direction. A portfolio needs both kinds of animal.

Diversification lives in the correlation structure, so the full pairwise matrix was computed from the monthly returns:

Correlation of monthly returns
Pearson pairwise correlations, derived from the portfolio covariance matrix
GOOGLAMZNTSLAGSBNDXDAX
GOOGL1.000.660.370.460.420.53
AMZN0.661.000.430.300.420.45
TSLA0.370.431.000.300.200.35
GS0.460.300.301.000.200.68
BNDX0.420.420.200.201.000.33
DAX0.530.450.350.680.331.00
GOOGL–AMZN at 0.66 move together (same macro exposure); GS–DAX at 0.68 share the financials/Europe factor. TSLA–BNDX at 0.20 is where the diversification benefit hides.

04 · MODELTracing the efficient frontier

With expected returns, volatilities and the covariance matrix estimated, 10,000 random portfolios were simulated across the risky assets — each a different weighting, each scored on return, risk and Sharpe ratio against the monthly risk-free rate. Plotted together they trace the Markowitz frontier: the upper-left edge is the set of portfolios you can't improve without paying for it in risk. Portfolio return is the weighted average of asset returns; portfolio risk is not — it's √(w′Σw), where the covariance matrix Σ lets offsetting movements partly cancel. That quadratic term is why diversification works, and why the cloud bows toward the top-left instead of forming a straight line.

10,000 portfolios, one winner
Each point is a simulated portfolio · 600-point sample shown · reproduced from the notebook's statistics (same method, seed 42)
The dense cloud is what random allocation buys you. The marked point is the max-Sharpe portfolio: 2.46% expected monthly return at 8.23% volatility, Sharpe 0.264.
Max-Sharpe portfolio allocation
Weights of the best of 10,000 simulated portfolios
The optimiser concentrates in the high-Sharpe tech names and keeps just enough bonds to matter — a textbook result, and a reminder that historical-mean optimisation chases whatever just performed.

05 · DECIDEValue-at-Risk, three ways

Now the risk number. One-month 95% VaR answers: what loss should we not expect to exceed more than one month in twenty? Three methods, three philosophies:

GARCH(1,1) conditional volatility over time
Estimated monthly volatility of portfolio returns · illustrative reconstruction showing the model's stress response
Volatility isn't constant — it clusters. The model lets the risk estimate breathe with the market: calm in quiet months, spiking through the 2020 and late-2022 stress windows. That time-variation is the whole reason GARCH exists, and the whole reason the flat-Normal VaR understates risk in turbulent periods.
One question, three answers
1-month 95% Value-at-Risk by estimation method
The same portfolio, the same confidence level, a 2.96-point spread. Model choice is itself a risk decision.
Inside the Monte Carlo estimate
Distribution of 10,000 simulated one-month portfolio values · reproduced with the notebook's parameters (μ=2.46%, σ=8.23%, seed 42)
The red region is the worst 5% of futures; its boundary (portfolio value 0.894) is where the 10.56% VaR comes from. Seeing the whole distribution makes the number mean something.
The call

Which number goes in the report? My answer: the range, with the assumptions attached. Presenting 7.60% alone smuggles "volatility is constant and returns are normal" past the reader. The spread between methods is the finding — it quantifies how much the risk estimate depends on what you assumed, which is exactly what a decision-maker deserves to see before sizing a position.

06 · EXTENDSimulating futures, not summarising the past

To complete the picture, Geometric Brownian Motion paths were simulated from the portfolio's drift and volatility — ten possible one-year futures fanning out from the same starting point under the standard stochastic price model dS = μS dt + σS dW.

Ten possible futures
Simulated GBM paths over one year, index = 100 at start · reproduced with the notebook's parameters (seed 42)
None of these is a forecast. Together they're the honest shape of the future: by year-end the paths span roughly 94 to 110 — and a single expected-return line through the middle would have told you none of that.

07 · TRANSFERWhy a growth analyst does quant finance

Volatility clustering — calm periods and turbulent periods that persist — is the same statistical animal whether the series is portfolio returns or the UK electricity prices in my battery trading project. Distributions, tail risk, confidence intervals and “how wrong could this number be?” are the foundation under every experiment readout and revenue forecast I produce at work. This project is where that foundation got load-tested.

Stack: Python · pandas · NumPy · SciPy · arch (GARCH) · matplotlib / seaborn · Bloomberg data · Markowitz mean-variance · Monte Carlo · GBM