Kelly Criterion — Cheatsheet Derivation

Kelly Criterion — Cheatsheet Derivation


Step 1 One Period Expectancy

E = pB − q

where p = win probability, q = 1−p = loss probability, B = net odds (win B per unit staked, lose 1).

Why: Weighted average of outcomes. Win B with probability p, lose 1 with probability q.


Step 2 Per-Flip Wealth Multipliers

Bet fraction f of current wealth W:

  • Win: W₁ = W(1+Bf)
  • Lose: W₁ = W(1−f)

Why: You keep the unbet portion W(1−f) regardless. On a win you collect B times your stake Wf on top. On a loss your stake Wf is gone.


Step 3 Wealth After n Flips

After h wins and (n−h) losses:

Wₙ = W₀(1+Bf)h(1−f)n−h

Why: The flips compound — each one rescales whatever the previous left. That means multiply, not add. Order doesn’t matter, only h and n−h.


Step 4 Per-Flip Growth Rate G

Take the nth root of total growth to extract the per-period rate:

G = (Wₙ/W₀)1/n = (1+Bf)h/n · (1−f)(n−h)/n

As n → ∞, law of large numbers: h/n → p, (n−h)/n → q.

G = (1+Bf)p(1−f)q

Why nth root: Same logic as extracting r from (1+r)n = total growth. Geometric mean, not arithmetic, because the process is multiplicative.


Step 5 Take ln Before Differentiating

Define g = ln(G). Since ln is monotonically increasing, maximizing g gives the same f* as maximizing G.

Apply two log rules:

  • ln(AB) = ln(A) + ln(B)  →  product becomes sum
  • ln(Ap) = p·ln(A)  →  exponent drops to coefficient
g = p·ln(1+Bf) + q·ln(1−f)

Why: Differentiating a product of powers is a mess. A sum of logs is trivial. Valid because ln is monotone — same maximum, easier math.


Step 6 Differentiate and Set to Zero

Rule: ddx[ln(x)] = 1x. Chain rule: multiply by derivative of the inside.

  • ddf[p·ln(1+Bf)] = pB1+Bf  ← chain rule gives B from inside (1+Bf)
  • ddf[q·ln(1−f)] = −q1−f  ← chain rule gives −1 from inside (1−f)

Set dg/df = 0:

pB1+Bf − q1−f = 0

Step 7 Solve for f*

Cross-multiply:

pB(1−f) = q(1+Bf)

Expand:

pB − pBf = q + qBf

Collect f terms:

pB − q = pBf + qBf = Bf(p+q)

Since p+q = 1:

f* = pB−qB = p − qB

The Answer

f* = pB − qB

Read as: edge / odds

  • Numerator pB−q is your expected profit per unit bet
  • Denominator B scales it by the odds

Special case B=1 (even money): f* = p−q

Your optimal bet equals your raw edge.


Key Insights

What Why it matters
Multiplicative wealth function One bad bet can’t be offset by other bets — sizing matters
Geometric mean not arithmetic Compounding processes need per-period rates, not averages
ln transform Turns product into sum without moving the maximum
Chain rule on ln(1−f) The −1 derivative is what creates a finite optimum
p+q=1 The simplification that closes the algebra cleanly

“end behavior”

Alex is an options trader you should follow in case he ever tweets a lot. Because he doesn’t, when he posted the question below a year ago, it got few responses. I took the liberty of posting it myself this week.

Article content

This was fun because it led to a lot of discussion on the timeline and DMs. I was told it sparked a bunch of quant debate on one trader’s desk.

The most popular answer, which was still less than 1/3 of the responses, was the correct answer.

Why?

The maximum value of a put is the strike. The maximum value of a call is the stock price.

Straddle is C + P so $100+$100 = $200

Notice how this means all call spreads go to zero since the calls are worth the same — the stock price. All put spreads go to their max value— the distance between strikes because the puts themselves are worth the strikes.

Logic for delta:

Delta is the change in option price per change in stock.

But the put’s strike is fixed, so the value of the put doesn’t depend on the stock price. The put has zero delta. It’s always worth $100. Which means it has no gamma either 🙂

The call is $100 because the max value of the call is the stock price. The call value moves 1-to-1 with the stock, so it has a delta of 1 or 100%

The max value of a straddle is therefore the stock price plus the strike price.

If you sell the straddle or either option at max value and hedge on its delta one time (this is known as a static hedge in contrast to dynamic hedging where you would rebalance as your hedge ratio changes), you cannot lose. It is that simple fact of arbitrage that makes it the upper bound.

To address the second most popular response in the poll, those who said the straddle is $100 (wrong) and has a 1.00 delta (correct), we will demonstrate why this is incorrect.

What’s your p/l if you sell 1 straddle at $100 and buy 100 shares against, if the stock goes to $300?

The straddle will be worth $400, so you lose $300 but make $200 on your long share.

Hmm, maybe I’m just underhedged. Fine, what if I hedge on a 200 delta?

In that case, you actually make money; you win $400 on your 2 shares more than offsetting the $300 straddle loss. But what if the stock went to zero?

Your straddle p/l is unchanged, but you lost $200 on the long stock position. Arbitrage max value means you cannot lose if you sell at that price. Since we found a losing scenario, the price is not the maximum arbitrage bound. If you sell the straddle at $200 and buy a single share of stock, there’s no scenario where you lose. It is the lowest straddle value for which this no-lose scenario is true, thus it’s the arbitrage bound.

Of course, this is but a toy problem where the call and put go to their maximum values because it’s a degenerate case of infinite time or vol. But learning how a function (an option price is just a function) behaves by observing its boundaries is good for intuition. You did this in 9th grade. Khan Academy can jog your memory:

Article content

In the real world, you can fleetingly find options that trade beyond their arbitrage values:

Article content

Earlier in the week, @DeepDishEnjoyer aka p4 wrote a thread about a dividend mispricing.

It led to some back and forth with passersbys who use options but appear to have large gaps in the fundamentals.

Between the maximum value poll and p4’s dividend lesson, it’s worth saying it:

In a proper option education, you spend a lot of time on arbitrage relationships, cost of carry, and synthetics before you ever hear the word “volatility”.

I didn’t study formal math but I imagine there’s a lot in common with the process of proofs. Arbitrages rest heavily on assumptions. So to understand the relationships, you are forced into an intimate familiarity with the assumptions. And in the extremes of everything, it’s the failure to examine assumptions that leads to being blindsided. But also, when things get extreme, to go on the attack means asking yourself, “Who’s on autopilot? Is this price resting on a stale assumption?” The arbitrage relationships give you the highest conceptual ROI that derivatives offer, you never learn the most useful thing derivatives can teach…passage over the “bridge of asses”.

If you want to see more examples of why option basics are so key to understanding assumptions and opportunities when things get weird:

Variance & Covariance Cheat Sheet

Variance & Covariance Cheat Sheet

Starting points (where every derivation begins)

Everything below is derived from these definitions. They’re the raw material — average squared deviation for variance, average product of deviations for covariance. When a derivation feels stuck, come back here and plug in.

Variance — average squared deviation from the mean
Var(X) = E[(X − μ)2]    μ = E[X]
Covariance — average product of deviations
Cov(X, Y) = E[(X − μX)(Y − μY)]
Sum of squared deviations (the un-averaged version)
SS = Σ (xi − μ)2    Var = SSn

Variance is just SS divided by n (or n−1 for a sample). Same object, before you average.

The move in every derivation: plug into one of these, expand the square or product (pure algebra), apply E using linearity, then recognize the Var/Cov patterns that fall out. The computational forms below (E[X2] − (E[X])2, E[XY] − E[X]E[Y]) are results of doing this, not starting points.


The identities

Variance from the definition
Var(X) = E[(X − μ)2] = E[X2] − (E[X])2

Average of the squares minus the square of the average. Worth showing where that second form comes from, since every later grind reuses this exact collapse. Start from the deviation definition and expand the square:

1n Σ(xi − x)2 = 1n Σ(xi2 − 2xix + x2)

Average term by term. The key is that x is a constant (already computed), so it pulls out of the sums:

  • First term: (1/n)Σxi2 = E[X2]
  • Middle term: (1/n)Σ(−2xix) = −2x · (1/n)Σxi = −2x · x = −2(E[X])2
  • Last term: (1/n)Σx2 = x2 = (E[X])2 (averaging a constant returns the constant)

Put them together — and notice the last term carries a coefficient of 1, not 2:

E[X2] − 2(E[X])2 + (E[X])2 = E[X2] − (E[X])2

The −2 and +1 combine to −1. That collapse — middle and last terms both becoming (E[X])2 and partially cancelling — is the same move behind every Var/Cov identity on this sheet.

Covariance from the definition
Cov(X, Y) = E[(X − μX)(Y − μY)] = E[XY] − E[X]E[Y]

Average of the products minus the product of the averages.

Variance is covariance with itself
Cov(X, X) = Var(X)
Scaling rule for variance
Var(aX) = a2 · Var(X)

Constants pull out as their square.

Scaling rule for covariance
Cov(aX, bY) = ab · Cov(X, Y)
Shifting rule for covariance
Cov(X + c, Y) = Cov(X, Y)

Adding a constant doesn’t change covariance.

Covariance with a constant is zero
Cov(X, c) = 0

Constants don’t co-vary.

