用Python和NumPy手把手教你模拟股市预测从状态转移矩阵到稳态分布金融市场的波动总是让人捉摸不透但数学却能为我们提供一种独特的视角。想象一下如果能够用代码模拟股市的牛熊转换预测长期趋势那该有多酷今天我们就用Python和NumPy从零开始构建一个马尔可夫链模型带你体验量化金融的奇妙世界。1. 环境准备与基础概念在开始编写代码前我们需要明确几个关键概念。马尔可夫链的核心思想是未来只取决于现在这种特性在金融时间序列分析中尤为重要。我们将股市简化为三种状态牛市Bull Market股价持续上涨熊市Bear Market股价持续下跌横盘Stagnant Market股价波动较小安装必要的Python库非常简单pip install numpy matplotlib马尔可夫链的数学本质可以用转移概率矩阵表示。假设当前是牛市那么下个周期保持牛市的概率0.9转为熊市的概率0.075转为横盘的概率0.025这种关系可以用矩阵表示为当前\下一状态牛市熊市横盘牛市0.90.0750.025熊市0.150.80.05横盘0.250.250.5注意矩阵每行概率之和必须严格等于1这是马尔可夫链的基本要求。2. 构建状态转移模型让我们用NumPy来实现这个转移矩阵。首先导入必要的库import numpy as np import matplotlib.pyplot as plt # 定义状态转移矩阵 transition_matrix np.array([ [0.9, 0.075, 0.025], # 牛市转移概率 [0.15, 0.8, 0.05], # 熊市转移概率 [0.25, 0.25, 0.5] # 横盘转移概率 ]) # 验证每行概率和为1 assert np.allclose(transition_matrix.sum(axis1), 1.0), 概率矩阵行和不为1为了直观理解状态转移我们可以模拟几个周期def simulate_markov_chain(initial_state, matrix, steps): states [牛市, 熊市, 横盘] current_state initial_state print(f初始状态: {states[current_state]}) for i in range(steps): current_state np.random.choice( len(states), pmatrix[current_state] ) print(f第{i1}步后状态: {states[current_state]})运行模拟simulate_markov_chain(0, transition_matrix, 10)典型输出可能如下初始状态: 牛市 第1步后状态: 牛市 第2步后状态: 牛市 第3步后状态: 熊市 第4步后状态: 熊市 第5步后状态: 牛市 ...3. 计算稳态分布马尔可夫链最迷人的特性之一是最终会收敛到一个稳态分布无论初始状态如何。数学上稳态分布π满足π πP我们可以通过矩阵幂次法来求解def find_steady_state(matrix, tolerance1e-8): n matrix.shape[0] pi np.ones(n) / n # 初始猜测 while True: new_pi pi matrix if np.linalg.norm(new_pi - pi) tolerance: break pi new_pi return pi steady_state find_steady_state(transition_matrix) print(f稳态分布: {steady_state})对于我们的股市模型输出应该是稳态分布: [0.625 0.3125 0.0625]这意味着长期来看62.5%的时间处于牛市31.25%的时间处于熊市6.25%的时间处于横盘4. 可视化收敛过程为了更直观地理解收敛过程我们可以绘制状态概率随时间变化的曲线def plot_convergence(initial_dist, matrix, steps20): history [initial_dist] current initial_dist for _ in range(steps): current current matrix history.append(current) history np.array(history) plt.figure(figsize(10, 6)) plt.plot(history[:, 0], label牛市概率) plt.plot(history[:, 1], label熊市概率) plt.plot(history[:, 2], label横盘概率) plt.xlabel(时间步) plt.ylabel(概率) plt.title(状态概率收敛过程) plt.legend() plt.grid(True) plt.show() # 假设初始分布为[0.3, 0.4, 0.3] plot_convergence(np.array([0.3, 0.4, 0.3]), transition_matrix)图表会清晰地展示不同状态概率如何随时间收敛到稳态值。这种可视化对于理解马尔可夫链的长期行为非常有帮助。5. 实际应用与扩展理解了基本原理后我们可以将这个模型应用到更实际的场景中。例如基于历史数据估计转移概率def estimate_transition_matrix(data): 根据历史状态序列估计转移矩阵 data: 状态序列如[0,0,1,2,0,...] n_states len(set(data)) matrix np.zeros((n_states, n_states)) for (i, j) in zip(data[:-1], data[1:]): matrix[i][j] 1 # 归一化 row_sums matrix.sum(axis1, keepdimsTrue) return matrix / row_sums # 示例历史数据0牛市1熊市2横盘 historical_data [0,0,1,1,0,2,0,1,1,1,0,0,2,2,0] estimated_matrix estimate_transition_matrix(historical_data) print(估计的转移矩阵:\n, estimated_matrix)对于更复杂的金融应用我们可以考虑加入更多市场状态如暴涨、暴跌考虑非平稳性转移概率随时间变化结合其他金融指标构建多维马尔可夫模型提示在实际交易策略中使用此类模型时务必进行充分的回溯测试和风险评估。马尔可夫链为金融建模提供了简洁而强大的框架。通过这个Python实现我们不仅理解了理论概念还获得了可以直接应用于实际数据分析的工具。
用Python和NumPy手把手教你模拟股市预测:从状态转移矩阵到稳态分布
用Python和NumPy手把手教你模拟股市预测从状态转移矩阵到稳态分布金融市场的波动总是让人捉摸不透但数学却能为我们提供一种独特的视角。想象一下如果能够用代码模拟股市的牛熊转换预测长期趋势那该有多酷今天我们就用Python和NumPy从零开始构建一个马尔可夫链模型带你体验量化金融的奇妙世界。1. 环境准备与基础概念在开始编写代码前我们需要明确几个关键概念。马尔可夫链的核心思想是未来只取决于现在这种特性在金融时间序列分析中尤为重要。我们将股市简化为三种状态牛市Bull Market股价持续上涨熊市Bear Market股价持续下跌横盘Stagnant Market股价波动较小安装必要的Python库非常简单pip install numpy matplotlib马尔可夫链的数学本质可以用转移概率矩阵表示。假设当前是牛市那么下个周期保持牛市的概率0.9转为熊市的概率0.075转为横盘的概率0.025这种关系可以用矩阵表示为当前\下一状态牛市熊市横盘牛市0.90.0750.025熊市0.150.80.05横盘0.250.250.5注意矩阵每行概率之和必须严格等于1这是马尔可夫链的基本要求。2. 构建状态转移模型让我们用NumPy来实现这个转移矩阵。首先导入必要的库import numpy as np import matplotlib.pyplot as plt # 定义状态转移矩阵 transition_matrix np.array([ [0.9, 0.075, 0.025], # 牛市转移概率 [0.15, 0.8, 0.05], # 熊市转移概率 [0.25, 0.25, 0.5] # 横盘转移概率 ]) # 验证每行概率和为1 assert np.allclose(transition_matrix.sum(axis1), 1.0), 概率矩阵行和不为1为了直观理解状态转移我们可以模拟几个周期def simulate_markov_chain(initial_state, matrix, steps): states [牛市, 熊市, 横盘] current_state initial_state print(f初始状态: {states[current_state]}) for i in range(steps): current_state np.random.choice( len(states), pmatrix[current_state] ) print(f第{i1}步后状态: {states[current_state]})运行模拟simulate_markov_chain(0, transition_matrix, 10)典型输出可能如下初始状态: 牛市 第1步后状态: 牛市 第2步后状态: 牛市 第3步后状态: 熊市 第4步后状态: 熊市 第5步后状态: 牛市 ...3. 计算稳态分布马尔可夫链最迷人的特性之一是最终会收敛到一个稳态分布无论初始状态如何。数学上稳态分布π满足π πP我们可以通过矩阵幂次法来求解def find_steady_state(matrix, tolerance1e-8): n matrix.shape[0] pi np.ones(n) / n # 初始猜测 while True: new_pi pi matrix if np.linalg.norm(new_pi - pi) tolerance: break pi new_pi return pi steady_state find_steady_state(transition_matrix) print(f稳态分布: {steady_state})对于我们的股市模型输出应该是稳态分布: [0.625 0.3125 0.0625]这意味着长期来看62.5%的时间处于牛市31.25%的时间处于熊市6.25%的时间处于横盘4. 可视化收敛过程为了更直观地理解收敛过程我们可以绘制状态概率随时间变化的曲线def plot_convergence(initial_dist, matrix, steps20): history [initial_dist] current initial_dist for _ in range(steps): current current matrix history.append(current) history np.array(history) plt.figure(figsize(10, 6)) plt.plot(history[:, 0], label牛市概率) plt.plot(history[:, 1], label熊市概率) plt.plot(history[:, 2], label横盘概率) plt.xlabel(时间步) plt.ylabel(概率) plt.title(状态概率收敛过程) plt.legend() plt.grid(True) plt.show() # 假设初始分布为[0.3, 0.4, 0.3] plot_convergence(np.array([0.3, 0.4, 0.3]), transition_matrix)图表会清晰地展示不同状态概率如何随时间收敛到稳态值。这种可视化对于理解马尔可夫链的长期行为非常有帮助。5. 实际应用与扩展理解了基本原理后我们可以将这个模型应用到更实际的场景中。例如基于历史数据估计转移概率def estimate_transition_matrix(data): 根据历史状态序列估计转移矩阵 data: 状态序列如[0,0,1,2,0,...] n_states len(set(data)) matrix np.zeros((n_states, n_states)) for (i, j) in zip(data[:-1], data[1:]): matrix[i][j] 1 # 归一化 row_sums matrix.sum(axis1, keepdimsTrue) return matrix / row_sums # 示例历史数据0牛市1熊市2横盘 historical_data [0,0,1,1,0,2,0,1,1,1,0,0,2,2,0] estimated_matrix estimate_transition_matrix(historical_data) print(估计的转移矩阵:\n, estimated_matrix)对于更复杂的金融应用我们可以考虑加入更多市场状态如暴涨、暴跌考虑非平稳性转移概率随时间变化结合其他金融指标构建多维马尔可夫模型提示在实际交易策略中使用此类模型时务必进行充分的回溯测试和风险评估。马尔可夫链为金融建模提供了简洁而强大的框架。通过这个Python实现我们不仅理解了理论概念还获得了可以直接应用于实际数据分析的工具。