PROJECT STRATA

Methodology

How Project Strata calculates bond analytics, risk metrics, and portfolio values. All formulas are industry-standard and traceable.

Bond Pricing

Present value calculations for fixed-income securities

Dirty Price from Yield

Computes the present value of all future cashflows by discounting each at the yield to maturity using periodic compounding.

P=i=1nCFi(1+ym)mtiP = \sum_{i=1}^{n} \frac{CF_i}{\left(1 + \frac{y}{m}\right)^{m \cdot t_i}}

Variables

PPDirty price (per 100 par)
CFiCF_iCashflow at time t_i (coupon or principal)
yyYield to maturity (annual, decimal)
mmCoupon frequency (1, 2, 4, or 12 per year)
tit_iTime to cashflow i in years

Assumptions

  • Periodic compounding at coupon frequency (not continuous)
  • ACT/365 Fixed day count for time fractions
  • No business day adjustments applied
  • All cashflows received on scheduled dates

Industry Comparison

Excel PRICE(): Uses 30/360 by default; specify basis=3 for ACT/365 to match
Bloomberg DPRICE: Matches when configured with same day count and compounding

YTM Solver (Bisection)

Finds the yield that equates the discounted cashflows to the target dirty price. Uses bisection with bracket expansion.

Find y such that P(y)=Ptarget\text{Find } y \text{ such that } P(y) = P_{target}

Variables

yyYield to maturity being solved for
P(y)P(y)Dirty price as a function of yield
PtargetP_{target}Target dirty price = clean + accrued

Assumptions

  • Initial bracket: -5% to +50% yield
  • Bracket expands (doubles upper bound) up to 8 times if needed
  • Maximum 80 iterations for convergence
  • Tolerance: 10^-10 price error

Industry Comparison

Excel YIELD(): Uses Newton-Raphson; may differ at edge cases
Bloomberg YLD: Generally matches for standard bonds

Cashflow Generation

Generates the coupon schedule by walking backward from maturity in regular coupon periods.

CFi=Cm100(coupon)+100(at maturity)CF_i = \frac{C}{m} \cdot 100 \quad \text{(coupon)} \quad + \quad 100 \quad \text{(at maturity)}

Variables

CFiCF_iCashflow at period i (per 100 par)
CCAnnual coupon rate (decimal)
mmCoupon frequency per year

Assumptions

  • Regular periods (no odd first/last coupons)
  • Principal returned at maturity only
  • No amortization

Curve Pricing (Zero Rates)

Discounts cashflows using interpolated zero rates from the yield curve with continuous compounding.

P=i=1nCFier(ti)tiP = \sum_{i=1}^{n} CF_i \cdot e^{-r(t_i) \cdot t_i}

Variables

PPDirty price (per 100 par)
CFiCF_iCashflow at time t_i
r(ti)r(t_i)Interpolated zero rate at time t_i (continuous, decimal)
tit_iTime to cashflow in years

Assumptions

  • Continuous compounding for discount factors
  • Linear interpolation between curve points
  • Flat extrapolation beyond curve boundaries
  • ACT/365 Fixed for time fractions

Industry Comparison

Bloomberg CDSW: Uses similar interpolation; check compounding convention

Curve + Spread Pricing

Adds a credit spread to the benchmark UST yield, then prices using periodic compounding.

yeffective=yUST+s10000y_{effective} = y_{UST} + \frac{s}{10000}

Variables

yeffectivey_{effective}Effective yield for discounting (decimal)
yUSTy_{UST}Interpolated UST benchmark yield (decimal)
ssCredit spread in basis points

Assumptions

  • UST benchmark matches bond maturity via interpolation
  • Spread applied as parallel shift to all cashflows
  • Periodic compounding (not continuous)

Industry Comparison

Bloomberg ASW: Asset swap spread may differ; uses different calculation

Risk Metrics

Duration, convexity, and sensitivity measures

Modified Duration

Measures the percentage price sensitivity to a 1% change in yield. Computed using finite difference (1bp bump).

Dmod=1PPy1PP+1bpP1bp20.0001D_{mod} = -\frac{1}{P} \cdot \frac{\partial P}{\partial y} \approx -\frac{1}{P} \cdot \frac{P_{+1bp} - P_{-1bp}}{2 \cdot 0.0001}

Variables

DmodD_{mod}Modified duration (years)
PPCurrent dirty price
P+1bpP_{+1bp}Price at yield + 1bp
P1bpP_{-1bp}Price at yield - 1bp