Variance of a sum
Var(X + Y) = Var(X) + Var(Y) + 2 · Cov(X, Y)
Variance of a weighted sum (the workhorse)
Var(aX + bY) = a2 Var(X) + b2 Var(Y) + 2ab · Cov(X, Y)

Here a and b are the amounts held of each asset. They’re portfolio weights when they sum to 1. Var(X+Y) above is just this formula with a = b = 1 — one unit of each, no weighting lever. The weights are what turn a raw sum into a portfolio.

Worked example. Two assets: σX = 20%, σY = 10%, ρ = 0.3. Equal weights a = b = 0.5.
  • Var(X) = 0.04,   Var(Y) = 0.01
  • Cov(X, Y) = ρ · σX · σY = 0.3 · 0.2 · 0.1 = 0.006
  • Var(P) = 0.25·0.04 + 0.25·0.01 + 2·0.5·0.5·0.006 = 0.01 + 0.0025 + 0.003 = 0.0155
  • σP = √0.0155 ≈ 12.4%
Compare to the naive weighted-average vol, 0.5·20% + 0.5·10% = 15%. The cross term (with ρ < 1) is what pulls portfolio vol below the average of the two vols. That gap is the diversification benefit.
Variance of a difference (spread variance / pair-trading formula)
Var(X − Y) = Var(X) + Var(Y) − 2 · Cov(X, Y)

Same as Var(X+Y) but cross term flips sign. When X and Y are highly correlated, spread variance is small — the math behind why pair trades work.

Bilinearity of covariance
Cov(X, A + B) = Cov(X, A) + Cov(X, B)

Same in the first slot by symmetry.

Where it’s used. This is the move that lets you compute an asset’s covariance with a whole portfolio without re-deriving anything. Say a portfolio P = 0.5A + 0.5B and you want how asset A co-moves with the portfolio it sits in:
Cov(A, P) = Cov(A, 0.5A + 0.5B) = 0.5 Var(A) + 0.5 Cov(A, B)
Distribute across the sum, pull the weights out. That number — an asset’s covariance with its own portfolio — is its marginal contribution to portfolio risk, and it’s exactly what you FOIL out when you expand Var(w1X1 + … + wnXn) into the full covariance matrix. Bilinearity is the engine under every portfolio-variance calculation.
Variance of a binomial
Var(H) = np(1−p)   where H = Σ Xi

Derived in two steps, both from scratch.

Step 1 — variance of a single flip. One flip X is 1 with probability p, 0 with probability (1−p). Mean is E[X] = p. Plug into the squared-deviation definition — deviations are (1−p) for heads and (0−p) = −p for tails, each weighted by its probability:

Var(X) = p(1−p)2 + (1−p)p2

Factor out p(1−p): the bracket is (1−p) + p = 1, so

Var(X) = p(1−p)

(Peaks at p = 0.5, value 0.25 — the fair coin is the most uncertain, most variance per flip.)

Step 2 — n flips. Write H as a sum of n independent single flips, H = X1 + … + Xn. Variance of a sum adds the pairwise Cov terms, but independent flips have Cov(Xi, Xj) = 0, so every cross term drops. The n identical variances just add:

Var(H) = Σ Var(Xi) = n · p(1−p)

The np(1−p) isn’t handed to you — it falls out of one Bernoulli’s p(1−p) times n, because independence kills the covariances.

Standard deviation scaling
StDev(aX) = |a| · StDev(X)
Correlation definition
ρ = Cov(X, Y)σX · σY

When ρ = 1: Cov(X, Y)2 = Var(X) · Var(Y).


The derivation recipe

Every identity in this neighborhood comes out of the same five moves. When you see a Var or Cov of something built from linear combinations of random variables, this is the procedure.

  1. Plug into the definition. Use Var(Z) = E[Z2] − (E[Z])2 or Cov(X, Y) = E[XY] − E[X]E[Y] depending on what you’re computing.
  2. Expand squares and products. Pure algebra on the random variables. FOIL out any binomials. No expectations yet.
  3. Apply E using linearity. Distribute E across sums, pull constants out of expectations. This is the step that does the most work. Always handle linearity first when you have the chance — squaring is not linear, so you simplify E first and let the square wrap what’s left.
  4. Group matching terms. Line up the things that share factors (a2 terms together, ab terms together, b2 terms together, etc.).
  5. Factor and recognize. Pull out shared factors and spot the patterns: (E[X2] − (E[X])2) is Var(X), and (E[XY] − E[X]E[Y]) is Cov(X, Y).

The reason this recipe always closes: variances and covariances are quadratic in the underlying random variables, so expanding any square or product of linear combinations only generates more variances and covariances. Step 5 is recognition, not computation. There’s nowhere else for the algebra to land.


Two applications

Interview problem: E[H · T] for n coin flips

Flip a fair coin n = 100 times. H = heads, T = tails. Find E[H · T]. Worked slowly, because the one-line answer hides about six moves.

Step 1 — first reach, and why it fails. The instinct is E[H · T] = E[H] · E[T] = 50 · 50 = 2,500. But splitting a product of expectations like that is only legal when the two variables are independent. Check the precondition: H + T = 100, so knowing H pins down T exactly. Not independent. The naive split is off by a correction.

Step 2 — name the correction. That correction is what covariance is. Rearranging Cov(X, Y) = E[XY] − E[X]E[Y]:

E[H · T] = E[H] · E[T] + Cov(H, T)
Independent → Cov = 0 → naive split exact. Locked → Cov ≠ 0 → you need the term.

Step 3 — get the sign first. H + T = 100, so when H is above its mean, T is forced below. They move opposite, always. So Cov(H, T) is negative, and the true answer lands below 2,500.

Step 4 — compute Cov(H, T) via substitution. Since T = 100 − H, write Cov(H, T) = Cov(H, 100 − H) and split with bilinearity:

Cov(H, 100 − H) = Cov(H, 100) + Cov(H, −H)
First term is covariance with a constant → 0. Second term, pull out the −1 (scaling rule, ab = 1 · (−1) = −1):
= 0 − Cov(H, H) = −Var(H)
So Cov(H, T) = −Var(H). Now it’s earned, not asserted.

Step 5 — Var(H) is the binomial variance. H is the count of heads in n flips, so Var(H) = np(1−p) = 100 · 0.5 · 0.5 = 25.

Step 6 — land it.

E[H · T] = 2,500 − 25 = 2,475

Where n(n−1) comes from. Keep everything in symbols instead of plugging in. E[H] = np and E[T] = n(1−p), so E[H]·E[T] = n2p(1−p), and Var(H) = np(1−p). Then:

E[H · T] = n2p(1−p) − np(1−p) = p(1−p)[n2 − n] = n(n−1)p(1−p)
The n2 is the naive product, the −n is the variance shortfall, and factoring out p(1−p) leaves n(n−1). Sanity check: 100 · 99 · 0.25 = 2,475. ✓

The through-line: the answer falls short of E[H]·E[T] by exactly Var(H), because Cov(H, T) = −Var(H) whenever H and T sum to a constant.

Two-stock equal-weight portfolio with equal variances σ2 and correlation ρ

Start from the workhorse with a = b = 0.5:

Var(P) = 0.25 Var(X) + 0.25 Var(Y) + 2(0.5)(0.5) Cov(X, Y)

Impose equal variances Var(X) = Var(Y) = σ2, and write the cross term with correlation, Cov(X, Y) = ρσ2 (since Cov = ρ · σX · σY and both vols are σ):

Var(P) = 0.25σ2 + 0.25σ2 + 0.5ρσ2 = 0.5σ2 + 0.5ρσ2

Factor out 0.5σ2:

Var(P) =  σ2(1 + ρ)2
Why this is the instructive form. Weights are fixed (50/50) and both vols are fixed (σ). The only thing left moving is ρ. So the entire diversification effect is carried by the single factor (1 + ρ)/2 — a clean dial from 0 to 1 that multiplies the single-name variance. Sweep ρ and read what correlation actually does:
ρ Var(P) σP (vol) vs. one stock
+1σ2σno benefit — identical names
+0.50.75σ20.87σ13% vol cut
00.5σ20.71σ29% vol cut (the √½ case)
−0.50.25σ20.5σhalf the vol
−100risk fully cancels
The variance scales linearly in ρ, but the thing you feel — vol, σP = σ√((1+ρ)/2) — scales as the square root, so the first chunk of decorrelation buys more than the last. Going from ρ = 1 to ρ = 0.5 already takes 13% off your vol. You do not need negative correlation to diversify; anything below +1 helps. Negative correlation is just the strong form, and ρ = −1 is the perfect hedge where the two positions cancel outright.

The whole two-name diversification story lives in that (1 + ρ)/2 factor. Same vols, same weights, and correlation alone moves you from “no benefit” to “risk gone.”

Two-stock unequal-weight portfolio with equal variances σ2 and correlation ρ
Var(P) = σ2 [1 − 2w(1−w)(1−ρ)]

Diversification benefit is the product of a weight piece (2w(1−w), maxed at w = 0.5) and a correlation piece (1−ρ). Need both to get benefit. With equal variances, equal weighting is optimal — any tilt from 50/50 sacrifices diversification.

Two-stock unequal-variance portfolio → inverse-variance weighting

Now drop the equal-variance assumption. Keep σX2 and σY2 separate. Weights w and (1−w):

Var(P) = w2σX2 + (1−w)2σY2 + 2w(1−w)ρσXσY

