5D Library › Non-Ergodic Wealth Dynamics, the Kelly Criterion and Volatility Drag · 中文
Chapter 8 Practice and a Pre-registered Experiment
Part 1 A four-step survival-and-compounding checklist
The first seven chapters can be reduced to a checklist for a household or small firm to run once a year (or before a major decision) on its cash flow and allocation. It needs no market data, only a list of assets and liabilities and last year’s spending records.
- Months of survival without income. If income stopped tomorrow, how many months of rigid spending (rent or mortgage, loans, insurance, school fees; for a firm, wages and rent) could current liquid funds cover? (Chapter 4)
- Share in single risks. What share of net worth is each of the largest “single risks” (one share, one customer, one property, the employer’s stock)? If any one of them lost half its value, how much would net worth fall? (Chapters 3 and 6)
- Rebalancing discipline. Are there written target weights? Have any parts drifted from target by more than a band set in advance? (Chapter 5)
- Haircut on assumed returns. What expected return are you assuming (or is the person selling you a product assuming)? Halve the excess return: what leverage does the Kelly formula then give? Is the leverage you actually use above it? (Chapters 2 and 3)
Calculation
The checklist applied to two fictional cases, a household and a small firm. Every number is invented.
# The four-step survival-and-compounding checklist applied to two FICTIONAL cases (every
# number invented). Amounts in thousands of any currency. Each position:
# (value, spread over many independent risks?).
H = dict(liquid=54, rigid_monthly=9, net_worth=600,
positions={"home equity": (250, False), "index fund": (150, True),
"bond fund": (40, True), "employer's shares": (100, False),
"cash": (54, True), "a friend's start-up": (6, False)},
targets={"index fund": 0.55, "bond fund": 0.20, "cash": 0.25}, band=0.05,
claimed_return=0.12, vol=0.18, rf=0.03, leverage_used=1.0)
F = dict(liquid=45, rigid_monthly=30, net_worth=400,
positions={"inventory": (120, True), "receivables, 40 customers": (100, True),
"one customer's contract": (160, False), "cash": (45, True)},
targets=None, band=None, claimed_return=0.25, vol=0.40, rf=0.03, leverage_used=2.0)
for name, c in (("household", H), ("small firm", F)):
print(f"== {name}")
nw = c["net_worth"]
# 1. months of rigid spending covered with zero income
months = c["liquid"] / c["rigid_monthly"]
print(f"1. survival without income: {months:.1f} months"
+ (" <- below 6, FLAG" if months < 6 else ""))
# 2. the largest exposures to a SINGLE risk, and what losing half would cost
single = sorted(((v[0], k) for k, v in c["positions"].items() if not v[1]), reverse=True)
for v, k in single[:2]:
print(f"2. single risk: {k}, {v / nw:.0%} of net worth;"
f" losing half costs {v / 2 / nw:.0%}")
# 3. rebalancing: is any sleeve outside its band?
if c["targets"]:
tot = sum(c["positions"][k][0] for k in c["targets"])
for k, t in c["targets"].items():
w = c["positions"][k][0] / tot
if abs(w - t) > c["band"]:
print(f"3. rebalance: {k} {w:.0%} vs target {t:.0%}"
f" (band +/-{c['band']:.0%})")
else:
print("3. rebalancing: no written target weights - write them down first")
# 4. haircut: halve the claimed excess return, then compare leverage with Kelly
ex = c["claimed_return"] - c["rf"]
k_full, k_cut = ex / c["vol"] ** 2, 0.5 * ex / c["vol"] ** 2
print(f"4. Kelly leverage: on the claim {k_full:.2f}; excess return halved {k_cut:.2f};"
f" half of that {0.5 * k_cut:.2f}")
print(f" leverage used {c['leverage_used']:.1f}"
+ (" <- above the haircut Kelly level, FLAG"
if c["leverage_used"] > k_cut else ""))
# == household
# 1. survival without income: 6.0 months
# 2. single risk: home equity, 42% of net worth; losing half costs 21%
# 2. single risk: employer's shares, 17% of net worth; losing half costs 8%
# 3. rebalance: index fund 61% vs target 55% (band +/-5%)
# 4. Kelly leverage: on the claim 2.78; excess return halved 1.39; half of that 0.69
# leverage used 1.0
# == small firm
# 1. survival without income: 1.5 months <- below 6, FLAG
# 2. single risk: one customer's contract, 40% of net worth; losing half costs 20%
# 3. rebalancing: no written target weights - write them down first
# 4. Kelly leverage: on the claim 1.37; excess return halved 0.69; half of that 0.34
# leverage used 2.0 <- above the haircut Kelly level, FLAGIn these fictional cases, the household has 6 months of survival; its largest single risks are its own home (42 % of net worth) and its employer’s shares (17 %: job and shares staked on the same company, which tend to get into trouble together); the index fund is about 6.5 percentage points above target (61.5 % against 55 %), outside its band; and even with the assumed excess return halved, its current unlevered allocation is below the Kelly level. The small firm shows two red lights: cash covers only 1.5 months of rigid costs, and its actual leverage (2 times) is above the Kelly level after the assumed return is halved (about 0.7 times); its largest single risk is one customer’s contract, 40 % of net worth.
Note
This checklist is neither investment advice nor a scoring tool. “Six months”, “halve the excess return” and “half Kelly” are conventions for record-keeping, not validated “best values”; every household and firm differs in the stability of its income, its access to finance and its ability to bear risk. The checklist’s job is to list, before a decision, the questions most easily overlooked: how far you are from the absorbing barrier, on how many independent risks your wealth is staked, whether your rules are written down, and how optimistic your estimate of returns is. For specific decisions about borrowing, investing or insurance, consult a licensed professional.
Part 2 A protocol for a pre-registered randomised controlled behavioural experiment
Question
In a repeated multiplicative investment task, does describing the same risky asset by “its arithmetic expected return and the average final wealth of many simulated players”, rather than by “its median path, time-average growth rate and the share of simulated players ending below their start”, change the leverage participants choose?
Why this experiment
Chapters 1 to 3 showed that in a multiplicative world the choice with the higher expected value is not necessarily the one that serves a single person in the long run. If part of the reason people over-leverage is that the display shows them only the expected value, then a different display, equally accurate but stressing the time average, might change their choices.
Evidence
Displays change risky choices. Benartzi and Thaler found that participants shown the distribution of stock returns over a thirty-year horizon, rather than a one-year horizon, chose a clearly higher share of stocks for a retirement account (Benartzi and Thaler 1999). Gneezy and Potters found that, in repeated betting experiments, letting participants see outcomes and decide more often reduced the risk they took (Gneezy and Potters 1997). These studies show that the same information presented differently changes people’s risky choices, in a direction that depends on what is presented.
Design
| Element | Specification |
|---|---|
| Participants | Adults aged 21 or over, recruited through an independent online survey panel; not recruited from the clients, partners or communities of the author’s businesses; people who report working as financial traders or investment advisers are excluded |
| Task | 40 rounds of repeated investment: each round the risky asset is multiplied by 1.3 or 0.8 with equal probability; each round participants choose leverage from 0 to 3 (in steps of 0.25), and leverage L multiplies wealth by 1 + 0.3L or 1 − 0.2L; starting wealth 100 points |
| Incentive | A fixed fee plus a bonus proportional to final wealth after 40 rounds, stated clearly before the start |
| Practice rounds | Five practice rounds before the task, showing only the two outcomes and their probabilities, with no summary; mean leverage in practice is a baseline covariate |
| Randomisation | 1:1, done automatically by the platform. Arm A (arithmetic display): the asset’s expected return per round, and the average final wealth of 10,000 simulated players playing 40 rounds at the participant’s chosen leverage. Arm B (ergodic display): the same asset’s time-average growth rate per round, the median final wealth and path of 10,000 simulated players, and the share of players ending below their start. Both arms show correct calculations from the same parameters, with the same word count, layout and number of charts |
| Blinding | Participants do not know there are two displays or what is hypothesised; the task runs entirely automatically; analysts do not see arm labels until the analysis is complete |
| Primary outcome | Mean chosen leverage over the 40 task rounds |
| Secondary outcomes | Share of rounds with leverage above twice Kelly (about 1.67); the distance from Kelly leverage, abs(L − L*), which also catches over-caution; final wealth |
| Comprehension checks | Two questions on the rules of the task; those who fail are excluded under rules fixed in advance |
| Analysis | Linear regression of the primary outcome on arm, with baseline practice leverage as covariate; two-sided α = 0.05 |
A word on the incentive is needed. With a bonus proportional to final wealth, a risk-neutral person who cares only about the expected payment should choose 3 times leverage every round (the highest expected return); someone who cares about the typical outcome should choose leverage near Kelly (about 0.83). So the experiment does not fix in advance which leverage is “correct”; it tests whether the same accurate information, displayed differently, changes people’s choices.
Calculation
The expected gain and time-average growth rate for different leverage in the task, and the decision rule fixed in advance.
# The task and the decision rule, both fixed before data collection.
# Task: each round the asset's factor is 1.3 or 0.8 with equal probability; leverage L
# (0 to 3, in steps of 0.25) turns it into 1 + 0.3 L or 1 - 0.2 L.
import math
g = lambda L: 0.5 * math.log(1 + 0.3 * L) + 0.5 * math.log(1 - 0.2 * L)
grid = [i / 4 for i in range(13)]
print("leverage expected gain/round time-average growth/round")
for L in grid[::2]:
print(f"{L:8.2f} {5 * L:+19.1f} % {100 * (math.exp(g(L)) - 1):+24.2f} %")
best = max(grid, key=g)
print(f"best leverage on the grid: {best} (exact Kelly 5/6 = {5 / 6:.3f});"
f" expected gain rises up to L = 3")
# Share of players below their start after 40 rounds (exact, from the binomial count of
# up-rounds): what the ergodic display shows at each leverage.
for L in (5 / 6, 1.0, 2.0, 3.0):
below = sum(math.comb(40, k) for k in range(41)
if k * math.log(1 + 0.3 * L) + (40 - k) * math.log(1 - 0.2 * L) < 0) / 2 ** 40
print(f"L = {L:.2f}: {below:.1%} of players end the 40 rounds below their start")
# Decision rule. d = arm B (ergodic display) minus arm A (arithmetic display) in mean
# chosen leverage, standardised, with its 95 % CI. Lower leverage is the predicted way.
SESOI = 0.30
def verdict(d, lo, hi, comprehension_ok=True):
if not comprehension_ok:
return f"{d:+.2f}: NOT INTERPRETABLE - over 15 % failed comprehension in an arm"
if hi <= -SESOI: v = "B lowers leverage by at least the smallest effect of interest"
elif hi < 0: v = "B lowers leverage; size not shown to reach 0.30 SD"
elif lo > 0: v = "B RAISES leverage (opposite to prediction)"
elif lo >= -SESOI and hi <= SESOI: v = "no difference worth acting on"
else: v = "unclear"
return f"{d:+.2f} ({lo:+.2f} to {hi:+.2f}): {v}"
cases = ((-0.55, -0.73, -0.37), (-0.45, -0.63, -0.27), (-0.15, -0.33, 0.03),
(-0.20, -0.36, -0.04), (0.05, -0.13, 0.23), (0.25, 0.07, 0.43))
for case in cases:
print(verdict(*case))
print("Secondary, reported with intervals, never decisive: share of rounds above 2 x Kelly;")
print("distance |L - L*|, which also catches over-caution; final wealth.")
# leverage expected gain/round time-average growth/round
# 0.00 +0.0 % +0.00 %
# 0.50 +2.5 % +1.73 %
# 1.00 +5.0 % +1.98 %
# 1.50 +7.5 % +0.75 %
# 2.00 +10.0 % -2.02 %
# 2.50 +12.5 % -6.46 %
# 3.00 +15.0 % -12.82 %
# best leverage on the grid: 0.75 (exact Kelly 5/6 = 0.833); expected gain rises up to L = 3
# L = 0.83: 21.5% of players end the 40 rounds below their start
# L = 1.00: 31.8% of players end the 40 rounds below their start
# L = 2.00: 56.3% of players end the 40 rounds below their start
# L = 3.00: 86.6% of players end the 40 rounds below their start
# -0.55 (-0.73 to -0.37): B lowers leverage by at least the smallest effect of interest
# -0.45 (-0.63 to -0.27): B lowers leverage; size not shown to reach 0.30 SD
# -0.15 (-0.33 to +0.03): unclear
# -0.20 (-0.36 to -0.04): B lowers leverage; size not shown to reach 0.30 SD
# +0.05 (-0.13 to +0.23): no difference worth acting on
# +0.25 (+0.07 to +0.43): B RAISES leverage (opposite to prediction)
# Secondary, reported with intervals, never decisive: share of rounds above 2 x Kelly;
# distance |L - L*|, which also catches over-caution; final wealth.An opposing hypothesis, stated in advance
The ergodic display might make participants over-cautious: after seeing that, at high leverage (L ≥ 2), “more than half the simulated players end below their start” (after 40 rounds, about 21.5 % end below the start at Kelly leverage, about 32 % at L = 1, about 56 % at L = 2 and about 87 % at L = 3), some may choose leverage far below Kelly or not invest at all. The experiment registers “distance from Kelly leverage” in advance as a secondary outcome: if arm B has lower mean leverage but no smaller distance from Kelly (because many participants have moved from over-leverage to over-caution), the report must say so too.
Sample size
Calculation
# Sample size for the pre-registered randomised behavioural experiment. Participants play
# the same repeated multiplicative investment task (40 rounds; each round they choose a
# leverage from 0 to 3 on a risky asset; bonus proportional to final wealth). Arm A sees
# the asset described by its arithmetic expected return and the AVERAGE final wealth of
# many simulated players; arm B sees the same parameters as the MEDIAN path, the
# time-average growth rate and the share of simulated players ending below the start.
# Primary outcome: mean chosen leverage over the 40 rounds. Two-sided alpha 0.05.
import math
from statistics import NormalDist
N = NormalDist()
def n_per_arm(d, alpha=0.05, power=0.90):
# normal-approximation formula, rounded up, plus 1 to allow for using the t distribution
return math.ceil(2 * (N.inv_cdf(1 - alpha / 2) + N.inv_cdf(power)) ** 2 / d ** 2) + 1
for d in (0.20, 0.25, 0.30, 0.40):
print(f"standardised effect {d:.2f}: {n_per_arm(d, power=0.8):4d} per arm for 80 % power,"
f" {n_per_arm(d):4d} for 90 %")
n = n_per_arm(0.30)
recruit = math.ceil(n / 0.85)
print(f"chosen: 0.30 SD, 90 % power -> {n} analysable per arm")
print(f"recruit {recruit} per arm allowing 15 % exclusions (comprehension checks),"
f" {2 * recruit} in all")
# Baseline leverage (mean of 5 practice rounds, before any display appears) enters the
# analysis as a covariate. If it correlates r = 0.5 with the outcome, power rises; the
# sample is still sized without it, leaving a margin.
r = 0.5
pw = N.cdf(0.30 / math.sqrt(2 * (1 - r ** 2) / n) - N.inv_cdf(0.975))
print(f"with a baseline covariate correlating {r}: power for 0.30 SD at n = {n} is {pw:.3f}")
# standardised effect 0.20: 394 per arm for 80 % power, 527 for 90 %
# standardised effect 0.25: 253 per arm for 80 % power, 338 for 90 %
# standardised effect 0.30: 176 per arm for 80 % power, 235 for 90 %
# standardised effect 0.40: 100 per arm for 80 % power, 133 for 90 %
# chosen: 0.30 SD, 90 % power -> 235 analysable per arm
# recruit 277 per arm allowing 15 % exclusions (comprehension checks), 554 in all
# with a baseline covariate correlating 0.5: power for 0.30 SD at n = 235 is 0.964With a smallest effect of interest of 0.30 standard deviations, two-sided α = 0.05 and 90 % power, each arm needs 235 analysable participants; allowing for about 15 % to be excluded for failing the comprehension checks, each arm recruits 277, 554 in all. With practice-round baseline as a covariate correlating 0.5 with the primary outcome, power rises to about 96 %; the sample size is still computed without the covariate, to leave a margin.
What this experiment cannot show
First, this is a laboratory task. Participants face a two-point gamble whose parameters are fully known and whose rounds are independent, for bonuses far smaller than real investments; their choices in the task are not necessarily their behaviour in real accounts.
Second, the two displays change several things at once (expectation or median, average wealth or the share below start, numbers or path charts), so a positive result cannot say which one works.
Third, the experiment cannot say which leverage is “right”. As explained above, with an incentive proportional to final wealth, maximising the expected payment and maximising the typical outcome give different answers; that is exactly the question this book discusses, not one the experiment can answer for anyone.
Fourth, results will be published whether positive or negative, and the code and protocol are registered publicly before data collection.
Disclosure
The author founded and runs Asia Influencer X and Yafu Global, which work in influencer and digital marketing, and holds no financial-services licence. The experiment is designed to be run and analysed by researchers independent of the author’s businesses and recruits no participants from their clients, partners or communities; all the code and the protocol are published openly for anyone to check. The author also uses this book and his own scripts (for personal market-watching study, not sold or offered to anyone) as a methodological reference for his community courses, the 5D Ascension Cards (Dimensional Shift Card Decks) and the Yafu AI knowledge base; he holds no financial-services licence and provides no investment advice, discretionary account management or trading-signal service.
Summary
The book’s conclusions reduce to four questions: how far are you from the absorbing barrier; on how many independent risks is your wealth staked; are your rebalancing rules written down; and how optimistic is your estimate of returns? This chapter demonstrated the checklist on two fictional cases and set out a pre-registered randomised controlled behavioural experiment comparing the effect of arithmetic and ergodic displays on chosen leverage in a repeated multiplicative investment task, with 235 analysable and 277 recruited per arm, and the decision rule and opposing hypothesis fixed in advance.
References
Fan, Y. (2026). Non-Ergodic Wealth Dynamics, the Kelly Criterion and Volatility Drag: From Itô's Lemma on Geometric Brownian Motion and Ruin Barriers to Barbell Portfolios, Read Beside the Shiji's 'Biographies of the Money-Makers' [非遍历性财富动力学、凯利准则与波动率税] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23754709 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).