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的核心循环:智能体观察状态,根据策略选择动作,动作影响环境,环境返回新状态和奖励,然后智能体根据奖励更新策略和价值函数。循环往复,直到学会最优策略。
学习建议:不要试图一次性理解所有概念。先搞懂状态、动作、奖励这三个最直观的要素,然后再去理解策略和价值函数。我在教团队新人时,都是让他们先手动设计一个简单的MDP(比如只有3个状态、2个动作),跑一遍流程,自然就懂了。
好了,MDP的基础就讲到这里。这些概念是后续所有强化学习算法的基石。你可能会觉得有点抽象,但相信我——等你真正开始写代码、调模型的时候,这些概念会变得非常具体。下一节我们会用Python实现一个完整的MDP环境,到时候你就知道这些东西怎么用了。
公众号:蓝海资料掘金营,微信deep3321