
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
你有没有想过,为什么传统的股票预测模型总是在关键时刻"翻车"?当市场暴跌时,所有精心设计的策略似乎都失效了。
最近,一篇来自 Medium 的文章提出了一个大胆的想法:与其预测下一个价格,不如理解市场当前的"结构"。作者 Maxence Arella 借鉴了 Google DeepMind 解决蛋白质折叠问题的 AlphaFold 架构,提出了"市场折叠"(Market Folding)这一全新框架。
简单来说,这个理论认为:市场并不是一条简单的时间序列,而是一个复杂的高维"流形"(Manifold)。稳定的市场就像一个"折叠"好的蛋白质,各种力量相互平衡;而市场崩溃则是这个结构的"坍塌"。
听起来很抽象?别担心,这篇文章将用 Python 代码带你一步步理解这个概念,并亲手实现一个"市场熵值"检测器。
AlphaFold 之所以能预测蛋白质结构,是因为它不再逐个模拟原子的物理运动,而是学习氨基酸之间的成对关系——无论它们在序列中相隔多远。
作者将这个思路迁移到金融市场:
想象市场是一个由 5 个人组成的合唱团,每个人代表一个技术指标:
当这 5 个"歌手"唱同一首歌时(低熵),说明市场高度一致——这往往意味着恐慌或泡沫。当他们各唱各的(高熵),反而说明市场健康、多元。
这与我们的直觉相反!稳定的市场是"复杂"的,崩溃的市场是"简单"的。
作者最初假设"折叠"的市场应该像蛋白质一样是低熵状态。但实验数据揭示了一个惊人的事实:
这与经济物理学的研究一致:在流动性危机中,所有资产的相关性都趋向于 1,市场失去了多样性,变成了"所有人同时卖出"的单一向量。
下面是完整的 Python 代码,它会下载 BTC-USD 的历史数据,计算市场熵值,并可视化结果。
import yfinance as yfimport pandas as pdimport numpy as npimport pandas_ta as taimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy.stats import entropy# ==========================================# 1. 获取数据("序列")# ==========================================ticker = "BTC-USD" # 可以换成其他股票代码,如 "AAPL"、"SPY"df = yf.download(ticker, period="2y", interval="1h")# 处理 yfinance 返回的多级列名if isinstance(df.columns, pd.MultiIndex): df.columns = df.columns.droplevel(1)# ==========================================# 2. 特征工程("氨基酸")# 归一化所有指标到 0-1 范围# ==========================================# RSI:相对强弱指数,衡量动量df['RSI'] = ta.rsi(df['Close'], length=14) / 100# 布林带宽度:衡量波动性bb = ta.bbands(df['Close'], length=20)df['BBW'] = bb.iloc[:, 2] # 取布林带宽度df['BBW'] = (df['BBW'] - df['BBW'].rolling(50).min()) / \ (df['BBW'].rolling(50).max() - df['BBW'].rolling(50).min())# ATR:平均真实范围,衡量价格波动幅度df['NATR'] = ta.atr(df['High'], df['Low'], df['Close'], length=14) / df['Close']# 成交量震荡器:衡量交易活跃度df['VolOsc'] = (df['Volume'].rolling(5).mean() - df['Volume'].rolling(10).mean()) / \ df['Volume'].rolling(10).mean()df['VolOsc'] = np.tanh(df['VolOsc']) # 用 tanh 归一化# Chaikin 资金流:衡量资金流入流出df['CMF'] = ta.cmf(df['High'], df['Low'], df['Close'], df['Volume'], length=20)# 定义特征列表features = ['RSI', 'BBW', 'NATR', 'VolOsc', 'CMF']df = df.dropna() # 删除空值# ==========================================# 3. 市场折叠算法(滚动矩阵熵)# ==========================================window_size = 50 # 滚动窗口大小,平衡统计显著性和响应速度entropy_scores = []# 遍历时间序列for i in range(len(df)): if i < window_size: entropy_scores.append(np.nan) continue # A. 构建交互矩阵(局部窗口的相关性矩阵) window = df[features].iloc[i-window_size:i] corr_matrix = window.corr() corr_matrix = corr_matrix.fillna(0) # 处理 NaN # B. 谱分解(提取特征值) # 特征值代表数据中不同"模式"的强度 eigenvalues, _ = np.linalg.eigh(corr_matrix) eigenvalues = np.abs(eigenvalues) # 取绝对值处理数值噪声 eigenvalues = eigenvalues / eigenvalues.sum() # 归一化 # C. 冯·诺依曼熵(折叠分数) # 低熵 = 高度结构化(折叠);高熵 = 混乱(未折叠) H = entropy(eigenvalues, base=2) entropy_scores.append(H)df['Market_Entropy'] = entropy_scoresdf['Folding_Score'] = df['Market_Entropy'].rolling(5).mean() # 平滑处理# ==========================================# 4. 可视化# ==========================================# 图 1:价格走势与熵值热力图plt.figure(figsize=(14, 6))plt.title(f"市场折叠:{ticker} 的结构熵", fontsize=16)# 用颜色编码熵值:蓝色 = 高熵(稳定);红色 = 低熵(混乱)scatter = plt.scatter(df.index, df['Close'], c=df['Folding_Score'], cmap='coolwarm_r', s=1)plt.colorbar(scatter, label="市场熵(蓝色=折叠/稳定,红色=坍塌/混乱)")plt.ylabel("价格")plt.xlabel("时间")plt.show()# 图 2:不同状态下的未来风险分布df['Future_Vol'] = df['Close'].shift(-24).rolling(24).std() # 未来 24 小时波动率# 按熵值中位数划分"折叠"和"坍塌"状态threshold = df['Folding_Score'].median()folded_regime = df[df['Folding_Score'] > threshold]['Future_Vol']collapsed_regime = df[df['Folding_Score'] < threshold]['Future_Vol']plt.figure(figsize=(10, 6))sns.kdeplot(folded_regime, label="折叠状态(高熵)", fill=True, color='blue')sns.kdeplot(collapsed_regime, label="坍塌状态(低熵)", fill=True, color='red')plt.title("不同市场状态下的未来风险分布", fontsize=16)plt.xlabel("未来波动率(风险)")plt.legend()plt.show()第一步:特征选择
我们选取了 5 个经典技术指标,分别代表动量、波动性、范围、成交量和资金流。这覆盖了技术分析的核心维度,相当于蛋白质中的"氨基酸"。
第二步:相关性矩阵
在每个滚动窗口内,计算 5 个指标之间的相关系数矩阵。这个 5×5 的矩阵描述了市场各"力量"之间的关系——它们是协同还是对抗?
第三步:特征值分解
对相关性矩阵进行特征值分解。特征值可以理解为不同"声音"的响度——如果一个特征值特别大,说明市场被单一力量主导;如果特征值分布均匀,说明市场力量多元。
第四步:冯·诺依曼熵
用熵来量化特征值的分布均匀程度。熵值趋近于 0 表示完美有序(所有指标高度相关),熵值趋近于 1 表示完美混沌(指标之间相互独立)。
运行代码后,你会看到两张图:
图 1 的含义:价格走势叠加熵值热力图。蓝色区域代表高熵(稳定期),红色区域代表低熵(风险期)。你会发现,市场的急剧转折点往往出现在红色区域。
图 2 的含义:两种状态下的未来波动率分布。高熵状态(蓝色曲线)的风险集中在低位,曲线更尖锐;低熵状态(红色曲线)有更长的"肥尾",意味着极端波动的概率更高。
作者在多种资产上测试了这个方法,发现规律具有普适性:
BTC-USD(比特币):熵值切换更频繁,说明加密货币市场的"结构性挫败"积累更快,状态转换更剧烈。
SPY 和 GOOGL(传统股票):长期呈现蓝色(高熵),说明即使价格上涨,市场仍保持多元复杂,这是健康趋势的标志。
BA(波音):在特定事件冲击(如安全事故新闻)时出现红色簇,说明低熵信号能有效捕捉市场对特定压力的"扁平化"反应。
这个框架不预测具体价格,而是输出一个"结构分数":
你可以把这个熵值指标作为风控信号:当熵值持续下降时,考虑减仓或对冲;当熵值回升时,市场可能重新进入稳定状态。
作者也坦诚地指出了几个局限:
简化版本:这只是概念验证,完整的 EvoFormer 架构需要 Google 级别的计算资源和海量数据。
指标固定:5 个指标是人工选取的,理想情况下应该让模型从原始 tick 数据中自动学习特征交互。
时间尺度敏感:实验在 1 小时和 4 小时周期上进行,超高频交易或长期宏观尺度可能需要不同的参数。
缺乏"金标准":金融市场没有像蛋白质数据库那样的"正确答案",状态标签仍然是统计推断而非绝对真理。
"市场折叠"框架给我们提供了一个全新的视角:与其执着于预测下一根 K 线,不如先理解市场当前的"健康状况"。
通过这篇文章,你学到了:
正如作者所说,市场相关性在压力时期趋向于 1 这个现象本身并不新鲜,经验丰富的交易员早就知道"分散投资在最需要的时候失效"。但这个框架提供了一个数学化的视角来量化这种直觉,用冯·诺依曼熵将市场一致性形式化,把稳定性重新定义为"复杂性的保持"而非"秩序"。
下次当你的预测模型突然失灵时,不妨问问自己:市场的"结构"是否已经悄悄改变了?
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