Assumptions

  • Symmetric 1bp yield shock for finite difference
  • Assumes parallel shift in yield curve
  • Does not capture convexity effects

Industry Comparison

Excel MDURATION(): Uses analytical formula; small differences possible
Bloomberg DUR: Generally matches for standard fixed-rate bonds

Convexity

Measures the curvature of the price-yield relationship. Captures second-order effects not explained by duration.

C=1P2Py2P+1bp+P1bp2PP(0.0001)2C = \frac{1}{P} \cdot \frac{\partial^2 P}{\partial y^2} \approx \frac{P_{+1bp} + P_{-1bp} - 2P}{P \cdot (0.0001)^2}

Variables

CCConvexity (years squared)
PPCurrent dirty price
P+1bpP_{+1bp}Price at yield + 1bp
P1bpP_{-1bp}Price at yield - 1bp

Assumptions

  • Second derivative approximation via central difference
  • Same 1bp shock as duration calculation
  • Positive for standard bonds (price-yield curve is convex)

Industry Comparison

Bloomberg CNVX: Matches for most standard bonds

DV01 (Dollar Value of 01)

The change in portfolio value for a 1 basis point move in yield. Expressed in currency units.

DV01=Dmod×MV×0.0001DV01 = D_{mod} \times MV \times 0.0001

Variables

DV01DV01Dollar value of 1bp (in notional currency)
DmodD_{mod}Modified duration
MVMVMarket value = (P / 100) × Notional

Assumptions

  • Linear approximation using duration
  • Ignores convexity effects for large moves
  • Negative sign convention: rising yields = loss

Industry Comparison

Bloomberg DV01: May use slightly different scaling conventions

CS01 (Credit Spread 01)

The change in value for a 1 basis point move in credit spread. Only applicable in Curve+Spread mode.

CS01=P(s+1bp)P(s)CS01 = P(s+1bp) - P(s)

Variables

CS01CS01P&L impact per 1bp spread move (notional currency)
P(s)P(s)Price at current spread s
P(s+1bp)P(s+1bp)Price at spread s + 1bp

Assumptions

  • One-sided difference (spread up only)
  • UST benchmark held constant
  • Represents credit-specific risk separate from rates

Horizon Analysis

Projected returns when selling before maturity

Total Horizon Return

Decomposes the expected return from holding a bond to a future horizon into four components: carry, roll-down, price effect, and reinvestment.

Rtotal=Rcarry+Rrolldown+Rprice+RreinvestR_{total} = R_{carry} + R_{rolldown} + R_{price} + R_{reinvest}

Variables

RtotalR_{total}Total return (% of initial investment)
RcarryR_{carry}Carry return from coupon income
RrolldownR_{rolldown}Roll-down return from aging
RpriceR_{price}Price return from yield changes
RreinvestR_{reinvest}Reinvestment return from coupon compounding

Assumptions

  • Horizon date is before bond maturity
  • Bond is sold at horizon at market price
  • Yield change is a parallel shift
  • Coupons reinvested at specified rate until horizon

Carry Return

The return from coupon income received during the holding period, expressed as a percentage of the initial investment.

Rcarry=ti<TCFicouponP0N100R_{carry} = \frac{\sum_{t_i < T} CF_i^{coupon}}{P_0 \cdot \frac{N}{100}}

Variables

RcarryR_{carry}Carry return (decimal)
CFicouponCF_i^{coupon}Coupon payment at time t_i (per 100 par)
TTHorizon date
P0P_0Initial dirty price (per 100)
NNNotional amount

Assumptions

  • Only coupons received before horizon are included
  • Coupon amounts are per 100 par, scaled by notional
  • Initial investment is dirty price × notional / 100

Roll-Down Return

The price change from the bond 'aging' along the yield curve, assuming yields remain unchanged.

Rrolldown=PTunchangedP0P0R_{rolldown} = \frac{P_T^{unchanged} - P_0}{P_0}

Variables

RrolldownR_{rolldown}Roll-down return (decimal)
PTunchangedP_T^{unchanged}Clean price at horizon with unchanged yield
P0P_0Initial clean price

Assumptions

  • Yield to maturity remains constant
  • Bond 'rolls down' the curve as maturity shortens
  • Premium bonds have negative roll-down (pull to par)
  • Discount bonds have positive roll-down (pull to par)

