3、马尔可夫决策过程(MDP)回顾:状态空间、动作空间、奖励函数设计对风控的影响
聊到强化学习交易策略,绕不开的一个基础就是马尔可夫决策过程,也就是MDP。很多朋友觉得这东西太理论,跟实战没关系。其实不然,MDP的三个核心要素——状态空间、动作空间、奖励函数——直接决定了你的风控能不能落地。
我刚开始做RL交易时,就踩过一个大坑。当时只顾着让模型赚钱,奖励函数设计得特别激进。结果呢?模型学会了在极端行情下重仓赌方向,回测曲线漂亮得不行,一上实盘就爆仓。说白了,就是MDP设计时没把风控嵌进去。
今天咱们就掰开揉碎,看看这三个要素到底怎么影响风控。
3.1 状态空间:你让模型看到了什么?
状态空间,就是模型做决策时能看到的全部信息。你想想看,如果模型连当前持仓风险都不知道,它怎么可能做出安全决策?
我个人习惯,状态空间至少要包含三类信息:
- 市场数据:价格、成交量、波动率等
- 持仓状态:当前仓位、浮盈浮亏、持仓时间
- 风险指标:VaR、最大回撤、夏普比率等
这里有个关键点——状态空间不是越大越好。我在项目中遇到过,有人把50个技术指标全塞进去,结果模型训练了三天都不收敛。为什么?因为状态空间太大,模型学不到有效特征,反而被噪声干扰。
举个例子,一个简单的风控状态空间可以这样设计:
# 状态空间示例
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的灵魂。模型学到的所有策略,本质上都是在最大化累积奖励。所以,奖励函数就是模型的价值观。
如果你只给赚钱的奖励,模型就会变成赌徒。如果你把风控也纳入奖励,模型才会学会稳健交易。
我常用的奖励函数设计思路是这样的:
- 核心奖励:每笔交易的盈亏,这是基础
- 风控惩罚:回撤超过阈值时给负奖励
- 行为约束:频繁交易、重仓交易都要惩罚
- 长期激励:夏普比率、卡玛比率等长期指标
来看一个具体的奖励函数实现:
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中的体现。
3.4 三者如何协同影响风控?
状态空间、动作空间、奖励函数不是孤立的。它们共同决定了模型的风险偏好。
我画了一张图,帮你理解它们的关系:
从这张图可以看出来,状态空间决定了模型能看到什么风险,动作空间决定了模型能做什么风控操作,奖励函数决定了模型愿不愿意做风控。三者缺一不可。
我在实际项目中总结了一个经验:先设计奖励函数,再反推状态空间和动作空间。因为奖励函数定义了目标,其他两个都是为实现目标服务的工具。
好了,关于MDP三要素对风控的影响,今天就聊到这儿。记住一句话:好的MDP设计,让模型天生就会做风控;差的设计,再怎么加约束也白搭。
公众号:蓝海资料掘金营,微信deep3321