4、马尔可夫决策过程:MDP五元组、状态转移概率、回报与折扣因子、策略评估与策略迭代

好,咱们今天聊聊马尔可夫决策过程,也就是 MDP。这东西说白了,就是强化学习的数学骨架。你想想看,一个智能体在环境里瞎逛,怎么决策、怎么拿奖励、怎么规划未来,全得靠这套框架来建模。

我个人习惯把 MDP 理解成一个「有奖励的有限状态机」。它比普通的马尔可夫链多了一个关键要素——动作。有了动作,智能体就不再是被动地看状态跳来跳去,而是主动选择怎么跳。

4.1 MDP 五元组:强化学习的数学骨架

一个标准的 MDP 由五个元素组成,业内叫五元组。我刚开始学的时候总觉得这五个东西很抽象,后来做项目才发现,其实每个元素都能在代码里找到对应。

元素 符号 含义 代码中的体现
状态集合 S 环境所有可能的状态 股票价格区间、持仓量
动作集合 A 智能体可执行的动作 买入、卖出、持有
状态转移概率 P 从一个状态到另一个状态的概率 市场涨跌的概率分布
奖励函数 R 执行动作后获得的即时奖励 盈亏金额、夏普比率
折扣因子 γ 未来奖励的折现系数 0.9 ~ 0.99 之间的常数

嗯,这里要注意:状态集合和动作集合可以是离散的,也可以是连续的。量化交易里,状态往往是连续的(价格、波动率),但为了简化,我们经常做离散化处理。

核心理解:MDP 五元组就是给强化学习问题画了个框。你只要能把你的问题塞进这个框里,就能用强化学习的方法去解。

4.2 状态转移概率:环境的不确定性建模

