Bayesian NAV Updating w/ Kalman Filters

Updating quarterly marks via x^tt=x^tt1+Kt(ztHx^tt1)\hat{x}_{t\mid t} = \hat{x}_{t\mid t-1} + K_t(z_t - H\hat{x}_{t\mid t-1}).

10/5/2025

Valuation is not a verdict; it is a belief with receipts. Bayesian updating turns scraps of quarter-to-date evidence into a living, probabilistic estimate of NAV. The math is compact; the philosophy is wide: confidence with a dial. Laplace called probability "common sense reduced to calculation." Tetlock reminded us that "beliefs are hypotheses to be tested, not treasures to be guarded."

This post builds a model step by step. Each step adds one idea and shows how it changes the posterior and the decisions you might take. Think "from toy to tool":

  • simple normal update,
  • many signals,
  • sequential updates,
  • better priors,
  • robust likelihoods,
  • a small state-space model,
  • cross-fund pooling,
  • decisions and diagnostics.

TL;DR

  1. Model the quarter-end return rqr_q as a hidden variable.
  2. Combine a prior (manager, macro) with the likelihood of partial signals.
  3. Interpret the posterior as a belief to act on, then test and recalibrate.

Ten-second intuition

Bayes updates beliefs:

p(ry)p(yr)p(r).p(r \mid y) \propto p(y \mid r)\,p(r).
  • The prior p(r)p(r) encodes what you believed before you saw this quarter.
  • The likelihood p(yr)p(y \mid r) says how probable the data would be if the true return were rr.
  • The posterior p(ry)p(r \mid y) blends the two, with the balance set by comparative uncertainty.

A tighter prior (more certain) moves less; a cleaner signal (less noisy) moves you more. This is the same engine behind weather nowcasting, sensor fusion, and Black-Litterman portfolio updates.

Interactive — Prior vs Posterior (one latent). Use the sliders to change the prior mean and standard deviation. Watch how the posterior curve shifts and tightens as the signal gets cleaner. Treat prior sd as your "confidence dial": narrow = dogmatic, wide = humble.

Play with prior confidence

Prior standard deviation s0 (%, on quarterly r)

humble
dogmatic
−0.4−0.200.20.40102030405060
Prior rPosterior rPrior vs Posterior (single latent r)Quarterly log return rDensity
E[r|y] ≈ 1.44%
sd ≈ 0.61%
N-N: mN=1.44%, sN=0.61%

Posterior combines the prior with active signals. Narrower priors move less; stronger data move more.


Setup and notation

Let VqV_q be NAV at quarter end qq. Define quarterly log return

rq=log ⁣(VqVq1).r_q = \log\!\left(\frac{V_q}{V_{q-1}}\right).

We use log returns because they add across time: if monthly logs are r1,r2,r3r_1, r_2, r_3, then rq=r1+r2+r3r_q = r_1 + r_2 + r_3. That makes sequential updating algebraic instead of acrobatic.

During the quarter, partial evidence trickles in:

  • exact or near-final month 1,
  • provisional month 2,
  • proxies for month 3 (sector ETFs, macro surprises, peer marks).

Our task: infer rqr_q continuously and map it into a distribution for VqV_q.

NAV mapping. If rqN(m,s2)r_q \sim \mathcal{N}(m, s^2), then VqdataV_q \mid \text{data} is lognormal with

E[Vqdata]=Vq1exp(m+12s2).\mathbb{E}[V_q \mid \text{data}] = V_{q-1}\,\exp\big(m + \tfrac{1}{2}s^2\big).95% band    [Vq1exp(m1.96s),  Vq1exp(m+1.96s)].\text{95\% band} \;\approx\; \big[\,V_{q-1}\,\exp\big(m - 1.96\,s\big),\; V_{q-1}\,\exp\big(m + 1.96\,s\big)\,\big].

The minimal model: one latent, one signal

Start with one belief, one clue.

  • Prior: rN(m0,s02)r \sim \mathcal{N}(m_0, s_0^2)
  • Signal: yrN(r,sy2)y \mid r \sim \mathcal{N}(r, s_y^2)

Posterior:

