Skip to main content
PROJECT STRATA
  • Dashboard
  • Bond Lab
GlossaryAccountSign In
HomeWatchlistAccount
PROJECT STRATA

Methodology

How Strata calculates every metric — and where more than one method exists, which we use and why. Click an entry to expand.

Fixed Income

›
Fixed Income · rate sensitivity

Duration

How much a bond's price moves when rates move. Four measures, each handling a case the one below it can't.

01Macaulayfoundation
The weighted-average time to the bond's cashflows — when, on average, you're paid back.
DMac=∑tt PV(CFt)PD_{\mathrm{Mac}} = \dfrac{\sum_t t\,\mathrm{PV}(\mathrm{CF}_t)}{P}DMac​=P∑t​tPV(CFt​)​
It's a time in years, not a price sensitivity — you can't apply it directly to a yield move.
▲ why a step upMacaulay is a time in years; dividing by 1+y/k1+y/k1+y/k turns it into a price sensitivity — the % move per 1% change in yield.
02Modifiedworking
The % price change for a 1% parallel yield move (Strata computes it via a 1bp finite difference).
Dmod=DMac1+y/kD_{\mathrm{mod}} = \dfrac{D_{\mathrm{Mac}}}{1 + y/k}Dmod​=1+y/kDMac​​
Assumes the cashflows are fixed — wrong for callables, putables and MBS, whose cashflows move with rates.
▲ why a step upModified assumes fixed cashflows; Effective re-prices under ±Δy\pm\Delta y±Δy, so callables and MBS whose cashflows change with rates are handled honestly. (For a vanilla bond, Deff=DmodD_{\mathrm{eff}} = D_{\mathrm{mod}}Deff​=Dmod​.)
03Effectiveadvanced◢ default
Re-price the bond at yield −Δy-\Delta y−Δy and +Δy+\Delta y+Δy and take the symmetric slope — because it re-prices, an embedded option's effect on the cashflows is captured directly.
Deff=P−−P+2 P ΔyD_{\mathrm{eff}} = \dfrac{P_{-} - P_{+}}{2\,P\,\Delta y}Deff​=2PΔyP−​−P+​​
Needs a full revaluation at each shock — overkill for a plain vanilla bond where it just equals modified duration.
▲ why a step upEffective bumps the whole curve in parallel; Key-rate bumps each tenor on its own — because the 2y and 30y rarely move together — and the per-tenor buckets sum to the effective duration.
04Key-ratecurve-aware◢ default
Sensitivity to a 1bp shift at each tenor (2/5/10/30y) separately, spread to neighbours by a triangular kernel; the buckets sum back to effective duration.
KRDi=−1P∂P∂zi,∑iKRDi≈Deff\mathrm{KRD}_i = -\dfrac{1}{P}\dfrac{\partial P}{\partial z_i}, \qquad \sum_i \mathrm{KRD}_i \approx D_{\mathrm{eff}}KRDi​=−P1​∂zi​∂P​,i∑​KRDi​≈Deff​
Needs a full curve and per-tenor revaluation — overkill for a single vanilla bond.
▸ Variables
DMacD_{\mathrm{Mac}}DMac​Macaulay duration — the cashflow-weighted average time to repayment (years)
DmodD_{\mathrm{mod}}Dmod​Modified duration — % price change per 1% yield move
DeffD_{\mathrm{eff}}Deff​Effective duration — sensitivity from re-pricing under ±Δy\pm\Delta y±Δy
KRDi\mathrm{KRD}_iKRDi​Key-rate duration at tenor TiT_iTi​ (sums to effective duration)
P, P−, P+P,\ P_{-},\ P_{+}P, P−​, P+​Current dirty price, and the price after a yield cut / rise of Δy\Delta yΔy
y, k, Δyy,\ k,\ \Delta yy, k, ΔyYield, coupon periods per year, and the size of the yield shift
CFt, t\mathrm{CF}_t,\ tCFt​, tCashflow at time ttt, and the time to it

△ The insight

Each rung doesn't replace the one below — it removes an assumption: Macaulay→Modified drops the time-units, Modified→Effective drops fixed-cashflows, Effective→Key-rate drops the parallel-shift. You climb only as far as the bond demands.

What Strata computes

Strata quotes Effective Duration for any bond — it's honest whether or not there's optionality — and Key-Rate Duration for curve risk. Modified duration is computed via a 1bp finite difference; Macaulay and modified are the rungs you climb to understand the number, but a vanilla approximation isn't what you'd quote on a callable.

Assumptions

  • •Modified duration uses a symmetric 1bp finite-difference bump; effective duration re-prices under a curve shock.
  • •Key-rate durations are verified against QuantLib parallel-bump effective duration in CI (∑KRDi≈Deff\sum \mathrm{KRD}_i \approx D_{\mathrm{eff}}∑KRDi​≈Deff​).

Limitations

  • —Duration is first-order — for large yield moves pair it with convexity.
  • —Macaulay/Modified assume fixed cashflows; only Effective and Key-rate capture embedded-option effects.

vs Industry Tools

Bloomberg DUR / KRD: Same measures; Bloomberg's default key-tenor set usually adds short-end keys (0.5Y, 1Y).
Excel MDURATION() / DURATION(): Return the analytic parallel-shift duration only; Key-rate decomposes that into per-tenor buckets.

Related

↗Convexity↗DV01↗CS01↗Credit Spread
Go deeper
CFA — Fixed-Income Risk & Return
›
Fixed Income · rate sensitivity

Convexity

The curvature of the price-yield relationship — the second-order correction duration alone misses on large yield moves.

C=1P∂2P∂y2≈P++P−−2PP (Δy)2C = \dfrac{1}{P}\dfrac{\partial^2 P}{\partial y^2} \approx \dfrac{P_{+} + P_{-} - 2P}{P\,(\Delta y)^2}C=P1​∂y2∂2P​≈P(Δy)2P+​+P−​−2P​
▸ Variables
CCCConvexity, in years-squared
PPPCurrent dirty price
P+, P−P_{+},\ P_{-}P+​, P−​Price after a yield rise / cut of Δy\Delta yΔy (Strata uses a 1bp bump)
Δy\Delta yΔySize of the symmetric yield shock (default 1bp)

What Strata computes

Strata computes convexity by central finite difference at the same 1bp bump it uses for duration: C≈(P++P−−2P)/(P (Δy)2)C \approx (P_{+} + P_{-} - 2P)/(P\,(\Delta y)^2)C≈(P+​+P−​−2P)/(P(Δy)2). For a vanilla bond convexity is positive, so the duration estimate always under-states the gain on a rate cut and over-states the loss on a rise — convexity adds the missing curvature back.

Assumptions

  • •Second derivative approximated by central difference at the same 1bp shock as duration.
  • •Cashflows are fixed — for callables/MBS, effective convexity (re-pricing) is needed and can turn negative.
  • •Positive for standard option-free bonds (the price-yield curve bows toward the origin).

Limitations

  • —It's a second-order term — the price approximation ΔP/P≈−Dmod Δy+12C (Δy)2\Delta P/P \approx -D_{\mathrm{mod}}\,\Delta y + \tfrac12 C\,(\Delta y)^2ΔP/P≈−Dmod​Δy+21​C(Δy)2 still truncates the Taylor series at order two.
  • —Fixed-cashflow convexity misses embedded optionality; a callable bond can show negative effective convexity near the call strike, which this formula won't see.
  • —The finite-difference value is sensitive to the bump size — too small and floating-point noise dominates, too large and the curvature is itself averaged away.

vs Industry Tools

Bloomberg CNVX: Matches for most standard fixed-rate bonds; effective convexity diverges once optionality is present.

Related

↗Duration↗DV01
Go deeper
CFA — Fixed-Income Risk & Return
›
Fixed Income · rate sensitivity

DV01

The change in a position's value for a 1bp move in yield — duration translated from a percentage into hard currency.

DV01=Dmod×MV×0.0001\mathrm{DV01} = D_{\mathrm{mod}} \times \mathrm{MV} \times 0.0001DV01=Dmod​×MV×0.0001
▸ Variables
DV01\mathrm{DV01}DV01Currency value of a 1bp yield move (in the notional currency)
DmodD_{\mathrm{mod}}Dmod​Modified duration of the bond
MV\mathrm{MV}MVMarket value of the position, MV=(P/100)×notional\mathrm{MV} = (P/100)\times\text{notional}MV=(P/100)×notional

What Strata computes

Strata reports DV01 as a positive magnitude — the size of the P&L for a 1bp move — and applies the direction by convention at use: rising yields are a loss for a long position, a gain for a short. It is derived from the same modified duration Strata computes via a 1bp finite difference, so the number is consistent with the duration shown alongside it.

Assumptions

  • •Linear (first-order) approximation through duration — convexity is ignored, so it over/under-states for large moves.
  • •Direction is a sign convention applied to the magnitude: a long position loses as yields rise.
  • •Market value uses the current dirty price scaled to the position's notional.

Limitations

  • —First-order only: for moves beyond a handful of basis points, pair it with convexity.
  • —It's a parallel-yield sensitivity — for curve risk, the per-tenor analogue is key-rate DV01 (the dollar version of key-rate duration).
  • —DV01 scales with market value, so two bonds with equal duration but different prices/notionals carry different DV01 — compare on a like-for-like notional.

vs Industry Tools

Bloomberg DV01: Same concept; Bloomberg may use a slightly different scaling (per million notional vs per position) — check the unit.

Related

↗Duration↗CS01
Go deeper
CFA — Fixed-Income Risk & Return
›
Fixed Income · relative value

CS01

The change in a position's value for a 1bp move in credit spread, with the benchmark curve held still — DV01's credit-side twin.

CS01=P(s+1bp)−P(s)\mathrm{CS01} = P(s + 1\text{bp}) - P(s)CS01=P(s+1bp)−P(s)
▸ Variables
CS01\mathrm{CS01}CS01P&L impact per 1bp spread move (in the notional currency)
P(s)P(s)P(s)Price at the current credit spread sss
P(s+1bp)P(s + 1\text{bp})P(s+1bp)Price after widening the spread by 1bp
sssCredit spread over the benchmark curve, in basis points

What Strata computes

Strata computes CS01 only in Curve+Spread pricing mode — the only mode where a credit spread is a separate, bumpable input — as a one-sided difference: re-price with the spread widened 1bp, holding the UST benchmark fixed. This isolates credit-specific risk from rate risk, so a desk can hedge the two legs independently.

Assumptions

  • •One-sided difference (spread widened by 1bp only), not a symmetric central bump.
  • •The benchmark (UST) curve is held constant — only the spread moves.
  • •Available in Curve+Spread mode; the All-in YTM and Pure Curve modes have no separable spread to bump.

Limitations

  • —Captures credit-spread risk only — it says nothing about benchmark-rate risk, which is DV01's job.
  • —First-order: a parallel 1bp spread bump, so it misses spread-curve steepening and any spread convexity.
  • —Undefined outside Curve+Spread mode, where the spread isn't an independent input.

vs Industry Tools

Bloomberg CS01 / spread DV01: Same concept (P&L per 1bp of spread); conventions on one-sided vs symmetric bumps can produce small differences.

Related

↗DV01↗Credit Spread
Go deeper
CFA — Fixed-Income: Yield & Spread Measures
›
Fixed Income · relative value

Credit Spread

How much extra yield a bond pays over a risk-free benchmark. Four measures, each handling a case the one below it can't.