Industry Comparison

Bloomberg HRZN: Similar decomposition; may use different interpolation

Price Return (Yield Change)

The price change due to assumed yield (or spread) movements between today and the horizon.

Rprice=PTnewPTunchangedP0R_{price} = \frac{P_T^{new} - P_T^{unchanged}}{P_0}

Variables

RpriceR_{price}Price return from yield change (decimal)
PTnewP_T^{new}Clean price at horizon with new yield
PTunchangedP_T^{unchanged}Clean price at horizon with unchanged yield
P0P_0Initial dirty price

Assumptions

  • Yield change is specified as basis points
  • In Curve+Spread mode, rate and spread changes are additive
  • Negative yield change → positive price return
  • Positive yield change → negative price return

Reinvestment Return

The additional income earned by reinvesting coupon payments at a specified rate until the horizon.

Rreinvest=ti<TCFi((1+r)Tti1)P0N100R_{reinvest} = \frac{\sum_{t_i < T} CF_i \cdot ((1+r)^{T-t_i} - 1)}{P_0 \cdot \frac{N}{100}}

Variables

RreinvestR_{reinvest}Reinvestment return (decimal)
CFiCF_iCoupon payment at time t_i
rrAnnual reinvestment rate (decimal)
TTTime to horizon (years)
tit_iTime of coupon payment (years)
P0P_0Initial dirty price

Assumptions

  • Coupons reinvested immediately upon receipt
  • Annual compounding at reinvestment rate
  • Default reinvestment rate equals current YTM
  • Return is FV of reinvested coupons minus face value

Horizon Price Calculation

The expected price of the bond at the horizon date, computed by discounting remaining cashflows at the horizon yield.

PT=i:ti>TCFi(1+yTm)m(tiT)P_T = \sum_{i: t_i > T} \frac{CF_i}{\left(1 + \frac{y_T}{m}\right)^{m \cdot (t_i - T)}}

Variables

PTP_TDirty price at horizon (per 100)
CFiCF_iCashflow at time t_i
yTy_TYield at horizon (initial yield + change)
mmCoupon frequency
TTHorizon date

Assumptions

  • Same pricing formula as initial pricing
  • Only cashflows after horizon are included
  • Settlement date for horizon pricing is the horizon date
  • Accrued interest at horizon affects clean/dirty split

Day Count Conventions

Standard methods for computing time fractions

30/360 US (Bond Basis)

Assumes each month has 30 days and each year has 360 days. Standard for US corporate bonds.

t=360(Y2Y1)+30(M2M1)+(D2D1)360t = \frac{360(Y_2 - Y_1) + 30(M_2 - M_1) + (D_2 - D_1)}{360}

Variables

ttYear fraction
Y1,Y2Y_1, Y_2Start and end years
M1,M2M_1, M_2Start and end months
D1,D2D_1, D_2Start and end days (adjusted)

Assumptions

  • If D1 = 31, set D1 = 30
  • If D1 = 30 or 31 and D2 = 31, set D2 = 30
  • If D1 is last day of February, set D1 = 30
  • If both D1 and D2 are last day of February, set D2 = 30

Industry Comparison

Excel YEARFRAC(): Use basis=0 for 30/360 US

ACT/ACT ISDA

Uses actual days, split across year boundaries. Standard for government securities.

t=days in non-leap years365+days in leap years366t = \frac{\text{days in non-leap years}}{365} + \frac{\text{days in leap years}}{366}

Variables

ttYear fraction

Assumptions

  • Period split at January 1 of each year
  • Each year portion uses that year's day count (365 or 366)
  • Full intermediate years count as exactly 1.0

Industry Comparison

Excel YEARFRAC(): Use basis=1 for ACT/ACT

ACT/360

Actual days divided by 360. Common for money market instruments.

t=actual days360t = \frac{\text{actual days}}{360}

Variables

ttYear fraction

Assumptions

  • Simple actual day count
  • Always divides by 360 regardless of leap year
  • Results in year fractions > 1 for periods > 360 days

Industry Comparison

Excel YEARFRAC(): Use basis=2 for ACT/360

ACT/365 Fixed

Actual days divided by 365. Ignores leap years. Used for UK gilts and some Asian markets.

t=actual days365t = \frac{\text{actual days}}{365}

Variables

ttYear fraction

Assumptions

  • Fixed denominator of 365
  • Does not adjust for leap years
  • Simple and predictable

