2. 强化学习基础:马尔可夫决策过程(MDP)、状态、动作、奖励、策略、价值函数

好,咱们正式开始啃强化学习的硬核基础。

说实话,很多做量化投资的朋友一听到「马尔可夫决策过程」这几个字就头大。我当年也一样,觉得这玩意儿太数学了。但后来在实际做投资组合优化时才发现——你每天面对的市场,本质上就是一个MDP。你想想看,你根据当前持仓和市场状态做决策,市场给你反馈(赚钱还是亏钱),然后进入下一个状态。这不就是MDP吗?

2.1 马尔可夫决策过程(MDP)—— 投资决策的数学骨架

MDP说白了就是描述「智能体与环境交互」的数学框架。它由五个要素组成:

  • S(状态空间):环境的所有可能状态
  • A(动作空间):智能体可以采取的所有动作
  • P(状态转移概率):在状态s执行动作a后,转移到s'的概率
  • R(奖励函数):在状态s执行动作a后获得的即时奖励
  • γ(折扣因子):未来奖励的折现系数,0到1之间

这里有个关键点——马尔可夫性质:下一个状态只取决于当前状态和动作,跟历史无关。用公式说就是:

P(s_{t+1} | s_t, a_t, s_{t-1}, a_{t-1}, ...) = P(s_{t+1} | s_t, a_t)

我在做CTA策略时遇到过一个问题:如果直接用过去10天的价格数据作为状态,那这个状态其实已经包含了历史信息,马尔可夫性质是成立的。但如果你只拿「今天涨跌」作为状态,那肯定不行——因为明天的走势还取决于过去几天的趋势。

核心理解:MDP假设未来只与现在有关,与过去无关。这个假设看似严格,但通过合理设计状态(比如包含历史窗口),我们可以让实际问题满足这个性质。

2.2 状态(State)—— 你看到了什么?

状态就是智能体感知到的环境信息。在投资组合管理中,状态可以包括:

  • 当前各资产的持仓比例
  • 各资产的历史收益率(比如过去20天的收益率序列)
  • 市场指标(波动率、相关性、成交量等)
  • 宏观经济数据
  • 账户总权益和风险指标

我个人习惯把状态设计成两部分:市场状态持仓状态。市场状态描述外部环境,持仓状态描述你当前的位置。这两者缺一不可。

实战技巧:状态维度不是越多越好。我曾经在状态里加了20多个指标,结果模型训练了三天都不收敛。后来精简到8个核心指标,效果反而更好。记住——状态要「够用」而不是「堆砌」。

2.3 动作(Action)—— 你能做什么?

动作是智能体可以采取的操作。在投资组合场景中,动作空间的设计直接影响策略的可行性。

常见的动作设计方式:

  • 离散动作:比如「买入」「卖出」「持有」三个动作,或者将调仓比例离散化为{-0.1, -0.05, 0, 0.05, 0.1}
  • 连续动作:直接输出各资产的权重向量,比如[0.3, 0.2, 0.5]表示三只资产的配置比例

嗯,这里要注意。离散动作简单但精度有限,连续动作灵活但训练难度大。我建议刚开始做实验时先用离散动作,等模型稳定了再切换到连续动作。

# 离散动作示例:调整5只股票的权重,每次调整幅度为±2%
actions = [
    [-0.02, 0, 0, 0, 0],   # 减仓股票1
    [0.02, 0, 0, 0, 0],    # 加仓股票1
    [0, -0.02, 0, 0, 0],   # 减仓股票2
    # ... 共10个动作
]

2.4 奖励(Reward)—— 你的目标是什么?

奖励函数是强化学习的「指挥棒」。你给它什么奖励,它就学什么行为。这个设计太重要了,我见过太多项目因为奖励函数没设计好而失败。

在投资组合中,常见的奖励设计:

奖励类型 公式 特点
简单收益率 R = portfolio_return 容易导致过度冒险
夏普比率 R = (return - rf) / std 平衡收益和风险
卡玛比率 R = return / max_drawdown 关注回撤控制
自定义惩罚 R = return - λ * volatility 灵活调整风险厌恶程度

