共计 2323 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要强化学习做自动交易?
传统交易策略通常依赖技术指标(如均线、MACD)或基本面分析,但存在两个致命缺陷:

- 静态规则失效快 :市场风格切换时,固定参数的策略容易失效。比如 2020 年疫情期间,传统均值回归策略全面崩溃
- 无法适应非线性关系 :人工设计的规则难以捕捉量价数据中的复杂模式,就像用线性方程去拟合 sin 曲线
而 Q -Learning 这类强化学习算法天然适合交易场景:
- 通过试错自动发现市场规律,不需要预设交易规则
- 能处理高维非结构化数据(如订单簿、新闻情感)
- 持续在线学习适应市场变化
技术选型:为什么首选 Q -Learning?
对比其他 RL 算法在交易场景的表现:
| 算法 | 训练速度 | 数据需求 | 适用场景 |
|---|---|---|---|
| Q-Learning | ★★★★ | ★★ | 离散动作小规模状态 |
| DQN | ★★ | ★★★★ | 复杂状态空间 |
| PPO | ★ | ★★★★★ | 连续动作控制 |
对于刚入门的开发者,Q-Learning 有三大优势:
- 实现简单(只需维护 Q -table)
- 对计算资源要求低
- 在小规模状态空间下效果显著
核心实现四步走
1. 状态空间设计:把市场变成机器能读懂的语言
建议从这些维度构建状态(以日线交易为例):
# 技术指标特征
features = {'rsi_14': ta.RSI(close, 14), # 相对强弱指数
'macd': ta.MACD(close), # 异同移动平均线
'volume_ma': volume.rolling(5).mean() / volume # 量比}
# 离散化成 10 个区间
state = pd.cut(features.values, bins=10, labels=range(10))
2. 动作空间:给 Agent 的交易权限
保持简单三种操作:
actions = {
0: 'BUY', # 全仓买入
1: 'SELL', # 清仓
2: 'HOLD' # 保持现状
}
3. 奖励函数:告诉 Agent 什么是好交易
不要直接用收益率,推荐复合奖励设计:
def get_reward():
# 基础收益
returns = (current_portfolio - last_portfolio) / last_portfolio
# 风险调整
sharpe_ratio = returns.mean() / returns.std()
# 惩罚频繁交易
trade_penalty = -0.001 if action_changed else 0
return returns + 0.1*sharpe_ratio + trade_penalty
4. Q-Table 更新:Agent 的学习核心
# 初始化 Q 表
q_table = np.zeros((state_num, action_num))
# 更新逻辑
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
new_q = (1 - alpha) * old_q + alpha * (reward + gamma * max_next_q)
完整代码框架
import pandas as pd
import numpy as np
class TradingAgent:
def __init__(self, data_path):
self.data = self._preprocess(data_path)
self.q_table = np.zeros((STATE_SPACE, ACTION_SPACE))
def _preprocess(self, path):
# 这里添加特征工程代码
pass
def choose_action(self, state, epsilon=0.1):
if np.random.random() < epsilon:
return np.random.choice(ACTION_SPACE)
return np.argmax(self.q_table[state])
def backtest(self):
for idx, row in self.data.iterrows():
state = self._get_state(row)
action = self.choose_action(state)
# 执行交易逻辑
# ...
# 更新 Q 值
reward = self._get_reward()
next_state = self._get_state(self.data.iloc[idx+1])
self._update_q(state, action, reward, next_state)
生产环境五大注意事项
- 过拟合预防
- 使用 walk-forward 优化:按 60 天训练 + 7 天测试滚动验证
-
添加 L2 正则化:
q_table += -0.01 * np.sign(q_table) -
延迟处理
- 在状态中加入 t - 1 数据:
state += [last_action, last_reward] -
模拟订单延迟:
actual_price = next_open_price -
风险控制
# 动态止损 if position['drawdown'] > 0.1: # 回撤超过 10% self.force_liquidation() -
样本外测试
- 保留至少 20% 数据从不参与训练
-
测试不同市场周期(牛市 / 熊市 / 震荡市)
-
监控指标
- 关注年化收益 / 最大回撤比(Calmar Ratio)
- 交易频率监控:理想日均交易 3 - 5 次
新手常踩的五个坑
- 数据泄漏 :使用了未来数据
-
解决方案:所有特征计算必须用
.shift(1) -
动作空间过大 :设置 10+ 种订单类型
-
正确做法:初期只用 BUY/SELL/HOLD
-
奖励设计不当 :只考虑收益率
-
改进:加入风险调整指标
-
忽略交易成本 :回测表现完美实盘亏损
-
修正:每笔交易扣除 0.2% 手续费
-
超参数固化 :永远用 0.9 的 gamma
- 建议:网格搜索学习率 / 折扣因子
三个延伸思考方向
- 如何引入 LSTM 处理时序依赖?可以尝试在状态中加入历史状态序列
- 怎样整合新闻情绪数据?考虑用 BERT 提取新闻情感作为额外状态维度
- 是否适合加密货币市场?需要调整状态设计(加入链上数据等)
正文完
发表至: 未分类
近一天内
