\[
% MathJax has no bm package; redefine \bm in terms of \boldsymbol, which it supports natively
\newcommand{\bm}[1]{\boldsymbol{#1}}
% --- Operators -----------------------------------------------------------
% Expectation operator
\DeclareMathOperator{\E}{E}
% Variance operator
\DeclareMathOperator{\Var}{Var}
% Covariance operator
\DeclareMathOperator{\Cov}{Cov}
% Correlation operator
\DeclareMathOperator{\Corr}{Corr}
% Rank operator (Spearman rank correlation)
\DeclareMathOperator{\Rank}{Rank}
% Skewness operator
\DeclareMathOperator{\Skewness}{Skewness}
% Kurtosis operator
\DeclareMathOperator{\Kurtosis}{Kurtosis}
% Difference/differential operator (upright d per ISO 80000-2)
\newcommand{\Diff}{\mathrm{d}}
% --- Risk Measures -------------------------------------------------------
% Value at Risk
\DeclareMathOperator{\VaR}{VaR}
% Expected Shortfall
\DeclareMathOperator{\ES}{ES}
% Marginal Value at Risk
\DeclareMathOperator{\MVaR}{MVaR}
% Component Value at Risk
\DeclareMathOperator{\CompVaR}{CVaR}
% Incremental Value at Risk
\DeclareMathOperator{\IVaR}{IVaR}
% Component Expected Shortfall
\DeclareMathOperator{\CompES}{CES}
% Weighted sensitivity for risk factor in FRTB SBM bucket
\DeclareMathOperator{\WS}{WS}
% Hedge-benefit ratio for FRTB DRC bucket
\DeclareMathOperator{\HBR}{HBR}
% Stress scenario risk measure for FRTB NMRF capital add-on
\DeclareMathOperator{\SES}{SES}
% Jump-to-default exposure for obligor (FRTB DRC)
\DeclareMathOperator{\JTD}{JTD}
% Loss given default for obligor (FRTB DRC)
\DeclareMathOperator{\LGD}{LGD}
% Default risk weight for obligor (FRTB DRC)
\DeclareMathOperator{\RW}{RW}
% ES ratio function
\newcommand{\ESratio}{\lambda}
% Arbitrary risk measure function (coherence axioms)
\newcommand{\RiskMeasure}{\varphi}
% Asset position (coherence axioms)
\newcommand{\Asset}{A}
% First named asset in examples
\newcommand{\AssetA}{A}
% Second named asset in examples
\newcommand{\AssetB}{B}
% Third named asset in examples
\newcommand{\AssetC}{C}
% Constant (risk measure axioms)
\newcommand{\Constant}{c}
% Bucket-level aggregate sensitivity in FRTB SBM
\newcommand{\BucketAgg}{S}
% Cross-bucket correlation in FRTB SBM
\newcommand{\CrossBucketCorr}{\gamma}
% Notional amount for an instrument (FRTB DRC and RRAO)
\newcommand{\Notional}{\text{Notional}}
% --- Distributions -------------------------------------------------------
% Binomial distribution
\DeclareMathOperator{\Binomial}{Binomial}
% Uniform distribution
\DeclareMathOperator{\Uniform}{Uniform}
% Normal distribution
\newcommand{\NormalDist}{\mathcal{N}}
% Student-t CDF
\newcommand{\StudentCDF}{t}
% Student-t PDF
\newcommand{\StudentPDF}{f}
% --- Returns -------------------------------------------------------------
% Price
\newcommand{\Price}{P}
% Simple (arithmetic) return
\newcommand{\SimpleReturns}{R}
% Log (compound) return
\newcommand{\CompoundReturns}{y}
% Matrix of compound returns
\newcommand{\ReturnMatrix}{\bm{y}}
% Dividend payment
\newcommand{\dividend}{d}
% --- Volatility ----------------------------------------------------------
% Realised variance
\DeclareMathOperator{\RealisedVar}{RV}
% Realised volatility (square root of realised variance)
\DeclareMathOperator{\RealisedVol}{RVol}
% Volatility
\newcommand{\Vol}{\sigma}
% GARCH intercept parameter
\newcommand{\GARCHconst}{\omega}
% ARCH coefficient (weight on past squared returns)
\newcommand{\ARCHcoeff}{\alpha}
% GARCH coefficient (weight on past variance)
\newcommand{\GARCHcoeff}{\beta}
% EWMA decay factor (typically 0.94)
\newcommand{\EWMAdecay}{\lambda}
% Standardized residual / error term
\newcommand{\StdNormal}{\epsilon}
% Leverage parameter in apARCH
\newcommand{\APARCHleverage}{\zeta}
% Power parameter in apARCH
\newcommand{\APARCHpower}{\delta}
% Degrees of freedom (Student-t)
\newcommand{\DOF}{\nu}
% GJR-GARCH leverage parameter
\newcommand{\GJRleverage}{\gamma}
% GARCH-X external regressor coefficient
\newcommand{\RegressorCoeff}{\xi}
% Mean (first moment)
\newcommand{\Mean}{\mu}
% Lag order in volatility models
\newcommand{\Lag}{L}
% Dummy variable (indicator in regressions)
\newcommand{\DummyVar}{D}
% --- Portfolio -----------------------------------------------------------
% Portfolio weight (scalar)
\newcommand{\weight}{w}
% Portfolio weight vector
\newcommand{\weights}{\bm{w}}
% Covariance matrix
\newcommand{\CovMatrix}{\bm{\Sigma}}
% Correlation matrix
\newcommand{\CorrMatrix}{\bm{C}}
% Correlation coefficient
\newcommand{\correlation}{\rho}
% Number of assets in portfolio
\newcommand{\NumberAssets}{K}
% Portfolio value
\newcommand{\PortfolioValue}{\vartheta}
% Asset beta (CAPM)
\newcommand{\AssetBeta}{\beta}
% Ledoit-Wolf shrinkage intensity
\newcommand{\ShrinkageIntensity}{\delta}
% Sample covariance matrix
\newcommand{\SampleCov}{\bm{S}}
% --- Time Series ---------------------------------------------------------
% Sample size
\newcommand{\SampleSize}{T}
% Generic count (number of lags, payments, etc.)
\newcommand{\Count}{N}
% Estimation window length
\newcommand{\EstWindow}{W_E}
% Testing window length
\newcommand{\TestWindow}{W_T}
% Stress window length
\newcommand{\StressWindow}{W_S}
% AR coefficient
\newcommand{\ARcoeff}{\phi}
% MA coefficient
\newcommand{\MAcoeff}{\psi}
% --- Probability ---------------------------------------------------------
% Probability level (e.g. 0.01 for 1% VaR)
\newcommand{\probability}{p}
% Cumulative sorted scenario weight
\newcommand{\CumScenarioWeight}{\Omega}
% p-quantile of the P and L distribution
\newcommand{\Quantile}{q}
% Quantile function
\newcommand{\QuantileFunction}{Q}
% Probability density function
\newcommand{\PDF}{f}
% Cumulative distribution function
\newcommand{\CDF}{F}
% Standard normal CDF
\newcommand{\NormalCDF}{\Phi}
% Inverse standard normal (quantile function)
\newcommand{\NormalQuantile}{\Phi^{-1}}
% Standard normal density function
\newcommand{\NormalPDF}{\phi}
% Likelihood function
\newcommand{\lik}{\mathcal{L}}
% Log-likelihood
\newcommand{\LogLikelihood}{\ell}
% Parameter vector (MLE estimation)
\newcommand{\ParamSet}{\theta}
% Parameter space
\newcommand{\ParamSpace}{\Theta}
% Fisher information matrix
\newcommand{\FisherInfo}{\mathcal{I}}
% Statistical power (Type II error rate)
\newcommand{\StatPower}{\beta}
% Significance level (CI coverage complement)
\newcommand{\SignifLevel}{\gamma}
% --- Options -------------------------------------------------------------
% Call option label
\newcommand{\CallOption}{\text{call}}
% Put option label
\newcommand{\PutOption}{\text{put}}
% Strike price
\newcommand{\Strike}{X}
% Risk-free interest rate
\newcommand{\RiskFree}{r_f}
% Option maturity (time to expiration)
\newcommand{\OptionMaturity}{\tau}
% Option delta
\newcommand{\OptionDelta}{\Delta}
% Option gamma
\newcommand{\OptionGamma}{\Gamma}
% Option vega
\newcommand{\Vega}{\mathcal{V}}
% Holding period
\newcommand{\HoldingPeriod}{H}
% Simulation profit/loss (signed; negative is a loss)
\newcommand{\ProfitLoss}{\Pi}
% Futures price
\newcommand{\Futures}{F}
% Hedge ratio
\newcommand{\HedgeRatio}{h}
% Units of basic asset held
\newcommand{\StockHolding}{x^b}
% Units of options held
\newcommand{\OptionHolding}{x^o}
% --- Interest Rates ------------------------------------------------------
% Bond convexity
\newcommand{\Convexity}{C}
% Interest rate / yield
\newcommand{\Yields}{r}
% Key rate change, basis points (scalar tenor component); used as \KeyRateChange_k or \KeyRateChange_{t,k}. EXCEPTION to the no-macro-to-macro-indirection rule, decided 2026-08-09: composed from \Yields on purpose, so a future change to the rate glyph propagates here without a follow-up edit. \Yields is defined earlier in generated output (same interest_rates category, TOML order), so expansion order is safe; verify this still holds if either entry is reordered.
\newcommand{\KeyRateChange}{\Delta \Yields^{\mathrm{bp}}}
% Key rate changes, basis points (vector); used bare or as \KeyRateChanges_t. EXCEPTION to the no-macro-to-macro-indirection rule, decided 2026-08-09: composed from \Yields on purpose, so a future change to the rate glyph propagates here without a follow-up edit. \bm{\Yields} depends on \bm/\boldsymbol correctly expanding a macro argument rather than a bare letter --- confirm this renders correctly the first time either consumer compiles it.
\newcommand{\KeyRateChanges}{\Delta \bm{\Yields}^{\mathrm{bp}}}
% Dollar value of a basis point
\newcommand{\DV}{\text{DV01}}
% Mean reversion speed (interest rate models)
\newcommand{\MeanReversion}{\varkappa}
% Modified duration
\newcommand{\ModDur}{D}
% Macaulay duration
\newcommand{\MacDur}{D_{\text{Mac}}}
% Effective duration
\newcommand{\EffDur}{D_{\text{eff}}}
% DV01 vector
\newcommand{\DVvec}{\bm{d}}
% Long-run mean rate (Vasicek/CIR/Hull-White)
\newcommand{\LongRunRate}{\theta}
% Hull-White time-varying drift
\newcommand{\HullWhiteDrift}{\varphi}
% Cash flow (coupon/principal payment)
\newcommand{\CashFlow}{c}
% --- Extreme Value -------------------------------------------------------
% Tail index (EVT, Pareto-type tails)
\newcommand{\TailIndex}{\iota}
% Shape parameter (xi = 1/iota)
\newcommand{\ShapeParam}{\varsigma}
% Threshold value (EVT)
\newcommand{\Threshold}{u}
% Extremal index (Leadbetter 1983)
\newcommand{\ExtremalIndex}{\theta}
% Multivariate extremal coefficient, theta in [1,d]. theta=1 complete tail dependence; theta=d asymptotic independence. Glyph collides with ExtremalIndex and ParamSet; disambiguated at source by macro name.
\newcommand{\ExtremalCoef}{\theta}
% GEV distribution function
\newcommand{\GEV}{\mathcal{H}}
% GPD distribution function
\newcommand{\GPD}{\mathcal{G}}
% GPD scale parameter
\newcommand{\GPDscale}{\beta}
% GPD scale parameter at a threshold u, distinct from the generic GPD scale
\newcommand{\GPDscaleAtThreshold}{\beta_u}
% Number of threshold exceedances (EVT)
\newcommand{\TailCount}{C}
% Sample maximum (block maxima, EVT)
\newcommand{\SampleMax}{M}
% Kurtosis value (realized, e.g. sample kurtosis)
\newcommand{\KurtosisVal}{\kappa}
% Pareto scaling constant (EVT)
\newcommand{\ParetoConst}{\mathcal{A}}
% Generic constant (EVT asymptotics)
\newcommand{\RemainderConst}{\mathcal{C}}
% Little-o asymptotic notation
\newcommand{\LittleO}{o}
% Moment order (EVT)
\newcommand{\MomentOrder}{\mathscr{m}}
% Doubled sample size (EVT block maxima)
\newcommand{\DoubleSample}{D}
% GEV normalizing location constant
\newcommand{\GEVloc}{a}
% GEV normalizing scale constant
\newcommand{\GEVscale}{b}
% Negative return (loss, EVT context)
\newcommand{\NegativeReturn}{L}
% --- Copulas -------------------------------------------------------------
% Copula function
\newcommand{\Copula}{\mathcal{C}}
% Copula density
\newcommand{\CopulaDensity}{c}
% Generator function (Archimedean copulas)
\newcommand{\generator}{\varphi}
% Copula dependence parameter
\newcommand{\CopulaParam}{\theta}
% Copula marginal parameter set
\newcommand{\MarginalParamSet}{\eta}
% Lower tail dependence coefficient
\newcommand{\LowerTailDep}{\lambda_L}
% Upper tail dependence coefficient
\newcommand{\UpperTailDep}{\lambda_U}
% Marginal CDF (second variable)
\newcommand{\MarginalCDF}{G}
% Joint density function
\newcommand{\JointDensity}{h}
% Marginal density function
\newcommand{\MarginalDensity}{g}
% Joint distribution function
\newcommand{\JointCDF}{H}
% Gaussian copula correlation parameter
\newcommand{\CopulaCorr}{\rho}
% --- Multivariate --------------------------------------------------------
% Diagonal matrix of conditional volatilities
\newcommand{\DiagVolD}{\bm{D}}
% Idiosyncratic variance matrix (diagonal, factor models)
\newcommand{\IdioVarMatrix}{\bm{\Psi}}
% Covariance matrix entry (two indices)
\newcommand{\CovElement}{\sigma}
% Auxiliary matrix in DCC dynamics
\newcommand{\DCCauxQ}{\bm{Q}}
% BEKK constant matrix
\newcommand{\BEKKconst}{\bm{\Omega}}
% BEKK ARCH parameter matrix
\newcommand{\BEKKarch}{\bm{A}}
% BEKK GARCH parameter matrix
\newcommand{\BEKKgarch}{\bm{B}}
% DCC rescaling diagonal matrix
\newcommand{\DCCrescaleZ}{\bm{Z}}
% DCC auxiliary matrix element
\newcommand{\DCCelement}{q}
% Factor loadings matrix (loadings/eigenvectors of the covariance matrix)
\newcommand{\FactorLoadings}{\bm{\Lambda}}
% Factor subscript label
\newcommand{\factor}{\text{factor}}
% PCA eigenvalue
\newcommand{\Eigenvalue}{\lambda}
% Number of factors in factor model
\newcommand{\NumberFactors}{m}
% Factor return vector
\newcommand{\FactorReturn}{\bm{g}}
% PCA factor score (scalar; not an eigenvector)
\newcommand{\PCAFactor}{F}
% BEKK cross-covariance coefficient
\newcommand{\BEKKcross}{\delta}
% Factor loading element
\newcommand{\FactorLoading}{\Lambda}
% DCC correlation persistence parameter
\newcommand{\DCCxi}{\xi}
% DCC news coefficient (weight on recent shocks)
\newcommand{\DCCzeta}{\zeta}
% --- Simulation ----------------------------------------------------------
% Number of simulation paths
\newcommand{\NumberSims}{B}
% Cholesky factor of covariance matrix
\newcommand{\Cholesky}{\bm{L}}
% Uniform random number
\newcommand{\UniformDraw}{\tilde{u}}
% --- Backtesting ---------------------------------------------------------
% Violation ratio (observed/expected violations)
\DeclareMathOperator{\ViolRatio}{VR}
% Stressed Value at Risk
\DeclareMathOperator{\StressedVaR}{SVaR}
% QLIKE loss function for variance forecasts
\DeclareMathOperator{\QLIKE}{QLIKE}
% Mean squared error (forecast loss function)
\DeclareMathOperator{\MSE}{MSE}
% Mean absolute error (forecast loss function)
\DeclareMathOperator{\MAE}{MAE}
% Markov transition probability
\newcommand{\TransProb}{\pi}
% Exception indicator: 1 if y_t < -VaR_t
\newcommand{\ExceptionInd}{\eta}
% Exception count
\newcommand{\ExceptionCount}{\upsilon}
% Probability Integral Transform
\newcommand{\ProbIntegralTransform}{\hat{u}}
% Quantile score (pinball loss function)
\newcommand{\QuantileScore}{\mathcal{S}}
% Kolmogorov-Smirnov test statistic
\newcommand{\KSstat}{D}
% Test statistic (generic base letter)
\newcommand{\TestStat}{J}
% --- General -------------------------------------------------------------
% Regression intercept
\newcommand{\RegressionIntercept}{a}
% Regression slope
\newcommand{\RegressionSlope}{\beta}
% Risk factor
\newcommand{\RiskFactor}{x}
% Forecast horizon
\newcommand{\ForecastHorizon}{h}
% Block length (bootstrap)
\newcommand{\BlockLength}{\ell}
% Capital tau variant
\newcommand{\DeliveryTime}{\Upsilon}
% Today's calendar time in years (option pricing input; distinct from trading-date index t)
\newcommand{\CalendarTime}{t^*}
% Probability measure
\newcommand{\ProbMeasure}{\mathbb{P}}
% Risk-neutral measure
\newcommand{\RiskNeutral}{\mathbb{Q}}
% Pricing function (Black-Scholes, bond pricing, etc.)
\newcommand{\PricingFn}{V}
% Indicator function
\newcommand{\Indicator}{\bm{1}}
% Vector of ones
\newcommand{\OnesVector}{\bm{1}}
% Risk factor sensitivity (first-order P&L)
\newcommand{\Sensitivity}{\delta}
% Second-order sensitivity (convexity/gamma)
\newcommand{\ConvexitySens}{\gamma}
% Output floor percentage (Basel)
\newcommand{\OutputFloor}{\alpha}
% --- Subscript Labels ----------------------------------------------------
% Subscript label: annualized
\newcommand{\Annual}{a}
% Subscript label: implied
\newcommand{\Implied}{I}
% Subscript label: portfolio
\newcommand{\Portfolio}{\pi}
% --- Text Abbreviations --------------------------------------------
% S&P 500 index
\newcommand{\SP}{\text{S\&P-500}}
% Student-t distribution (text)
\newcommand{\St}{\text{Student-t}}
% Geopolitical Risk index (Caldara and Iacoviello)
\newcommand{\GPR}{\text{GPR}}
\]
The sources used in these notes, and the main alternatives. The type of data we use is typically obtained from commercial vendors, which provide documented and supported feeds. Many offer free tiers or academic discounts, and your university may have a subscription.
What we usually use
EODHD
EODHD is the main price source used in these notes. EODHD (EOD Historical Data) provides live and end-of-day prices for stocks, ETFs and mutual funds from exchanges worldwide, together with a fundamental-data API. Consult the vendor’s current documentation for coverage, pricing and academic access.
EODHD provides packages for R (eodhdR2) and Python (eodhd) and can be accessed from Julia via HTTP requests. More information can be found at the EODHD API documentation .
Installation and setup
The eodhdR2 package relies on several supporting packages that need to be installed first:
install.packages (c ("httr" , "jsonlite" , "lubridate" , "dplyr" , "readr" ))
install.packages ("eodhdR2" )
library (eodhdR2)
from eodhd import APIClient
using Pkg
Pkg .add (["HTTP" , "JSON3" , "DataFrames" , "Dates" ])
using HTTP , JSON3 , DataFrames , Dates
API token setup
An API token is like a digital key that identifies you to the EODHD service. The token is a unique string of characters that tells the server who you are and what data you are allowed to access.
Register at eodhd.com for a free or paid account. Once the plan is active, an API key is generated in your account.
There are two main options for API access:
Personal API key : Full access to all functions including splits data
Demo key : Limited to basic price and dividend data only
token = "YOUR_API_KEY_HERE" # or "demo" for limited access
set_token (token)
api = APIClient("YOUR_API_KEY_HERE" ) # or "demo" for limited access
const TOKEN = "YOUR_API_KEY_HERE" # or "demo" for limited access
const BASE_URL = "https://eodhd.com/api"
Downloading data
prices = get_prices ("AAPL" , "US" )
head (prices, 5 )
import pandas as pd
data = api.get_eod_historical_stock_market_data(
symbol= "AAPL.US" ,
period= "d"
)
prices = pd.DataFrame(data)
print (prices.head())
function get_prices (symbol, exchange)
url = " $ BASE_URL/eod/ $ symbol. $ exchange?api_token= $ TOKEN&fmt=json"
response = HTTP.get (url)
data = JSON3.read (String (response.body))
return DataFrame (data)
end
prices = get_prices ("AAPL" , "US" )
first (prices, 5 )
We obtained the data we use in these notes with permission from EODHD.
Other sources
Bloomberg
Bloomberg is the dominant market-data platform in finance. Bloomberg data can be accessed programmatically from R, Python and Julia.
LSE students have access to a number of Bloomberg terminals in the library and the master students’ common rooms.
Wind
The Wind Financial Terminal (WFT) also provides market data like the Bloomberg Terminal but with a specific focus on the Chinese financial markets. It supports APIs for multiple languages. LSE has access to Wind.
WRDS
The Wharton business school at the University of Pennsylvania provides a service called Wharton Research Data Services (WRDS) that many universities subscribe to. This provides a common interface to several databases, including CRSP and TAQ high-frequency data. WRDS and many of its databases are available to LSE students and staff.
Yahoo Finance
The go-to place for many researchers requiring financial data has been finance.yahoo.com . Many software packages can automatically download this data for free.
There are three problems with Yahoo Finance:
Yahoo occasionally changes how the API works, requiring updates to software;
The service often goes offline for days or weeks;
There are errors in the data. For example, UK prices, quoted in pence by convention, sometimes appear in pounds for one or two days before reverting to pence. On other occasions, values are silently revised after the fact.
Federal Reserve Economic Data (FRED)
FRED (Federal Reserve Economic Data), at fred.stlouisfed.org , is a good source for macroeconomic data, including unemployment, GDP, interest rates and the money supply.
Alpha Vantage
Alpha Vantage provides free daily and real-time stock price data with API access in multiple languages. Its free data shows similar quality problems to Yahoo Finance.
Nasdaq Data Link
Nasdaq Data Link (formerly Quandl) provides API access in multiple languages to a large number of commercial databases, some of which are free. While comprehensive, one may need to subscribe to data from several providers.
Fama-French Data Library
The Fama-French Data Library provides a large amount of historical data compiled by Eugene Fama and Kenneth French. The data is updated regularly, and the Fama-French 3-factor data is especially useful for analysing fund and portfolio performance.
BIS
The BIS provides a useful database on credit and banking statistics. You can access it directly at stats.bis.org .
World Bank
The World Bank provides economic development data, including national accounts and poverty indicators, accessible through its Open Data portal .
OECD
The OECD provides data on member states, including national accounts and labour-market statistics, accessible through its OECD Data Explorer .