我曾经犯过一个错误:直接用累计收益率做奖励。结果模型学会了「赌一把」——在某个资产上重仓,赚了就大赚,亏了就爆仓。后来改成夏普比率加回撤惩罚,模型才变得稳健。

避坑指南:奖励函数一定要考虑风险。单纯追求收益最大化的模型,在实盘中大概率会亏得很惨。建议至少加入波动率惩罚或最大回撤惩罚。

2.5 策略(Policy)—— 你怎么做决策?

策略就是智能体的「大脑」,它告诉你在每个状态下应该采取什么动作。策略分为两种:

  • 确定性策略:π(s) = a,给定状态直接输出动作
  • 随机性策略:π(a|s) = P(a|s),给定状态输出动作的概率分布

在投资中,我更喜欢用随机性策略。为什么?因为市场有不确定性,确定性策略容易过拟合。随机性策略天然带有探索性,能帮你发现更好的交易机会。

# 随机性策略示例:softmax策略
def softmax_policy(state, q_values, temperature=1.0):
    # 计算各动作的偏好分数
    preferences = q_values[state]
    # 应用温度参数控制探索程度
    scaled = preferences / temperature
    # 转换为概率分布
    probs = np.exp(scaled) / np.sum(np.exp(scaled))
    # 根据概率采样动作
    action = np.random.choice(len(probs), p=probs)
    return action

2.6 价值函数(Value Function)—— 这个状态值多少钱?

价值函数评估「当前状态有多好」。它有两种形式:

  • 状态价值函数 V(s):从状态s开始,按照策略π行动,能获得的期望累计奖励
  • 动作价值函数 Q(s,a):在状态s执行动作a后,再按照策略π行动,能获得的期望累计奖励

公式看起来有点吓人,但说白了就是:

V(s) = E[ R_t + γ*R_{t+1} + γ²*R_{t+2} + ... | s_t = s, π ]

Q(s,a) = E[ R_t + γ*R_{t+1} + γ²*R_{t+2} + ... | s_t = s, a_t = a, π ]

我刚开始学的时候,总觉得V和Q差不多。后来做项目才明白:V(s)告诉你「这个市场状态好不好」,Q(s,a)告诉你「在这个市场状态下,买茅台好还是买五粮液好」。前者是宏观判断,后者是具体决策。

关键关系:V(s) = max_a Q(s,a)。也就是说,状态s的价值等于在这个状态下能采取的最佳动作的价值。这个关系是很多强化学习算法的基础。

2.7 知识体系总览

下面这张图把MDP的核心要素串起来了。我建议你多看几遍,把每个要素之间的关系理清楚。

马尔可夫决策过程(MDP)核心要素 智能体 (Agent) 环境 (Environment) 状态 (State) 动作 (Action) 奖励 (Reward) 策略 (Policy) 价值函数 (Value) 转移概率 (P) 输出动作 执行动作 返回新状态 返回奖励 输入状态 选择动作 评估价值 折扣因子 γ ∈ [0,1]:控制未来奖励的重要性 循环迭代:s → a → s' → r → 更新策略和价值函数

这张图展示了MDP的核心循环:智能体观察状态,根据策略选择动作,动作影响环境,环境返回新状态和奖励,然后智能体根据奖励更新策略和价值函数。循环往复,直到学会最优策略。

学习建议:不要试图一次性理解所有概念。先搞懂状态、动作、奖励这三个最直观的要素,然后再去理解策略和价值函数。我在教团队新人时,都是让他们先手动设计一个简单的MDP(比如只有3个状态、2个动作),跑一遍流程,自然就懂了。

好了,MDP的基础就讲到这里。这些概念是后续所有强化学习算法的基石。你可能会觉得有点抽象,但相信我——等你真正开始写代码、调模型的时候,这些概念会变得非常具体。下一节我们会用Python实现一个完整的MDP环境,到时候你就知道这些东西怎么用了。


公众号:蓝海资料掘金营,微信deep3321