s12=s02+sy2,m1=s12(s02m0+sy2y).s_1^{-2} = s_0^{-2} + s_y^{-2},\qquad m_1 = s_1^2 \left(s_0^{-2} m_0 + s_y^{-2} y\right).

This is a precision-weighted average. Intuition: if the signal is twice as precise (half the variance) as the prior, it gets twice the weight.

Common pitfalls.

  • Do not double-count the same piece of information via multiple "signals".
  • Keep units straight: work in logs when you add over months, and convert to percents only for display.

Interactive — Signals and posterior (start simple). Set one signal equal to a clean month-1 return, vary its sd, and watch the posterior mean migrate toward yy while the band tightens.

Signals
−0.4−0.200.20.40102030405060
PriorPosteriorPosterior with selected signalsQuarterly log return rDensity

NAV: E[V] ≈ 101.45 | median ≈ 101.45 | 5–95% ≈ [100.43, 102.49]


Multi-signal extension (conjugate Normal)

Now allow many clues that linearly load on rr:

ykrN(akr+bk,sk2),k=1,,K.y_k \mid r \sim \mathcal{N}(a_k r + b_k, s_k^2),\quad k=1,\dots,K.

Stack in matrix form: y=Ar+b+ϵy = A r + b + \epsilon with A=[a1,,aK]A = [a_1,\dots,a_K]^\top and ϵN(0,R)\epsilon \sim \mathcal{N}(0, R), R=diag(sk2)R=\mathrm{diag}(s_k^2). The posterior remains Normal:

sN2=(s02+AR1A)1,mN=sN2(s02m0+AR1(yb)).s_N^2 = \left(s_0^{-2} + A^\top R^{-1} A\right)^{-1},\qquad m_N = s_N^2\left(s_0^{-2} m_0 + A^\top R^{-1}(y - b)\right).

Why this matters. Different proxies carry different units and cleanliness. A sector ETF with ak1a_k \approx 1 and small sks_k will move beliefs more than a noisy peer print with ak0.4a_k \approx 0.4.

NAV expectation.

E[Vqdata]=Vq1exp ⁣(mN+12sN2).\mathbb{E}[V_q \mid \text{data}] = V_{q-1}\,\exp\!\left(m_N + \tfrac{1}{2}s_N^2\right).

Interactive — Multiple signals. Toggle aka_k, bkb_k, yky_k, and sks_k to see how weights reallocate when you add or remove evidence. The implied NAV band updates in place.

Signals
−0.4−0.200.20.40102030405060
PriorPosteriorPosterior with selected signalsQuarterly log return rDensity

NAV: E[V] ≈ 101.45 | median ≈ 101.45 | 5–95% ≈ [100.43, 102.49]


Sequential updating through the quarter

Evidence arrives in order, but conjugate Normal updates commute: updating with y1y_1 then y2y_2 yields the same posterior as updating once with (y1,y2)(y_1,y_2) together. That lets you treat the quarter as a loop:

  • T1 (after month 1): prior (m0,s02)(m_0,s_0^2) updated by y1y_1 gives (m1,s12)(m_1,s_1^2)
  • T2: update by y2y_2 to (m2,s22)(m_2,s_2^2)
  • T3: add proxies for month 3
  • T4: final mark collapses uncertainty

Order-invariance proof sketch. With independent Gaussian signals, posteriors multiply and the product of Gaussians is Gaussian; multiplication is commutative, so the update order does not matter.

Interactive — Timeline scrubber. Scrub T1 to T4 and see the band narrow. The badges report posterior mean and sd at each stage.

Sequential updates
−0.4−0.200.20.40102030405060
T1T2T3T4Sequential updating: T1 → T4Quarterly log return rDensity
T1: m=1.79%, sd=0.89%
T2: m=1.50%, sd=0.63%
T3: m=1.44%, sd=0.61%
T4: m=1.44%, sd=0.61%

As you move from T1 to T4, evidence accumulates and the distribution tightens. T4 can be modeled as an almost-exact observation.

StageMean r (%)SD r (%)
T11.790.89
T21.500.63
T31.440.61
T41.440.61

Constructing the prior: reputation and regime

A good prior is earned, not guessed.