Minimize over w. Var(P) is an upward parabola in w (positive coefficient on w2), so the critical point is the min. Differentiate term by term and set to zero:

2wσX2 − 2(1−w)σY2 + 2(1−2w)ρσXσY = 0

Divide by 2, expand, collect the w terms on the left and constants on the right, factor w out:

w(σX2 + σY2 − 2ρσXσY) = σY2 − ρσXσY
w* =  σY2 − ρσXσYσX2 + σY2 − 2ρσXσY

The denominator is Var(X − Y) — the spread variance from earlier. The numerator is σY2 − Cov(X, Y).

The payoff — set ρ = 0 (independent names):
w* = σY2σX2 + σY2 = 1/σX21/σX2 + 1/σY2
That’s inverse-variance weighting: each asset’s weight is its inverse variance over the sum of inverse variances. The quieter asset gets more money. This is the result behind Kalman filters, weighted least squares, and meta-analysis — anywhere you optimally combine noisy estimates, you weight by precision (1/variance). It’s also the “optimal” cousin of the inverse-vol risk-parity heuristic, which ignores correlations.

Intuition — hold σX fixed at 20% (σX2 = 0.04), turn the σY knob:

σY σY2 w* on X
000
10%0.010.20
20%0.040.50
40%0.160.80
∞∞→ 1

X’s weight is driven by Y’s variance, not its own. The noisier the alternative, the more you pile into X. Three anchors: σY2 = 0 → w* = 0 (Y is riskless, hold only Y); σY2 = σX2 → w* = 0.5 (equal variances recover equal weighting); σY2 → ∞ → w* → 1 (Y is pure noise, flee into X). The cleanest limit: if σX2 = 0, then w* = 1 — a riskless X takes the whole book. Precision is just quietness, and you trust the quiet estimate more.

Three-variable portfolio variance → why the matrix shows up

Same Form A grind, one more variable. Expand (aX + bY + cZ)2, apply E, subtract the squared-mean term. Every squared term becomes a variance, every cross term a covariance:

Var(aX + bY + cZ) = a2Var(X) + b2Var(Y) + c2Var(Z) + 2ab Cov(X,Y) + 2ac Cov(X,Z) + 2bc Cov(Y,Z)

Counting the terms. For n assets you always get:

  • n variance terms — one per asset (the ai2 Var pieces)
  • nC2 = n(n−1)/2 covariance pairs — one per distinct pair

Total = n + nC2. For n = 3: 3 + 3 = 6. For n = 100: 100 variances + 4,950 covariance pairs. The cross terms grow as n2, which is exactly why nobody writes portfolio variance longhand past n = 3 — you switch to the matrix form.

The double-sum / matrix form. Organize every term into a grid indexed by asset pairs. With weights wi and returns ri:
Var(P) = Σi Σj wi wj Cov(ri, rj) = w⊤Σw
Reading the double sum: the outer Σ over i and the inner Σ over j together form every ordered pair (i, j). For each pair you drop in one term, wiwjCov(ri, rj), and add them all up. For n = 3 that’s 3 × 3 = 9 cells:
X (j=1) Y (j=2) Z (j=3)
X (i=1)a2Var(X)ab Cov(X,Y)ac Cov(X,Z)
Y (i=2)ab Cov(X,Y)b2Var(Y)bc Cov(Y,Z)
Z (i=3)ac Cov(X,Z)bc Cov(Y,Z)c2Var(Z)
Sum all nine cells and you get the six-term formula above. Two things to see:
  • Diagonal (i = j, shaded): Cov(ri, ri) = Var(ri), so the diagonal is the n variance terms.
  • Off-diagonal (i ≠ j): each unordered pair appears twice — cell (X,Y) and cell (Y,X) are identical — and those two copies are exactly where the factor of 2 on each covariance comes from. You never write the 2 by hand; the grid double-counts it for you.
So Σ is the covariance matrix: variances down the diagonal, covariances off it. w⊤Σw just says “sweep every cell of the grid, weight it, sum it.” The n + nC2 count is the matrix — diagonal plus (doubled) upper triangle. You’ve already discovered why the matrix form is inevitable; it’s just bookkeeping for the term explosion.
Figure — the double sum is the matrix: one sweep, three views
Var(P) = Σi Σj wiwj Cov(ri, rj) an instruction for sweeping a grid: for every row i, for every column j, add that cell inner Σ over j → picks the column X (j=1) Y (j=2) Z (j=3) outer Σ over i → picks the row X (i=1) Y (i=2) Z (i=3) w1² Var(X) w1w2 Cov(X,Y) w1w3 Cov(X,Z) w2w1 Cov(X,Y) w2² Var(Y) w2w3 Cov(Y,Z) w3w1 Cov(X,Z) w3w2 Cov(Y,Z) w3² Var(Z) Diagonal (i = j): Cov(ri, ri) = Var(ri) — the 3 variance terms. Twin cells (i,j) & (j,i): identical — every covariance is visited twice. That double-count is the ×2 you wrote by hand. The grid supplies it for free. add all 9 cells = wT Σ w Σ is the covariance matrix: variances on the diagonal, covariances off it. n assets = the same sweep on an n×n grid. Nothing new happens; the grid just grows.
Figure — three forms of the same variance, and where the 2s go
① ALGEBRAIC — you write the 2s by hand a²Var(X) + b²Var(Y) + c²Var(Z) 2ab Cov(X,Y) + 2ac Cov(X,Z) + 2bc Cov(Y,Z) ② MATRIX — the 2s vanish into the symmetry Var(P) = wT Σ w,   where Σ = Var(X) Cov(X,Y) Cov(X,Z) Cov(X,Y) Var(Y) Cov(Y,Z) Cov(X,Z) Cov(Y,Z) Var(Z) Each covariance sits in two matched-color cells (mirrored across the diagonal). Summed, the two cells are the 2 from Stage 1. Variances (diagonal, purple) have no mirror — that’s why they’re never doubled. ③ DOUBLE SUM — the matrix written in math Var(P) = Σ n i=1 Σ n j=1 wiwj Cov(ri, rj) Cov(ri, ri) = Var(ri) — covariance with itself is just variance, so the diagonal needs no special case. Both sums run 1 to n, so the sweep is n² terms. 10 assets → 100 terms, not 20. That quadratic blow-up is exactly why the compact matrix form earns its keep.
Notation you’ll see in practice: w⊤Σw. You’ll run into this constantly in risk models, optimizers, and quant papers. It’s the same portfolio variance, packaged as a matrix operation. Reading it piece by piece:
  • w — the weight vector, weights stacked in a column.
  • w⊤ — “w transpose,” the same weights laid flat as a row. Transpose just tips a column over into a row.
  • Σ — the covariance matrix (the grid above). Watch out: this capital-sigma is the matrix, not a summation sign. Variances on the diagonal, covariances off it.
So w⊤Σw is row-of-weights × matrix × column-of-weights, which multiplies out to a single number — the portfolio variance. It’s identical to the double sum, and in a spreadsheet it’s literally =MMULT(MMULT(TRANSPOSE(w), Σ), w).

Why bother, when the double sum already shows everything? Three practical reasons, none of them “it’s more correct.” It doesn’t grow — three symbols whether n is 2 or 2,000, where the double sum for 500 names is 250,000 terms. It’s how software actually computes portfolio variance (one fast matrix op). And optimization only speaks matrix: the minimum-variance weights come out as Σ−11 normalized, and the inverse Σ−1 has no double-sum spelling. The two-asset inverse-variance weighting derived above is Σ−1 for n = 2 — the matrix form is how that generalizes. For understanding, the double sum is enough; this is the notation for doing things with it.


The ladder

Each rung is built from the one before it — the definition first, then the algebra of scaling and adding, then portfolios, then the jump to the matrix. Nothing is assumed that wasn’t derived earlier.

1.  Variance as average squared deviation
2.  Var(X) = E[X2] − (E[X])2 — from the definition
3.  Cov(X, Y) = E[XY] − E[X]E[Y] — from the definition
4.  Var(aX) = a2·Var(X)
5.  Cov(aX, bY) = ab·Cov(X, Y)
6.  Cov(X + c, Y) = Cov(X, Y) and Cov(X, c) = 0
7.  Var(X + Y) = Var(X) + Var(Y) + 2·Cov(X, Y)
8.  Var(aX + bY) — the full weighted-sum workhorse
9.  Two-stock equal-weight portfolio variance → the (1+ρ)/2 diversification factor
10. Two-stock unequal-weight portfolio variance (equal variances)
11. Var(X − Y) — spread variance / pair-trading formula
12. Variance of a binomial = np(1−p)
13. Two-stock unequal-variance portfolio → inverse-variance weighting
14. Var(aX + bY + cZ) — three variables, and the n + nC2 term count
15. General n-asset portfolio variance — the w⊤Σw matrix form

Is this one lesson in a math course?

No. This would be roughly half a semester of a first probability course, or a full chapter and a half of a more applied stats book.

Rough mapping to a standard curriculum:

  • Variance from the definition, E[X2] identity: one lecture, plus a problem set
  • Covariance and the product identity: one lecture
  • Scaling rules, bilinearity, variance of a sum: one to two lectures
  • Portfolio variance, weighted sums, correlation: one lecture in the probability course, or the opening week of a finance/portfolio-theory course
  • Binomial variance, applications: another lecture or two

