3、马尔可夫决策过程(MDP)回顾:状态空间、动作空间、奖励函数设计对风控的影响

聊到强化学习交易策略,绕不开的一个基础就是马尔可夫决策过程,也就是MDP。很多朋友觉得这东西太理论,跟实战没关系。其实不然,MDP的三个核心要素——状态空间、动作空间、奖励函数——直接决定了你的风控能不能落地。

我刚开始做RL交易时,就踩过一个大坑。当时只顾着让模型赚钱,奖励函数设计得特别激进。结果呢?模型学会了在极端行情下重仓赌方向,回测曲线漂亮得不行,一上实盘就爆仓。说白了,就是MDP设计时没把风控嵌进去。

今天咱们就掰开揉碎,看看这三个要素到底怎么影响风控。

3.1 状态空间:你让模型看到了什么?

状态空间,就是模型做决策时能看到的全部信息。你想想看,如果模型连当前持仓风险都不知道,它怎么可能做出安全决策?

我个人习惯,状态空间至少要包含三类信息:

  • 市场数据:价格、成交量、波动率等
  • 持仓状态:当前仓位、浮盈浮亏、持仓时间
  • 风险指标:VaR、最大回撤、夏普比率等

这里有个关键点——状态空间不是越大越好。我在项目中遇到过,有人把50个技术指标全塞进去,结果模型训练了三天都不收敛。为什么?因为状态空间太大,模型学不到有效特征,反而被噪声干扰。

我的建议:状态空间控制在10-20个维度。优先选择跟风险直接相关的指标,比如当前波动率、持仓比例、账户净值。

举个例子,一个简单的风控状态空间可以这样设计:

# 状态空间示例
state = {
    'price_change': 当前价格变化率,
    'volatility': 过去20根K线的波动率,
    'position_ratio': 当前持仓占总资金比例,
    'unrealized_pnl': 当前浮盈浮亏比例,
    'drawdown': 当前回撤幅度,
    'market_regime': 市场状态(趋势/震荡/高波动)
}

嗯,这里要注意,状态空间必须包含历史信息。MDP要求状态具有马尔可夫性,即当前状态包含了决策所需的所有历史信息。所以像波动率、回撤这类指标,天然就是历史数据的聚合,正好满足这个要求。

3.2 动作空间:模型能做什么?

动作空间定义了模型可以采取的操作。在交易场景下,动作空间的设计直接决定了风控的精细程度。

常见的动作空间有三种:

动作空间类型 描述 风控特点
离散动作 买入、卖出、持有 简单粗暴,风控粒度粗
连续动作 仓位比例0-100% 精细控制,但训练难度大
混合动作 方向+仓位+止损 最灵活,风控最全面

我个人更推荐混合动作空间。为什么?因为你可以把风控指令直接编码到动作里。比如:

# 混合动作空间示例
action = {
    'direction': [-1, 0, 1],  # 做空、观望、做多
    'position_size': [0, 0.25, 0.5, 0.75, 1.0],  # 仓位比例
    'stop_loss': [0.01, 0.02, 0.03, 0.05],  # 止损比例
    'take_profit': [0.02, 0.03, 0.05, 0.1]  # 止盈比例
}

我曾经犯过一个错误——让模型自己决定止损位。结果模型学会了把止损设得特别宽,等于没有止损。后来我改成固定止损+模型调仓,风控效果立马好了很多。

避坑指南:动作空间不要给模型太多自由度。尤其是风控相关的动作,比如止损、仓位上限,最好用硬约束。模型可以在约束范围内优化,但不能突破底线。

3.3 奖励函数:模型的价值观

奖励函数是MDP的灵魂。模型学到的所有策略,本质上都是在最大化累积奖励。所以,奖励函数就是模型的价值观

如果你只给赚钱的奖励,模型就会变成赌徒。如果你把风控也纳入奖励,模型才会学会稳健交易。

我常用的奖励函数设计思路是这样的:

  1. 核心奖励:每笔交易的盈亏,这是基础
  2. 风控惩罚:回撤超过阈值时给负奖励
  3. 行为约束:频繁交易、重仓交易都要惩罚
  4. 长期激励:夏普比率、卡玛比率等长期指标

来看一个具体的奖励函数实现:

def calculate_reward(state, action, next_state):
    # 基础奖励:盈亏
    pnl = next_state['equity'] - state['equity']
    
    # 风控惩罚:回撤惩罚
    drawdown_penalty = 0
    if next_state['drawdown'] > 0.1:  # 回撤超过10%
        drawdown_penalty = -2.0 * (next_state['drawdown'] - 0.1)
    
    # 行为约束:频繁交易惩罚
    trade_penalty = 0
    if action['position_size'] != state['position_ratio']:
        trade_penalty = -0.01  # 每次调仓扣0.01
    
    # 长期激励:夏普比率
    sharpe_bonus = 0
    if len(state['returns_history']) > 20:
        sharpe = calculate_sharpe(state['returns_history'])
        if sharpe > 1.0:
            sharpe_bonus = 0.1 * (sharpe - 1.0)
    
    # 总奖励
    total_reward = pnl + drawdown_penalty + trade_penalty + sharpe_bonus
    
    return total_reward

你想想看,这个奖励函数里,回撤惩罚的权重比盈亏还高。模型很快就学会了:与其冒险赚大钱,不如稳稳地赚小钱。这就是风控在MDP中的体现。

核心要点:奖励函数要平衡短期收益和长期风险。我一般把风控相关的惩罚项权重设为核心奖励的1.5-2倍。这样模型才会把风控放在第一位。

3.4 三者如何协同影响风控?

状态空间、动作空间、奖励函数不是孤立的。它们共同决定了模型的风险偏好。

我画了一张图,帮你理解它们的关系:

MDP三要素对风控的影响 状态空间 市场数据 持仓状态 风险指标 动作空间 离散/连续/混合 仓位控制 止损止盈 奖励函数 盈亏奖励 风控惩罚 长期激励 风控效果 回撤控制 | 仓位管理 | 风险调整收益 三者协同:状态提供信息 → 动作执行决策 → 奖励反馈结果

从这张图可以看出来,状态空间决定了模型能看到什么风险,动作空间决定了模型能做什么风控操作,奖励函数决定了模型愿不愿意做风控。三者缺一不可。

我在实际项目中总结了一个经验:先设计奖励函数,再反推状态空间和动作空间。因为奖励函数定义了目标,其他两个都是为实现目标服务的工具。

实战技巧:如果你刚开始做RL交易策略,建议先用简单的离散动作空间(买/卖/持有),配合包含回撤惩罚的奖励函数。等模型跑通了,再逐步增加复杂度。一口吃不成胖子,风控也是一样。

好了,关于MDP三要素对风控的影响,今天就聊到这儿。记住一句话:好的MDP设计,让模型天生就会做风控;差的设计,再怎么加约束也白搭


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