01G-Spreadfoundation
The bond's yield over the government curve at its maturity — a single point.
G=ycc−rgovt(T)\mathrm{G} = y^{cc} - r^{\text{govt}}(T)G=ycc−rgovt(T)
Reads one point on the curve; a steep or kinked curve between now and TTT is invisible to it.
└I-Spreadvariant
Same single-point read, but over the swap curve instead of governments — the funding benchmark for many desks.
I=ycc−rswap(T)\mathrm{I} = y^{cc} - r^{\text{swap}}(T)I=ycc−rswap(T)
Use when the swap curve is your funding/relative-value benchmark rather than governments.
Uses Strata's estimated swap curve (SOFR + post-GFC spreads), not a live par-swap curve — indicative, not trade-grade.
▲ why a step upG/I read the spread at a single maturity; Z spreads a constant over every curve point, so it reflects the shape G/I miss. (Z = G when the curve is flat.)
02Z-Spreadworking◢ default
One constant spread added across the whole zero curve that re-prices the bond — so the curve's shape is in the number.
Pmkt=∑tCFt(1+z(t)+Z)tP_{\text{mkt}} = \sum_{t} \dfrac{CF_t}{\bigl(1 + z(t) + Z\bigr)^{t}}Pmkt​=t∑​(1+z(t)+Z)tCFt​​
Still assumes deterministic cashflows — it can't see embedded-option value in callables or putables.
└Asset-Swap Spreadvariant
The spread over the floating index in a par asset-swap package — coupon-vs-swap plus a price-to-par adjustment.
ASW≈(C−rswap)+100−PcleanA\mathrm{ASW} \approx (C - r^{\text{swap}}) + \dfrac{100 - P^{\text{clean}}}{A}ASW≈(C−rswap)+A100−Pclean​
Use when the trade is structured as an asset swap (bond + matching IRS to par).
A par-construction approximation: ≈\approx≈ Z near par, but it diverges for deep-discount or premium bonds.
▲ why a step upZ assumes fixed cashflows; OAS reprices the bond in a short-rate lattice (V0V_0V0​ = backward-induction price), removing option value. (OAS = Z when there's no optionality.)
03Option-Adjusted Spreadadvanced◢ default
The spread over the curve inside a short-rate tree, so embedded-option value is priced out — callable and bullet bonds finally compare on equal terms.
Pmkt=V0(z(t)+OAS; σ)P_{\text{mkt}} = V_0\bigl(z(t) + \mathrm{OAS};\ \sigma\bigr)Pmkt​=V0​(z(t)+OAS; σ)
Model-dependent — BDT vs Hull-White give slightly different numbers — and it needs a rate-volatility σ\sigmaσ assumption.
▸ Variables
yccy^{cc}yccBond yield-to-maturity, converted to continuous compounding: ycc=f ln⁡(1+yper/f)y^{cc} = f\,\ln(1 + y^{\text{per}}/f)ycc=fln(1+yper/f)
ypery^{\text{per}}yperQuoted (periodic) YTM at frequency fff
fffCoupon periods per year
rgovt(T)r^{\text{govt}}(T)rgovt(T)Government zero rate interpolated at the bond's maturity TTT (UST, or ECB AAA for EUR)
rswap(T)r^{\text{swap}}(T)rswap(T)Swap rate interpolated at TTT (Strata's estimated USD SOFR curve)
z(t)z(t)z(t)Government zero rate at each cashflow time ttt (the whole curve, not one point)
ZZZThe constant spread added to every curve point that re-prices the bond
CFtCF_tCFt​Cashflow at time ttt
PmktP_{\text{mkt}}Pmkt​Observed market (dirty) price
σ\sigmaσAssumed short-rate volatility (the OAS tree input)
CCCBond coupon rate; AAA = the swap annuity (PV of 1bp over the schedule)

What Strata computes

Strata computes all four and shows them together. For an option-free bond you'd quote the Z-Spread; for a callable/putable bond the OAS (the engine is BDT for Student/API tiers, Hull-White 1F for Professional). G- and I-Spread are the single-point reads you climb through to understand them.

Assumptions

  • •All yields are converted to continuous compounding before differencing, so spreads are comparable across coupon frequencies.
  • •Z-Spread and OAS solve for the spread that re-prices the bond against Strata's zero curve (bisection).
  • •OAS prices embedded options in a calibrated short-rate tree at the chosen volatility.

Limitations

  • —G/I-Spread for non-USD/EUR bonds fall back to the UST benchmark — a cross-currency read; treat as indicative.
  • —I-Spread and ASW rest on Strata's estimated USD swap curve, not a live traded par-swap curve.
  • —OAS depends on the model + the volatility input — quote the engine alongside the number.

vs Industry Tools

Bloomberg YAS / OAS1: Same ladder (G/I/Z/OAS); Strata's I-Spread/ASW use an estimated swap curve, so expect small differences there.

Related

↗CS01↗Bond Pricing↗YTM Solver
Go deeper
CFA — Fixed-Income: Yield & Spread Measures
›
Fixed Income · valuation

Bond Pricing

Three ways to discount a bond's cashflows to a price. They differ by which inputs you have — a single yield, a full curve, or a curve plus a credit spread.

ApproachHow it builds the distributionUse when
All-in YTM◢ defaultDiscount every cashflow at one yield, compounding mmm times a year — the quote-screen number when all you have is a single YTM.you have (or are solving for) one yield-to-maturity and want the quote-screen price.
Pure CurveDiscount each cashflow at its own continuously-compounded zero rate off the curve — the term structure's shape is now in the price.you have a full zero curve and want the curve-consistent, credit-free benchmark value.
Curve+SpreadAdd a credit spread to the interpolated benchmark yield, then discount — separating rate risk (the curve) from credit risk (the spread).you have a benchmark curve and a credit spread, and want to bump rates and credit independently (the mode CS01 needs).

Dirty price

P=PV of all cashflowsP = \text{PV of all cashflows}P=PV of all cashflows

Every mode outputs the dirty (full) price per 100 par — the present value of every coupon and principal cashflow. The clean (quoted) price is this minus accrued interest.

▸ Variables
PPPDirty price (per 100 par) — the output of every mode
CFi, tiCF_i,\ t_iCFi​, ti​Cashflow iii and its time in years (from the coupon schedule)
yyyYield to maturity (annual, decimal) for the all-in mode
mmmCoupon frequency per year (1, 2, 4 or 12)
r(ti)r(t_i)r(ti​)Interpolated zero rate at time tit_iti​ (continuous, decimal) for the curve mode
yUSTy_{\mathrm{UST}}yUST​Interpolated UST benchmark yield at the bond's maturity
sssCredit spread over the benchmark, in basis points

△ The insight

All three discount the same cashflows — they differ only in the discount rate they build: one number, a whole curve, or a curve plus a spread. Curve+Spread is the only mode that splits rate risk from credit risk, which is why DV01 and CS01 live there.

What Strata computes

Strata defaults to All-in YTM because a single yield is the input you most often have from a quote screen, and it's the price the YTM solver inverts. It switches to Curve+Spread the moment you supply a benchmark curve and a credit spread (so it can show DV01/CS01 separately), and to Pure Curve when you want the credit-free, curve-consistent benchmark value.

Assumptions

  • •All-in YTM and Curve+Spread use periodic compounding at the coupon frequency; Pure Curve uses continuous compounding.
  • •ACT/365 Fixed day count for time fractions; no business-day adjustments; cashflows received on scheduled dates.
  • •The curve modes use log-linear interpolation in the zero rate between curve points (falling back to plain linear when a bounding rate is non-positive), with flat extrapolation beyond the curve.

Limitations

  • —All-in YTM collapses the term structure to one number — wrong for a steep or kinked curve.
  • —Pure Curve omits credit entirely; Curve+Spread restores it but only as a parallel spread shift.
  • —None of the three prices embedded optionality — for callables/putables that's the OAS/short-rate-tree machinery in the credit-spread ladder.

vs Industry Tools

Excel PRICE(): All-in YTM analogue; defaults to 30/360 — set basis=3 for ACT/365 to match Strata.
Bloomberg DPRICE / CDSW: DPRICE matches the all-in mode with the same day count + compounding; CDSW mirrors the curve mode (check the compounding convention).

Related

↗YTM Solver↗Day-Count Conventions↗Accrued Interest↗Credit Spread↗CS01
Go deeper
CFA — Fixed-Income: Introduction to Valuation
›
Fixed Income · valuation

YTM Solver

The inverse of pricing: find the single yield that discounts a bond's cashflows back to its observed price.

Find y  such that  P(y)=Ptarget\text{Find } y \ \text{ such that } \ P(y) = P_{\mathrm{target}}Find y  such that  P(y)=Ptarget​
▸ Variables
yyyYield to maturity being solved for
P(y)P(y)P(y)Dirty price as a function of yield (the All-in YTM pricing map)
PtargetP_{\mathrm{target}}Ptarget​Target dirty price, =clean+accrued= \text{clean} + \text{accrued}=clean+accrued

What Strata computes

Strata solves YTM by bisection with bracket expansion, not Newton-Raphson: it brackets the yield in [−5%, +50%][-5\%,\ +50\%][−5%, +50%], doubles the upper bound up to 8 times if the root sits higher, then halves the interval to a 10−1010^{-10}10−10 price tolerance (max 80 iterations). Bisection is chosen for robustness — it can't diverge or overshoot the way a derivative-based method can on a badly-conditioned bond.

Assumptions

  • •Initial bracket of −5%-5\%−5% to +50%+50\%+50% yield, with the upper bound doubling up to 8 times if needed.
  • •Convergence at a 10−1010^{-10}10−10 price-error tolerance, capped at 80 iterations.
  • •Price is monotone in yield (a single root) — true for option-free fixed-rate bonds.

Limitations

  • —Bisection is robust but slower than Newton-Raphson — it converges linearly, not quadratically.
  • —Assumes a single monotone root; for callable/putable bonds with multiple yield measures, you solve YTC/YTP/YTW separately and take the worst.
  • —Returns a single all-in yield — it collapses any term-structure shape, exactly as the All-in YTM pricing mode does.

vs Industry Tools

Excel YIELD(): Uses Newton-Raphson; can differ from Strata's bisection at edge cases (deep discount/premium, near-maturity).
Bloomberg YLD: Generally matches for standard fixed-rate bonds.

Related

↗Bond Pricing
Go deeper
CFA — Fixed-Income: Yield Measures
›
Fixed Income · conventions

Day-Count Conventions

Four rules for turning a span of calendar dates into a year fraction. The choice is market convention, and it changes accrued interest and the discount-time of every cashflow.

ApproachHow it builds the distributionUse when
ACT/365 Fixed◢ defaultCount the real days, always divide by 365 — simple and predictable, ignoring leap years entirely.pricing in Strata, UK gilts, and several Asian markets — Strata's engine default for all time fractions.
30/360 USPretend every month has 30 days and every year 360 — so each coupon period is exactly equal, the US corporate-bond convention.quoting US corporate bonds, where equal idealised periods are the market standard.
ACT/ACT ISDACount real days, split at each year boundary, and divide each slice by that year's own length — the most calendar-accurate rule.pricing government securities, where calendar-exact accrual is the convention.
ACT/360Count real days, divide by 360 — the money-market convention that makes a year worth slightly more than 1.0.money-market instruments and floating-rate notes, where ACT/360 is the standard.

Year fraction

t=day-count numeratordenominatort = \dfrac{\text{day-count numerator}}{\text{denominator}}t=denominatorday-count numerator​

Each convention is a numerator (real days, or idealised 30-day months) over a denominator (360, 365 or the year's own length). The denominator is the quirk: 360 inflates, fixed-365 ignores leap years, ACT/ACT alone matches the calendar.

▸ Variables
tttYear fraction — the output of every convention
Y1,Y2Y_1, Y_2Y1​,Y2​Start and end years (the 30/360 inputs)
M1,M2M_1, M_2M1​,M2​Start and end months
D1,D2D_1, D_2D1​,D2​Start and end days, after the 30/360 day adjustments

△ The insight

The numerator (real vs idealised days) and the denominator (360, fixed 365, or the calendar year) together set the year fraction — so the same dates accrue different interest under each convention. ACT/360 inflates it, 30/360 idealises it, ACT/ACT alone tracks the real calendar.

What Strata computes

Strata's pricing engine uses ACT/365 Fixed for every time fraction — it's simple, predictable and leap-year-stable, which keeps the discount times deterministic across the curve. The other three are offered because accrued interest must be quoted in the market's convention for the instrument (30/360 for US corporates, ACT/ACT for governments, ACT/360 for money markets).

Assumptions

  • •30/360 applies day adjustments: if D1=31D_1=31D1​=31 set it to 303030; if D1∈{30,31}D_1\in\{30,31\}D1​∈{30,31} and D2=31D_2=31D2​=31 set D2=30D_2=30D2​=30; February month-ends map to 303030.
  • •ACT/ACT splits the period at January 1 and divides each slice by that year's day count (365365365 or 366366366); full intermediate years count as exactly 1.01.01.0.
  • •ACT/360 and ACT/365 Fixed are simple actual-day counts over a constant denominator, with no leap-year adjustment.

Limitations

  • —The conventions are not interchangeable: the same dates give different accrued interest and discount times, so a bond must be priced in its market's convention.
  • —ACT/360 produces year fractions above 1.01.01.0 for periods longer than 360 days — interest is overstated relative to a 365 basis.
  • —30/360's idealised months break around month-end and February, requiring the day-adjustment rules above.

vs Industry Tools

Excel YEARFRAC(): The basis argument selects the convention: basis=0 for 30/360 US, basis=1 for ACT/ACT, basis=2 for ACT/360, basis=3 for ACT/365 — one function, four conventions.

Related

↗Accrued Interest↗Bond Pricing
Go deeper
ISDA — 2006 Definitions, day-count fractions
›
Fixed Income · conventions

Accrued Interest

The slice of the next coupon the seller has earned but not yet been paid — added to the quoted price to get the cash that actually settles.

AI=Cm×taccruedtperiodAI = \dfrac{C}{m}\times\dfrac{t_{\mathrm{accrued}}}{t_{\mathrm{period}}}AI=mC​×tperiod​taccrued​​
▸ Variables
AIAIAIAccrued interest (per 100 par)
CCCAnnual coupon rate (decimal)
mmmCoupon frequency per year
taccruedt_{\mathrm{accrued}}taccrued​Year fraction from the last coupon date to settlement (day-count dependent)
tperiodt_{\mathrm{period}}tperiod​Year fraction for the full coupon period

What Strata computes

Strata accrues pro-rata within the coupon period: the period coupon C/mC/mC/m scaled by the fraction of the period elapsed at settlement. Both year fractions come from the bond's day-count convention, so changing the convention changes accrued interest — and the buyer always pays the seller this accrued amount on top of the clean price.

Assumptions

  • •Pro-rata accrual within the coupon period (straight-line, no compounding inside the period).
  • •Both year fractions use the bond's day-count convention — so accrued moves with the convention.
  • •The buyer pays the seller accrued interest at settlement; it is then recovered in the next full coupon.

Limitations

  • —The clean (quoted) price excludes accrued; the dirty (settlement) price is Pdirty=Pclean+AIP_{\mathrm{dirty}} = P_{\mathrm{clean}} + AIPdirty​=Pclean​+AI — quoting clean while settling dirty is a constant source of confusion.
  • —Accrued is convention-dependent: the same bond on the same date accrues differently under 30/360 vs ACT/ACT (see day-count).
  • —The straight-line pro-rata rule assumes a regular coupon period — odd first/last (long or short) coupons need the schedule's actual period length.

vs Industry Tools

Excel ACCRINT(): Matches when given the same day-count convention.
Bloomberg (clean vs dirty quote): Bonds quote on the clean price; the dirty price is clean + accrued, as here.

Related

↗Bond Pricing↗Day-Count Conventions
Go deeper
CFA — Fixed-Income: Prices and Yields
›
Fixed Income · holding-period return

Horizon Return

The total return from holding a bond to a future date, broken into four additive parts: carry, roll-down, the price move from a yield change, and reinvestment income. All four share one denominator so they sum to the whole.

Rtotal=Rcarry+Rrolldown+Rprice+RreinvestR_{\text{total}} = R_{\text{carry}} + R_{\text{rolldown}} + R_{\text{price}} + R_{\text{reinvest}}Rtotal​=Rcarry​+Rrolldown​+Rprice​+Rreinvest​
▸ Variables
RtotalR_{\text{total}}Rtotal​Total horizon return, as a fraction of the initial investment: Rtotal=∑ti<TCFicoupon+(reinvest income)+PTnew−P0P0R_{\text{total}} = \dfrac{\sum_{t_i < T} CF_i^{\text{coupon}} + (\text{reinvest income}) + P_T^{\text{new}} - P_0}{P_0}Rtotal​=P0​∑ti​<T​CFicoupon​+(reinvest income)+PTnew​−P0​​
RcarryR_{\text{carry}}Rcarry​Carry from coupon income received before the horizon: Rcarry=∑ti<TCFicouponP0R_{\text{carry}} = \dfrac{\sum_{t_i < T} CF_i^{\text{coupon}}}{P_0}Rcarry​=P0​∑ti​<T​CFicoupon​​
RrolldownR_{\text{rolldown}}Rrolldown​Price change from the bond aging along an unchanged curve: Rrolldown=PTunchanged−P0P0R_{\text{rolldown}} = \dfrac{P_T^{\text{unchanged}} - P_0}{P_0}Rrolldown​=P0​PTunchanged​−P0​​ (both prices dirty)
RpriceR_{\text{price}}Rprice​Price change from the assumed yield/spread move at the horizon: Rprice=PTnew−PTunchangedP0R_{\text{price}} = \dfrac{P_T^{\text{new}} - P_T^{\text{unchanged}}}{P_0}Rprice​=P0​PTnew​−PTunchanged​​
RreinvestR_{\text{reinvest}}Rreinvest​Extra income from reinvesting coupons to the horizon: Rreinvest=∑ti<TCFi((1+r)T−ti−1)P0R_{\text{reinvest}} = \dfrac{\sum_{t_i < T} CF_i \bigl((1+r)^{T-t_i} - 1\bigr)}{P_0}Rreinvest​=P0​∑ti​<T​CFi​((1+r)T−ti​−1)​
P0P_0P0​Initial dirty price per 100 par — the single common denominator for all four legs (notional cancels in a return)
PTunchanged, PTnewP_T^{\text{unchanged}},\ P_T^{\text{new}}PTunchanged​, PTnew​Dirty price at the horizon under the unchanged curve vs. under the assumed yield move
CFicoupon, CFiCF_i^{\text{coupon}},\ CF_iCFicoupon​, CFi​Coupon paid at time tit_iti​ (per 100 par); CFiCF_iCFi​ also denotes the cashflow reinvested
T, ti, rT,\ t_i,\ rT, ti​, rHorizon date, time of cashflow tit_iti​ (years), and the annual reinvestment rate (default: current YTM)
yT, my_T,\ myT​, mHorizon yield (initial yield + assumed change) and coupon frequency, used to re-price at the horizon

What Strata computes

Strata decomposes horizon return into the four additive legs above and prices the horizon by discounting the remaining cashflows at the horizon yield: PT=∑i: ti>TCFi(1+yT/m)m(ti−T)P_T = \sum_{i:\,t_i > T} \dfrac{CF_i}{(1 + y_T/m)^{m(t_i - T)}}PT​=∑i:ti​>T​(1+yT​/m)m(ti​−T)CFi​​ — the same pricing formula as the initial price, but settled at the horizon date so accrued interest sets the clean/dirty split. Every leg is divided by the **initial dirty price P0P_0P0​** (per 100), the choice that makes the four parts sum exactly to the total. The default reinvestment rate is the current YTM; in Curve+Spread mode the rate and spread changes are additive.

Assumptions

  • •All four components share **one denominator — the initial dirty price P0P_0P0​ per 100** — so they are additive (this is the audit fix; notional cancels in a return).
  • •Roll-down uses dirty prices for both P0P_0P0​ and PTunchangedP_T^{\text{unchanged}}PTunchanged​ — premium bonds roll down (pull to par), discount bonds roll up.
  • •The horizon date is before maturity; the bond is sold at the horizon at its market (dirty) price, and only cashflows after the horizon are discounted into PTP_TPT​.
  • •Only coupons received before the horizon contribute to carry and reinvestment; reinvestment compounds annually at rate rrr.
  • •The yield change is a parallel shift specified in basis points; a yield fall gives a positive price return and a rise a negative one.

Limitations

  • —The price leg is a full re-pricing at the horizon, but the decomposition still assumes a parallel curve shift — it does not capture twist/steepener/flattener moves (use a scenario stress for those).
  • —Reinvestment risk is real: the realised reinvestment rate is unknown today, so the carry-plus-reinvest legs are only as good as the assumed rrr.
  • —It is a point forecast for one horizon and one yield scenario — it says nothing about the distribution of outcomes (pair with VaR / Monte-Carlo for that).
  • —Roll-down depends on the shape of the curve assumed unchanged; a steep curve flatters roll-down that may not persist.

vs Industry Tools

Bloomberg HRZN / scenario horizon analysis: Same carry / roll / price / reinvestment decomposition; interpolation of the unchanged horizon curve may differ.

Related

↗Duration↗Bond Pricing
Go deeper
CFA — Fixed-Income: Sources of Return

Derivatives

›
Derivatives · options

Option Pricing

What an option is worth, and how that worth moves. One closed-form for European payoffs, one tree for early exercise, and the Greeks and implied vol read straight off the model.

ApproachHow it builds the distributionUse when
Black-Scholes-Merton◢ defaultA closed-form price for a European option on a dividend-paying asset — instant, exact, and the reference every other method is checked against.European payoffs and any time you need an instant analytic price or to seed the Greeks / implied vol.
CRR Binomial Tree◢ defaultDiscretise the price path into an up-down tree and price by backward induction, testing early exercise at every node — so American options are valued honestly.American or Bermudan exercise, or whenever early-exercise value matters (e.g. deep-ITM puts, dividend-paying calls).
└Greeks◢ defaultThe partial derivatives of the BSM price — delta, gamma, vega, theta, rho — that tell you how the value moves and how to hedge it.hedging or risk-managing an options book — sizing the delta hedge, watching gamma near expiry, or pricing a vol view through vega.
└Implied Volatility◢ defaultRun BSM backwards: solve, by Newton-Raphson on vega, for the single σ\sigmaσ that reprices the option to its market price.reading the market's volatility view out of a quoted price, or building the smile / surface from a chain of quotes.

Price

V=f(S,K,r,δ,σ,T)V = f(S, K, r, \delta, \sigma, T)V=f(S,K,r,δ,σ,T)

The fair value of the option from the model — call or put, European (BSM) or American (tree).

Implied vol

σ s.t. VBSM(σ)=Vmarket\sigma\ \text{s.t.}\ V^{\text{BSM}}(\sigma) = V^{\text{market}}σ s.t. VBSM(σ)=Vmarket

The model run in reverse: the volatility that reprices the option to the market — a measure read off any price, not a separate model.

▸ Variables
S, KS,\ KS, KSpot price of the underlying, and the strike
r, δr,\ \deltar, δContinuously compounded risk-free rate, and continuous dividend yield
σ, T\sigma,\ Tσ, TAnnualised volatility of the underlying, and time to expiry in years
d1, d2d_1,\ d_2d1​, d2​d1=ln⁡(S/K)+(r−δ+σ2/2)TσTd_1 = \dfrac{\ln(S/K) + (r - \delta + \sigma^2/2)T}{\sigma\sqrt{T}}d1​=σT​ln(S/K)+(r−δ+σ2/2)T​ and d2=d1−σTd_2 = d_1 - \sigma\sqrt{T}d2​=d1​−σT​
N(⋅), n(⋅)N(\cdot),\ n(\cdot)N(⋅), n(⋅)Cumulative standard-normal distribution, and its density
C, PC,\ PC, PCall and put price
u, d, p∗u,\ d,\ p^*u, d, p∗Up factor u=eσΔtu = e^{\sigma\sqrt{\Delta t}}u=eσΔt​, down d=1/ud = 1/ud=1/u, and the risk-neutral up-probability under carry r−δr - \deltar−δ
Δt, Vn,j\Delta t,\ V_{n,j}Δt, Vn,j​Tree step length T/nT/nT/n, and the option value at node (n,j)(n,j)(n,j) (jjj up-moves)
Δ, Γ, V, Θ, ρ\Delta,\ \Gamma,\ \mathcal{V},\ \Theta,\ \rhoΔ, Γ, V, Θ, ρDelta, gamma, vega, theta and rho — the first-order Greeks (vega/rho per 1% move, theta per calendar day)
VmarketV^{\text{market}}VmarketObserved market price of the option — the target the implied-vol solver inverts

△ The insight

The two pricing rows aren't rivals: the CRR tree **converges to BSM as the step count n→∞n \to \inftyn→∞**. So for a European option they agree, and the tree only earns its cost by pricing the early exercise BSM can't see.

What Strata computes

Strata prices European options analytically with BSM (instant, exact) and American options on a CRR tree (early exercise per node), then reports the Greeks and implied vol off the BSM engine. The tree's step count is set high enough internally for convergence; the 1–3-step view is for teaching only.

Assumptions

  • •Geometric Brownian motion for the underlying with constant volatility σ\sigmaσ and risk-free rate rrr, continuous dividend yield δ\deltaδ, no transaction costs or short-sale limits.
  • •The CRR tree's risk-neutral probability uses cost-of-carry r−δr - \deltar−δ; American early exercise is taken whenever intrinsic value exceeds continuation value.
  • •Greeks are scaled for practical reading: vega and rho per 1% move (×0.01\times 0.01×0.01), theta per calendar day (×1/365\times 1/365×1/365).
  • •Implied vol is solved by Newton-Raphson (max 50 iterations, tolerance 10−710^{-7}10−7) with an adaptive seed; it returns null if vega falls below 10−1010^{-10}10−10.

Limitations

  • —Constant volatility — BSM assumes a flat surface, so it misprices the smile / skew that real markets show; implied vol is how the market patches that.
  • —GBM has thinner tails than reality, so deep-OTM options and jump risk are under-valued.
  • —Discrete dividends need a PV-of-dividend adjustment; the continuous-yield δ\deltaδ is an approximation for dividend-paying single names.
  • —The tree converges only as nnn grows and oscillates on the way — a low step count gives a visibly wrong American price.

vs Industry Tools

Bloomberg OVME: Prices on local-volatility or stochastic-vol (Heston) surfaces; BSM is the flat-vol special case Strata implements.
CFA Level II (Valuation of Contingent Claims): Standard two-period CRR tree formulation; Strata extends it to an n-period tree for convergence.

Related

↗Linear Derivatives↗CVA / DVA
Go deeper
Merton (1973) — Theory of Rational Option PricingCox, Ross & Rubinstein (1979) — Option Pricing: A Simplified Approach
›
Derivatives · forwards, FRAs & swaps

Linear Derivatives

Lock in a price, a rate, or a whole stream of rates. Three instruments, each one a longer version of the no-arbitrage forward below it.

01Forward Pricingfoundation
Carry the spot forward at the cost of money less any yield it throws off — the only price that admits no arbitrage against borrowing and holding the asset.
F0(T)=(S0−PV(Div)) erTF0(T)=S0 e(r−δ)TF_0(T) = \bigl(S_0 - \mathrm{PV}(\mathrm{Div})\bigr)\,e^{rT} \qquad F_0(T) = S_0\,e^{(r - \delta)T}F0​(T)=(S0​−PV(Div))erTF0​(T)=S0​e(r−δ)T
A single locked price at one date — it says nothing about a future borrowing rate or a stream of cashflows.
▲ why a step upA forward fixes a price for an asset; an FRA fixes a rate for one future period — the same no-arbitrage logic applied to borrowing instead of to a spot asset.
02FRA Settlementworking
Lock a single future interest rate: at fixing, exchange the PV of the gap between the realised rate LLL and the contracted rate, discounted back at LLL.
Settlement=(L−FRA)×N×days/basis1+L×days/basis\text{Settlement} = \dfrac{(L - \mathrm{FRA}) \times N \times \text{days}/\text{basis}}{1 + L \times \text{days}/\text{basis}}Settlement=1+L×days/basis(L−FRA)×N×days/basis​
Covers one period only — a multi-year hedge needs a whole strip of FRAs, which is exactly the next rung.
▲ why a step upAn FRA locks one period's rate; a swap is a strip of forward rates — the par fixed rate SFR\mathrm{SFR}SFR is the single number that prices the entire strip to zero net value.
03Interest-Rate Swapadvanced◢ default
Find the one fixed rate that makes a whole schedule of floating payments net to zero PV at inception — an at-market swap costs nothing to enter.
SFR=1−DFN∑i=1NDFi δi\mathrm{SFR} = \dfrac{1 - DF_N}{\sum_{i=1}^{N} DF_i\,\delta_i}SFR=∑i=1N​DFi​δi​1−DFN​​
Single-curve construction (one zero curve both discounts and forwards) on stylised period times — the CFA convention, not a modern multi-curve OIS-discount desk model.
▸ Variables
F0(T)F_0(T)F0​(T)Forward price agreed today for delivery at TTT
S0S_0S0​Current spot price of the underlying
PV(Div)\mathrm{PV}(\mathrm{Div})PV(Div)Present value of discrete dividends paid before TTT (subtracted before compounding)
r, δr,\ \deltar, δContinuously compounded risk-free rate, and continuous dividend / carry yield
L, FRAL,\ \mathrm{FRA}L, FRARealised settlement reference rate (e.g. SOFR), and the contracted FRA rate
NNNNotional principal
days/basis\text{days}/\text{basis}days/basisAccrual fraction for the FRA period (e.g. Act/360 for USD)
SFR\mathrm{SFR}SFRPar (at-market) swap fixed rate — set so the fixed and floating legs have equal PV
DFi, DFNDF_i,\ DF_NDFi​, DFN​Discount factor at payment date iii, and at final date NNN, from the bootstrapped zero curve
δi\delta_iδi​Day-count fraction for swap period iii

△ The insight

There's only one idea here, stretched across more periods: replicate the payoff with cash and the underlying, and no-arbitrage pins the price. A swap is just a strip of forwards — which is why the same DFiDF_iDFi​ curve prices all three.

What Strata computes

Strata's headline linear-derivatives output is the par swap rate (the most-asked desk number), with forward and FRA pricing as the rungs you climb to understand it. The swap uses a single bootstrapped SOFR zero curve to both discount and imply the floating leg (Vfloat=NV_{\text{float}} = NVfloat​=N at each reset), with continuous compounding and stylised period times.

Assumptions

  • •No-arbitrage throughout: continuous compounding, no bid-ask spread, no transaction costs, and free capital flows for the FX-forward (CIRP) case.
  • •The floating leg of the swap resets to par at each coupon date (the floating-rate-bond analogy), so its value equals notional at reset.
  • •Discount factors come from a single bootstrapped SOFR zero curve; the same curve discounts and forwards (CFA single-curve convention).
  • •Swap period times are stylised (Ti=i/frequencyT_i = i/\text{frequency}Ti​=i/frequency) with a constant day-count fraction — methodologically transparent but not calendar-accurate.

Limitations

  • —Single-curve pricing: real desks discount on OIS and forward on a separate index curve, so Strata's swap value diverges from a multi-curve mark.
  • —Stylised conventions (idealised period times, constant day-count) plus an estimated USD swap curve mean values are directionally meaningful, not trade-grade.
  • —FRA settlement assumes the payment is discounted at the prevailing reference rate LLL, the market convention but an approximation.
  • —Linear payoffs only — these instruments carry no optionality, so duration/DV01 fully describe their rate risk (see CVA for the credit overlay).

vs Industry Tools

CFA Level II curriculum (Swap Valuation): Standard fixed-rate-bond / floating-rate-bond decomposition and the par-swap-rate formula; Strata follows the single-curve convention.
Bloomberg SWPM: Full multi-curve (OIS-discount + index forwarding), calendar-accurate schedules and live par-swap curves; Strata is an indicative single-curve estimate.

Related

↗CVA / DVA
Go deeper
Hull — Options, Futures, and Other DerivativesCFA — Derivatives: Pricing and Valuation of Forward Commitments
›
Derivatives · counterparty risk

CVA / DVA

The price you knock off an OTC derivative for the chance your counterparty defaults (CVA), plus the symmetric credit for your own (DVA). BCVA is the net.

CVA=−∑iLGDcp⋅DFi⋅EE(ti)⋅ΔPDcp,iDVA=+∑iLGDown⋅DFi⋅NEE(ti)⋅ΔPDown,iBCVA=CVA+DVA\begin{aligned} \mathrm{CVA} &= -\sum_{i} \mathrm{LGD}_{\text{cp}} \cdot DF_i \cdot \mathrm{EE}(t_i) \cdot \Delta\mathrm{PD}_{\text{cp},i} \\ \mathrm{DVA} &= +\sum_{i} \mathrm{LGD}_{\text{own}} \cdot DF_i \cdot \mathrm{NEE}(t_i) \cdot \Delta\mathrm{PD}_{\text{own},i} \\ \mathrm{BCVA} &= \mathrm{CVA} + \mathrm{DVA} \end{aligned}CVADVABCVA​=−i∑​LGDcp​⋅DFi​⋅EE(ti​)⋅ΔPDcp,i​=+i∑​LGDown​⋅DFi​⋅NEE(ti​)⋅ΔPDown,i​=CVA+DVA​
▸ Variables
CVA, DVA\mathrm{CVA},\ \mathrm{DVA}CVA, DVACredit / debit valuation adjustment — expected loss from the counterparty's / your own default (CVA stored as a negative number)
BCVA\mathrm{BCVA}BCVABilateral CVA, the net adjustment: CVA+DVA\mathrm{CVA} + \mathrm{DVA}CVA+DVA
λ\lambdaλHazard (default-intensity) rate, λ=Spreadcp/(10000⋅LGDcp)\lambda = \mathrm{Spread}_{\text{cp}} / (10000 \cdot \mathrm{LGD}_{\text{cp}})λ=Spreadcp​/(10000⋅LGDcp​); cumulative default PD(t)=1−e−λt\mathrm{PD}(t) = 1 - e^{-\lambda t}PD(t)=1−e−λt
Spreadcp\mathrm{Spread}_{\text{cp}}Spreadcp​Counterparty CDS / credit spread in basis points
LGDcp, LGDown\mathrm{LGD}_{\text{cp}},\ \mathrm{LGD}_{\text{own}}LGDcp​, LGDown​Loss given default for the counterparty / for you, each =1−Recovery Rate= 1 - \text{Recovery Rate}=1−Recovery Rate
EE(t)\mathrm{EE}(t)EE(t)Expected (positive) exposure at time ttt — convex DV01 decay ×\times× the half-normal mean φ(0)=1/2π\varphi(0) = 1/\sqrt{2\pi}φ(0)=1/2π​
NEE(t)\mathrm{NEE}(t)NEE(t)Negative expected exposure; the IRS profile is symmetric so NEE(t)=EE(t)\mathrm{NEE}(t) = \mathrm{EE}(t)NEE(t)=EE(t)
DV01\mathrm{DV01}DV01Dollar value of a 1bp rate move on the swap — the scale of the exposure
σr\sigma_rσr​Assumed short-rate volatility — the diffusion that grows the swap's mark-to-market exposure over time
T, t, tiT,\ t,\ t_iT, t, ti​Swap maturity, a generic time, and the iii-th of NNN exposure time steps
DFi, ΔPD(ti)DF_i,\ \Delta\mathrm{PD}(t_i)DFi​, ΔPD(ti​)Risk-free discount factor at tit_iti​, and the marginal default probability over step iii

What Strata computes

Strata reports a screening-grade BCVA: expected exposure as a convex DV01 decay EE(t)∝(T−t)/T⋅t\mathrm{EE}(t) \propto \sqrt{(T-t)/T}\cdot\sqrt{t}EE(t)∝(T−t)/T​⋅t​ (peaks mid-life), the exposure integral discretised over N=20N = 20N=20 left-edge steps, hazard rates backed out from each party's spread, and BCVA=CVA+DVA\mathrm{BCVA} = \mathrm{CVA} + \mathrm{DVA}BCVA=CVA+DVA (not minus). It is an indicative number, not a desk's IMM model.

Assumptions

  • •Expected exposure uses a convex DV01 decay EE(t)∝(T−t)/T×t\mathrm{EE}(t) \propto \sqrt{(T-t)/T}\times\sqrt{t}EE(t)∝(T−t)/T​×t​ — a stated modelling choice (the textbook profile is linear (T−t)/T(T-t)/T(T−t)/T) that peaks mid-life.
  • •NEE=EE\mathrm{NEE} = \mathrm{EE}NEE=EE: the swap's exposure is symmetric, so the credit asymmetry between the two parties enters only through λown\lambda_{\text{own}}λown​ vs λcp\lambda_{\text{cp}}λcp​, not through a weight on the exposure.
  • •The exposure integral is discretised over N=20N = 20N=20 left-edge time steps; CVA is stored as a negative number and BCVA=CVA+DVA\mathrm{BCVA} = \mathrm{CVA} + \mathrm{DVA}BCVA=CVA+DVA.
  • •Hazard rates are constant and backed out of each party's credit spread at a flat LGD; discounting is at the risk-free curve.

Limitations

  • —A screening estimate only — production CVA simulates the full trade NPV path with netting sets and collateral, which can move the number materially.
  • —No wrong-way risk: exposure and default probability are assumed independent, so a counterparty whose default correlates with the exposure is under-charged.
  • —Single-trade, no netting or CSA — a real counterparty's CVA is computed across the whole portfolio of trades, not one swap in isolation.
  • —DVA is controversial: booking a gain when your own credit deteriorates is real under accounting but un-hedgeable and excluded from Basel CVA capital.

vs Industry Tools

Bloomberg CVA function: Full Monte-Carlo simulation with netting sets, collateral and IMM-approved models (Basel III); Strata's is a closed-form indicative estimate.

Related

↗Linear Derivatives↗Credit Spread
Go deeper
Gregory — The xVA Challenge (Counterparty Credit Risk)Basel III — CVA risk framework

Equity

›
Equity · discount rate

WACC

The blended after-tax cost of a firm's capital, the discount rate for unlevered free cash flow. One accepted formula; the lesson is how you source each input.

WACC=wE kE+wD kD (1−t)kE=Rf+β ERP+CRP+SPkD=∣Interest Expense∣Total DebtβL=βU [1+(1−t) D/E]\begin{aligned} \mathrm{WACC} &= w_E\,k_E + w_D\,k_D\,(1 - t) \\ k_E &= R_f + \beta\,\mathrm{ERP} + \mathrm{CRP} + \mathrm{SP} \\ k_D &= \dfrac{|\text{Interest Expense}|}{\text{Total Debt}} \\ \beta_L &= \beta_U\,\bigl[1 + (1 - t)\,D/E\bigr] \end{aligned}WACCkE​kD​βL​​=wE​kE​+wD​kD​(1−t)=Rf​+βERP+CRP+SP=Total Debt∣Interest Expense∣​=βU​[1+(1−t)D/E]​
▸ Variables
wE, wDw_E,\ w_DwE​, wD​Market-value weights of equity and debt (wE+wD=1w_E + w_D = 1wE​+wD​=1)
kEk_EkE​Cost of equity, from the four-component CAPM
kDk_DkD​Pre-tax cost of debt, implied from the income statement as ∣Interest Expense∣/Total Debt|\text{Interest Expense}| / \text{Total Debt}∣Interest Expense∣/Total Debt
tttEffective tax rate, the source of the debt tax shield (applied once, in the WACC sum)
RfR_fRf​Risk-free rate (10-year UST; FRED DGS10, fallback 4.25%4.25\%4.25%)
β\betaβEquity (levered) beta used in CAPM (FMP live; falls back to a re-levered Damodaran industry median)
ERP\mathrm{ERP}ERPEquity risk premium (Damodaran implied; fallback 4.60%4.60\%4.60%)
CRP\mathrm{CRP}CRPCountry risk premium (Damodaran; 000 for the US)
SP\mathrm{SP}SPSize premium (user-specified; default 000)
βL, βU\beta_L,\ \beta_UβL​, βU​Levered (observed) and unlevered (asset) beta, linked by the Hamada equation
D/ED/ED/EDebt-to-equity ratio at market values (the Hamada relevering input)

What Strata computes

Strata computes one WACC: market-value-weighted, four-component CAPM cost of equity, and a pre-tax cost of debt implied from the income statement (not a yield-to-maturity on outstanding bonds). When only an unlevered industry-median beta is available, it is re-levered via Hamada to the firm's own D/ED/ED/E before entering CAPM. The tax shield is applied once, in the wD kD(1−t)w_D\,k_D(1-t)wD​kD​(1−t) term.

Assumptions

  • •Beta is re-levered via the Hamada equation when an unlevered industry-median is used; debt is assumed risk-free and the tax shield permanent (no Miles-Ezzell / Harris-Pringle adjustment).
  • •Cost of debt is derived from the income statement (∣Interest Expense∣/Total Debt|\text{Interest Expense}| / \text{Total Debt}∣Interest Expense∣/Total Debt), not yield-to-maturity on traded bonds.
  • •The risk-free rate falls back to 4.25%4.25\%4.25% when FRED is unavailable; the tax rate to a Damodaran sector median, fallback 21%21\%21%.
  • •Capital weights are at market value, so wEw_EwE​ uses market cap, not book equity.

Limitations

  • —It is a single blended rate, so it implicitly assumes a constant capital structure over the whole forecast, true for few firms mid-deleveraging.
  • —Income-statement kDk_DkD​ lags the market: a firm whose credit has just widened still shows its old average coupon, understating the true marginal cost of debt.
  • —WACC is the right discount rate for unlevered (free-cash-flow-to-firm) flows only, discount FCFE at kEk_EkE​ instead.
  • —Every input is a convention choice (beta source, ERP, RfR_fRf​ basis), the same firm can carry a materially different WACC under defensible inputs.

vs Industry Tools

Bloomberg WACC: Uses a market-implied beta and a YTM-based cost of debt, more precise for large-cap issuers with liquid bonds; Strata's kDk_DkD​ is income-statement-implied (transparent, but backward-looking).

Related

↗Discounted Cash Flow↗Dividend Discount Model
Go deeper
Damodaran — Cost of CapitalHamada (1972) — The Effect of the Firm's Capital Structure
›
Equity · intrinsic valuation

Discounted Cash Flow

Value a firm as the present value of the cash it will generate. Forecast the flows, discount them, and bridge to a per-share price.

01Two-Stageworking◢ default
Discount an explicit FCF forecast at WACC, add a Gordon terminal value, then bridge enterprise value to a per-share price by netting out debt.
V0=∑t=1NFCFt(1+WACC) t−0.5 1mid+TV(1+WACC)N,TV=FCFN(1+gT)WACC−gT,P0=V0−Net DebtSharesV_0 = \sum_{t=1}^{N} \dfrac{\mathrm{FCF}_t}{(1+\mathrm{WACC})^{\,t - 0.5\,\mathbf{1}_{\mathrm{mid}}}} + \dfrac{\mathrm{TV}}{(1+\mathrm{WACC})^{N}}, \qquad \mathrm{TV} = \dfrac{\mathrm{FCF}_N(1+g_T)}{\mathrm{WACC} - g_T}, \qquad P_0 = \dfrac{V_0 - \text{Net Debt}}{\text{Shares}}V0​=t=1∑N​(1+WACC)t−0.51mid​FCFt​​+(1+WACC)NTV​,TV=WACC−gT​FCFN​(1+gT​)​,P0​=SharesV0​−Net Debt​
A single jump from g1g_1g1​ to gTg_TgT​ at year NNN, no glide path; the terminal value usually dominates and is undefined when WACC≤gT\mathrm{WACC} \le g_TWACC≤gT​.
└Reverse DCFvariant
Invert the model: hold every other input fixed and solve (bisection, bracket-expanding) for the Stage-1 growth g∗g^{*}g∗ that makes the DCF price equal today's market price, the growth the market is paying for.
g∗=arg⁡min⁡g ∣ P0DCF(g)−P0mkt ∣g^{*} = \arg\min_{g}\,\bigl|\,P_0^{\mathrm{DCF}}(g) - P_0^{\mathrm{mkt}}\,\bigr|g∗=arggmin​​P0DCF​(g)−P0mkt​​
Returns one number conditional on all other inputs, a different WACC or terminal growth implies a different g∗g^{*}g∗; returns null if no solution sits in the search range.
└FCFEvariant
Discount cash available to equity directly at the cost of equity kEk_EkE​, so there is no enterprise-to-equity bridge, debt service is already inside the cash flow.
FCFEt=NI+D&A−CapEx−ΔWC+Net Borrowing,P0=∑t=1NFCFEt(1+kE)t+TV(1+kE)N\mathrm{FCFE}_t = \mathrm{NI} + \mathrm{D\&A} - \mathrm{CapEx} - \Delta\mathrm{WC} + \text{Net Borrowing}, \qquad P_0 = \sum_{t=1}^{N} \dfrac{\mathrm{FCFE}_t}{(1+k_E)^{t}} + \dfrac{\mathrm{TV}}{(1+k_E)^{N}}FCFEt​=NI+D&A−CapEx−ΔWC+Net Borrowing,P0​=t=1∑N​(1+kE​)tFCFEt​​+(1+kE​)NTV​
Net borrowing is hard to forecast and swings FCFE; the equity-side result is sensitive to capital-structure assumptions the firm-side FCFF model sidesteps.
▲ why a step upTwo-stage snaps from high growth to terminal in one year; three-stage interpolates across N2N_2N2​ years, which is more realistic for a maturing firm and softens the terminal-value dependence.
02Three-Stageadvanced
Insert a transition stage where growth fades linearly from g1g_1g1​ down to gTg_TgT​ before the perpetuity, so the step-down is gradual rather than a cliff.
gt(2)=g1+(gT−g1) tN2,V0=∑t=1N1+N2FCFt(1+WACC)t+TV(1+WACC)N1+N2g_t^{(2)} = g_1 + (g_T - g_1)\,\dfrac{t}{N_2}, \qquad V_0 = \sum_{t=1}^{N_1+N_2} \dfrac{\mathrm{FCF}_t}{(1+\mathrm{WACC})^{t}} + \dfrac{\mathrm{TV}}{(1+\mathrm{WACC})^{N_1+N_2}}gt(2)​=g1​+(gT​−g1​)N2​t​,V0​=t=1∑N1​+N2​​(1+WACC)tFCFt​​+(1+WACC)N1​+N2​TV​
The linear fade is itself an assumption, real growth rarely declines in a straight line, and the extra stage adds inputs without removing terminal-value sensitivity.
▸ Variables
V0V_0V0​Enterprise value today, the discounted sum of forecast cash flows plus terminal value
P0P_0P0​Implied value per share after the enterprise-to-equity bridge
FCFt\mathrm{FCF}_tFCFt​Free cash flow to the firm in year ttt
g1, gTg_1,\ g_Tg1​, gT​Stage-1 (explicit) growth rate and the terminal (long-run) growth rate
WACC\mathrm{WACC}WACCWeighted average cost of capital, the discount rate for firm cash flows
N, N1, N2N,\ N_1,\ N_2N, N1​, N2​Length of the explicit forecast; and (3-stage) the Stage-1 and Stage-2 lengths in years
1mid\mathbf{1}_{\mathrm{mid}}1mid​Mid-year convention flag: 111 if active (cash arrives mid-period), else 000
TV\mathrm{TV}TVTerminal value, via the Gordon perpetuity or an exit EV/EBITDA multiple
gt(2)g_t^{(2)}gt(2)​Stage-2 growth in year ttt, fading linearly from g1g_1g1​ to gTg_TgT​ (3-stage only)
Net Debt\text{Net Debt}Net DebtTotal debt minus cash, subtracted at the enterprise-to-equity bridge
Shares\text{Shares}SharesDiluted shares outstanding, the divisor in the per-share bridge
g∗g^{*}g∗Reverse-DCF: the Stage-1 growth that makes the model value equal the market price
P0DCF(g)P_0^{\mathrm{DCF}}(g)P0DCF​(g)Reverse-DCF: the two-stage DCF per-share value as a function of the Stage-1 growth ggg
P0mktP_0^{\mathrm{mkt}}P0mkt​Reverse-DCF: the observed market price the inversion solves against
FCFEt\mathrm{FCFE}_tFCFEt​Free cash flow to equity in year ttt, cash left after debt service
NI\mathrm{NI}NINet income (the FCFE starting point)
D&A\mathrm{D\&A}D&ADepreciation and amortisation, added back (non-cash)
CapEx\mathrm{CapEx}CapExCapital expenditure, subtracted
ΔWC\Delta\mathrm{WC}ΔWCChange in net working capital, subtracted
Net Borrowing\text{Net Borrowing}Net BorrowingNew debt issuance minus repayment, added in FCFE
kEk_EkE​Cost of equity, the discount rate for equity cash flows in FCFE

△ The insight

Two-stage to three-stage removes the growth cliff; reverse-DCF inverts the same machine to read the market's expectation; FCFE re-routes it down the equity side at kEk_EkE​. Same discounting engine, four lenses on it.

What Strata computes

Strata defaults to the two-stage DCF (explicit FCF forecast + Gordon terminal value, mid-year convention optional) and bridges to a per-share price. Three-stage is offered for firms with a long, visible glide path; reverse-DCF and FCFE are the inversion and equity-side cuts you switch to when the question changes.

Assumptions

  • •Mid-year convention applies only to explicit-period FCFs; the terminal value is always discounted at end of year NNN.
  • •The Gordon terminal value is undefined and returns null when WACC≤gT\mathrm{WACC} \le g_TWACC≤gT​.
  • •The enterprise-to-equity bridge subtracts net debt; FCFE skips the bridge because its cash flows are already post-debt-service.
  • •Reverse-DCF holds WACC, terminal growth and forecast length fixed and solves only for Stage-1 growth.

Limitations

  • —The output is dominated by the terminal value and the WACC-minus-gTg_TgT​ denominator, small input moves swing the answer.
  • —Three-stage's linear fade and FCFE's net-borrowing path are modelling conventions, not observed quantities.
  • —Every variant inherits the forecast's quality, garbage forecasts produce confident-looking but wrong intrinsic values.

vs Industry Tools

Bloomberg DSCF: Pulls consensus estimates for the explicit period; same Gordon terminal-value formula. Strata uses your forecast or SEC-derived actuals and exposes the reverse and FCFE cuts in the same panel.

Related

↗WACC↗Comparable Company Analysis↗Dividend Discount Model
Go deeper
Damodaran — Investment ValuationCFA — Discounted Dividend & Free Cash Flow Valuation
›
Equity · intrinsic valuation

Dividend Discount Model

Value a share as the present value of its future dividends. Two rungs, differing only in how the dividend growth rate is allowed to change.

01Gordon Growthfoundation◢ default
A perpetuity: next year's dividend divided by the spread between the required return and a single growth rate held constant forever.
P0=D0 (1+g)r−g,r>gP_0 = \dfrac{D_0\,(1 + g)}{r - g}, \qquad r > gP0​=r−gD0​(1+g)​,r>g
One growth rate forever fits only a mature, steady-state payer; it is undefined (returns null) when r≤gr \le gr≤g and is hypersensitive to ggg as it approaches rrr.
▲ why a step upGordon assumes a single growth rate forever; the H-model adds a second term that prices a temporary high-growth phase decaying to the terminal rate, no need to project each year explicitly.
02H-Modelworking
A Gordon base on the terminal rate gLg_LgL​, plus a closed-form premium for the extra growth that fades linearly from gSg_SgS​ down to gLg_LgL​ over the transition.
P0=D0 (1+gL)r−gL+D0 H (gS−gL)r−gL,H=high-growth years2P_0 = \dfrac{D_0\,(1 + g_L)}{r - g_L} + \dfrac{D_0\,H\,(g_S - g_L)}{r - g_L}, \qquad H = \dfrac{\text{high-growth years}}{2}P0​=r−gL​D0​(1+gL​)​+r−gL​D0​H(gS​−gL​)​,H=2high-growth years​
The linear decay is an approximation, real transitions rarely follow a straight line, and it still requires r>gLr > g_Lr>gL​ for the base term to converge.
▸ Variables
P0P_0P0​Intrinsic value per share today
D0D_0D0​Most recent annual dividend per share
gggConstant long-term dividend growth rate (single-stage)
gS, gLg_S,\ g_LgS​, gL​Short-term (initial) and long-term (terminal) dividend growth rates (H-model)
rrrRequired rate of return on equity (cost of equity), the discount rate
HHHHalf the high-growth period in years, H=(high-growth years)/2H = (\text{high-growth years}) / 2H=(high-growth years)/2

△ The insight

Both rungs are the same perpetuity: the H-model is Gordon-on-gLg_LgL​ plus one extra term for a linearly-fading head start. When gS=gLg_S = g_LgS​=gL​ the premium vanishes and the H-model collapses back to Gordon.

What Strata computes

Strata defaults to the Gordon Growth model for steady-state dividend payers, it is the cleanest single-input read. The H-model is offered for firms in transition (a high payout growth that is visibly maturing), where a single constant ggg would mis-state value.

Assumptions

  • •Both models are undefined and return null when the discount rate does not exceed the relevant terminal growth (r≤gr \le gr≤g for Gordon, r≤gLr \le g_Lr≤gL​ for the H-model).
  • •The H-model permits a temporary gS>rg_S > rgS​>r; only a terminal gL≥rg_L \ge rgL​≥r makes the perpetuity blow up.
  • •Dividends are the right cash-flow proxy, which holds for established payers, not for non- or low-payout firms.

Limitations

  • —Useless for firms that pay no dividends or whose payout is unrelated to earning power, use a free-cash-flow model instead.
  • —Both rungs are dominated by the r−gLr - g_Lr−gL​ denominator, the value explodes as growth nears the required return.
  • —The H-model's linear-fade shape is assumed, not estimated, two analysts can pick different transition lengths.

vs Industry Tools

CFA curriculum (Equity Valuation): Standard single-stage Gordon and two-stage H-model formulations; the H-model is the textbook tool for emerging-market firms with a transitional growth profile.

Related

↗Discounted Cash Flow↗WACC
Go deeper
Gordon (1959) — Dividends, Earnings, and Stock PricesCFA — Discounted Dividend Valuation
›
Equity · relative valuation

Comparable Company Analysis

Value a firm by what the market pays for its peers. Apply a peer-group multiple to the firm's own fundamental, several multiples, one implied value each.

ApproachHow it builds the distributionUse when
P/E◢ defaultApply the peer price-to-earnings multiple straight to net income, an equity-level multiple, so no debt bridge is needed.comparing profitable firms with similar capital structures and clean earnings.
P/SPrice-to-sales, anchored on revenue, which stays positive and is harder to manipulate than earnings.the firm is pre-profit or earnings are too noisy to trust (early-stage, cyclical trough).
EV/EBITDAAn enterprise-level multiple on pre-financing, pre-tax operating cash, so it is capital-structure-neutral, then bridge EV to equity.comparing firms with different leverage or tax regimes, the cross-capital-structure default.
EV/FCFAn enterprise multiple on actual free cash flow, the cash left after capex, which EV/EBITDA overlooks.capex intensity differs across the peer set and cash conversion is the real question.

Implied value

P0=Implied equity valueSharesP_0 = \dfrac{\text{Implied equity value}}{\text{Shares}}P0​=SharesImplied equity value​

Each multiple yields one implied price; the football-field chart shows the range (min / median / mean / max) across the peer set rather than a single point estimate.

▸ Variables
mmmThe peer-group multiple (median or mean of the comparable set)
NI\text{NI}NINet income, the P/E denominator fundamental
Rev\text{Rev}RevRevenue (sales), the P/S denominator fundamental
EBITDA\mathrm{EBITDA}EBITDAEarnings before interest, tax, depreciation and amortisation, the EV/EBITDA fundamental
FCF\mathrm{FCF}FCFFree cash flow, the EV/FCF fundamental
EV\mathrm{EV}EVImplied enterprise value (multiple applied to an EV-level fundamental)
Net Debt\text{Net Debt}Net DebtTotal debt minus cash, the enterprise-to-equity bridge term
Shares\text{Shares}SharesDiluted shares outstanding, the per-share divisor
P0P_0P0​Implied value per share after the bridge

△ The insight

Comps measures relative value, what the firm is worth if peers are fairly priced, while DCF measures intrinsic value from the firm's own cash flows. When a whole sector is mispriced, comps inherits the error; the two methods are a cross-check, not substitutes.

What Strata computes

Strata leads with P/E for profitable firms, the most quoted multiple, and triangulates with P/S, EV/EBITDA and EV/FCF so leverage, profitability and capex intensity each get a vote. The football-field chart presents the spread of implied values, not a false-precision single number.

Assumptions

  • •The peer group comes from the live `/api/equity/peers` endpoint; the user can add or remove peers.
  • •Multiples are sourced from FMP; the firm's fundamentals from SEC XBRL trailing-twelve-month actuals.
  • •Negative or zero multiples are excluded from the peer statistics so a loss-maker does not poison the median.
  • •EV-level multiples (EV/EBITDA, EV/FCF) net out debt at the bridge; equity-level multiples (P/E, P/S) do not.

Limitations

  • —Comps is only as honest as the peer set, a sector-wide bubble or trough is baked straight into the implied value.
  • —Each multiple is blind to something, P/E to leverage, P/S to margins, EV/EBITDA to capex, no single row is sufficient.
  • —Point-in-time multiples ignore differences in growth and risk between the firm and its peers.

vs Industry Tools

Bloomberg COMP: Uses real-time consensus estimates; Strata uses trailing-twelve-month actuals from SEC filings, more transparent, but backward-looking.

Related

↗Discounted Cash Flow
Go deeper
Damodaran — Relative ValuationCFA — Market-Based Valuation: Price & Enterprise Value Multiples

Portfolio

›
Portfolio · optimization

Efficient Frontier

The lowest-variance portfolio for each level of expected return. One quadratic program, swept across a target return to trace the curve.

min⁡w 12 wTΣ ws.t.1Tw=1,    μTw=t,    L≤wi≤U\min_{\mathbf{w}}\ \tfrac{1}{2}\,\mathbf{w}^{\mathsf T}\mathbf{\Sigma}\,\mathbf{w} \quad \text{s.t.}\quad \mathbf{1}^{\mathsf T}\mathbf{w}=1,\;\; \boldsymbol{\mu}^{\mathsf T}\mathbf{w}=t,\;\; L \le w_i \le Uwmin​ 21​wTΣws.t.1Tw=1,μTw=t,L≤wi​≤U
▸ Variables
w\mathbf{w}wAsset weight vector being optimised
Σ\mathbf{\Sigma}ΣCovariance matrix of asset returns (annualised, positive definite)
μ\boldsymbol{\mu}μVector of expected (annualised) asset returns
tttTarget portfolio return swept from the minimum-variance point up to the maximum feasible return
L, UL,\ UL, UPer-asset weight box (long-only when L=0L = 0L=0)
1\mathbf{1}1Vector of ones — the fully-invested budget constraint 1Tw=1\mathbf{1}^{\mathsf T}\mathbf{w}=11Tw=1
rfr_frf​Risk-free rate — fixes the tangency (max-Sharpe) point where the capital market line touches the frontier

What Strata computes

Strata solves the exact convex QP with a primal active-set method (not a grid search), long-only box constraints (0≤wi≤maxWeight0 \le w_i \le \text{maxWeight}0≤wi​≤maxWeight) on the public endpoint, then sweeps ttt from the global minimum-variance (GMV) portfolio to the max feasible return. The tangency portfolio is the frontier point with the steepest line from rfr_frf​; the capital market line is that line extended through it.

Assumptions

  • •Exact convex QP (primal active-set), not a grid-search approximation.
  • •The covariance matrix is positive definite (no ridge regularisation is added).
  • •Expected returns come from the historical mean — the usual mean-variance input sensitivity applies.
  • •GMV Σ−11/(1TΣ−11)\Sigma^{-1}\mathbf{1}/(\mathbf{1}^{\mathsf T}\Sigma^{-1}\mathbf{1})Σ−11/(1TΣ−11) and tangency Σ−1(μ−rf1)/(1TΣ−1(μ−rf1))\Sigma^{-1}(\mu - r_f\mathbf{1})/(\mathbf{1}^{\mathsf T}\Sigma^{-1}(\mu - r_f\mathbf{1}))Σ−1(μ−rf​1)/(1TΣ−1(μ−rf​1)) recover the unconstrained closed forms when the box does not bind.

Limitations

  • —Mean-variance is extremely sensitive to the expected-return inputs — small changes in μ\boldsymbol{\mu}μ swing the weights, the classic estimation-error problem.
  • —It only sees mean and variance, so skew and fat tails are invisible to it (the case for pairing with VaR\mathrm{VaR}VaR / ES\mathrm{ES}ES).
  • —Sample covariance is noisy for many assets; institutions often add shrinkage or a factor model that Strata's public endpoint does not.
  • —Long-only box constraints mean the constrained frontier can sit inside the unconstrained one.

vs Industry Tools

Bloomberg PORT: Also solves an exact mean-variance QP; may add covariance shrinkage and a richer constraint set.
Excel Solver: GRG Nonlinear / Simplex reaches the same optimum on the same convex QP, one target at a time.

Related

↗Portfolio Variance↗Sharpe Ratio
Go deeper
Markowitz (1952) — Portfolio Selection
›
Portfolio · risk

Portfolio Variance

How much a whole portfolio's return wobbles. It's not the average of each asset's risk — the cross-terms between assets are where diversification lives.

σp2=wTΣ w=∑i=1n∑j=1nwi wj σij\sigma_p^2 = \mathbf{w}^{\mathsf T}\mathbf{\Sigma}\,\mathbf{w} = \sum_{i=1}^{n}\sum_{j=1}^{n} w_i\,w_j\,\sigma_{ij}σp2​=wTΣw=i=1∑n​j=1∑n​wi​wj​σij​
▸ Variables
σp2\sigma_p^2σp2​Portfolio variance (its square root σp\sigma_pσp​ is the portfolio volatility)
w\mathbf{w}wVector of asset weights, summing to 1 (fully invested)
Σ\mathbf{\Sigma}ΣCovariance matrix of asset returns
σij\sigma_{ij}σij​Covariance between assets iii and jjj (the diagonal σii\sigma_{ii}σii​ is asset iii's own variance)
nnnNumber of assets in the portfolio

What Strata computes

Strata computes the full quadratic form wTΣw\mathbf{w}^{\mathsf T}\mathbf{\Sigma}\mathbf{w}wTΣw from the sample covariance matrix — every pairwise term is included, so the diversification benefit from imperfectly-correlated assets is captured exactly. Volatility σp\sigma_pσp​ is then the square root, annualised consistently with the covariance inputs.

Assumptions

  • •Weights sum to 1 (fully invested) and are market-value weights in the display currency.
  • •The covariance matrix is estimated from a historical window and is treated as stable going forward.
  • •Returns are approximately multivariate normal, so variance summarises the risk.

Limitations

  • —Variance treats upside and downside swings identically — it can't see skew or fat tails.
  • —It rests entirely on the estimated covariances; in a crisis correlations jump toward 1 and the diversification it credits evaporates.
  • —For nnn assets there are n(n−1)/2n(n-1)/2n(n−1)/2 covariances to estimate — the matrix gets noisy fast without shrinkage or a factor model.

vs Industry Tools

Bloomberg PORT: Same quadratic form; may apply shrinkage to the covariance matrix for stability.
BARRA / Axioma: Use a factor-model covariance instead of the raw sample matrix to reduce estimation error.

Related

↗Covariance Matrix↗Efficient Frontier
Go deeper
Markowitz (1952) — Portfolio Selection
›
Portfolio · estimation

Covariance Matrix

The table of how every pair of assets moves together — the raw material that portfolio variance and the efficient frontier both consume.

σ^ij=1T−1∑t=1T(ri,t−rˉi)(rj,t−rˉj)\hat{\sigma}_{ij} = \dfrac{1}{T-1}\sum_{t=1}^{T}\bigl(r_{i,t} - \bar{r}_i\bigr)\bigl(r_{j,t} - \bar{r}_j\bigr)σ^ij​=T−11​t=1∑T​(ri,t​−rˉi​)(rj,t​−rˉj​)
▸ Variables
σ^ij\hat{\sigma}_{ij}σ^ij​Estimated covariance between assets iii and jjj (the matrix entry)
ri,tr_{i,t}ri,t​Return of asset iii in period ttt
rˉi\bar{r}_irˉi​Mean return of asset iii over the window
TTTNumber of observations (default 252 trading days = 1 year)
T−1T-1T−1Bessel's correction — the unbiased sample denominator

What Strata computes

Strata uses the plain sample covariance with the T−1T-1T−1 (Bessel-corrected) denominator over the lookback window — no shrinkage, no factor model. It's the transparent estimator: every entry is computable by hand from the return series, which matches Strata's self-compute positioning. Downstream, the efficient-frontier QP requires this matrix to be positive definite.

Assumptions

  • •Returns are stationary — the covariance structure is stable over the window.
  • •The sample is large enough relative to the number of assets for the estimates to be reliable.
  • •No structural break in the correlation regime inside the window.
  • •Simple sample estimator — no Ledoit-Wolf shrinkage or factor decomposition.

Limitations

  • —With nnn assets there are n(n+1)/2n(n+1)/2n(n+1)/2 entries to estimate — for many assets and a short window the matrix is noisy and can become near-singular.
  • —Sample covariance gives equal weight to every observation, so it's slow to react to a regime change.
  • —Correlations are not constant — they spike toward 1 in a crisis, exactly when diversification is most needed.

vs Industry Tools

Bloomberg: Often applies Ledoit-Wolf shrinkage toward a structured target for more stable estimates.
BARRA / Axioma: Replace the raw sample matrix with a factor-model covariance to cut estimation error.

Related

↗Portfolio Variance↗Efficient Frontier↗Monte-Carlo Simulation
Go deeper
Ledoit & Wolf (2004) — Honey, I Shrunk the Sample Covariance Matrix
›
Portfolio · risk-adjusted return

Risk-Adjusted Return

Return earned per unit of risk taken. One family, but each ratio divides by a different risk — and that choice decides which risk it rewards.

ApproachHow it builds the distributionUse when
Sharpe◢ defaultExcess return over total volatility — reward per unit of all variability, up or down.the return stream is roughly symmetric and you want the one universal benchmark.
Sortino◢ defaultExcess return over downside deviation only — upside swings stop counting as risk.returns are skewed and you only care about volatility that loses money.
TreynorExcess return over systematic risk (beta) — reward per unit of market exposure, ignoring diversifiable risk.the portfolio is a diversified sleeve of a larger book, so only market risk is priced.
Information RatioActive return over tracking error — skill per unit of deviation from the benchmark.the mandate is to beat a benchmark and active risk is the budget that matters.
Jensen's AlphaReturn above what CAPM predicts for the portfolio's beta — value added net of market exposure.you want the absolute outperformance attributable to skill rather than a ranking ratio.
CalmarReturn over the worst drawdown — reward per unit of the deepest pain an investor actually felt.capital-preservation matters and the path of losses, not just their variance, is the risk.
└M² (Modigliani)Sharpe restated in return units — what the portfolio would have earned levered to the benchmark's volatility σb\sigma_bσb​.you need Sharpe expressed as a return an investor can compare to the benchmark directly.

Ratio

excess returnchosen risk measure\dfrac{\text{excess return}}{\text{chosen risk measure}}chosen risk measureexcess return​

Every member is the same shape — an excess return over a denominator. The denominator is the whole lesson: it picks which risk gets rewarded.

▸ Variables
Rp, RfR_p,\ R_fRp​, Rf​Portfolio return and the risk-free rate, on the same annualised basis
RbR_bRb​Benchmark return (the active/tracking reference)
σp\sigma_pσp​Total volatility — standard deviation of all returns (the Sharpe denominator)
σd\sigma_dσd​Downside deviation — standard deviation of returns below a target (the Sortino denominator)
βp\beta_pβp​Portfolio beta — sensitivity to the market, cov(Rp,Rm)/σm2\mathrm{cov}(R_p, R_m)/\sigma_m^2cov(Rp​,Rm​)/σm2​ (the Treynor / Jensen denominator)
RmR_mRm​Market (or benchmark) return used to fit beta
TE\mathrm{TE}TETracking error — standard deviation of the active return Rp−RbR_p - R_bRp​−Rb​ (the Information Ratio denominator)
MDD\mathrm{MDD}MDDMaximum drawdown — the largest peak-to-trough decline over the window (the Calmar denominator)
αJ\alpha_JαJ​Jensen's alpha — return above the CAPM-predicted return
σb\sigma_bσb​Benchmark volatility — the standard deviation M² levers the portfolio's Sharpe ratio up to

△ The insight

Each ratio is excess return over a different risk — and the denominator is the opinion. Total vol (Sharpe) treats up and down alike; downside deviation (Sortino) forgives upside; beta (Treynor) prices only market risk; tracking error (Information) prices only benchmark deviation; max drawdown (Calmar) prices the worst path. Pick the denominator that matches the risk you actually fear.

What Strata computes

Strata leads with Sharpe (the universal cross-comparison) and Sortino (its skew-aware twin), then shows Treynor, Information Ratio, Jensen's alpha and Calmar alongside so the same stream can be judged on systematic, active and drawdown risk. M² is reported as Sharpe in return units. No single ratio is right — that's why it's a family, not one number.

Assumptions

  • •Returns and the risk-free / benchmark series are on the same annualised basis before any ratio is formed.
  • •Sharpe and Sortino assume volatility (total or downside) summarises risk; Treynor and Jensen assume a single-factor CAPM beta.
  • •Beta and tracking error are estimated from the historical window and are treated as stable over it.

Limitations

  • —All ratios are backward-looking — a calm window inflates every one of them.
  • —Ratios built on volatility miss fat tails; pair them with VaR\mathrm{VaR}VaR / ES\mathrm{ES}ES for the tail.
  • —Drawdown-based (Calmar) and benchmark-relative (Information Ratio) measures are especially sensitive to the chosen window and reference.
  • —A higher ratio is not automatically better risk-adjusted performance if the denominator misprices the portfolio's real risk.

vs Industry Tools

Morningstar / Bloomberg PORT: Report the same family; conventions differ (downside-target for Sortino, the benchmark and window for Information Ratio / Calmar).

Related

↗Value at Risk↗Sharpe Ratio
Go deeper
Sharpe (1994) — The Sharpe RatioModigliani & Modigliani (1997) — Risk-Adjusted Performance
›
Portfolio · risk-adjusted return

Sharpe Ratio

Excess return per unit of volatility. One accepted formula, the lesson is how you build each input.

SR=E[Rp]−Rfσp\mathrm{SR} = \dfrac{\mathbb{E}[R_p] - R_f}{\sigma_p}SR=σp​E[Rp​]−Rf​​
▸ Variables
E[Rp]\mathbb{E}[R_p]E[Rp​]Portfolio return, annualised (realised mean for ex-post, expected for ex-ante)
RfR_fRf​Risk-free rate on the same annualised basis (your chosen reference)
σp\sigma_pσp​Portfolio volatility, the annualised standard deviation of returns

What Strata computes

Strata reports the ex-post Sharpe: realised daily mean excess return annualised by ×252\times\sqrt{252}×252​, with the risk-free basis you set (default 4%4\%4%). The 252\sqrt{252}252​ scaling assumes returns are independent across days.

Assumptions

  • •Returns are independent and identically distributed across periods (what justifies the time\sqrt{\text{time}}time​ annualisation).
  • •Returns are approximately normal, so mean and standard deviation summarise the whole distribution.
  • •The risk-free rate is on the same period/annualisation basis as the return.

Limitations

  • —Penalises upside volatility exactly like downside — for skewed return streams that understates a good manager (the case for Sortino\textrm{Sortino}Sortino).
  • —Under-states risk for fat-tailed / non-normal returns, where standard deviation misses the tail (the case for a Cornish-Fisher\textrm{Cornish-Fisher}Cornish-Fisher adjustment).
  • —252\sqrt{252}252​ annualisation breaks when returns are autocorrelated (e.g. monthly, illiquid, or smoothed series).
  • —The excess basis is a choice: the same stream scores differently against Rf=0%R_f = 0\%Rf​=0% vs 4%4\%4%.
vs Industry Tools — n/a · same formula everywhere, only conventions differ

Related

↗Value at Risk↗Efficient Frontier
Go deeper
Sharpe (1994) — The Sharpe Ratio
›
Portfolio · tail risk

Value at Risk

The loss not exceeded at a confidence level over a horizon. Several ways to estimate the distribution, two ways to measure the tail.

ApproachHow it builds the distributionUse when
ParametricAssume returns are normal; read the loss straight off the α\alphaα quantile.fast checks on roughly linear, roughly normal books.
└Cornish-FisherBend the normal quantile for skew SSS and excess kurtosis KKK — fat tails without a full simulation.a cheap fat-tailed cross-check on the parametric number.
Historical◢ defaultRank the realised outcomes and take the empirical (1−α)(1-\alpha)(1−α) percentile — no distribution assumed.you have a clean lookback window and non-linear payoffs.
Monte-Carlo◢ defaultSimulate correlated forward paths (GBM + Cholesky) and take the percentile of terminal values.forward-looking paths or path-dependent positions.

VaR (95%)

VaRα=V0−P1−α\mathrm{VaR}_\alpha = V_0 - P_{1-\alpha}VaRα​=V0​−P1−α​

A threshold: losses won't exceed this α\alphaα of the time. Silent on how bad the other (1−α)(1-\alpha)(1−α) gets.

ES / CVaR (97.5%)

ESα=E[L∣L>VaRα]\mathrm{ES}_\alpha = \mathbb{E}\bigl[L \mid L > \mathrm{VaR}_\alpha\bigr]ESα​=E[L∣L>VaRα​]

The tail average — mean loss beyond VaR, always ≥\ge≥ VaR. A measure, not a method: compute it on any row.

▸ Variables
V0V_0V0​Initial portfolio value
α\alphaαConfidence level (e.g. 95%, 97.5%)
zαz_\alphazα​Standard-normal quantile at α\alphaα (z95=1.645z_{95}=1.645z95​=1.645)
μ, σ\mu,\ \sigmaμ, σMean and standard deviation of P&L
P1−αP_{1-\alpha}P1−α​The (1−α)(1-\alpha)(1−α) percentile of the outcome distribution
LLLLoss, as a positive number
S, KS,\ KS, KSkewness and excess kurtosis (the Cornish-Fisher inputs)

△ The insight

VaR is not sub-additive — a diversified book can post a higher VaR than the sum of its parts, which is both wrong and gameable. ES is coherent (sub-additive), which is why Basel/FRTB moved the trading book to Expected Shortfall at 97.5%.

What Strata computes

Strata computes Historical + Monte-Carlo (one grounded in data, one in dynamics), each reported with ES alongside VaR. Cornish-Fisher is a fast fat-tailed cross-check; plain parametric is taught, then retired. No single row wins — that's why it's a grid.

Assumptions

  • •Every cell uses the same horizon and confidence — the only thing that varies is the distribution each approach assumes.
  • •Parametric/Cornish-Fisher assume a (corrected) normal; Historical assumes the window represents the future; Monte-Carlo assumes its simulation model.

Limitations

  • —Each approach is only as good as its inputs — a calm lookback understates risk for all of them.
  • —VaR ignores the shape of the tail beyond the cutoff — the reason ES exists.
  • —Parametric/Monte-Carlo inherit thin-tailed assumptions; Historical can't see un-sampled events.

vs Industry Tools

RiskMetrics / Basel FRTB: RiskMetrics popularised parametric VaR; Basel FRTB now mandates Expected Shortfall (97.5%) for the trading book — Strata reports both.

Related

↗Sharpe Ratio↗Monte-Carlo Simulation
Go deeper
Jorion — Value at RiskBasel — Minimum capital requirements for market risk (FRTB)
›
Portfolio · simulation

Monte-Carlo Simulation

Roll the portfolio forward thousands of times along random-but-realistic paths, then read the distribution of outcomes. The engine behind forward-looking VaR and projection fans.

St+Δt=St exp⁡ ⁣[(μ−12σ2)Δt+σΔt X],X=L Z,    Σ=LLTS_{t+\Delta t} = S_t\,\exp\!\Bigl[\bigl(\mu - \tfrac{1}{2}\sigma^2\bigr)\Delta t + \sigma\sqrt{\Delta t}\,\mathbf{X}\Bigr],\qquad \mathbf{X} = \mathbf{L}\,\mathbf{Z},\;\; \mathbf{\Sigma} = \mathbf{L}\mathbf{L}^{\mathsf T}St+Δt​=St​exp[(μ−21​σ2)Δt+σΔt​X],X=LZ,Σ=LLT
▸ Variables
StS_tSt​Asset (or portfolio) value at time ttt
μ\muμExpected return (drift)
σ\sigmaσVolatility of the asset
Δt\Delta tΔtTime step of the simulation (Strata uses monthly steps for efficiency)
Z\mathbf{Z}ZVector of independent standard-normal draws (one per asset, via Box-Muller)
X\mathbf{X}XThe correlated shock vector that actually drives each path
L\mathbf{L}LLower-triangular Cholesky factor of Σ\mathbf{\Sigma}Σ — turns independent normals into correlated ones
Σ\mathbf{\Sigma}ΣTarget covariance matrix the paths must reproduce

What Strata computes

Strata models each asset as geometric Brownian motion (log-normal, the Black-Scholes assumption) and injects cross-asset correlation through the Cholesky factor L\mathbf{L}L of the covariance matrix: independent normals Z\mathbf{Z}Z become correlated shocks X=LZ\mathbf{X} = \mathbf{L}\mathbf{Z}X=LZ. Monthly time steps keep it fast enough for the live VaR endpoint (capped at 5,000 sims on the public API). A tiny 10−1010^{-10}10−10 ridge is added before factoring for numerical stability.

Assumptions

  • •Returns are log-normally distributed (geometric Brownian motion, no jumps).
  • •Volatility and the correlation structure are constant over the simulation horizon.
  • •The covariance matrix is positive semi-definite so its Cholesky factor exists (a 10−1010^{-10}10−10 regularisation is added for safety).
  • •Independent normals are generated via the Box-Muller transform, then correlated by L\mathbf{L}L.

Limitations

  • —GBM's tails are thinner than reality — it under-states the chance of extreme moves, so MC VaR can look reassuring.
  • —Constant volatility and correlation ignore clustering and the crisis regime shift toward correlation 1.
  • —Output is only as good as the estimated μ\muμ and Σ\mathbf{\Sigma}Σ inputs — garbage in, confident-looking garbage out.
  • —Monthly steps trade path resolution for speed; path-dependent payoffs need finer steps.

vs Industry Tools

RiskMetrics: Similar simulation approach; may use GARCH for time-varying volatility instead of constant σ\sigmaσ.
Bloomberg MARS: Uses richer stochastic models for derivatives; Cholesky correlation is the universal standard either way.

Related

↗Value at Risk↗Covariance Matrix
Go deeper
Glasserman — Monte Carlo Methods in Financial Engineering
›
Portfolio · aggregation

Market-Value Weighted Metrics

How a per-holding number becomes a portfolio number: weight each holding by its market value. Bigger positions pull the average toward them.

Xport=∑iwi Xi∑iwiX_{\text{port}} = \dfrac{\sum_i w_i\,X_i}{\sum_i w_i}Xport​=∑i​wi​∑i​wi​Xi​​
▸ Variables
XportX_{\text{port}}Xport​Portfolio-level metric (e.g. duration, yield, dividend yield)
XiX_iXi​The same metric for holding iii
wiw_iwi​Market value of holding iii, in the display currency

What Strata computes

Strata weights by market value in the display currency — every holding is converted via the FX cross-rate first, then weighted, so a USD and a EUR position are compared on one basis. This is the right roll-up for linear, value-additive metrics (duration, yield); metrics that aren't linear in value (e.g. volatility, which needs the covariance matrix) are computed at the portfolio level instead, not weighted.

Assumptions

  • •All holding values are converted to the display currency before weighting.
  • •Weights are positive market values (a long-only roll-up).
  • •The metric being aggregated is approximately linear in market value, so a simple weighted average is valid.

Limitations

  • —Only valid for value-additive metrics — averaging volatilities or betas this way ignores correlation and overstates risk.
  • —Stale or mismatched FX rates distort the weights across currencies.
  • —Equal-weighting or risk-weighting would give a different portfolio number for the same holdings.
vs Industry Tools — n/a · same formula everywhere, only conventions differ

Related

↗Portfolio Variance↗FX Cross-Rate
Go deeper
CFA — Portfolio Management: Return & Risk
›
Portfolio · currency

FX Cross-Rate

Get the price of one currency in another when every quote is against a common base. Go through the base: divide out the source, multiply in the target.

rateFROM→TO=rates[TO]rates[FROM]\mathrm{rate}_{\text{FROM}\to\text{TO}} = \dfrac{\mathrm{rates}[\text{TO}]}{\mathrm{rates}[\text{FROM}]}rateFROM→TO​=rates[FROM]rates[TO]​
▸ Variables
FROM\text{FROM}FROMSource currency being converted out of
TO\text{TO}TOTarget currency being converted into
rates[⋅]\mathrm{rates}[\cdot]rates[⋅]Quote map: units of that currency per 1 unit of the base (USD), so rates[USD]=1\mathrm{rates}[\text{USD}] = 1rates[USD]=1

What Strata computes

Strata holds every rate as units per 1 USD and triangulates: FROM→TO\text{FROM}\to\text{TO}FROM→TO is rates[TO]/rates[FROM]\mathrm{rates}[\text{TO}]/\mathrm{rates}[\text{FROM}]rates[TO]/rates[FROM] (equivalently, USD-out then target-in). ECB is the primary source — EUR-based quotes are re-expressed onto the USD base on ingest. Every portfolio monetary calc routes through this so a multi-currency book is valued on one consistent basis.

Assumptions

  • •USD is the common base; all quotes are stored as 1 USD = XXX of each currency.
  • •Cross rates are derived by triangulation through USD, not quoted directly.
  • •A single mid rate is used (no separate bid/ask).

Limitations

  • —Triangulation uses mid rates, so it ignores the bid-ask spread a real conversion would pay.
  • —The result is only as fresh as the underlying quotes — stale rates misprice the book.
  • —Two conversions (out of base, into target) compound any rounding in each leg.

vs Industry Tools

ECB reference rates: Strata's primary source; EUR-based, re-based to USD before triangulation.

Related

↗Market-Value Weighted Metrics↗Portfolio Variance
Go deeper
ECB — Euro foreign exchange reference rates
›
Portfolio · return estimation

Bond Return Proxy

When a bond has no usable price history, estimate its daily return from carry plus a duration-scaled move in the matched Treasury yield. A first-order approximation: it sees rates, not credit.

rbond≈c252−Dmod Δyr_{\text{bond}} \approx \dfrac{c}{252} - D_{\text{mod}}\,\Delta yrbond​≈252c​−Dmod​Δy
▸ Variables
rbondr_{\text{bond}}rbond​Estimated daily bond return
cccAnnual coupon rate (decimal); c/252c/252c/252 is the daily carry
DmodD_{\text{mod}}Dmod​Modified duration — the price sensitivity to a yield move
Δy\Delta yΔyDaily change in the duration-matched benchmark UST yield

What Strata computes

Strata picks the benchmark UST by duration — ^IRX (3M), ^FVX (5Y), ^TNX (10Y), ^TYX (30Y) — applies the bond's modified duration to that day's yield change, and adds the daily carry c/252c/252c/252. The credit spread is held constant, so this is a rates-only proxy: it fills the return series so portfolio analytics (covariance, VaR, Monte-Carlo) can run when no clean price history exists.

Assumptions

  • •The benchmark UST is matched to the bond by duration: ^IRX (3M), ^FVX (5Y), ^TNX (10Y), ^TYX (30Y).
  • •The credit spread is held constant — only the rates component drives the proxied return.
  • •Linear duration approximation: convexity is ignored.
  • •Daily carry is the annual coupon spread evenly across the year, c/252c/252c/252.

Limitations

  • —Rates-only — it cannot see credit-spread moves, which dominate the return of lower-rated corporates (cross-link: credit-spread, DV01/CS01).
  • —First-order in duration: it ignores convexity, so it overstates losses and understates gains for large yield moves.
  • —A single benchmark tenor is a coarse match — a bond between key tenors inherits the wrong sensitivity to curve reshaping.
  • —Carry as c/252c/252c/252 ignores the actual accrual schedule and pull-to-par, so the level of return is approximate even when rates don't move.

vs Industry Tools

Bloomberg BRTN: Uses actual price changes; materially more accurate for corporate bonds, where credit-spread moves matter.

Related

↗Duration↗Monte-Carlo Simulation
Go deeper
CFA — Fixed-Income Risk & Return
›
Portfolio · rate stress

Portfolio Shock Analysis

Estimate the P&L hit from a parallel rate or spread shock across the book using duration. A fast first-order read — the same sensitivity that DV01 and duration express, applied as a finite shock.

ΔP≈−Dmod P Δy\Delta P \approx -D_{\text{mod}}\,P\,\Delta yΔP≈−Dmod​PΔy
▸ Variables
ΔP\Delta PΔPEstimated change in portfolio value from the shock
DmodD_{\text{mod}}Dmod​Modified duration of the position (or book-weighted duration)
PPPCurrent value of the position / portfolio
Δy\Delta yΔyThe applied yield (or spread) shock, in decimal

What Strata computes

Strata applies the book's modified duration to a user-set parallel shock Δy\Delta yΔy to get a quick P&L estimate across all rate-sensitive holdings. This is the same first-order sensitivity as DV01 and duration, just expressed as a finite shock rather than a per-1bp or per-1% rate: ΔP≈− DV01×(Δy in bp)\Delta P \approx -\,\text{DV01} \times (\Delta y \text{ in bp})ΔP≈−DV01×(Δy in bp). Use it for a fast scan; for an exact figure on large moves, re-price (the duration measures already cross-link here).

Assumptions

  • •Linear, first-order approximation — the price/yield relationship is treated as a straight line over the shock.
  • •A single parallel shift is applied across all holdings (one Δy\Delta yΔy for the whole book).
  • •Each position's modified duration is taken as fixed over the shock (no re-pricing).

Limitations

  • —Ignores convexity, so it overestimates losses and underestimates gains — the error grows with the size of the shock.
  • —Parallel-only: it cannot represent a steepener, flattener, or twist — only a uniform shift (use scenario/curve stress for those).
  • —It is the duration/DV01 sensitivity re-applied at a finite shock — it adds no new risk information beyond those, so read it alongside DV01 and duration, not instead of them.
  • —Spread and rate shocks are treated identically through one duration; it does not separate the credit (CS01) from the rate (DV01) channel.
vs Industry Tools — n/a · same formula everywhere, only conventions differ

Related

↗DV01↗Duration↗Portfolio Variance
Go deeper
CFA — Fixed-Income Risk & Return

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

SEC EDGAR XBRL Financials

Standardised financial statement data sourced from SEC XBRL inline filings (10-K and 10-Q)

As filed (SEC updates within hours of submission)
  • •Source: SEC EDGAR XBRL API (free, no key required)
  • •60+ standardised metrics: revenue, operating income, net income, EPS, assets, liabilities, equity, capex, D&A, working capital
  • •Up to 20 years of annual history where available
  • •Rate limit: 10 req/sec; User-Agent: Project Strata/1.0
  • •Bank/financial sector requires alternate GAAP line items (e.g., InterestAndDividendIncomeOperating)
  • •Used in: Equity Lab financials tab, DCF inputs auto-population, comps fundamentals

FRED — Federal Reserve Economic Data

US macroeconomic and rates data from the St. Louis Federal Reserve

Daily (market close for rates series)
  • •Series used: DGS10 (10Y UST yield, risk-free rate for WACC/CAPM)
  • •SOFR compounded averages (SOFR30DAYAVG, SOFR90DAYAVG, SOFR180DAYAVG) for short end of USD swap curve
  • •DGS2, DGS5, DGS10, DGS30 for market context panel
  • •FRED FEDFUNDS for federal funds rate display
  • •ICE swap rate series (ICERATES*) and H.15 DSWP series discontinued — not available
  • •Fallback: DGS10 defaults to 4.25% when FRED is unreachable

Damodaran Online — Valuation Datasets

Annual datasets from Prof. Aswath Damodaran (NYU Stern) used for market-implied equity risk premium, industry betas, and default spreads

Annual (updated each January)
  • •Implied equity risk premium (ERP): used as fallback when live ERP is unavailable (default 4.60%)
  • •Industry unlevered betas: used when FMP live beta is outside [0.1, 5.0] or unavailable
  • •Country risk premiums (CRP) by nation for international WACC estimation
  • •Default spreads by credit rating and seniority for cost-of-debt estimation
  • •Hosted at: pages.stern.nyu.edu/~adamodar/

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