So this is the equivalent of maybe four to six lectures of material, plus the problem sets that go with them. The reason it feels like a lot is that this sheet does the whole pipeline — derivation, intuition, numerical examples, applications — for each piece, instead of showing a formula and moving on.

The trade-off is real: this is slower but produces durable understanding. A typical math course shows you Var(aX + bY) on day one, leaves the “why it’s that and not something else” fuzzy, and you pattern-match for the rest of the semester. Done this way, when σ2 · (1+ρ)/2 turns up in a textbook two years later, you see the bilinearity FOIL behind it instead of recognizing a memorized formula.

That’s the trade. Slower, but it sticks.

after this post you will be sizing bets in your head

One of the most important concepts in risk-taking is bet sizing. Which is unfortunate because people are quite bad at it, while the effort to be way above average is quite low.

A jarring and famous demonstration of this is the Haghani-Dewey Coin Flipping study, which showed how even college grads with business, economic, and technical backgrounds incinerated their capital or massively underperformed the expected profits presented to them by a game they knew was rigged in their favor.

You can read my synopsis in Bet Sizing Is Not Intuitive.

For a binary wager (ie win or lose), if you know the payoffs and the probability of winning, both of which were known to the participants, the solution is to use the Kelly Criterion.

The tragedy is that it is incredibly simple to compute and applies to many conventional gambles and decisions (the examples in the quiz will span various life situations!).

If something is both easy and widely relevant, it should be common knowledge. So let’s fix that today. I’ll show you how easy it is to use, and you’ll forever be able to do it in your head.

First, a succinct definition:

Kelly is the bet size, as a fraction of bankroll, that maximizes the long-run compounded growth rate of your wealth. It’s a mathematical solution to bet size that doesn’t seek to maximize expected profit per trial, but the size that optimally balances compounding rate and survival.

If you want to go deep on this, see Moontowerquant’s Kelly Criterion Resources, but today’s focus is on getting straight to usability.

We will use this formulation of Kelly because it’s general:

f* = p − q/b

where:

p = probability of winning

q = 1−p or probability of losing

b = the odds you’re getting → what you win divided by what you risk

The easiest way to learn it is just jump right in with a few worked examples:

Fair coin wager (even odds style bet)

p =50%

q= 50%

b =1 (ie even money, for a $1 bet you either lose a $1 or make a $1 profit)

f* = 50% – 50% / 1 = 0 → bet nothing, zero edge

Coin biased in your favor (even odds style bet)

p =60%

q= 40%

b =1 (ie even money, for a $1 bet you either lose a $1 or make a $1 profit)

f* = 60% – 40% / 1 = .20 → bet 20% of your bankroll

Roll a 6 on a die (underdog bet where you get odds)

p =1/6

q= 5/6

b =8 (for a $1 bet, you either lose a $1 or make an $8 profit)

f* = 1/6 – (5/6) / 8

f* =8/48 – 5/48 = 3/48 → bet 6.25% of your bankroll

If f* is 0 or negative, you have no edge, so not betting is prescribed

Sports moneyline (betting as a favorite where you lay odds)

A −200 favorite. You risk $2 to win $1, and the line implies 2/3, but you think it’s closer to 3 in 4.

p = 75%
q = 25%
b = 0.5 (getting 50% return on the amount you risk)

f* = 75% − 25% / 0.5 = 75% − 50% = 25% → bet 25% of your bankroll

Wait a minute, these are large bets?!!

If these bet sizes seem surprisingly large for the given advantages, then your senses are well-tuned. For most people, “full” Kelly is too big!

Kelly maximizes long-run growth on the assumption your probability is correct. Well, it probably isn’t because the world is messy. We can inject some humility by using a fraction of Kelly:

  • “Half Kelly” gives up about a quarter of the growth rate and roughly halves the drawdowns. If you invert that, you see that the Kelly scaling law means as you bet bigger, you get diminishing returns per unit of risk. Extrapolating that logic, betting more than “full Kelly” is incinerating compounded wealth even if the individual bet has positive EV.
  • “Quarter Kelly” or less is far more common in practice.

Please don’t let the equation scare you, it’s intuitive and easy to remember

Look at the equation again:

f* = p − q/b

It’s just “how often you win” minus “how often you lose.” It’s just that the second term incorporates the payoff. The loss term gets divided by b, which represents the return you collect when you’re right.

  • When b = 1, you’re getting even money. A 100% return. Dividing by 1 leaves q alone, and the equation collapses to pure hit rate: p − q. That’s the coin case where you bet $1 to make $1.
  • When b > 1, you’re getting long odds. The division shrinks the loss term. This is why the die works. You lose 5 out of 6 rolls. Straight subtraction says you’re down 66 cents on the dollar and should never play, but you’re paid 8-to-1, so that 5/6 becomes 5/48, and suddenly the 1/6 win percentage is the bigger number. Long odds forgive a bad hit rate.
  • When b < 1, you’re laying odds. Now division stretches the loss term. The moneyline: you only lose a quarter of the time, but at −200 each loss costs you two units to earn back one, so that 25% loss percentage behaves like 50%. Being right three times out of four barely clears the bar. Lay enough odds and even a very good record is a losing proposition.

The graphic shows how you can think of the odds (the denominator) as shrinking or inflating q, as you collapse your thinking to a comparison of p vs q.

A word on b

b trips people up because “odds” is loaded gambler jargon. A wider interpretation of b is that it’s a percent return.

It’s what you make divided by what you risk. Even money is b = 1: risk a dollar, make a dollar. That’s a 100% return on the amount at stake. 3-to-1 is b = 3, a 300% return. Laying −200 is b = 0.5 because if you risk two to make one, it’s a 50% return.

[Return is a profit, while multiples don’t subtract your initial risk. It’s the difference between “I 2x’d my money” vs “I made 100%” or “I 10x’d my money” vs “I made 900%”. The percent return is the multiple minus one because we subtract our initial risk.]

The reason it’s a return and not just “the odds” is that Kelly assumes a loss wipes out the whole stake. The denominator is always the same number: everything you put up. b is comparable across a coin, a die, and a moneyline because it’s the return on risk, always measured against a total loss.

b = 1 is a natural reference point. At 100% return, a win exactly cancels a loss, so you need to win more than half the time. The breakeven hit rate changes with b.

Set f* = 0 and you get p = 1/(1+b).

Read the table as a menu of the hit rates you’re allowed to have. At b = 24 you can be wrong 24 times out of 25 and still be flat. At b = 0.25 you can be right four out of five and still be flat

Applying to real life: when is Kelly the right tool?

Kelly needs a few inputs: a bankroll, a payoff you know, and a probability estimate.

Which of these is a Kelly problem?

  1. A prediction market contract trading at 30¢. You think it’s worth 45¢.
  2. You’re all-in-or-fold on the river with a read that you’re good 40% of the time, getting 3-to-1 from the pot.
  3. How much of your 401(k) to put in equities.
  4. Writing checks as an angel investor across 30 startups.
  5. Buying a weekly call on a biotech ahead of an FDA decision date.
  6. Whether to take the new job.
  7. Your buddy offers you 5-to-1 that it rains in Oakland tomorrow. The forecast says 30%.
  8. Buying homeowners insurance. The premium is clearly more than the expected loss — that’s how the insurer stays in business.
  9. Your neighbor doesn’t carry homeowners coverage. She banks the premium instead.
  10. Your auto policy offers a $500 deductible or a $2,500 deductible, for a $340/yr discount on the premium.
  11. You’ve got vested startup options. Exercising costs $40k out of pocket in strike, and you think there’s maybe a 15% chance the company gets somewhere that makes them worth $1M.
  12. A merger arb spread. Target’s at $46, deal price is $50, and it trades back to $38 if the deal breaks. You think it closes 90% of the time.
  13. Your agency spends 20 hours of unbilled time on a speculative pitch. You win about a quarter of them, and a win is worth 80 billable hours.