Industry Comparison

Excel YEARFRAC(): Use basis=3 for ACT/365

Accrued Interest

Coupon accrual and clean/dirty price relationship

Accrued Interest

The portion of the next coupon that has accrued to the seller since the last coupon date.

AI=Cm×taccruedtperiodAI = \frac{C}{m} \times \frac{t_{accrued}}{t_{period}}

Variables

AIAIAccrued interest (per 100 par)
CCAnnual coupon rate (decimal)
mmCoupon frequency per year
taccruedt_{accrued}Year fraction from last coupon to settlement
tperiodt_{period}Year fraction for the full coupon period

Assumptions

  • Pro-rata accrual within coupon period
  • Day count convention determines time fractions
  • Buyer pays seller accrued at settlement

Industry Comparison

Excel ACCRINT(): Matches with same day count convention

Clean vs Dirty Price

The dirty (full) price includes accrued interest; the clean (quoted) price excludes it.

Pdirty=Pclean+AIP_{dirty} = P_{clean} + AI

Variables

PdirtyP_{dirty}Dirty/full price (actual settlement amount per 100)
PcleanP_{clean}Clean/quoted price (for comparability)
AIAIAccrued interest

Assumptions

  • Clean prices are quoted for comparability across bonds
  • Dirty price is the actual amount paid at settlement
  • Settlement amount = (Dirty / 100) × Notional

Portfolio Aggregation

Multi-asset calculations and currency conversion

Market-Value Weighted Metrics

Portfolio-level metrics are computed as market-value weighted averages of individual holdings.

Xportfolio=iwiXiiwiX_{portfolio} = \frac{\sum_i w_i \cdot X_i}{\sum_i w_i}

Variables

XportfolioX_{portfolio}Portfolio-level metric (e.g., duration, yield)
XiX_iMetric for holding i
wiw_iMarket value of holding i (in display currency)

Assumptions

  • All values converted to display currency before weighting
  • Weights are positive market values
  • Simple weighted average (not duration-weighted for some metrics)

FX Cross-Rate Calculation

Converts between currencies using triangulation through a base currency (USD).

FROMTO=1rates[FROM]×rates[TO]\frac{FROM}{TO} = \frac{1}{\text{rates}[FROM]} \times \text{rates}[TO]

Variables

FROMFROMSource currency
TOTOTarget currency
ratesratesMap of currency → units per 1 USD

Assumptions

  • USD is the base currency for rate quotes
  • All rates quoted as: 1 USD = X currency
  • Cross rates derived via USD triangulation

Industry Comparison

ECB rates: Primary source; EUR-based, converted to USD base

Portfolio Shock Analysis

Estimates P&L impact of rate/spread shocks using duration approximation.

ΔPDmod×P×Δy\Delta P \approx -D_{mod} \times P \times \Delta y

Variables

ΔP\Delta PEstimated price change
DmodD_{mod}Modified duration
PPCurrent price
Δy\Delta yYield shock (decimal)

Assumptions

  • Linear approximation (first-order only)
  • Ignores convexity (underestimates gains, overestimates losses)
  • Assumes parallel shift across all holdings

Portfolio Analytics

Efficient frontier optimization, Monte Carlo simulation, and risk metrics (VaR, CVaR)

Portfolio Variance

The variance of portfolio returns depends on individual asset variances and their covariances. This is the foundation of Modern Portfolio Theory (Markowitz, 1952).

σp2=wTΣw=i=1nj=1nwiwjσij\sigma_p^2 = \mathbf{w}^T \mathbf{\Sigma} \mathbf{w} = \sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_{ij}

Variables

σp2\sigma_p^2Portfolio variance
w\mathbf{w}Vector of asset weights (sum to 1)
Σ\mathbf{\Sigma}Covariance matrix of asset returns
σij\sigma_{ij}Covariance between assets i and j

Assumptions

  • Weights sum to 1 (fully invested)
  • Returns are multivariate normal
  • Covariance matrix is estimated from historical data
  • Past correlations persist in the future

Industry Comparison

Bloomberg PORT: Uses same formula; may apply shrinkage to covariance matrix
BARRA: Uses factor model covariance instead of sample covariance

Efficient Frontier (Mean-Variance Optimization)

Finds the set of portfolios offering the highest expected return for each level of risk. We use grid search over weight combinations to trace the frontier.

