Py学习  »  Python

用 Python 揭秘“市场折叠”:一种全新的金融市场预测思路

数据科学实战 • 6 天前 • 123 次点击  

 

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

你有没有想过,为什么传统的股票预测模型总是在关键时刻"翻车"?当市场暴跌时,所有精心设计的策略似乎都失效了。

最近,一篇来自 Medium 的文章提出了一个大胆的想法:与其预测下一个价格,不如理解市场当前的"结构"。作者 Maxence Arella 借鉴了 Google DeepMind 解决蛋白质折叠问题的 AlphaFold 架构,提出了"市场折叠"(Market Folding)这一全新框架。

简单来说,这个理论认为:市场并不是一条简单的时间序列,而是一个复杂的高维"流形"(Manifold)。稳定的市场就像一个"折叠"好的蛋白质,各种力量相互平衡;而市场崩溃则是这个结构的"坍塌"。

听起来很抽象?别担心,这篇文章将用 Python 代码带你一步步理解这个概念,并亲手实现一个"市场熵值"检测器。

核心概念:什么是"市场折叠"?

从蛋白质折叠到金融市场

AlphaFold 之所以能预测蛋白质结构,是因为它不再逐个模拟原子的物理运动,而是学习氨基酸之间的成对关系——无论它们在序列中相隔多远。

作者将这个思路迁移到金融市场:

  • • 传统方法:把市场看成一串数字,预测下一个价格
  • • 市场折叠:把市场看成一个复杂结构,判断当前状态是"稳定"还是"混乱"

用"合唱团"来理解市场熵

想象市场是一个由 5 个人组成的合唱团,每个人代表一个技术指标:

  1. 1. RSI(动量):价格移动快不快?
  2. 2. 布林带宽度(波动性):市场在扩张还是收缩?
  3. 3. ATR(范围):每天的波动幅度有多大?
  4. 4. 成交量震荡器(参与度):交易者是否活跃?
  5. 5. Chaikin 资金流(资金流向):资金在流入还是流出?

当这 5 个"歌手"唱同一首歌时(低熵),说明市场高度一致——这往往意味着恐慌或泡沫。当他们各唱各的(高熵),反而说明市场健康、多元。

这与我们的直觉相反!稳定的市场是"复杂"的,崩溃的市场是"简单"的。

关键发现:熵值反转

作者最初假设"折叠"的市场应该像蛋白质一样是低熵状态。但实验数据揭示了一个惊人的事实:

  • • 高熵状态(蓝色区域):对应持续稳定的趋势行情,市场多元健康
  • • 低熵状态(红色区域):对应剧烈转折点和结构崩溃,风险极高

这与经济物理学的研究一致:在流动性危机中,所有资产的相关性都趋向于 1,市场失去了多样性,变成了"所有人同时卖出"的单一向量。

实战代码:用 Python 实现市场熵值检测

下面是完整的 Python 代码,它会下载 BTC-USD 的历史数据,计算市场熵值,并可视化结果。

import yfinance as yf
import
 pandas as pd
import
 numpy as np
import
 pandas_ta as ta
import
 matplotlib.pyplot as plt
import
 seaborn as sns
from
 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_scores
df['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. 1. 如何用 Python 计算市场的"结构熵"
  2. 2. 为什么稳定的市场反而是"复杂"的(高熵),而崩溃的市场是"简单"的(低熵)
  3. 3. 如何用可视化工具识别市场的"折叠"与"坍塌"状态

正如作者所说,市场相关性在压力时期趋向于 1 这个现象本身并不新鲜,经验丰富的交易员早就知道"分散投资在最需要的时候失效"。但这个框架提供了一个数学化的视角来量化这种直觉,用冯·诺依曼熵将市场一致性形式化,把稳定性重新定义为"复杂性的保持"而非"秩序"。

下次当你的预测模型突然失灵时,不妨问问自己:市场的"结构"是否已经悄悄改变了?

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. PyBroker实战课程:赠送《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
    专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

 

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8.  量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/192430