状态转移概率 P(s'|s, a) 表示:在状态 s 下执行动作 a,跳到状态 s' 的概率。这玩意儿是 MDP 里最核心也最头疼的部分。

为什么头疼?因为真实环境里,你根本拿不到精确的转移概率。比如股票市场,你买入后明天涨的概率是多少?没人能给出精确数字。

我在项目中遇到过这种情况:一开始我试图用历史数据去估计转移概率矩阵,结果发现市场一变,这个矩阵就完全失效了。后来我改用无模型的强化学习方法,直接跳过概率估计,从经验中学习。

避坑指南:我曾经花了两周时间构建一个精细的状态转移矩阵,结果回测效果还不如随机策略。后来才明白,对于复杂环境,与其花精力估计概率,不如用模型无关的方法。

状态转移概率满足马尔可夫性质:未来只依赖于当前状态,与历史无关。这个性质很重要,它让问题变得可解。你想想看,如果每次决策都要回顾整个历史,那计算量就爆炸了。

4.3 回报与折扣因子:短期与长期的平衡

回报 G_t 是未来所有折扣奖励的总和。公式很简单:

G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + ...

折扣因子 γ 在 0 到 1 之间。γ 越接近 0,智能体越短视;越接近 1,越有远见。

我个人习惯把 γ 设成 0.99。为什么?因为量化交易里,我们既要考虑当前交易的盈亏,也要考虑长期账户的增长。γ=0.99 意味着未来 100 步的奖励还有约 0.37 的权重,这个衰减速度比较合理。

γ 取值 行为倾向 适用场景
0.0 只看眼前 高频交易、日内短线
0.5 适度远视 中频交易、持仓几天
0.9 较有远见 趋势跟踪、持仓数周
0.99 非常远视 长期投资、资产配置

注意:γ 设得太大会导致训练不稳定,因为未来奖励的方差会累积。设得太小又会让智能体变得短视。我建议从 0.95 开始调,根据回测结果微调。

4.4 策略评估与策略迭代:找到最优策略

策略 π 就是智能体的行为准则。它告诉你在每个状态下该做什么动作。策略评估是计算给定策略的价值函数,策略迭代则是不断改进策略。

说白了,策略评估就是「算账」,看看当前策略到底能赚多少钱。策略迭代就是「改方案」,根据算账结果调整策略。

4.4.1 策略评估:计算价值函数

策略评估的核心是贝尔曼方程。对于给定策略 π,状态价值函数 V_π(s) 满足:

V_π(s) = Σ_a π(a|s) Σ_{s'} P(s'|s,a) [R(s,a,s') + γV_π(s')]

这个方程看着复杂,其实逻辑很简单:当前状态的价值 = 所有可能动作的价值加权平均。每个动作的价值 = 立即奖励 + 未来状态的折扣价值。

我记得第一次实现策略评估时,用了迭代法。代码大概长这样:

def policy_evaluation(policy, env, gamma=0.99, theta=1e-6):
    V = np.zeros(env.n_states)
    while True:
        delta = 0
        for s in range(env.n_states):
            v = V[s]
            # 计算当前状态的新价值
            new_v = 0
            for a in range(env.n_actions):
                action_prob = policy[s][a]
                for s_prob, s_next, reward in env.transitions[s][a]:
                    new_v += action_prob * s_prob * (reward + gamma * V[s_next])
            V[s] = new_v
            delta = max(delta, abs(v - V[s]))
        if delta < theta:
            break
    return V

嗯,这里要注意收敛条件 theta。设得太大会导致价值函数不准确,设得太小又浪费计算资源。我一般设 1e-6,够用。

4.4.2 策略迭代:策略改进与评估的循环

策略迭代分两步走:策略评估算出当前价值函数,然后策略改进根据价值函数更新策略。这两步交替进行,直到策略不再变化。

策略改进的核心是贪心选择:在每个状态下,选择能最大化未来价值的动作。

def policy_iteration(env, gamma=0.99):
    policy = np.ones([env.n_states, env.n_actions]) / env.n_actions
    while True:
        # 策略评估
        V = policy_evaluation(policy, env, gamma)
        
        # 策略改进
        policy_stable = True
        for s in range(env.n_states):
            old_action = np.argmax(policy[s])
            
            # 计算每个动作的价值
            action_values = np.zeros(env.n_actions)
            for a in range(env.n_actions):
                for s_prob, s_next, reward in env.transitions[s][a]:
                    action_values[a] += s_prob * (reward + gamma * V[s_next])
            
            # 更新策略为贪心策略
            best_action = np.argmax(action_values)
            policy[s] = np.eye(env.n_actions)[best_action]
            
            if old_action != best_action:
                policy_stable = False
        
        if policy_stable:
            break
    return policy, V

关键洞察:策略迭代保证收敛到最优策略。但要注意,它要求环境模型(转移概率和奖励)是已知的。在量化交易中,我们通常不知道真实的市场模型,所以策略迭代更多用于理论分析和简单环境。

4.5 知识体系总览

下面这张图把 MDP 的核心知识串起来了。你看,从五元组出发,到状态转移概率、回报计算,再到策略评估和迭代,整个逻辑链条是清晰的。

马尔可夫决策过程(MDP)知识体系 MDP 五元组 (S, A, P, R, γ) 状态转移概率 P(s'|s,a) 回报 G_t 与折扣因子 γ 策略评估 V_π(s) 策略迭代(评估+改进) 马尔可夫性质:未来只依赖当前 贝尔曼方程:递归计算价值 最优策略 π* 量化交易策略 机器人控制 策略评估 → 策略改进 → 收敛到最优策略

你看这张图,MDP 五元组是根,四个分支分别对应状态转移、回报计算、策略评估和策略迭代。策略评估和策略迭代之间有个循环箭头,表示它们交替进行直到收敛。

个人经验:我刚开始做量化回测框架时,就是按照这个结构来设计的。先把五元组定义清楚,然后实现策略评估和迭代。虽然最后因为环境模型未知,转向了无模型方法,但这个框架帮我理清了思路。

好了,MDP 的核心内容就这些。记住:五元组是骨架,转移概率是环境的不确定性,折扣因子是时间偏好,策略评估和迭代是求解方法。把这几个点吃透了,强化学习的入门就算完成了。