你身边一定有人这样买股票:不看估值、不看财报,就因为「这票上周一根大阳线拉了 18%,搞不好下个月就十倍」。这种用小钱博巨奖的冲动,不是散户的专利,而是被写进行为金融教科书的一种稳定偏好——博彩偏好(lottery preference)。
更反直觉的是,被这种偏好追捧的「彩票型股票」,长期来看跑不赢那些平淡无奇的普通股。本文要讲清楚的,就是如何用一个极简指标 MAX 把「彩票性」量化出来,并用分组回测证明:越像彩票,未来越亏。
一、MAX:把「像不像彩票」变成一个数字#
彩票的本质是小概率、大赔付。对应到股价上,就是「过去一段时间里,出现过一根特别夸张的上涨大阳线」。Bali、Cakici 与 Whitelaw(2011)用一个干净到离谱的指标抓住了它:
也就是个股在过去 21 个交易日(约一个月)里的最大单日收益率。
为什么是「单日最大」而不是「月涨幅」?因为散户记住的不是「这个月涨了 12%」,而是「那天一根线拉了 15%」的那种刺激感。MAX 衡量的正是这种极端正向跳变的强度——它和月累计收益高度不同:一只票可以一个月慢慢涨 12% 但 MAX 只有 3%(毫无彩票感),也可以横盘一个月、最后一天旱地拔葱 20%(十足彩票感)。

二、行为逻辑:为什么高 MAX 反而亏#
逻辑链条很短,但很硬:
- 散户对「博巨奖」有超额需求,愿意为彩票型股票支付溢价;
- 溢价推高了当前价格,等于提前透支了未来的收益;
- 当炒作退潮、价格向价值回归,高 MAX 股票就系统性跑输。
换句话说,MAX 不是一个「利好信号」,而是一个被高估的程度计。它越高,说明当前的博彩溢价越厚,未来均值回归的向下空间越大。这和动量相反:动量是「涨了还会涨」,MAX 异象是「涨得太刺激反而要跌」——因为驱动它的是噪声交易者的情绪,不是基本面。
三、Python:计算 MAX、分组、看未来收益#
下面这段代码与四张配图完全对应,是自洽合成数据(每只股票带偶发巨阳线的「彩票跳涨」,未来 21 日收益被设定为随 MAX 单调下降,仅用于演示方法;真实落地请用实际日收益,见文末)。
import numpy as np
def simulate(N=600, T=21, seed=20260712):
rng = np.random.default_rng(seed)
p = rng.uniform(0.02, 0.30, size=N) # 每只股票的「彩票倾向」
drift = rng.normal(0.0003, 0.0010, size=N) # 轻微正漂移
jump = (rng.random((N, T)) < p[:, None]) * rng.exponential(0.045, size=(N, T))
r = drift[:, None] + jump + rng.normal(0, 0.026, size=(N, T))
MAX = r.max(axis=1) # 过去 21 日最大单日收益
future_exp = 0.023 - 0.21 * MAX # 关键:未来收益随 MAX 单调下降
future_ret = future_exp + rng.normal(0, 0.026, size=N)
return MAX, future_ret
MAX, future_ret = simulate()
order = np.argsort(MAX)
dec = np.array_split(order, 10) # 按 MAX 分十组
means = [future_ret[i].mean() * 100 for i in dec]
for k, m in enumerate(means):
print(f"D{k+1:02d} (MAX {MAX[dec[k]].mean()*100:.1f}%) future={m:+.2f}%")
print(f"long-short (D01-D10) = {means[0]-means[-1]:+.2f}% / month")python跑出来的分组收益(D01 = 最低 MAX 组,D10 = 最高 MAX 组)呈现出教科书式的单调下滑:
D01 (MAX 3.1%) future=+1.72%
D02 (MAX 5.4%) future=+1.01%
...
D09 (MAX 18.2%) future=-0.66%
D10 (MAX 22.5%) future=-2.21% ← 最像彩票的一组,显著跑输plaintext最高 MAX 组未来 21 日平均亏 −2.21%,最低组赚 +1.72%,单次截面多空约 +3.9%/月(图三把这种组合做 60 个月再平衡,月度均值约 +3.6%、年化约 50%)。注意这是横截面排序收益,和个股绝对涨跌无关——它测的是「彩票性」本身的定价错误。