maxwwTμs.t.wTΣwσtarget2,wi=1\max_{\mathbf{w}} \quad \mathbf{w}^T \boldsymbol{\mu} \quad \text{s.t.} \quad \mathbf{w}^T \mathbf{\Sigma} \mathbf{w} \leq \sigma_{target}^2, \quad \sum w_i = 1

Variables

w\mathbf{w}Asset weight vector to optimize
μ\boldsymbol{\mu}Vector of expected returns
Σ\mathbf{\Sigma}Covariance matrix
σtarget\sigma_{target}Target portfolio volatility

Assumptions

  • Grid search with 5% weight increments (20 steps)
  • Long-only by default (weights ≥ 0)
  • Maximum 15 assets for performance
  • Expected returns estimated from historical mean

Industry Comparison

Bloomberg PORT: Uses quadratic programming (QP) solver for exact optimization
Excel Solver: Uses GRG Nonlinear or Simplex; more precise than grid search

Sharpe Ratio

Measures risk-adjusted return: the excess return per unit of volatility. The tangency portfolio has the highest Sharpe ratio on the efficient frontier.

SR=E[Rp]RfσpSR = \frac{E[R_p] - R_f}{\sigma_p}

Variables

SRSRSharpe ratio
E[Rp]E[R_p]Expected portfolio return (annualized)
RfR_fRisk-free rate (annualized)
σp\sigma_pPortfolio volatility (annualized)

Assumptions

  • Risk-free rate input by user (default 4%)
  • Returns are normally distributed
  • Excess return is the only measure of value
  • Volatility is the only measure of risk

Industry Comparison

Morningstar: Uses same formula; may adjust for survivorship bias

Capital Market Line (CML)

Shows the risk-return trade-off for portfolios combining the risk-free asset with the tangency (max Sharpe) portfolio.

E[R]=Rf+E[Rm]RfσmσE[R] = R_f + \frac{E[R_m] - R_f}{\sigma_m} \cdot \sigma

Variables

E[R]E[R]Expected return on CML portfolio
RfR_fRisk-free rate
E[Rm]E[R_m]Expected return of tangency portfolio
σm\sigma_mVolatility of tangency portfolio
σ\sigmaTarget portfolio volatility

Assumptions

  • Investors can borrow/lend at the risk-free rate
  • No transaction costs or taxes
  • All investors have homogeneous expectations

Sample Covariance Matrix

