5D Library › 信贷周期、自组织临界性与市场相变的统计物理 · English

第八章 实践与预注册试验

第一部分 周期与波动的四步核查表

前七章可以归结为一份定期使用的核查表。先说清楚它不是什么:它不是买卖信号,不能判断顶部或底部,也不能告诉你崩盘的时间。前三步只是记录市场的背景状态,第六章已经说明,没有可靠的证据表明这类指标能事前择时。真正的重点是第四步:无论市场将来怎样,你自己的仓位能不能承受。

  1. 价格结构与成交量确认。 记录指数相对于近期区间的位置,以及伴随的成交量是高于还是低于近期平均。本书没有任何证据表明这类读数能预测后市;把它当作背景,问自己的问题是:如果最近的走势不能持续,我的仓位会怎样?
  2. 波动率指数的位置与「同涨」。 记录波动率指数处在过去一年的什么百分位,以及最近有多少天指数与波动率指数同时上涨。这同样只是背景记录,不是信号;它提示的问题是:我的组合是否在波动率上升时同时承受损失(例如卖出期权或杠杆产品)?
  3. 期权的隐含波动率排名与偏度。 平值隐含波动率在过去一年区间中的位置(IV Rank)是多少?虚值看跌期权与虚值看涨期权的隐含波动率差,相对于它自己的历史是高还是低?记住偏度是风险中性的价格,包含风险溢价。(第五章)
  4. 极端情景压力测试。 如果指数一天下跌 20%,或在一个月里阴跌 20%,或剧烈震荡却原地不动,你的组合会损失多少?有没有任何一部分会被强制卖出(保证金贷款、杠杆产品、卖出期权)?不卖出任何资产,现金能支撑多少个月的开支?(第二章至第四章)

推导

把核查表用于一组虚构的数据:一年的指数与波动率指数(程序模拟),一个虚构的期权报价,以及一个假设的组合:60% 宽基指数基金、15% 两倍每日杠杆指数基金、25% 现金,每月开支为组合的 1%。

# The four-step cycle-and-volatility checklist applied to FICTIONAL data. It describes the state of
# the market and, above all, how fragile one's own portfolio is; it is not a timing signal.
import math, random, statistics as st
rnd = random.Random(30)
# A fictional year of an equity index and of a volatility index (OU in logs, as in Chapter 5)
idx, vol, x = [100.0], [16.0], math.log(16.0)
for t in range(249):
    x = math.log(17) + 0.977 * (x - math.log(17)) + 0.065 * rnd.gauss(0, 1)
    r = 0.0006 - 0.004 * (x - math.log(17)) + math.exp(x) / 100 / math.sqrt(252) * rnd.gauss(0, 1)
    idx.append(idx[-1] * (1 + r)); vol.append(math.exp(x))
top = max(idx)
for k in range(3):                                              # the last three days: a push to a new high
    idx.append(max(idx[-1], top) * 1.006); vol.append(vol[-1] * (1.03 if k else 0.99))
volume = [1.0 + 0.3 * rnd.random() for _ in idx]
volume[-3:] = [0.85, 0.82, 0.80]                                # ... on thin volume

# 1. Price structure and volume confirmation
hi20 = max(idx[-23:-3])
new_high = max(idx[-3:]) > hi20
vol_ok = st.fmean(volume[-3:]) > st.fmean(volume[-23:-3])
print(f"1. index {idx[-1]:.1f}; new 20-day high in the last 3 days: {new_high};"
      f" confirmed by above-average volume: {vol_ok}")
# 2. Volatility-index percentile and 'rising together' days
pct = sum(v < vol[-1] for v in vol) / len(vol)
both_up = sum(1 for t in range(-10, 0) if idx[t] > idx[t - 1] and vol[t] > vol[t - 1])
print(f"2. volatility index {vol[-1]:.1f}, percentile of the past year {pct:.0%};"
      f" days in the last 10 when index and volatility index both rose: {both_up}")
# 3. Implied-vol rank and skew of a fictional option chain on the index
atm_iv = 0.95 * vol[-1] / 100                                 # fictional chain priced near the index level
iv_lo, iv_hi = 0.95 * min(vol) / 100, 0.95 * max(vol) / 100
put25, call25, skew_hist = 0.198, 0.137, [0.032, 0.041, 0.038, 0.045, 0.050, 0.036, 0.044, 0.039]
rank = (atm_iv - iv_lo) / (iv_hi - iv_lo)
skew = put25 - call25
print(f"3. at-the-money implied vol {atm_iv:.1%}, IV rank {rank:.0%} (range {iv_lo:.1%}-{iv_hi:.1%});"
      f" 25-delta put minus call {skew:+.1%} vs past median {st.median(skew_hist):+.1%}")