四、配图解读:四张图各说明什么#
图一(分布):MAX 在截面里是右偏、厚尾的——大多数股票一个月里最猛的一天也就涨两三个点,少数股票带着一根 15%+、甚至 27% 的巨阳线,正是这些「尾部」构成了彩票股。
图二(分组):把全市场按 MAX 十等分,未来收益从 D01 的正值一路滑到 D10 的负值。这条下滑曲线本身就是异象存在的证据:它和任何宏观、行业因子都没关系,纯粹由「过去涨得有多刺激」驱动。
图三(多空):把「多最低 MAX / 空最高 MAX」做成一个每月再平衡的组合,净值是稳定向上的。月度均值约 +3.6%,折算年化约 50%——这个幅度是合成数据为了可视化放大的;在真实美股样本里 Bali 等人报道的多空约 1%–1.5%/月,量级小但统计上极显著(t 值常常 > 5)。

图四(路径):最直观地告诉你 MAX 抓住了什么——彩票股平时半死不活,突然一根巨阳线把 MAX 拉爆,然后阴跌回去;普通股则平稳爬升。散户记住的是前者那根线,机构赚的是后者的钱。

五、实盘六大真实陷阱#
陷阱一:前视偏差(最容易犯)。 MAX 必须用形成期(过去)的收益算,未来收益是另一个独立窗口(之后)的。绝不能用「包含未来」的窗口算 MAX 再拿同一个窗口的收益做检验——那等于用答案算答案,会造出虚假的完美相关性。
陷阱二:退市与幸存者偏差。 彩票股多是小盘、高波动、甚至濒临退市的票。回测如果只在「活到今天」的股票里算,会自动剔除那些已经跌没退市的极端彩票股,系统性低估亏损。真实结论只会比回测更糟。
陷阱三:A 股涨跌停封顶。 在 A 股,单日最大收益被涨跌停板封在 +10%(创业板/科创板 +20%),所以 MAX 天然有上限,且「巨阳线」信息被压缩。直接用美股那套 MAX 定义会失真——要么换更细粒度(分钟级最大单根 K)、要么拉长窗口,或改用「最大 5 日收益 MAX5」等衍生代理。
陷阱四:卖空约束。 多空组合里的「空最高 MAX 组」,在 A 股几乎无法直接做(融券标的少、成本高、常无券可融)。实务上要么只用多头端(做多低 MAX、回避高 MAX),要么用股指期货/ETF 做市场中性对冲后表达,收益会被摩擦吃掉一大块。
陷阱五:市值与行业暴露。 MAX 和市值强负相关——小盘股天然更容易出巨阳线。如果不控制,你的「MAX 因子」其实是在做多大盘、做空小盘。真实研究里要对市值、行业做截面中性化(对市值/行业哑变量回归取残差)后再排序。
陷阱六:微盘流动性。 高 MAX 集中在微盘,买卖冲击成本极高。回测里用收盘价算的 +3.6%/月,实盘可能因为根本买不进/卖不出而大幅缩水,甚至方向相反。
六、落地路径与诚实结论#
真实复现时,把合成序列换成:
- 数据:个股日收益率(前复权),剔除停牌/上市不足一个月的新股;
- MAX 计算:用形成期 [−21,−1] 的日收益取最大值,未来收益用 [0,+21] 窗口;
- 分组:按 MAX 十等分,计算每组等权未来收益,看最高组是否显著为负、多空是否稳定为正;
- 中性化:对对数市值、行业哑变量回归取残差,剔除风格暴露后再排序;
- 成本:用实际的买卖价差+冲击成本重算多空,确认 alpha 在扣费后仍在;
- 对照:和动量、波动率、特质波动率等因子做相关性检验,确认 MAX 是独立的异象而非它们的马甲。
结论:MAX 用一根「最刺激的那根阳线」量化了散户的博彩偏好,而行为金融的逻辑很直白——被情绪溢价推高的彩票股,未来必然回归。它是少数在多个市场、多个时期都被反复证实的横截面异象。但落到自己账户上,先过了前视、退市、涨跌停、卖空、市值暴露这五关,否则你回测出的「十倍因子」,只是另一个被你自己买贵的彩票。