Solutions to Kelly Problems

  1. Yes. Cleanest case there is. Binary, known payoff, and the price provides b directly. Risk 30¢ to make 70¢, so b = 2.33. f* = 45% − 55%/2.33 = 21%.
  2. Yes. This is the canonical one. p = 40%, b = 3, f* = 40% − 60%/3 = 20% of your stack. The wrinkle is that in poker your stack isn’t really your bankroll. There’s a whole literature on pros using Kelly for bankroll management across sessions rather than for a single river decision.
  3. No. Not this version of it. Stock returns aren’t generally binary so there’s no p, q, or b. There’s a continuous analog called Merton’s Share, which is similarly rooted in reward vs variance. What Gamblers Can Teach the Buy-and-Hold Crowd can get you started.
  4. Sort of. The structure is right: repeated, roughly binary, long odds. The problem is that p is a guess and b is a bigger guess, and Kelly is violently sensitive to overestimating your edge. Garbage in, garbage out.
  5. Approximately. If you treat it as approve/reject it’s binary enough to size with. If the expiry aligns with the date such that you are betting strictly on the terminal intrinsic value, the option piece will inherit the binary modeling you imposed on the stock.
  6. No. The variables are too opaque.
  7. Yes. p = 30%, b = 5, f* = 30% − 70%/5 = 16%. Note, you’ll lose this bet more than twice as often as you win it, so your most likely scenario is losing 16%. You can shrink the Kelly fraction if this makes you uncomfortable.
  8. Wrong side of the equation. Run f* on this and you get a negative number, because you’re buying a negative-EV bet.
  9. Yes. It’s the same policy, so notice that the bet only exists on the insurer’s side of it! Every year your neighbor doesn’t buy, she collects a premium and writes a tail. Rebuild cost $500k, premium $3,000, call it a 1-in-500 chance of a total loss.

    p = 99.8%
    q = 0.2%
    b = 3,000 / 500,000 = 0.006 (risk $500k to win $3,000)

    f* = 99.8% − 0.2%/0.006 = 99.8% − 33.3% = 66.5%

    Positive, as expected since insurers price premiums well above fair value. In this case, her bet size is the $500k house. If the house is most of her net worth, she’s at 100% on a bet capped at 66%. Rather than overbet, she should buy the policy. If she’s worth $5M, she’s betting 10% when she’s allowed 66%, which puts her near quarter Kelly (~14%), and she could skip the insurance. If she’s worth $1mm, it’s a 50% bet, which is more than half Kelly. I’d say take the insurance but I’m a wimp. There are other considerations (would she have the liquidity to rebuild the home or maybe taking the insurance with a high deductible is a better fit), but just doing this exercise gives you a sense of how risky or conservative your choices are relative to the bet share that maximizes long-term wealth.

  10. Yes. Raising the deductible is like you writing a $2,000 policy and collecting $340 a year for it. You’re the insurer again, so work out what you need to believe. Take the high deductible and save $340. Have a claim, and you’re out $2,000 more, but you already banked the $340, so the loss is $1,660.

    b = 340 / 1,660 = 0.205

    f* = p − q/0.205 = p − 4.88q

    Set that to zero, and you get p = 4.88q, which, with p + q = 1, means q = 17%. Your breakeven is a claim every 5.9 years. Anything less frequent and you’re the one with the edge.

    Let’s say real-world collision frequency is more like 6%. So p = 94%:

    f* = 94% − 6%/0.205 = 94% − 29.3% = 64.7%

    Which says risk at most ~65% of your bankroll. The risk here is $1,660. That clears as long as you have about $2,600 in liquid savings, which is to say the sizing check is trivially satisfied for almost everyone so you should generally opt for the higher deductible. For quarter Kelly, we’d need savings of $1,660/(.647 * .25) = $10,262.

  11. Approximately. It’s not truly binary, but if you frame it in a way where you are comfortable with the no consolation prize of a medium outcome, you can see it as paying $40k for a 15% shot at $1M. b = 24, so f* = 15% − 85%/24 = 11.5% of your liquid net worth. This is quite sensitive to your estimate of p of course.
  12. Yes, a classic example of binary-type risk in markets. You risk $8 to make $4, so b = 0.5 — you’re laying odds, same as the moneyline. f* = 90% − 10%/0.5 = 70%. That number is only as good as the 90%. Revise p to 75% and f* is 25%.
  13. Yes, in a subtle way! Your bankroll is capacity, not cash. b = 80/20 = 4, so f* = 25% − 75%/4 = 6.25%. Twenty hours has to be 6% of what you’re working with, which means you can’t run this pitch out of a 100-hour month. If you’re the manager, you can put it in dollar terms by converting to wages.

Finally, I strongly recommend William Poundstone’s book Fortune’s Formula: The Untold Story of the Scientific Betting System That Beat the Casinos and Wall Street

Description:

In 1956, two Bell Labs scientists discovered the scientific formula for getting rich. One was mathematician Claude Shannon, neurotic father of our digital age, whose genius is ranked with Einstein’s. The other was John L. Kelly Jr., a Texas-born, gun-toting physicist. Together they applied the science of information theory—the basis of computers and the Internet—to the problem of making as much money as possible, as fast as possible.

Shannon and MIT mathematician Edward O. Thorp took the “Kelly formula” to Las Vegas. It worked. They realized that there was even more money to be made in the stock market. Thorp used the Kelly system with his phenomenally successful hedge fund, Princeton-Newport Partners. Shannon became a successful investor, too, topping even Warren Buffett’s rate of return. Fortune’s Formula traces how the Kelly formula sparked controversy even as it made fortunes at racetracks, casinos, and trading desks. It reveals the dark side of this alluring scheme, which is founded on exploiting an insider’s edge.

Shannon believed it was possible for a smart investor to beat the market—and William Poundstone’s Fortune’s Formula will convince you that he was right.

And this is from my notes, Insights From Fortune’s Formula:

a gripping narrative full of 20th century trivia that ties together the birth of information theory, some of the greatest scientific minds of the 1900s, the rise of quantitative finance, and the role of organized crime. These topics come alive in a fresh, memorable way when discovered through the lens of its colorful characters.

It chronicles the history of the efficient market hypothesis (MIT, U Chicago, Paul Samuelson). You can organize its conclusion around this excerpt:

There is much truth in the efficient market hypothesis. The controversy has always been over just how far the claim can be pressed. Asking whether markets are efficient is like asking whether the world is round. The best way to answer depends on the expectations and sophistication of the questioner. If someone is asking whether the world is round or flat, as fifteenth-century Europeans might have asked, then “round” is a better answer. If someone knows that and is asking whether the earth is a geometrically perfect sphere, the answer is no.

stock-bond correlation

Return Stacked’s RSSB gives you a dollar of global equities and a dollar of Treasuries on the same dollar of capital. They just listed options on it this week. It will be a useful option market to watch if it gathers liquidity because its implied vol allows you to back out an implied stock-bond correlation since we know the vol of the legs.

Risk-parity funds and strategies are diversified, which gives them cover to use leverage but also means they are structurally short stock-bond correlation. In theory, they should be natural buyers of RSSB vol. If they actually did that, I’d expect the implied vol to trade at a healthy risk premium since it’s a one-way risk. There’s no real natural seller of that correlation.

I asked the Moontower Agent to work out the details and generate a deck (which is also a heat check on its abilities.) It produced a deck I could download, walking through the variance identity, a IEF-for-GOVT proxy swap, a scenario table for implied ρ across RSSB IV levels, and the noise associated with realized correlation.

The deck is short and educational:

Reading Implied Correlation Through RSSB Options

Confidence Intervals on Correlation

This made me look up a time series of the correlation between stocks and bonds using VTI and IEF as respective representatives of the asset classes. The 30-day came back +0.43, the 1-year at +0.28.

The agent volunteered the following statistical insight:

N=22 daily returns is a small sample. The 95% confidence interval on a correlation of +0.43 with N=22 is roughly [+0.02, +0.72] — wide. You cannot confidently distinguish +0.43 from +0.20 or +0.60 at that sample size. The 1Y number (N=251) is statistically much tighter — CI roughly [+0.16, +0.39].

Normally, when you compute a confidence interval, you effectively make a market by scaling the standard deviation to your desired confidence (so 1.96 or “2 sigma” for ~95% confidence)

But take notice of the first interval: +0.02 to +0.72 isn’t centered on +0.43. The upper tail runs 0.29 above, the lower tail 0.41 below. Weird. You wouldn’t see lopsided error bars if the math was something like “estimate ± 1.96 × standard error”.

Agent teach me what you did and why.

The problem is that the error bar’s width depends on the answer

Correlation lives on [−1, +1]. Bounded. If the true ρ is 0.9, your sample estimates can’t overshoot by much (the ceiling is 1.0) but they can undershoot plenty.

That boundedness shows up in the standard error of r itself, which runs about (1 − r²)/√(N − 1). Look at what that does. At r = 0.43 with N = 22 the SE is 0.177. At r = 0.9 with the same 22 observations it’s 0.042, four times tighter. Not because you learned more, but because you got squeezed against the wall.

The agent used something it called Fisher’s fix to move to a coordinate system where the standard error stops depending on r, do the easy symmetric thing there, and come back.

The recipe

1. Transform the point estimate: z = arctanh(r) = ½ · ln[(1 + r) / (1 − r)]

2. Take the standard error in z-space: SE = 1/√(N − 3). Note what’s missing. No r. Sample size is the only input.

3. Build the interval symmetrically, the boring way you already know: z ± 1.96 · SE

4. Recover each endpoint separately: tanh(z_low) and tanh(z_high)

Article content

Broadly educational bits to notice

Step 1 does almost nothing to the estimate.

0.4332 becomes 0.4635. The transform is only there to get the r out of the standard error in step 2.

Step 4 is where the lopsidedness comes from.

Both 30-day endpoints sit exactly 0.4497 away from the center in z-space. Perfectly symmetric. But tanh squashes hard once you’re out past 0.5 but does almost nothing near the origin, so the top end at 0.9131 gets crushed down to +0.72 while the bottom end at 0.0139 is nearly untouched at +0.014. What matters is each endpoint’s distance from zero, not its distance from your estimate.

Step 2 accounts for sample size

Ten times the sample and the standard error only comes down by a factor of 3.6. At large N the confidence grows by √N scaling, but at small N, subtracting 3 makes the confidence grow slower than square root scaling.

2 lessons

  1. The object-level lesson: Correlations are volatile and because they are bounded from [-1,1] we need to recenter our point estimates before cuffing their ranges
  2. The meta-lesson: LLMs are great math tutors so when they volunteer info of the “I don’t know what I don’t know” variety they can hold your hand. I’ve shared how I use LLMs as a tutor before in Socrates 2026: how to use highlights

collar shopping