# 4. Stress test of a hypothetical portfolio: 60 % index fund, 15 % 2x daily-leveraged index fund,
#    25 % cash; monthly spending need 1 % of the portfolio
def lev_path(daily, L=2.0):
    v = 1.0
    for r in daily: v *= 1 + L * r
    return v - 1
scen = {"gap: index -20 % in one day": [-0.20],
        "slide: -20 % in 20 days, steady": [0.8 ** (1 / 20) - 1] * 20,
        "chop: flat after 20 days, +-4 % daily": [0.04, -0.04 / 1.04] * 10}
for name, path in scen.items():
    ix = math.prod(1 + r for r in path) - 1
    loss = 0.60 * ix + 0.15 * lev_path(path)
    print(f"4. {name:36s}: index {ix:+.1%}, 2x fund {lev_path(path):+.1%},"
          f" portfolio {loss:+.1%}")
print(f"   cash covers {0.25 / 0.01:.0f} months of spending without selling anything; no margin loan, so no forced sale")
# 1. index 136.8; new 20-day high in the last 3 days: True; confirmed by above-average volume: False
# 2. volatility index 19.6, percentile of the past year 71%; days in the last 10 when index and volatility index both rose: 3
# 3. at-the-money implied vol 18.6%, IV rank 41% (range 10.5%-30.5%); 25-delta put minus call +6.1% vs past median +4.0%
# 4. gap: index -20 % in one day         : index -20.0%, 2x fund -40.0%, portfolio -18.0%
# 4. slide: -20 % in 20 days, steady     : index -20.0%, 2x fund -36.2%, portfolio -17.4%
# 4. chop: flat after 20 days, +-4 % daily: index +0.0%, 2x fund -3.0%, portfolio -0.5%
#    cash covers 25 months of spending without selling anything; no margin loan, so no forced sale

在这组虚构的数据中,指数在最后三天创出 20 日新高,但成交量低于此前平均,是一次「未经确认」的新高;波动率指数处在过去一年的第 71 百分位,最近 10 天中有 3 天与指数同时上涨;隐含波动率排名约 41%,偏度高于它自己的历史中位数。这些都只是描述,不构成任何结论。

第四步的结果更有用。指数一天下跌 20% 时,两倍杠杆基金损失 40%,组合损失 18%。同样是 20% 的下跌,如果在 20 天里平稳地发生,两倍基金只损失约 36%:在单边趋势中,每日再平衡的复利反而略微减少了损失。但如果指数剧烈震荡 20 天、最后原地不动,两倍基金仍然损失约 3%:这是每日再平衡的杠杆产品在震荡中的「波动损耗」,Cheng 与 Madhavan 对这类基金的路径依赖做了系统的说明 (Cheng and Madhavan 2009)。这个组合没有保证金贷款,不会被强制卖出;25% 的现金可以支撑约 25 个月的开支。

注

这份核查表不是择时工具。 前三步的「信号」在本书中没有被证明有任何预测能力,书中给出的阈值和读法只是便于记录的约定。第四步的情景也是示意性的:真实的极端情景可能更糟,而且多种资产可能同时下跌(第三章)。如果你的组合中有任何部分会在下跌中被强制卖出,那一部分才是这份核查表最需要你注意的地方。涉及个人财务的决定,请咨询持牌的独立专业人士。

第二部分 预注册随机对照实验方案

问题

向个人投资者介绍杠杆基金或卖出期权类产品时,通常展示的是过去几年的平均年化收益率。如果同时展示历史上的最大回撤,以及一组来自厚尾模型的模拟结果,会不会改变人们在这些产品上的配置比例?

已有的证据与方向

已有研究显示,展示方式会改变人们对风险的理解与选择,但方向并不总是「更谨慎」。贝纳茨与塞勒发现,向参与者展示长期收益的分布(而不是单年的结果)时,他们更愿意配置股票 (Benartzi and Thaler 1999)。考夫曼、韦伯与黑斯利发现,无论是让参与者通过反复抽样「体验」收益分布,还是使用一种图形化的风险工具,参与者在风险资产上的配置都提高了;对收益与损失概率的回忆更准确,则主要归功于风险工具 (Kaufmann et al. 2013)。布拉德伯里、亨斯与蔡斯伯格也发现,模拟体验改变了投资者对风险与收益的理解和选择 (Bradbury et al. 2015)。所以本试验不预设方向,使用双侧检验。

设计