Reputation as pseudo-data. Suppose a manager has track record mean rˉ\bar r and variance strack2s_{\text{track}}^2 over nn quarters. Use an effective sample size neffnn_{\text{eff}} \le n to discount for drift or luck. Then

m0=λrˉ+(1λ)mpeer,s02=strack2neff,λ[0,1].m_0 = \lambda\,\bar r + (1-\lambda)\,m_{\text{peer}},\qquad s_0^2 = \frac{s_{\text{track}}^2}{n_{\text{eff}}},\quad \lambda \in [0,1].

Regime priors. Add macro features ff with a ridge prior on coefficients:

rfN(mbase+βf, sbase2),βN(0, τ2I).r \mid f \sim \mathcal{N}(m_{\text{base}} + \beta^\top f,\ s_{\text{base}}^2),\qquad \beta \sim \mathcal{N}(0,\ \tau^2 I).

This is just regularized regression; Black-Litterman is a portfolio-size cousin.

Interactive — Prior builder. Feed in a track record and a peer rate, set neffn_{\text{eff}}, and push (m0,s0)(m_0,s_0) into the rest of the post.

Prior builder: reputation and regime
low rep
high rep
m0 ← 1.65%
s0 ← 1.59%
n_eff = 12
Apply to prior

We treat past performance as pseudo-observations and shrink toward a peer base rate. Smaller effective samples widen s0; tighter priors imply stronger conviction.


Robustness: when reality is not Gaussian

Marks can jump, proxies can be wrong, and volatility is not constant.

  • Unknown variance. A Normal-Inverse-Gamma prior on (r,σ2)(r,\sigma^2) yields a Student-t posterior on rr. Fatter tails slow overreaction to outliers.
  • Outlier-resistant likelihood. Model ykrtν(akr+bk,sk2)y_k \mid r \sim t_\nu(a_k r + b_k, s_k^2). Small ν\nu down-weights wild points.

Interactive — Likelihood chooser. Flip between Gaussian and t, vary ν\nu, and note how the posterior spreads when you admit heavy tails.

Robustness to tails and noise
−0.4−0.200.20.40102030405060
Posterior (Gaussian)PriorLikelihood assumptions: Gaussian vs Student-tQuarterly log return rDensity
E[r|y] ≈ 1.44%
sd ≈ 0.61%

Lower ν thickens tails, putting more probability on outliers and slowing overreaction to noisy signals.


State-space step-up: monthly latent returns (Kalman)

We now model the monthly path, not just the quarterly sum. The latent state is

x=[r1r2r3],rq=1x.x = \begin{bmatrix} r_1 \\ r_2 \\ r_3 \end{bmatrix},\qquad r_q = \mathbf{1}^\top x.

Process (prior). Each month has baseline mean plus macro tilt and correlated uncertainty:

rmN(μm, sproc2),Cov(x)=sproc2C(ρ),r_m \sim \mathcal{N}(\mu_m,\ s_{\text{proc}}^2),\quad \mathrm{Cov}(x) = s_{\text{proc}}^2\,C(\rho),

where C(ρ)C(\rho) is a 3x3 Toeplitz correlation with Cij=ρijC_{ij}=\rho^{|i-j|}. This makes months related but not identical.

Observations.

  • exact months: ym=rm+ϵmy_m = r_m + \epsilon_m, with small but nonzero sd sobs12s_{\text{obs12}} (near-final, not perfect),
  • month-3 proxy: y3=r3+e3y_3 = r_3 + e_3, e3N(0,sobs2)e_3 \sim \mathcal{N}(0, s_{\text{obs}}^2),
  • optional final sum: yΣ=r1+r2+r3+ηy_{\Sigma} = r_1 + r_2 + r_3 + \eta, with sd sΣs_{\Sigma}.

Kalman update (scalar measurement). For a measurement y=Hx+εy = Hx + \varepsilon, εN(0,R)\varepsilon \sim \mathcal{N}(0,R), the update is

