用Python实战检验时间序列的‘无记忆性’:以股票价格为例的马尔可夫性检验
2026/5/28 6:09:14 网站建设 项目流程

用Python实战检验时间序列的‘无记忆性’:以股票价格为例的马尔可夫性检验

金融市场的不可预测性一直是量化分析的核心挑战。当我们观察股票价格的波动时,一个关键问题是:今天的涨跌是否真的只与昨天有关,而与更早的历史毫无瓜葛?这种"无记忆性"特征在数学上被称为马尔可夫性,它构成了马尔可夫链模型的基础。本文将带您用Python完整实现从数据预处理到统计检验的全流程,用真实的股票数据验证这个有趣的假设。

1. 理解马尔可夫性与金融时间序列

马尔可夫链的"无记忆性"看似反常识,却为复杂系统的建模提供了简化思路。想象你正在观察一只股票的每日收盘价:

  • 理想情况:明天的价格变动仅取决于今天的价格状态,与上周的走势完全无关
  • 现实情况:市场情绪、技术指标形成的支撑压力位等都可能产生历史依赖

我们通过状态转移概率矩阵来量化这种关系。以简单的三状态模型为例:

当前状态上涨(+)持平(0)下跌(-)
上涨(+)P(+++)P(+0
持平(0)P(+00)P(00
下跌(-)P(+--)P(-0

表:三状态马尔可夫链的转移概率矩阵示意

实际操作中,我们会用卡方检验来验证观察到的转移频率是否显著偏离独立转移的假设。以下是检验流程的关键步骤:

  1. 状态划分:将连续价格变化离散化为有限状态
  2. 频数统计:计算各状态间实际发生的转移次数
  3. 期望计算:假设无记忆性时的理论转移频数
  4. 假设检验:通过χ²统计量比较观察值与期望值

2. 数据准备与状态划分

我们从雅虎财经获取特斯拉(TSLA)2020-2022年的日线数据作为示例。首先用Python进行基础处理:

import yfinance as yf import pandas as pd # 获取历史数据 ticker = "TSLA" data = yf.download(ticker, start="2020-01-01", end="2022-12-31") # 计算日收益率 data['Return'] = data['Close'].pct_change() * 100 data = data.dropna()

状态划分策略需要兼顾业务逻辑与统计需求。对于股票收益率,我们采用三分位法:

def classify_return(r): if r > 0.5: return 'up' elif r < -0.5: return 'down' else: return 'neutral' data['State'] = data['Return'].apply(classify_return)

状态边界值的选择直接影响检验结果。实践中建议:

  • 参考股票的实际波动率设定阈值
  • 确保每个状态有足够的样本量
  • 可通过网格搜索寻找最优划分

3. 构建转移频数矩阵

转移频数矩阵是检验的基础,它记录了状态间的实际转移情况。用Pandas的交叉表功能可高效实现:

# 生成转移序列 states = data['State'].values transitions = [(states[i], states[i+1]) for i in range(len(states)-1)] # 构建频数矩阵 freq_matrix = pd.crosstab( pd.Series([t[0] for t in transitions], name='Current'), pd.Series([t[1] for t in transitions], name='Next'), margins=False )

得到的频数矩阵示例如下:

Currentdownneutralup
down234532
neutral316841
up293937

表:TSLA股票状态转移频数矩阵(示例)

数据质量检查至关重要:

  • 确保没有零频数单元格(会导致χ²计算问题)
  • 检查状态分布是否均衡
  • 验证时间顺序正确的

4. 实施卡方检验

卡方检验的核心是比较观察频数与期望频数的差异。期望频数基于边际概率计算:

from scipy.stats import chi2_contingency # 执行卡方检验 chi2, p, dof, expected = chi2_contingency(freq_matrix) print(f"卡方统计量: {chi2:.2f}") print(f"P值: {p:.4f}") print(f"自由度: {dof}")

结果解读要点

  • P值<0.05:拒绝原假设,认为序列具有马尔可夫性
  • 效应量评估:卡方值/样本量反映关联强度
  • 残差分析:观察哪个转移对差异贡献最大

对于我们的示例数据,可能得到如下输出:

卡方统计量: 15.72 P值: 0.0274 自由度: 4

这表明在5%显著性水平下,我们可以认为TSLA的价格变动具有马尔可夫性。

5. 检验结果的应用与局限

当验证通过后,转移概率矩阵可直接用于预测:

# 计算转移概率矩阵 transition_matrix = freq_matrix.div(freq_matrix.sum(axis=1), axis=0) # 预测下一状态 current_state = 'up' next_probs = transition_matrix.loc[current_state] print(f"从{current_state}状态转移概率:\n{next_probs}")

但必须注意以下限制:

  1. 时间尺度敏感性:日线可能通过检验,但周线或分钟线结果可能不同
  2. 状态划分依赖性:改变分类标准会显著影响结论
  3. 市场状态变化:牛市/熊市中的转移模式可能不同

改进方向建议:

  • 引入滚动窗口检验观察性质是否稳定
  • 尝试更多状态分类(如五分类)
  • 结合其他检验方法(如似然比检验)

6. 完整代码实现与可视化

以下是整合所有步骤的完整代码示例:

import matplotlib.pyplot as plt import seaborn as sns def markov_test(ticker, start, end, threshold=0.5): # 数据获取与处理 data = yf.download(ticker, start=start, end=end) data['Return'] = data['Close'].pct_change() * 100 data = data.dropna() # 状态划分 data['State'] = data['Return'].apply( lambda r: 'up' if r > threshold else 'down' if r < -threshold else 'neutral' ) # 转移矩阵 states = data['State'].values transitions = [(states[i], states[i+1]) for i in range(len(states)-1)] freq_matrix = pd.crosstab( pd.Series([t[0] for t in transitions], name='Current'), pd.Series([t[1] for t in transitions], name='Next') ) # 可视化 plt.figure(figsize=(10,6)) sns.heatmap(freq_matrix, annot=True, fmt='d', cmap='YlGnBu') plt.title(f'{ticker} State Transition Frequencies') # 卡方检验 chi2, p, dof, expected = chi2_contingency(freq_matrix) return { 'freq_matrix': freq_matrix, 'chi2': chi2, 'p_value': p, 'dof': dof, 'transition_matrix': freq_matrix.div(freq_matrix.sum(axis=1), axis=0) } # 执行检验 results = markov_test('TSLA', '2020-01-01', '2022-12-31') print(f"马尔可夫性检验P值: {results['p_value']:.4f}")

可视化输出包括:

  • 状态转移热力图
  • 各统计量数值结果
  • 格式化后的转移概率矩阵

7. 进阶思考与扩展应用

当基础检验通过后,可以考虑以下深化方向:

多变量马尔可夫模型

# 添加交易量状态 data['Volume_State'] = (data['Volume'] > data['Volume'].rolling(20).mean()).map({True: 'high', False: 'low'}) combined_state = data['State'] + '_' + data['Volume_State']

**隐马尔可夫模型(HMM)**应用:

  • 使用hmmlearn库拟合潜在状态
  • 观察市场"隐藏模式"的转移规律

行业对比分析框架:

  1. 选择同行业多只股票
  2. 并行执行马氏性检验
  3. 比较不同股票的转移模式差异

实际项目中遇到的典型问题包括:

  • 小样本量导致的检验效力不足
  • 极端事件(如熔断)对状态划分的干扰
  • 非平稳性时间序列带来的伪相关性

这些情况需要结合领域知识进行判断,必要时采用更复杂的马尔可夫切换模型。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询