要素 规定
参与者 年满 21 岁、至少投资过一种上市证券或基金的成年人,通过独立的在线专业调查样本库招募;不从作者企业的客户、合作伙伴或社群成员中招募
任务 用一个假设的 100,000 单位预算构建组合,可选现金、宽基指数基金、两倍每日杠杆指数基金、卖出看跌期权(「卖波动」)基金。为使选择有真实后果,随机抽取部分参与者,按其组合在一条预先生成的模拟路径上的结果发放一定比例的奖励
随机分组 1:1 随机分配,按「是否交易过杠杆或期权产品」分层
A 组(常规披露) 四种产品类别过去若干年的平均年化收益率表,标明为指数回测或模拟数字;不使用任何真实产品的数据
B 组(尾部披露) 同样的平均收益率表,加上两种杠杆产品类别在指数回测中的最大回撤(同样标明为回测数字),以及 1,000 条来自厚尾(GARCH)模型的 5 年模拟路径,标出最差的 5%
盲法 参与者只被告知「构建一个投资组合」,不知道存在两种披露,也不知道研究的假设;实验在线自动进行;分析者在揭盲前不知道哪个代码对应哪一组
主要结局 配置在两种杠杆产品上的比例(0–100%)
次要结局 参与者对两倍基金 5 年内最大回撤的估计;对自己选择的信心;现金比例;理解检查题的正确率
分析 线性回归,自变量为组别,分层变量作为协变量;双侧 α=0.05\alpha = 0.05

样本量

推导

# Sample size for the pre-registered randomised experiment. Participants build a hypothetical
# 100,000-unit portfolio from cash, a broad index fund, a 2x daily-leveraged index fund and a
# put-writing ("short volatility") fund, after seeing ONE of two disclosures about the two
# leveraged products:
#   A (usual): average annual returns over past years, in a table (labelled index back-tests)
#   B (tail):  the same averages PLUS the worst back-test drawdowns and 1,000 simulated 5-year paths
#              from a fat-tailed (GARCH) model, shown as a fan of outcomes with the 5 % worst marked
# Primary outcome: share of the portfolio put into the two leveraged products (0-100 %).
# Effect in SD units; normal approximation; two-sided alpha 0.05 (the direction is not assumed:
# earlier studies found that showing simulated outcomes can INCREASE risk taking).
import math
from statistics import NormalDist
N = NormalDist()

def n_per_arm(d, alpha=0.05, power=0.90):
    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)} per arm for 80 % power, {n_per_arm(d)} for 90 %")
n = n_per_arm(0.30)
rec = math.ceil(n / 0.85)
print(f"chosen: 0.30 SD, 90 % power -> {n} analysable per arm; allowing 15 % exclusions"
      f" (failed attention or comprehension checks) recruit {rec} per arm, {2 * rec} in all")
# Randomisation is stratified by prior experience with leveraged or option products (yes / no);
# stratum enters the analysis as a covariate.
# 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; allowing 15 % exclusions (failed attention or comprehension checks) recruit 277 per arm, 554 in all

按最小关注效应 0.30 个标准差、90% 把握度计算,每组需要 235 名可分析的参与者;考虑约 15% 的参与者因未通过注意力或理解检查而被排除,每组招募 277 人,共 554 人。

判定规则

推导

# Decision rule, fixed before data collection. d = arm B (tail disclosure) minus arm A (average
# returns only) in the share allocated to leveraged products, standardised, with its 95 % CI.
# Confirmatory test: is d different from zero (two-sided alpha 0.05)? The trial is powered (90 %) to
# detect d = 0.30 SD, the smallest effect of interest; how the CI sits relative to +-0.30 is reported
# descriptively, not as a second test.
# Validity check: in arm B at least 70 % must correctly answer "In the simulations, how often did the
# 2x fund lose more than half its value within 5 years?" - otherwise the disclosure was not understood.
SESOI = 0.30

def verdict(d, lo, hi, understood):
    if understood < 0.70:
        return f"effect {d:+.2f}: NOT INTERPRETABLE - only {understood:.0%} of arm B understood the disclosure"
    if hi < 0:
        v = "the tail disclosure REDUCES leveraged allocation"
    elif lo > 0:
        v = "the tail disclosure INCREASES leveraged allocation"
    else:
        v = "no difference shown"
    if lo >= -SESOI and hi <= SESOI:
        size = "CI within +-0.30: any effect is smaller than the smallest effect of interest"
    elif hi <= -SESOI or lo >= SESOI:
        size = "CI wholly beyond 0.30 in size"
    else:
        size = "CI includes effects both above and below 0.30 in size"
    return f"effect {d:+.2f} ({lo:+.2f} to {hi:+.2f}): {v}; descriptively, {size}"

for r in ((-0.48, -0.65, -0.31, 0.84), (-0.20, -0.37, -0.03, 0.81), (0.04, -0.13, 0.21, 0.88),
          (0.22, 0.05, 0.39, 0.79), (-0.40, -0.57, -0.23, 0.55)):
    print(verdict(*r))