K=PH(HPH+R)1,m+=m+K(yHm),K = P^- H^\top (H P^- H^\top + R)^{-1},\quad m^+ = m^- + K(y - H m^-), P+=(IKH)P(IKH)+KRK(Joseph form, PSD safe).P^+ = (I - K H)\,P^-\,(I - K H)^\top + K R K^\top\quad \text{(Joseph form, PSD safe)}.

What the gain KK does. KK increases when PP^- is large (you were uncertain) or RR is small (measurement is clean). That is, move fast when you were unsure and the new data are good.

Total-quarter uncertainty. The variance of the quarterly return is

Var(rq)=1P1.\mathrm{Var}(r_q) = \mathbf{1}^\top P \mathbf{1}.

Interactive — Monthly state nowcast.

  • Move through stages T1 to T4; see how exact months collapse their bands and the sum variance shrinks.
  • Increase ρproc\rho_{\text{proc}} to couple months more tightly.
  • Use nonzero sobs12s_{\text{obs12}} so "exact" months are near-final rather than perfect; this prevents degeneracy and is more realistic.
Kalman nowcast (3-month state)
r1r2r3sum−10123
Posterior meanPrior mean (per month)Monthly latent returns and quarter sum (posterior means with 95% bands)Return (%)
r_sum mean ≈ 1.27%
sd ≈ 0.92%
E[V] ≈ 101.29
5–95% ≈ [99.46, 103.13]

Non-zero prior correlation (rho_proc) and finite observation noise (s_obs12) prevent the geometry from degenerating to identity. The Joseph update keeps P PSD and numerically stable.

Measurement geometry
H selects which r_m you observe
R sets measurement noise
P → ρ for readability
r1r2r3r3r2r1
−1−0.500.51ρCorrelation of monthly latent returns (ρ)0.000.051.000.021.000.051.000.020.00
020406080100r1r2r3
Observation vector H at stage T3Loading (percentage points)
Observation variance RR ≈ 1.00e-4

We visualize correlation rather than raw covariance to center the color scale at 0 and emphasize structure over magnitude. H is a simple loading vector; R is the scalar noise level for the current measurement.

How to read the geometry.

  • The correlation heatmap shows structure across months; off-diagonals indicate shared shocks.
  • The HH bar shows which latent you are observing at this stage (e.g., month 2 or a sum).
  • RR is the observation noise; larger RR yields smaller KK and gentler moves.

Cross-fund pooling: hierarchical Bayes

You rarely follow one fund. To calibrate beliefs across many, you share statistical strength.

Model quarterly fund returns riqr_{iq} with fund-specific means μi\mu_i and idiosyncratic noise σi\sigma_i:

riqN(μi+βfq, σi2),μiN(μsector, τ2).r_{iq} \sim \mathcal{N}(\mu_i + \beta^\top f_q,\ \sigma_i^2), \qquad \mu_i \sim \mathcal{N}(\mu_{\text{sector}},\ \tau^2).

Given a fund summary with sample mean rˉi\bar r_i, variance si2s_i^2, sample size nin_i, the posterior for μi\mu_i is

μidataN ⁣(ωirˉi+(1ωi)μsectorshrunken mean, (nisi2+1τ2)1posterior variance),\mu_i \mid \text{data} \sim \mathcal{N}\!\left( \underbrace{\omega_i \bar r_i + (1-\omega_i)\mu_{\text{sector}}}_{\text{shrunken mean}},\ \underbrace{\left(\frac{n_i}{s_i^2} + \frac{1}{\tau^2}\right)^{-1}}_{\text{posterior variance}} \right),

with shrinkage weight

ωi=ni/si2ni/si2+1/τ2.\omega_i = \frac{n_i / s_i^2}{n_i / s_i^2 + 1/\tau^2}.

Interpretation: data-poor or high-volatility funds (small ni/si2n_i/s_i^2) shrink more. This is James-Stein in fund clothing.

Interactive — Shrinkage in action. Move τ\tau to tune pooling strength. Long arrows mean heavy shrinkage. Try increasing volatility for a couple of funds to see how their posteriors retreat toward the sector anchor.