Estimates the covariance structure from historical returns. We use sample covariance with n-1 denominator (Bessel's correction).

σ^ij=1T1t=1T(ri,trˉi)(rj,trˉj)\hat{\sigma}_{ij} = \frac{1}{T-1} \sum_{t=1}^{T} (r_{i,t} - \bar{r}_i)(r_{j,t} - \bar{r}_j)

Variables

σ^ij\hat{\sigma}_{ij}Estimated covariance between assets i and j
ri,tr_{i,t}Return of asset i at time t
rˉi\bar{r}_iMean return of asset i
TTNumber of observations (default 252 days = 1 year)

Assumptions

  • Returns are stationary (stable over time)
  • Sample size is sufficient for reliable estimates
  • No structural breaks in correlation regime
  • Simple sample estimator (no shrinkage)

Industry Comparison

Bloomberg: Often uses Ledoit-Wolf shrinkage for more stable estimates
BARRA/Axioma: Uses factor models to reduce estimation error

Monte Carlo Simulation (Geometric Brownian Motion)

Projects portfolio value using correlated random walks. Each asset follows a log-normal process, which is the standard model in finance (same assumption as Black-Scholes).

St+Δt=Stexp[(μσ22)Δt+σΔtZ]S_{t+\Delta t} = S_t \cdot \exp\left[(\mu - \frac{\sigma^2}{2})\Delta t + \sigma \sqrt{\Delta t} \cdot Z\right]

Variables

StS_tAsset price at time t
μ\muExpected return (drift)
σ\sigmaVolatility
Δt\Delta tTime step (1 month)
ZZStandard normal random variable

Assumptions

  • Returns are log-normally distributed
  • Volatility and correlations are constant
  • No jumps or regime changes
  • Monthly time steps for computational efficiency

Industry Comparison

RiskMetrics: Similar approach; may use GARCH for time-varying volatility
Bloomberg MARS: Uses more complex models for derivatives

Cholesky Decomposition for Correlated Simulation

Transforms independent random variables into correlated ones using the Cholesky decomposition of the covariance matrix. This is the standard method in finance.

X=LZ,where Σ=LLT\mathbf{X} = \mathbf{L} \cdot \mathbf{Z}, \quad \text{where } \mathbf{\Sigma} = \mathbf{L} \mathbf{L}^T

Variables

X\mathbf{X}Correlated random vector
L\mathbf{L}Lower triangular Cholesky factor
Z\mathbf{Z}Vector of independent standard normals
Σ\mathbf{\Sigma}Target covariance matrix

Assumptions

  • Covariance matrix is positive semi-definite
  • Small regularization (10^-10) added for numerical stability
  • Independent normals generated via Box-Muller transform

Industry Comparison

All major risk systems: Cholesky is the universal standard for correlated simulation

Value at Risk (Historical Simulation VaR)

Estimates the maximum loss at a given confidence level. We use the percentile of simulated terminal values (historical simulation approach).

VaRα=Initial ValuePercentile1α(Terminal Values)\text{VaR}_{\alpha} = \text{Initial Value} - \text{Percentile}_{1-\alpha}(\text{Terminal Values})

Variables

VaRα\text{VaR}_{\alpha}Value at Risk at α confidence (e.g., 95%)
α\alphaConfidence level (0.95 or 0.99)
1α1-\alphaLeft tail percentile (5% or 1%)

Assumptions

  • Simulated returns from Monte Carlo paths
  • VaR reported as positive loss amount
  • Horizon-specific (not scaled by square-root of time)
  • Does not indicate severity beyond VaR threshold

Industry Comparison

Basel III/IV: Requires historical simulation or internal models
RiskMetrics: Also offers parametric VaR using delta-normal method

CVaR / Expected Shortfall

The average loss in the worst α% of scenarios. Unlike VaR, CVaR tells you how bad losses are when they exceed VaR. Required by Basel III for market risk.

CVaRα=E[LossLoss>VaRα]=1ntaili:Li>VaRLi\text{CVaR}_{\alpha} = E[\text{Loss} \mid \text{Loss} > \text{VaR}_{\alpha}] = \frac{1}{n_{tail}} \sum_{i: L_i > \text{VaR}} L_i

Variables

CVaRα\text{CVaR}_{\alpha}Conditional VaR / Expected Shortfall at α
ntailn_{tail}Number of observations in tail (worst 5%)
LiL_iLoss in scenario i

Assumptions

  • Simple average of losses beyond VaR threshold
  • More conservative than VaR (always ≥ VaR)
  • Coherent risk measure (subadditive)
  • Sensitive to tail distribution shape

Industry Comparison

Basel III: Required for market risk capital; called Expected Shortfall
Solvency II: Insurance uses similar tail-based risk measures

Bond Return Proxy (Duration Approximation)

For bonds without direct price history, we proxy returns using UST yield changes and duration. This captures rate sensitivity but not credit spread movements.

rbondc252DmodΔyr_{bond} \approx \frac{c}{252} - D_{mod} \cdot \Delta y

Variables

rbondr_{bond}Daily bond return estimate
ccAnnual coupon rate (decimal)
DmodD_{mod}Modified duration
Δy\Delta yDaily change in benchmark UST yield

Assumptions

  • UST benchmark matched by duration: ^IRX (3M), ^FVX (5Y), ^TNX (10Y), ^TYX (30Y)
  • Credit spread held constant (rates-only proxy)
  • Linear duration approximation (ignores convexity)
  • Daily carry approximated as annual coupon / 252

Industry Comparison

Bloomberg BRTN: Uses actual price changes; more accurate for corporate bonds

Data Sources

External data feeds and refresh schedules

UST Yield Curve

US Treasury par yields for benchmark pricing

Daily (market close)
  • Source: treasury.gov XML feed
  • Tenors: 1M, 2M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, 30Y
  • Interpolated for non-standard maturities

FX Exchange Rates

Foreign exchange rates for currency conversion

Daily (ECB reference rate)
  • Primary: European Central Bank (ECB)
  • Fallback providers for ECB downtime
  • Supports G10 + RUB, THB

Equity Market Data

Stock prices, fundamentals, and historical data

Intraday (delayed)
  • Price history: Alpha Vantage
  • Fundamentals: Financial Modeling Prep (FMP)
  • Some fundamental metrics may be unavailable

Project Strata is for educational purposes. Calculations are illustrative and should not be used for actual trading decisions.