print("Secondary outcomes (expected drawdown, confidence, choice of the cash buffer) are reported with intervals, never decisive.")
# effect -0.48 (-0.65 to -0.31): the tail disclosure REDUCES leveraged allocation; descriptively, CI wholly beyond 0.30 in size
# effect -0.20 (-0.37 to -0.03): the tail disclosure REDUCES leveraged allocation; descriptively, CI includes effects both above and below 0.30 in size
# effect +0.04 (-0.13 to +0.21): no difference shown; descriptively, CI within +-0.30: any effect is smaller than the smallest effect of interest
# effect +0.22 (+0.05 to +0.39): the tail disclosure INCREASES leveraged allocation; descriptively, CI includes effects both above and below 0.30 in size
# effect -0.40: NOT INTERPRETABLE - only 55% of arm B understood the disclosure
# Secondary outcomes (expected drawdown, confidence, choice of the cash buffer) are reported with intervals, never decisive.

示例结果是编造的。如果 B 组中正确回答理解检查题(「在模拟中,两倍基金有多大比例的路径在 5 年内损失过半?」)的人不到 70%,说明尾部披露没有被理解,无论结果如何,报告都写「不可解释」。验证性的结论只有一个:在双侧 α=0.05\alpha = 0.05 下,效应是否不等于零,以及它的方向。样本量按检出 0.30 个标准差的效应有 90% 把握度计算;置信区间相对于 ±0.30 的位置只作描述性报告,不作为第二个检验。如果 B 组的杠杆配置反而更高,判定规则同样如实报告。

这项试验不能说明什么

第一,组合是假设的,即使有部分奖励,参与者承担的也不是真实的财务后果;真实账户中的行为可能不同。第二,试验检验的是一种特定的披露形式,不能说明其他形式(例如文字警示、互动模拟)的效果。第三,试验只比较配置比例,不能说明哪一种配置「更好」:配置较少的杠杆产品不一定更好,那取决于每个人的财务状况和目标。第四,模拟路径来自一个特定的模型,它本身也可能低估或高估真实的尾部风险(第四章)。

伦理与利益冲突

试验须经独立伦理委员会批准,取得知情同意,并在第一位参与者入组之前登记方案和分析计划 (Nosek et al. 2018)。研究结束后,参与者会被告知研究的目的和两种披露的内容。材料中提到的产品都是一般类别,不使用任何真实产品的名称或数据。

利益披露

作者创办并经营网红营销与数字营销机构 Asia Influencer X 与 Yafu Global,不持有任何金融服务牌照,也不是持牌投资顾问。本书不链接、不推荐任何券商、基金、交易课程、信号服务或金融产品;书中提到的「杠杆基金」「期权」都是一般类别,不指任何具体产品。第八章的试验设计为由独立于作者企业的研究人员实施和分析;书中所有代码与研究方案均公开,供任何人检验。为限制利益的影响:参与者不从作者企业的客户、合作伙伴或社群成员中招募;刺激材料与分析代码在入组前公开;无论结果如何,结果、数据和代码都将公开。作者亦将本书及自用脚本(个人看盘学习用,不对外销售)作为其社群课程、升维牌卡(5D Ascension Cards)与 Yafu AI 知识库的方法论参考;作者不持有任何金融服务牌照,不提供任何投资顾问、代客理财或交易信号服务。

参考文献

Benartzi, Shlomo, and Richard H. Thaler. 1999. “Risk Aversion or Myopia? Choices in Repeated Gambles and Retirement Investments.” Management Science 45 (3): 364–81.
Bradbury, Meike A. S., Thorsten Hens, and Stefan Zeisberger. 2015. “Improving Investment Decisions with Simulated Experience.” Review of Finance 19 (3): 1019–52.
Cheng, Minder, and Ananth Madhavan. 2009. “The Dynamics of Leveraged and Inverse Exchange-Traded Funds.” Journal of Investment Management 7 (4): 43–62.
Kaufmann, Christine, Martin Weber, and Emily Haisley. 2013. “The Role of Experience Sampling and Graphical Displays on One’s Investment Risk Appetite.” Management Science 59 (2): 323–40.
Nosek, Brian A., Charles R. Ebersole, Alexander C. DeHaven, and David T. Mellor. 2018. “The Preregistration Revolution.” Proceedings of the National Academy of Sciences 115 (11): 2600–2606.

Fan, Y. (2026). Credit Cycles, Self-Organised Criticality and the Statistical Physics of Market Phase Transitions: From Minsky's Financial Instability Hypothesis and Sandpile Power-Law Avalanches to Implied-Volatility Skew, Read Beside Classical Chinese Thought on Rise and Decline [信贷周期、自组织临界性与市场相变的统计物理] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23754711 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).