At the end of July, Dean Curnutt tweeted:

The thread should sound familiar. Weeks earlier, Dean tweeted about SNDK vols presenting attractive collar pricing for hedgers.

From high implied vol can work for or against you?:

The high vol is a gift to the natural holders. Millennial employees can lock in their unborn grandkids’ inheritance.

A non-technical way to appreciate how high vol creates this opportunity in upside call vs downside put differentials: Imagine a stock starts at $100. It gets to $125. From $125 to $150 is only 20%. But if the stock fell to $75 the distance from $75 to $50 is 33%. Both $50 and $150 are 50% from the initial price, but in a compounding sense 150 is much “closer” to the starting value than $50. The higher the vol the less “distance” a fixed dollar move represents. As implied vol increases OTM calls grow faster in value than OTM puts. This is the source of the attractive pricing you see in the risk reversal (ie option collar).

That pricing falls out of the risk-neutral world that rests on “no-arbitrage” assumptions. In fact, the lognormal return process, described in the quote without ever using the word “lognormal”, is only one of many assumptions. The forward price of the stock is also assumed to be a function of the risk-free rate, which pushes the price that the options are based on higher than the spot price. This, of course, pushes up calls and puts down by their respective deltas. These assumptions conspire to make calls look quite expensive relative to puts to someone comparing the risk-reward of options intuitively.

Intuition would likely lead to very different prices, but present an arbitrage in the process because you live in the real world not the risk-neutral world.

A few examples from that post:

  • Warren Buffett sells the long-dated puts because he believes the no-arbitrage assumption of the risk-free rate underestimates real-world forward prices. The option trader he faces is quite content to buy those puts since they are looking for an easy flip in the vol market.
  • FX carry. The speculator holds the future for the risky but generous profit the risk-neutral price creates. The derivatives trader is content to make a penny of arbitrage profit.

This is an admittedly mind-bending state of affairs, but it creates disagreement because of different horizons. This is the basis for trade!

The collars (also known as risk reversals or fences depending on the trading floor you grew up on) are another example of risk-neutral assumptions presenting wacky prices to those who don’t require arbitrage to trade.

The arbitrageur prices the collar like a contractor bidding a job. The daily hedges are materials and labor. The replication price is a manufacturing cost. Call it $500 per square foot. But the client trading the collar is looking at the finished house represented by the payoff of where the stock lands. They are happy to pay $500/ sq ft if the final product is worth $800/ft. The derivatives trader is not underwriting the final value but operating a cost plus business. They have no view on the value of the final product. It’s literally none of their business.

If you want to tangle with this deeper, you are welcome to revisit how to get arbed with perfect information (again) but take heart that you aren’t alone if you struggle with the idea of no-arbitrage replication. I always say it’s the “bridge of asses” for finance.

Collar Shopping

Dean’s tweets highlighted stocks where the calls you overwrite can finance a fairly high strike put, creating an attractive hedge and therefore risk-reward to a long position.

Consider an example where you buy a $100 stock and a 1-year 20% out-of-the-money put while selling a 1-year 40% out-of-the-money call at the same price as the put. In other words, a “zero-cost” collar. The most you can lose is 20% in the case where the stock tanks. Your upside is capped at 40% before your shares would be called away. If you think the stock has a symmetrical distribution where it’s going up or going down are the same probability this looks like a good bet because you are getting 2-1 odds.

If the collar costs $2 or 2% of the stock price, we can roll that into the basis (so $102). Now you are risking 22% to make 38%, a risk reward (R:R) of 1.73 to 1.

This is a snapshot from the Moontower Collars Workflow on 8/11/26 for options with about 3 months to expiry.

Every row on the screen prices the package of buying the .25 delta put, selling the .25 delta call, and buying the stock.

You can restrict your universe to certain sectors and re-sort. You can filter for stocks a certain threshold above their moving average or stocks that are strongly correlated to each other to hunt for the best bang for your buck for a given beta, or just any number of screens to narrow your candidates.

A thread for the masochists

The strikes here are delta-defined, so the vol gap between names is already baked in. You could imagine beta-adjusting the strikes to go a step further (although you’d need to use the API/MCP).

Beta is correlation times the vol ratio. So if correlation < 1.0, beta-adjusting pulls the call strike in toward at-the-money. You’re short that call in a collar, so a nearer strike prints fatter making the risk-reward look better. But it’s a trade-off. The result comes from truncating idiosyncratic upside that is not captured in beta.

Defensive-minded investors should take note (as Dean clearly has). The multi-year highs in deferred interest rates (pushes up forward prices) and the fact that high-flying stocks that have made concentrated investors quite rich are also relatively high-volatility presents those of us in the real (not risk-neutral) world an attractive menu of hedges.

A final puzzle for the masochists

Collared stock has the same hockey stock diagram as owning a call spread of the same strikes but the total cost will vary by some amount. How much is the amount and why? The hint lies in put-call parity. Solving this should feel like a puzzle and is a step on the “bridge of asses”.

How I Teach Middle Schoolers To Build Stock Portfolios

If you construct a portfolio from 2 stocks and one is $100 and the other is $10, buying a share of each means the first will dominate your portfolio’s risk, assuming they have the same volatility.

If you have $100,000 to invest, you can balance the risk by equal-weighting the holdings: $50k into each stock. You buy 500 shares of A and 5,000 shares of B.

But what if they aren’t the same volatility?

Equal-weighting means the most volatile stocks determine performance. If your $100,000 is split equally between the 2 stocks and A moves 10% per day while B moves 1% per day, you aren’t diversified. Stock A will mostly determine your returns.

We can achieve more balance via equal-risk-weighting, which adjusts how many dollars go into each stock based on its volatility.

Weight each stock by 1/vol:

  • Stock A gets 1/10
  • Stock B gets 1/1.

Divide by the total (1/10 + 1 = 1.1) and you get about 9% in A and 91% in B. Stock A is 10x as risky, so it gets about 1/10th the dollars.

On $100,000 that’s roughly $9k of A and $91k of B, corresponding to

  • 91 shares of A
  • 9,100 shares of B

Compared to the equal-dollar portfolio, the equal-risk portfolio requires you’d sell about 409 shares of A and buy about 4,100 shares of B, moving roughly 41% of your total portfolio value from the jumpy stock to the calm one.

No masochism for the kids but in case you’re interested…

Equal risk weighting is the starting point for so-called risk parity weighting. The difference is that instead of only considering the volatility a holding adds to the portfolio, the correlation is considered. A stock highly correlated with the rest of your portfolio contributes a lot of risk, while an anti-correlated one does a better job diversifying and reducing total portfolio risk. The effect can be so strong that even a highly volatile but anti-correlated stock can reduce total risk.

Computing a correlation-aware risk contribution requires a full covariance matrix and an optimizer — i.e., a guess-and-test calculator — to find the portfolio weights, since there’s no closed-form solution. If the kids can grok equal vol-weighting I feel like I’ve done my job, and they can discover risk parity on their own if they’re so inclined.)

Your own Portfolio HQ Spreadsheet

This workbook is designed to organize and monitor your first portfolio.

⏬ Download

The sheet is view-only. Select “duplicate” from the file menu to get your own copy.

In this video, I show you how to use the sheet and talk about the Investment “lab” we did this week.

Delta-hedged risk reversals

We recently added multi-leg support to our Attribution Visualizer, our tool for allowing you to track an option contract’s p/l assuming you hedged the delta daily. The tool breaks out the p/l according to gamma + theta (which sum to realized p/l) and to implied vol (vega p/l).

With multi-leg support, you can now entertain yourself with countless questions. Like “how would a masochistic skew trade work out if I trade a risk reversal and hedge daily?”

I ran a few risk reversals through the attribution tool.

USO: Buy call/sell put after the Iran war started

Date: March 13

Expiry: June 18, 2026 (~ 3 months)

Spot: $119.92

Risk reversal: 140c / 100p (equidistant strikes ~ each 17% OTM)

Initial hedge: Short 73 shares per risk reversal (the RR had .73 delta)

The war had already flipped the skew hard toward upside strikes. The $140 call traded 94% vol against the $100 put’s 83% IV. It cost $5.83 in option premium.

At expiration, the stock expired at $114.87

So how did it work out to buy the premium IV?

moontower.ai
moontower.ai

Not good. The cumulative delta-hedged p/l was a loss of over $4.50 as you lost to both realized vol and vega. At the initiation of the trade, paying the premium vol meant you were flattish gamma but paying theta.

You were also long vega because, despite the options being equidistant, at a generally elevated vol level the lognormality of the underlying distribution and its associated positive skew pumps up the delta of calls. In fact, the 140 call was ~.47 while the 100 put, which is closer in dollar space, was only .27d. The higher call delta says the 140 strike is much “closer in vol space”. That’s why the equidistant risk reversal cost so much premium to buy the call. You are buying at OTM that has a delta that we usually associate with near ATM options!

Let’s adjust the strikes so that our call and put are both ~.25d

To equalize deltas against the $100 put you have to buy…drum roll please…

The $190 call! 58% OTM for 101% IV. Now you collect a $2.17 credit to own the call and short the 100 put. Your initial Greeks mostly vanish.

The trade still loses, but it fares much better as the loss is only $1.29.

