3、强化学习核心概念:智能体、环境、状态、动作、奖励,马尔可夫决策过程(MDP),策略与价值函数
好,咱们今天来啃一块硬骨头——强化学习的核心概念。说实话,我当年刚接触这些术语时,脑袋也是嗡嗡的。什么智能体、环境、状态、动作、奖励,还有那个听起来很唬人的马尔可夫决策过程(MDP)。
但别怕,这些东西说白了就是一套“怎么让程序自己学会做决定”的框架。你想想看,我们人类是怎么学会走路的?摔倒了爬起来,走对了有奖励(到达目的地),走错了有惩罚(摔疼了)。强化学习就是模仿这个过程。
3.1 核心五要素:智能体、环境、状态、动作、奖励
咱们先来拆解这五个基本概念。我习惯用一个比喻来理解:把强化学习想象成一个“游戏玩家”在玩“游戏”。
- 智能体(Agent):就是那个做决定的“玩家”。在量化交易里,它就是我们的交易策略程序。
- 环境(Environment):就是“游戏本身”。在交易场景中,环境就是整个市场——价格波动、成交量、新闻事件等等。
- 状态(State):智能体在某个时刻看到的“游戏画面”。比如当前持仓、K线形态、技术指标值。
- 动作(Action):智能体可以做的操作。比如“买入100股”、“卖出50股”、“持仓不动”。
- 奖励(Reward):环境对智能体动作的反馈。赚钱了给正奖励,亏钱了给负奖励。
核心理解:强化学习的目标,就是让智能体学会一套“在什么状态下该做什么动作”的规则,使得长期累积的奖励最大化。
我在做第一个量化交易RL模型时,就犯过一个低级错误——把奖励函数设成了“单笔交易盈亏”。结果模型学会了频繁交易,赚点小钱就跑,亏了就死扛。后来我才意识到,奖励函数的设计直接决定了模型的行为模式。
3.2 马尔可夫决策过程(MDP)
MDP是强化学习的数学基础。说白了,它就是一个描述“决策问题”的框架。为什么叫“马尔可夫”?因为有一个重要假设:未来的状态只取决于当前状态和当前动作,与过去的历史无关。
嗯,这里要注意。这个假设在真实交易中并不完全成立。比如今天的成交量异常,可能预示着未来几天的趋势。但MDP假设“当前状态已经包含了所有必要信息”。所以我们在做状态设计时,要把历史信息编码进当前状态里,比如用过去N天的价格序列作为状态。
一个MDP由五元组定义:(S, A, P, R, γ)
| 符号 | 含义 | 交易示例 |
|---|---|---|
| S | 状态空间 | 所有可能的持仓+市场指标组合 |
| A | 动作空间 | {买入, 卖出, 持有} |
| P | 状态转移概率 | 从“持仓+上涨”到“持仓+下跌”的概率 |
| R | 奖励函数 | R(s, a) = 本次交易盈亏 |
| γ | 折扣因子 | 0.9~0.99,控制远见程度 |
个人经验:折扣因子γ的选择很关键。γ=0表示只看眼前利益,γ接近1表示很有远见。我在做高频交易时用γ=0.95,做中长线时用γ=0.99。你可以根据策略持仓周期来调。
3.3 策略与价值函数
策略和价值函数,是强化学习的两个核心概念。它们就像硬币的两面——策略决定“怎么做”,价值函数评估“这么做有多好”。
策略(Policy)
策略就是智能体的“行为准则”。它告诉智能体:在某个状态下,应该采取什么动作。策略有两种表示方式:
- 确定性策略:π(s) = a,给定状态s,直接输出动作a。比如“当MACD金叉时买入”。
- 随机性策略:π(a|s) = P(a|s),给定状态s,输出每个动作的概率。比如“有80%概率买入,20%概率持有”。
我刚开始做时,总喜欢用确定性策略,觉得干脆利落。后来发现随机性策略在探索阶段更好用——它不会一直重复同一个动作,能发现更好的交易模式。
价值函数(Value Function)
价值函数用来评估“某个状态有多好”或者“在某个状态下做某个动作有多好”。主要有两种:
- 状态价值函数 V(s):从状态s开始,按照策略π行动,能获得的期望累积奖励。
- 动作价值函数 Q(s, a):在状态s下执行动作a,之后按照策略π行动,能获得的期望累积奖励。
你想想看,Q(s, a) 是不是更实用?因为它直接告诉我们“在某个市场状态下,买入、卖出、持有哪个更好”。这就是Q-learning算法的核心思想。
避坑指南:我曾经在实现Q-learning时,把Q表初始化为全零。结果模型花了很长时间才学会“买入”这个动作,因为一开始所有动作的价值都一样。后来我改用乐观初始值(比如+1),模型探索效率明显提升。
3.4 知识体系总览
为了让你更直观地理解这些概念之间的关系,我画了一张图。这张图展示了强化学习的核心循环:智能体观察状态,做出动作,环境反馈奖励并进入新状态。
这张图把整个流程串起来了。智能体观察当前状态S,根据策略π选择动作A,环境执行动作后给出奖励R并转移到新状态S'。这个循环不断重复,智能体就在这个过程中学习优化自己的策略。
3.5 代码示例:一个简单的MDP环境
光说不练假把式。咱们用Python实现一个最简单的交易MDP环境。这个环境只有两种状态(上涨、下跌),两种动作(买入、卖出)。
import numpy as np
class SimpleTradingEnv:
"""一个极简的交易MDP环境"""
def __init__(self):
# 状态空间:0=下跌,1=上涨
self.states = [0, 1]
# 动作空间:0=卖出,1=买入
self.actions = [0, 1]
# 状态转移矩阵 P[s][a] = [s'概率]
self.P = {
0: {0: [0.7, 0.3], 1: [0.4, 0.6]}, # 下跌时卖出/买入
1: {0: [0.3, 0.7], 1: [0.2, 0.8]} # 上涨时卖出/买入
}
# 奖励函数 R[s][a]
self.R = {
0: {0: 0.0, 1: -0.5}, # 下跌时买入亏钱
1: {0: 0.5, 1: 0.0} # 上涨时卖出赚钱
}
self.current_state = 0
def step(self, action):
"""执行动作,返回(新状态, 奖励, 是否结束)"""
probs = self.P[self.current_state][action]
next_state = np.random.choice(self.states, p=probs)
reward = self.R[self.current_state][action]
self.current_state = next_state
# 简单环境永不结束
return next_state, reward, False
def reset(self):
self.current_state = 0
return self.current_state
# 测试一下
env = SimpleTradingEnv()
state = env.reset()
print(f"初始状态: {'上涨' if state else '下跌'}")
for i in range(5):
action = np.random.choice(env.actions)
next_state, reward, _ = env.step(action)
print(f"步骤{i+1}: 执行{'买入' if action else '卖出'}, "
f"奖励={reward:.1f}, 新状态={'上涨' if next_state else '下跌'}")
运行结果示例:
初始状态: 下跌
步骤1: 执行卖出, 奖励=0.0, 新状态=下跌
步骤2: 执行买入, 奖励=-0.5, 新状态=上涨
步骤3: 执行买入, 奖励=0.0, 新状态=上涨
步骤4: 执行卖出, 奖励=0.5, 新状态=上涨
步骤5: 执行买入, 奖励=0.0, 新状态=上涨
看到没?这个环境虽然简单,但已经包含了MDP的所有要素。状态转移概率模拟了市场的随机性,奖励函数反映了不同动作的盈亏。实际交易环境会比这个复杂得多,但核心逻辑是一样的。
好了,这一章的内容就到这里。记住这几个核心概念,它们是后续所有算法的基石。下一章我们会深入探讨Q-learning和策略梯度方法,到时候这些概念会反复出现。