1. 马尔可夫过程基础:定义、核心性质、状态空间与转移概率矩阵
大家好,欢迎来到这门课的第一讲。
咱们开门见山。马尔可夫过程,说白了就是研究「下一步怎么走」的数学工具。我最早接触它是在做高频交易策略回测的时候,当时被一堆随机过程搞得头大,后来发现马尔可夫过程反而是最「讲道理」的那一个——它不跟你玩弯弯绕,只关心你现在在哪,不管你怎么来的。
1.1 什么是马尔可夫过程?
先给个定义,别怕,我尽量说人话。
马尔可夫过程,是一种随机过程。它满足一个核心条件:未来的状态只依赖于当前状态,与过去的状态无关。
嗯,这就是所谓的「马尔可夫性」,也叫「无后效性」。
核心定义:
对于任意时刻 t,以及任意状态 s₁, s₂, ..., sₜ,有:
P(Xₜ₊₁ = sₜ₊₁ | Xₜ = sₜ, Xₜ₋₁ = sₜ₋₁, ..., X₁ = s₁) = P(Xₜ₊₁ = sₜ₊₁ | Xₜ = sₜ)
翻译成人话:给定现在,未来与过去条件独立。
你想想看,这像不像做交易?
我个人的经验是,很多趋势跟踪策略本质上就假设了「当前价格走势已经包含了所有历史信息」。你不需要知道三天前发生了什么,只需要知道现在处于什么状态——是上涨趋势、震荡整理还是下跌趋势。这就是马尔可夫性在量化交易中的朴素体现。
1.2 核心性质:马尔可夫性
咱们再深入一点。马尔可夫性到底意味着什么?
- 记忆只有一步:系统只记得「上一刻」的状态,更早的历史被遗忘。
- 状态决定一切:只要知道当前状态,未来演化的概率分布就完全确定了。
- 路径无关:不管你是从天堂跌落到当前状态,还是从地狱爬上来,未来的概率都一样。
我曾经在开发一个CTA策略时,犯过一个低级错误:把过去10天的价格数据全部塞进模型,结果过拟合得一塌糊涂。后来改用马尔可夫链,只保留当前状态(比如用MACD金叉/死叉作为状态),效果反而更稳健。说白了,有时候「忘记」比「记住」更重要。
避坑指南:
我曾经以为所有金融时间序列都满足马尔可夫性,结果在波动率聚类明显的品种上吃了大亏。记住:马尔可夫性是一个假设,不是真理。使用前一定要检验。
1.3 状态空间
状态空间,就是系统所有可能状态的集合。用数学符号表示就是 S = {s₁, s₂, ..., sₙ}。
在趋势跟踪中,我习惯把状态空间设计成离散的、有限的。比如:
- 状态1:强势上涨(涨幅 > 2%)
- 状态2:温和上涨(0% < 涨幅 ≤ 2%)
- 状态3:震荡(-1% ≤ 涨幅 ≤ 0%)
- 状态4:温和下跌(-2% ≤ 涨幅 < -1%)
- 状态5:强势下跌(涨幅 < -2%)
你可能会问:为什么是5个状态?不是3个,也不是10个?
嗯,这里有个经验之谈。状态太少,区分度不够;状态太多,转移概率矩阵会变得稀疏,估计不准。我个人建议,对于日线级别的趋势跟踪,3到7个状态是比较舒服的范围。
1.4 转移概率矩阵
这是马尔可夫过程的核心工具。转移概率矩阵 P 是一个 n×n 的方阵,其中 Pᵢⱼ 表示从状态 i 转移到状态 j 的概率。
数学上:Pᵢⱼ = P(Xₜ₊₁ = sⱼ | Xₜ = sᵢ)
矩阵的每一行之和必须等于1,因为从某个状态出发,总要转移到某个状态(包括自身)。
举个例子,假设我们统计了某只股票过去1000个交易日的状态转移情况:
| 从\到 | 强势上涨 | 温和上涨 | 震荡 | 温和下跌 | 强势下跌 |
|---|---|---|---|---|---|
| 强势上涨 | 0.40 | 0.30 | 0.15 | 0.10 | 0.05 |
| 温和上涨 | 0.20 | 0.35 | 0.25 | 0.15 | 0.05 |
| 震荡 | 0.10 | 0.25 | 0.30 | 0.25 | 0.10 |
| 温和下跌 | 0.05 | 0.15 | 0.25 | 0.35 | 0.20 |
| 强势下跌 | 0.05 | 0.10 | 0.15 | 0.30 | 0.40 |
看到没?对角线上的概率普遍较高。这说明趋势有「惯性」——强势上涨之后,更可能继续上涨;强势下跌之后,更可能继续下跌。这就是趋势跟踪能赚钱的数学基础。
注意:
转移概率矩阵是静态的,它假设转移规律不随时间变化。但在真实市场中,市场状态会发生变化(比如牛转熊),转移概率也会漂移。我建议每3-6个月重新估计一次矩阵。
1.5 用Python实现一个简单的马尔可夫链
光说不练假把式。咱们写几行代码,把上面的矩阵用起来。
import numpy as np
# 定义状态
states = ['强势上涨', '温和上涨', '震荡', '温和下跌', '强势下跌']
# 转移概率矩阵
P = np.array([
[0.40, 0.30, 0.15, 0.10, 0.05],
[0.20, 0.35, 0.25, 0.15, 0.05],
[0.10, 0.25, 0.30, 0.25, 0.10],
[0.05, 0.15, 0.25, 0.35, 0.20],
[0.05, 0.10, 0.15, 0.30, 0.40]
])
# 当前状态(假设当前是温和上涨,索引为1)
current_state = 1
# 预测下一步状态
next_state_probs = P[current_state]
next_state = np.random.choice(len(states), p=next_state_probs)
print(f"当前状态: {states[current_state]}")
print(f"预测下一步状态: {states[next_state]}")
print(f"各状态概率: {dict(zip(states, next_state_probs))}")
这段代码很简单,但它是整个马尔可夫过程在趋势跟踪中应用的基础。你想想看,如果我们能准确估计出转移概率,就能知道当前趋势持续的概率有多大,从而决定是持仓还是平仓。
1.6 知识体系总览
为了让你对本章内容有个整体印象,我画了一张图:
这张图把本章的知识结构串起来了。从定义出发,理解核心性质,然后构建状态空间,最后用转移概率矩阵量化状态之间的转换规律。每一步都是下一步的基础。
1.7 小结
这一章我们聊了:
- 马尔可夫过程的定义——未来只依赖现在
- 马尔可夫性——无后效性,忘记过去
- 状态空间——系统所有可能的状态
- 转移概率矩阵——状态之间跳转的概率
我个人觉得,理解马尔可夫过程的关键不在于数学公式,而在于思维方式:把复杂的时间序列问题,简化为状态之间的跳转问题。这种「化繁为简」的思路,在量化交易中非常实用。
下一章,我们会讨论如何用马尔可夫链来建模趋势跟踪策略。不过在那之前,建议你把上面的代码跑一跑,亲手感受一下转移概率矩阵是怎么工作的。
公众号:蓝海资料掘金营,微信deep3321