It’s tempting to conclude paying a premium vol doesn’t work. But if you bought the much cheaper call and shorted the put on a hedged riskie in SPY before the war started, then you got smoked if you chose April 30th expiry (SPY bottomed the last day of Q1), recovered once the market started rallying, only to lose again as the market…continued rallying! SPY riskie:

moonotwer.ai

I’ve said it repeatedly over the years in different ways, but riskies are the whips and leather of the option world. If you bought the call on the SPY Feb 720/650 risk reversal on the first trading day of the year and hedged daily until expiration, you actually would have lost $.25 despite the following:

  • the trade collected about $2.75 in premium at the outset
  • the stock’s closing prices stayed inside the range of $675-$700
  • the call you bought was 10.2% IV and the put you sold was 16.8% IV
moontower.ai

In Financial Hacking, Philip Maymin invents an optimistic junior trading assistant who sits down his bosses at the bank to explain that he has found an infinite money machine. Selling the high IVs in SPY puts and buying the cheap IV in SPY calls. Maymin asks the reader to figure out why this logic doesn’t work.

Our tool provides the day-by-day audit which feeds the charts. Armed with that, Claude does an admirable job of not only answering Maymin’s prompt to the reader but also pinpointing exactly which days carry the biggest weight in the answer.

The Scaling Laws of Risk-Reduction

In a misconception about harvesting volatility, you learn that you do NOT need to scalp the gamma to isolate the vol of an option trade.

If you buy options implying a daily vol of 2% per day and it moves 4% per day, your expectancy is positive regardless of whether you hedge or not. That doesn’t mean you will win any more than it means you will win if you flip a fair coin and receive 2-1 odds. You have made Sklansky bucks, not necessarily real bucks.

RIP Sklansky

Hedging reduces the p/l variation around the expectancy.

In Financial Hacking, Philip Maymin explains

The inability to hedge perfectly continuously impacts your trading by introducing random risk. This risk decreases if you hedge more frequently, but only as fast as the square root. Therefore, if you want to halve your risk, you have to hedge four times as often.

He makes this tangible and practical when he says:

Noise from hedging a one-year option on a daily basis instead of continuously is about the same as one volatility point. If you make one volatility point in expected profit and the standard deviation of your profit is one volatility point, then your Sharpe ratio is about one.

His final point echoes my argument that a requirement to hedge to isolate vol is a misconception:

The risk from not hedging continuously can be diversified away.

I built a simulator so you can see this scaling law in action.

An oblique insight can be witnessed if you set up the simulation with negative expectancy, ie pay 24% vol for a stock that realizes 20%. The more you hedge the more certain you lock in negative expectancy.

Doug Costa actually showed that happen in the toy example above. The investor who bought the 110 calls based on the real-world probability but then hedged by shorting the mispriced security actually assured themselves of a loss.

If you have no edge, variance is your friend. Not financial advice.

🎮Moontower Discrete Hedging Simulator

hurst

In a random walk where trials are independent, variance scales linearly with time. Since standard deviation is the square root of variance, volatility scales with sqrt(T).

This sublinear power law scaling gets smuggled into option math that answers practical questions. For example, assuming implied vol is constant, a 12-month ATF straddle is twice the price of a 3-month ATF straddle because sqrt (12/3) = 2.

This scaling is commonly used to convert raw vega into weighted vega. Raw vega is an extremely low-resolution number. If you own 50k 12-month vega vs being short 40k 3-month vega then it appears like you are long vol. But 12-month IV doesn’t whip around as much as 3-month IV, so this position will not act like it’s long vol on a large move higher in vol as the term structure will not “parallel shift” higher. The 3-month will increase faster as the term structure steepens into a downward sloping shape. A shape referred to as “inverted” or “backwardated”.

A simple way to modify raw vega is to scale all your monthly vegas by 1/sqrt(T) by normalizing them to a fixed DTE, for example 3 months. In that case, using the same math we did above, a 12-month vega is cut in half relative to the 3-month.

So your re-weighted vega is now short 15k vega instead of being long 10k vega!

12-month vega x scaling factor relative to 3m vega = +50k * 1/sqrt(12/3) = +25k

3-month vega x scaling factor relative to 3m vega = -40k * 1/sqrt(3/3) = -40k

Net: -15k

That volatility changes should move in proportion to 1/sqrt(T) is not a commandment brought down from Moses. It’s a convenient scaling factor that corresponds better, even if imperfectly, to empirical vol surface behavior. It also has a handy interpretation. If IV’s change in proportion to 1/sqrt(T) then ATM time spreads are unchanged (net of theta). In other words, the 3m/12month straddle spread is unchanged in such a regime.

Again, this scaling doesn’t need to hold. Sometimes we have parallel shifts in term structure and sometimes term structures steepen faster or slower than sqrt(T) scaling would predict. But the scaling is still a better prediction than the raw vega measure, which would have you believe IVs from all months are directly comparable without adjusting for how slow long-dated IVs change or how fast a weekly IV can move.

Random walks and the derivative pricing theory built upon them assume returns are independent. In hindsight, random walks still exhibit stretches that can be labeled “trend” (like a run of heads) or “mean reversion” (period of frequent alternating). But it’s one thing to label these stretches and hindsight vs predict them.

It should be self-evident that being able to predict trends or reversion would be marvelously profitable for a directional trader. But, direction aside, it would be a gift to volatility traders as well. It would influence not only how they priced vertical spreads and time spreads but the deltas in their models and their delta-hedging strategies. In other words, it would change everything if you had an edge on the probability of the next move being up or down, even if you did not have an edge on the fair value of the stock (this would occur if you had an edge on probability but not on the magnitude of up move vs down move). Option structures allow fine-grained bets that can isolate probability from magnitude.

If an asset trends over weeks or months, you will underestimate its volatility by scaling its daily volatility by sqrt(T). That makes sense. If it trended, that’s similar to saying the moves were auto-correlated and therefore dependent. Again, this is descriptive, not predictive, but relating measures of volatility to this interdependence lets us see how sensitive option pricing is to the random walk assumption. A few articles I’ve written in this vein:

These articles have a unifying concern. If prices are random, then sure, the power function that specifies how volatility scales is the familiar:

But if prices trend or mean-revert, the exponent is no longer 1/2.

Over any historical sample, H can be observed to be something other than 1/2. For it to be 1/2 would mean that annualized volatility over 2 different sampling windows was identical. In hindsight, that will rarely occur. But it’s also true for any exponent you pick. It’s hard to make the persistent case for a value other than 1/2, especially when it carries the financial totem of randomness.

In Retail Options Trading, Euan Sinclair says markets aren’t random, but they’re close to random. The question of whether there’s enough life growing in the gap between “random” and “almost random” for a skilled hunter to eat is existential professional investors’ careers.

We need to examine randomness.

Returning to the context of volatility scaling and its relationship to randomness, Euan reaches for a popular quant tool. The Hurst exponent. That’s why I picked H for the exponent in the general version of the volatility power law.

Euan’s definitions:

  • H = 0.5 is a random walk. No memory.
  • H < 0.5 is mean-reverting. Up tends to be followed by down.
  • H > 0.5 is trending, or “persistent.” Up tends to be followed by more up.

It’s time to do some learning moontower-style and start with the basics.

What The Hurst Exponent Actually Measures

Our Favorite Starting Point: Coin Flips

Flip a fair coin 100 times. Score +1 for heads, −1 for tails, and keep a running sum.

After 100 flips, how far from zero is that running sum?

Three stylized regimes to compare:

  • Perfectly correlated flips (every flip copies the last one): the running sum after 100 flips is ±100. It grows linearly with N.
  • Perfectly anti-correlated flips (+1, −1, +1, −1, …): the running sum never escapes ±1. It doesn’t grow with N at all.
  • Independent flips: the running sum lands around ±√N or in this case ±10.

Think of these as regimes that correspond to three scaling exponents:

  • Correlated (trending) N^1
  • Anti-correlated (mean-reverting): N^0
  • Independent (random walk) N^0.5

The exponent is the answer to “what power of N does the cumulative range scale with?”

Strip out the step size to isolate the regime

The ±1 coin gave a running sum with range around √N. If the coin paid ±10 instead, the range would be 10·√N. Bigger steps, bigger range. We want to strip out that distortion. If we measured price range on raw market data, a jumpy stock would always look more “trending” than a calm one, just because its steps are bigger. We’d be measuring volatility tangled up with regime, when we want regime alone.

The fix is to divide the range by the standard deviation of the steps: R/S

For the ±1 coin, R ≈ √N and S = 1, so R/S ≈ √N.

For the ±10 coin, R ≈ 10·√N and S = 10, so R/S ≈ √N. Same answer. The step size cancels out.

That’s the rescaled range. R/S only cares about the regime of the series, not its scale.

From coins to assets

Now we can adapt this to asset returns.

So we have two measurements over a window of T days of log returns:

  • S = the standard deviation of the returns (the step size in the coin example)
  • R = the range (max − min) of the cumulative sum of the de-meaned returns. How far the running total wandered between its high and its low.

We de-mean before computing R, so we strip out drift. We don’t care that the thing went up over the window, we care how it wandered around that trend. We divide by S to strip out the volatility scale.

The √T Benchmark

If returns are independent, R/S also grows like √T for the same underlying reason:

The variances of independent things add, so the spread grows by √T.

Now generalize it. Instead of forcing the exponent to be 0.5, let the data tell you:

R/S ~ T^H

  • H = 0.5: matches √T. Independent.
  • H > 0.5: R/S grows faster than √T. Trending. Moves reinforce each other.
  • H < 0.5: R/S grows slower than √T. Mean-reverting. Moves fight each other.

Reading H Off A Plot

The scaled range takes the functional form of a power law. If we take logs of both sides, the power law becomes a straight line, and the exponent H becomes the slope of the line.

log₂(R/S) = H · log₂(T)

Compute R/S at a few different T’s, plot them log-log, and the slope is H. It doesn’t matter which type of log we use. We could choose log₁₀ or ln, but using log₂ gives a clean way to narrate it: every time you double T, R/S multiplies by 2^H.

  • H = 0.5: each doubling multiplies R/S by √2 ≈ 1.41
  • H = 1.0: each doubling doubles R/S
  • H = 0.0: each doubling leaves R/S untouched

The Implementation Recipe

  1. Pick several T’s (say 5, 10, 20, 40).
  2. At each T, chop the sample into non-overlapping chunks. (see appendix)
  3. For each chunk: de-mean, cumulative sum, R = max − min, S = std dev, then R/S.
  4. Average R/S across the chunks at that T.
  5. Fit a line through the (log₂T, log₂(R/S)) points. The slope is H.

Worked Examples

Computing one R/S by hand

Take a single 5-day chunk of returns, in %: +1, +3, −2, +4, −1.

  1. Mean: (1 + 3 − 2 + 4 − 1) / 5 = +1%
  2. De-mean (subtract the mean from each): 0, +2, −3, +3, −2
  3. Cumulative sum (running total of the de-meaned series): 0, +2, −1, +2, 0
  4. R is the range of that running total: max − min = (+2) − (−1) = 3
  5. S is the standard deviation of the original five returns ≈ 2.28 (population stdev, STDEV.P)
  6. R/S = 3 / 2.28 ≈ 1.32

That 1.32 is one chunk’s R/S.

Notice that since √5 ≈ 2.24, this little stretch wandered less than a random walk would, so it reads mean-reverting

We just repeat this for several windows.

Say you’ve got 80 days of returns.

Compute R/S at T = 5, 10, 20, 40:

The Hurst exponent, H ≈ 0.43, is extracted as the slope from the log-log plot, which is is linear transformation of a power function.

H<.50 corresponds to mean-reversion. Every doubling of T multiplies R/S by 2^0.43 ≈ 1.35, a hair under the 1.41 you’d get from a pure random walk. The wandering is growing slower than random diffusion would predict.

Applications of H

If H isn’t 0.5, then √T annualization is wrong for that asset. H > 0.5 means your long-horizon vol is higher than √252 × daily vol claims. H < 0.5 means it’s lower.

The articles I linked to in the intro wrestle with this same idea but in a simpler point-to-point manner in the form of a trend ratio (ie vol sampled weekly ÷ vol sampled daily).

If you assume the asset is “self-similar,” then the exponent H governs the scaling at every horizon then besides looking for trend or mean reversion strategies you can now research a world of option relationships that are potentially mispriced if the assumption of independence is strongly embedded in volatility scaling models.

To be reductionist, my trend ratio calcs were a two-point estimate of H. Autocorrelation patches function as a lagged estimate of the same thing. Hurst is the version that uses the whole curve instead of two points or one lag.

The assumption that markets are self-similar is wrong. The more wrong it is, the less you have to gain from Hurst vs point-to-point extrapolations, but all of this is dominated by the biggest elephant in the room. Can past data help you predict trend or mean-reversion at all? Which just circles back to Euan. If you are going to bother trading, you must believe, at worst, they are merely “almost random”.

A Sense Of Proportion

H looks like a number between 0 and 1, so a move from 0.50 to 0.55 feels insignificant. The vol-annualization lens is the cleanest way to debunk that.

Consider a stock with 1% daily vol.

  • At H = 0.50: 1% × 252^0.5 = 15.9% annual
  • At H = 0.55: 1% × 252^0.55 = 19.4% annual

A 0.05 bump in H means a 22% increase in annualized vol. This obviously affects your opinion of option prices but it’s also meaningful for position sizing and risk or VaR.

Most equity-index Hurst estimates sit in a narrow-looking 0.45 to 0.55 band, but that “small” band obscures significant differences.

The Catch: The Naive Number Lies

Now go back to Sinclair’s warning, because this is where it earns its keep.

Classic R/S — the recipe above, the one in his book, the one everybody reaches for first — is biased. Run it on a series you know is a memoryless random walk, at a 252-day window, and it does not hand you back 0.5. It hands you back something noticeably higher. The estimator manufactures a little fake memory all on its own, before the data even gets a vote.

So when SPY’s rolling H sits below 0.5, you have to ask how much of that is the market and how much is the ruler. This isn’t a fringe complaint. Lo built a modified R/S statistic back in 1991 precisely because the classic version confuses genuine long memory with garden-variety short-range stuff like volatility clustering, and equity returns are drowning in volatility clustering.

The fix is not exotic. Simulate a big pile of random walks the same length as your estimation window, run the exact same R/S recipe on them, and see what H the estimator coughs up on data you built to have none. Whatever offset it shows is the lie. Subtract it. Now a true random walk reads 0.5, and a reading that survives the correction is one you can actually look at.

This is the same humility you already preach about your own VRP work. A single rolling-window H is one draw. Treating it as gospel is exactly the “sample size of 1” trap. Calibrate it or don’t believe it.

Sandbox

I’ve heard of many traders, including option traders using Hurst in their research. It feels like it’s accelerated in the past 5 years. I didn’t take a harder look at it until Euan gave a brief intro to it in Retail Options Trading and LLM’s made it easier to tutor yourself on a quant method. It’s a technique that’s well-known, but anecdotally I’ve heard a wide range of mileage from it (I’m guessing every pro option trader in a seat today has at least heard of it in trading contexts).

If autocorrelation adnrealized vol ratios at different frequencies are worth looking at then Hurst is worth at least “spaghetti on the wall”. I built a Jupyter notebook to tinker using yfinance data. You can use it, fork it, whatever:

https://colab.research.google.com/github/Kris-SF/data-pipelines/blob/main/quant-analysis/hurst_analysis.ipynb

If I were to bring this “in the lab” to see how it can become a metric or even signal I’d start with tinkering to see how it its output jives with my intuition of how a certain asset behaved over a particular period.

Once I had a feel for it, I’d throw the metric up on a scatterplot against other metrics to develop a sense of what is normal. Are there any correlations between H and IV skews or IV term structures? How do changes in Hurst coincide with changes in realized vol (rv is an input to R/S therefore and ultimately H so maybe we are hunting for a residual variable to track?)

If you have organized data, in the world of LLMs all of this work is more fun and faster. For now, I hope this primer on Hurst was a digestible first step for explaining the theory behind it and why it can be relevant.

You can find additional notes below.


Appendix: What “chop into non-overlapping chunks” really means

T is a window length, just how many days of wandering you measure at once. You pick several because H isn’t a property of any single window. It’s the rate at which R/S grows as the window lengthens. A handful of T’s gives you points to fit a slope through.

You have 251 daily returns. You want one number, H. That’s the entire goal.

Pick a few window sizes: 5, 10, 20, 40.

For each window size you do the exact same thing:

  • T = 5: chop the 251 days into back-to-back groups of 5. You get 50 groups. Compute R/S for each group, then average all 50. That’s your R/S at 5.
  • T = 10: chop into groups of 10. You get 25 groups. R/S for each, average them. R/S at 10.
  • T = 20: groups of 20, so 12 groups. Average. R/S at 20.
  • T = 40: groups of 40, so 6 groups. Average. R/S at 40.

Now you have four points: (5, R/S@5), (10, R/S@10), (20, R/S@20), (40, R/S@40). Plot them log-log, draw the best-fit line, and the slope is H.

You want enough windows to fit a line, but longer windows are comprised of fewer blocks (like the T=40 window) so they’re shakier sample from which you are computing an average R/S.

Appendix: Bias

The body said classic R/S reads high on a random walk.

The finite-sample problem

Even on a true coin-flip walk, R/S over a short window doesn’t average to exactly √T. It sits a little above. Hurst, Anis, and Lloyd worked out the expected R/S of a random walk in closed form back in the 70s, so one fix is to divide your measured R/S by that expected value at each T before you fit. It’s conceptually similar to the familiar Bessel n−1 adjustment done to sample variance since we don’t know the true population variance.

Claude suggested 2 ways to apply a correction:

  • Use the closed-form expected R/S directly
  • Simulate a pile of random walks and measure what your exact regression spits out.

They differ because the log of an average isn’t the average of a log (Jensen’s inequality). The closed-form route leaves a residual bias of a few hundredths. The simulation route, because it runs the identical regression you use in practice, lands a true random walk back at 0.5.

After much back-and-forth, I took Claude’s rec and had the notebook use the simulation route.

The nice thing about LLMs is they know a lot of the academic history of a measure. Like I said this is a starting point for your own exploration.

Better estimators exist.

Classic R/S is the cleanest to teach and the weakest to trade. Lo’s modified R/S (1991) is built to ignore short-range dependence like volatility clustering, which plain R/S happily mislabels as memory. Detrended Fluctuation Analysis (Peng et al., 1994) is the workhorse in the econophysics literature. If you ever size a position off an H, cross-check it with one of those rather than lean on R/S alone.