Cross-fund pooling
tight
loose
−505Fund 1Fund 2Fund 3Fund 4Fund 5Fund 6Fund 7Fund 8Fund 9Fund 10Fund 11Fund 12
Sector meanObserved meanPosterior (shrunken)Hierarchical shrinkage: raw vs posterior fund meansQuarterly return (%)
Shrinks extremes toward mu_sector
tau controls pooling strength
Fundnsigma (%)raw (%)post (%)|shrink| (pp)
Fund 21210.85-7.01-4.692.31
Fund 786.867.556.341.21
Fund 8147.64-4.94-4.060.88
Fund 32711.87-3.83-2.960.87
Fund 9228.97-5.02-4.230.79

Data-poor or high-vol funds shrink more. Pooling trades narrative for calibration.


From belief to action

A posterior is not an answer; it is a control surface for choices. Here are three operational views:

  1. Tail odds. For a loss threshold LL in log terms, compute P(rqL)P(r_q \le L) and decide if rebalancing or hedging triggers.
  2. Beat-the-benchmark odds. If the benchmark quarterly log return is rr^*, then P(rq>r)P(r_q > r^*) quantifies the chance of outperformance.
  3. Risk-adjusted rule. Define risk-adjusted return
RA=mλs,\mathrm{RA} = m - \lambda s,

with mm the posterior mean and ss the posterior sd. Choose thresholds taddt_{\text{add}} and ttrimt_{\text{trim}}; Add if RAtadd\mathrm{RA} \ge t_{\text{add}}, Trim if RAttrim\mathrm{RA} \le t_{\text{trim}}, else Hold.

Contours. Lines of constant RA satisfy s=(mt)/λs = (m - t)/\lambda; steeper λ\lambda penalizes uncertainty more.

Value of information (quick approximation). If the next signal reduces variance from s2s^2 to s2Δs^2 - \Delta, the RA improves by about (λ/2)Δ/s(\lambda/2)\,\Delta/s for small changes. Expensive information should clear this expected improvement hurdle.

Interactive — Decision map. The heatmap shows Add/Hold/Trim regions in the nonnegative quadrant. The cross marks your current posterior. Tune λ\lambda and thresholds to match mandate and risk appetite.

From beliefs to actions
0510152005101520
Add boundaryTrim boundaryCurrent posteriorDecision map: risk-adjusted mean vs uncertainty (non-negative region)Posterior mean r (%)Posterior sd r (%)
Recommend: ADD
RA = 0.83 pp

The map now shows only non-negative means and standard deviations. Adjust the axis maxima to fit your fund’s posterior scale.


Diagnostics and epistemic humility

Beliefs need audit trails. Three checks help keep you honest.

  • Log score. The average log predictive density 1Nilogp(riμi,si)\frac{1}{N}\sum_i \log p(r_i \mid \mu_i, s_i) rewards sharp and calibrated forecasts.
  • Brier score. For a binary event like r<0r<0, the mean squared error between predicted probabilities and outcomes.
  • Calibration curves and PIT. Probability integral transforms ui=Fi(ri)u_i = F_i(r_i) should be uniform if calibrated; reliability curves should sit on the diagonal.

Interactive — Calibration dashboard. Simulate forecasts and outcomes. Inject mean bias or noise mis-specification and see how the PIT warps and scores deteriorate. Then fix your priors or likelihoods upstream.

Calibration and scoring
Log score ≈ 1.799
Brier ≈ 0.217
00.20.40.60.810510152025
PIT histogram (should be flat if calibrated)u = F_i(r_i)Count
020406080100020406080100
IdealObserved vs predictedReliability: predicted vs realized P(r<0)Predicted P(r<0) (%)Observed frequency (%)

A flat PIT and a reliability curve on the diagonal indicate well-calibrated beliefs. If not, widen priors or revisit likelihood assumptions.


Implementation notes

  • Treat each signal’s uncertainty sks_k as first-class metadata.
  • Prevent leakage: never let final marks influence interim updates.
  • Unit test the algebra: conjugate updates, Kalman recursions (including Joseph form), and posterior predictive checks.
  • Beware double counting: a peer print and an ETF move may express the same shock; correlate or down-weight accordingly.

The progression — simple average -> multi-signal -> sequential -> dynamic -> pooled — mirrors the evolution of belief itself: from a single guess to a system that learns, checks itself, and earns its confidence.