1. 课程导入

欢迎进入《强化学习交易与仓位决策实战》。在开始写第一行策略代码之前,我们需要先建立一张清晰的“认知地图”:这门课到底解决什么问题、用什么工具解决、最终要交付什么。很多学习者一上来就急着调库、跑回测,结果把强化学习当成“更复杂的均线策略”,最后既解释不了模型行为,也无法稳定复现收益。本章的目标,就是让你在动手前先理解全局。

一、学习目标:你最终要具备什么能力

本课程不是泛泛介绍强化学习理论,而是聚焦“交易与仓位决策”这一具体场景。完成学习后,你应当能够独立完成以下任务:

  • 建模能力:把行情、持仓、成本、风险约束抽象为强化学习可识别的状态、动作与奖励。
  • 实现能力:使用 Python 与主流强化学习库搭建可训练、可回测、可复现的交易智能体。
  • 评估能力:不只看收益率,而是用夏普比率、最大回撤、换手率、胜率等指标综合判断策略质量。
  • 诊断能力:识别过拟合、奖励黑客、样本外失效等常见问题,并知道如何复盘与修正。
核心判断标准:一个合格的强化学习交易系统,必须能回答三个问题——它在什么状态下决策?它为什么选择这个仓位?它的收益是否来自可解释的规律而非偶然?

二、核心概念:五个必须打牢的基石

强化学习交易的本质,是让智能体在不确定的市场中通过试错学习“何时买、买多少、何时卖”。理解以下五个概念,后续所有章节都会围绕它们展开。

概念 在交易中的含义 典型示例
状态 State 智能体做决策时看到的全部信息 过去N根K线、当前持仓、浮动盈亏、波动率
动作 Action 可执行的仓位或交易指令 空仓、半仓、满仓,或目标仓位比例
奖励 Reward 对动作好坏的即时反馈 收益率、风险调整收益、回撤惩罚
策略 Policy 从状态到动作的映射函数 神经网络输出的仓位概率分布
价值函数 Value 对长期回报的估计 当前状态下未来累计收益的期望

其中,奖励设计是最容易被低估的环节。如果奖励只写“收益率”,模型会倾向于高杠杆、高换手;如果加入回撤惩罚和交易成本,行为会明显更稳健。这一点我们会在后续章节反复验证。

三、整体框架:从数据到决策的闭环

本课程采用“数据—环境—智能体—评估—迭代”的闭环框架。它不是一次性流程,而是一个不断循环的工程系统。下图展示了这一闭环的核心结构。

强化学习交易决策闭环 市场数据 价格/成交量/因子 交易环境 状态/奖励/成本 智能体 策略网络/价值网络 评估与复盘 回测/指标/归因 仓位决策 目标仓位/执行 迭代优化 调参/换奖励/再训练

这个闭环的关键在于:评估结果必须反馈到环境与奖励设计中,而不是只反馈到模型参数。很多失败案例的根源,是环境建模错了,却一直在调网络结构。

四、实战路线图:30章如何推进

整个课程分为四个阶段,循序渐进,每一阶段都有明确的交付物。

  1. 基础构建(第1—8章):理解强化学习交易范式,搭建数据管道与交易环境,完成第一个可运行的随机策略基线。
  2. 核心算法(第9—18章):掌握DQN、DDPG、PPO等算法在仓位决策中的适配方式,重点解决连续动作空间与风险约束。
  3. 实战优化(第19—26章):处理过拟合、奖励设计、多资产组合、交易成本与滑点等真实问题。
  4. 评估与部署(第27—30章):建立完整回测与归因体系,完成从研究到模拟盘的落地。
建议学习节奏:每章先理解概念,再运行示例代码,最后用自己的数据复现一次。不要跳过“环境搭建”阶段,它是后续所有实验的地基。

五、常见误区与复盘提醒

在正式进入编码前,先认清几个高频误区,可以帮你少走大量弯路。

  • 误区一:把强化学习当预测模型。它不预测涨跌,而是学习“在什么状态下采取什么仓位更优”。
  • 误区二:只看总收益。没有风险调整和样本外验证的收益曲线,几乎没有参考价值。
  • 误区三:忽略交易成本。高频调仓在回测中很美好,实盘中会被手续费和滑点迅速侵蚀。
  • 误区四:奖励设计过于单一。只奖励收益会鼓励极端风险,必须加入回撤、波动或成本惩罚。
复盘原则:当策略表现异常好时,先怀疑数据泄漏;当策略表现异常差时,先检查状态归一化和奖励尺度。绝大多数问题出在环境,而不是算法。

下面是一段最小可运行的环境接口示例,帮助你建立“状态—动作—奖励”的直观感受。后续章节会在此基础上逐步扩展。

class TradingEnv:
    def __init__(self, prices, window=20):
        self.prices = prices
        self.window = window
        self.reset()

    def reset(self):
        self.t = self.window
        self.position = 0.0
        return self._get_state()

    def _get_state(self):
        # 状态:过去window根收益率 + 当前仓位
        rets = self.prices[self.t-self.window:self.t]
        return np.append(rets, self.position)

    def step(self, action):
        # 动作:目标仓位比例,范围[-1, 1]
        target = np.clip(action, -1, 1)
        ret = self.prices[self.t] / self.prices[self.t-1] - 1
        cost = abs(target - self.position) * 0.001
        reward = target * ret - cost
        self.position = target
        self.t += 1
        done = self.t >= len(self.prices) - 1
        return self._get_state(), reward, done, {}

这段代码虽然简单,却包含了本课程最核心的思想:状态决定观察,动作决定仓位,奖励决定学习方向。当你能够清晰地修改这三者,并观察策略行为的变化,你就真正进入了强化学习交易的大门。接下来,我们将从数据与环境开始,一步步搭建属于你自己的决策系统。