作者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:今天这篇文章有点“硬”,但我保证,只要你耐心看完,会对“AI量化+金融”有一个全新的认知。咱们不整虚的,直接上代码,教你用强化学习搓一个交易机器人。
最近总有粉丝后台问我:“老余,我看那个量化交易好像很赚钱,但我不会写复杂的数学公式,能不能让AI自己去学怎么炒股?”
问得好!这就好比你问:“我不想学开车,能不能搞辆自动驾驶的车?”
答案是:可以,但你得先学会怎么造车。
今天,咱们就来聊聊量化领域最性感、也最硬核的技术——强化学习(Reinforcement Learning, RL)。别被这个名词吓到了,其实它的原理跟驯狗差不多。我们将一步步搭建一个AI,让它在股市的起起伏伏中,自己学会什么时候买,什么时候卖。
一、 什么是强化学习?
你可以把训练AI交易员想象成训练一只刚进家门的小狗:
- 环境 (Environment):这就是股市。充满了诱惑(暴涨)和陷阱(暴跌)。
- 智能体 (Agent):这就是你的AI机器人,或者那只小狗。
- 动作 (Action):小狗能做的动作——比如“坐下”、“握手”。在股市里,就是“买入”、“卖出”或者“躺平(持有)”。
- 奖励 (Reward):这是核心!小狗做对了动作,你给它肉干;做错了,你甚至可能要骂它两句。在交易里,赚了钱就是肉干(正奖励),亏了钱就是惩罚(负奖励)。

我们目标是构建一个能自我进化的AI交易员
通过成千上万次的尝试,AI会慢慢总结出一套规律:“哦,原来在这个指标金叉的时候买入,大概率能吃到肉干!”
这就叫策略优化。
为了让大家更直观地理解,我做了一个对比表:
| 特性 | 传统量化策略 | 强化学习 (RL) 策略 |
|---|---|---|
| 决策逻辑 | 死记硬背(如果A>B,则买入) | 随机应变(根据盘面感觉动态调整) |
| 适应性 | 市场变了,策略就失效 | 可以持续学习,自我进化 |
| 开发难度 | 需要精通金融指标 | 需要精通“设计奖励机制” |
二、 准备工作:搭好你的兵器库
工欲善其事,必先利其器。咱们这次主要用到 Python,以及几个核心的神器。老余建议你用 Python 3.8 以上的版本。
打开你的终端(Terminal),把下面这些库装上:
pip install numpy pandas gymnasium stable-baselines3 yfinance matplotlib
这里重点介绍两位主角:
- Gymnasium:这是OpenAI Gym的升级版,用来搭建我们的“模拟交易所”。
- Stable-Baselines3:这是量化圈的“瑞士军刀”,里面封装好了最顶级的强化学习算法(比如PPO),省得你自己去写那几千行底层代码。
三、 实战第一步:搞数据
巧妇难为无米之炊。咱们先用 yfinance 把苹果公司 (AAPL) 的股票数据扒拉下来。
import yfinance as yf
import pandas as pd
# 下载苹果公司的数据,从2020年到2024年
def get_data(ticker='AAPL'):
data = yf.download(ticker, start='2020-01-01', end='2024-01-01')
# 简单的预处理,我们只需要收盘价
data = data[['Close']]
return data
df = get_data()
print(df.head())
老余提示:真实做量化时,数据清洗能占你80%的时间。这里为了演示方便,我们假设数据是完美的。
四、 核心环节:搭建“练功房”
这是最关键的一步!我们需要告诉AI:你看得到什么(状态),你能做什么(动作),以及怎么算赢(奖励)。
我们需要继承 gym.Env 来写一个自定义环境。代码有点长,但逻辑很清晰,跟着老余的注释看:
import gymnasium as gym
import numpy as np
from gymnasium import spaces
class StockTradingEnv(gym.Env):
"""
自定义股票交易环境
"""
def __init__(self, df, initial_balance=10000):
super(StockTradingEnv, self).__init__()
self.df = df
self.initial_balance = initial_balance
# 【动作空间】:3个动作
# 0: 卖出, 1: 持有, 2: 买入
self.action_space = spaces.Discrete(3)
# 【观察空间】:AI能看到的数据
# 这里为了简单,我们假设AI能看到:
# [当前股价, 账户余额, 持有的股数, 盈亏比例]
self.observation_space = spaces.Box(
low=0, high=np.inf, shape=(6,), dtype=np.float32
)
def reset(self, seed=None, options=None):
# 重置环境,比如开始新一轮训练
super().reset(seed=seed)
self.balance = self.initial_balance # 初始资金
self.shares_held = 0 # 持仓股数
self.current_step = 0 # 当前天数
self.total_asset = self.initial_balance
return self._next_observation(), {}
def _next_observation(self):
# 获取当前的状态数据给AI看
# 真实场景里,这里通常会加入RSI, MACD等技术指标
obs = np.array([
self.df.iloc[self.current_step]['Close'].item(),
self.balance,
self.shares_held,
0, 0, 0 # 预留给其他指标的位置
])
return obs.astype(np.float32)
def step(self, action):
# AI执行一个动作,环境给反馈
current_price = self.df.iloc[self.current_step]['Close'].item()
# 执行买卖逻辑
if action == 2: # 买入
# 简单策略:每次满仓梭哈(仅供教学!)
# 实际中要考虑仓位管理
total_possible = self.balance // current_price
if total_possible > 0:
self.shares_held += total_possible
self.balance -= total_possible * current_price
elif action == 0: # 卖出
# 清仓卖出
if self.shares_held > 0:
self.balance += self.shares_held * current_price
self.shares_held = 0
# 更新总资产 = 现金 + 股票市值
new_total_asset = self.balance + (self.shares_held * current_price)
# 【奖励函数】:最核心的部分!
# 今天的奖励 = 今天的总资产 - 昨天的总资产
reward = new_total_asset - self.total_asset
self.total_asset = new_total_asset
self.current_step += 1
# 判断是否结束(钱花光了,或者数据跑完了)
done = self.current_step >= len(self.df) - 1
return self._next_observation(), reward, done, False, {}
def render(self):
# 打印当前状态,用于调试
print(f'Step: {self.current_step}, Asset: {self.total_asset}')
这个 StockTradingEnv 就是我们的练功房。注意那个 Reward 的计算,这里是最简单的“赚了多少就是多少分”。
老余敲黑板: 在实际生产中,单纯用利润做奖励很危险,AI为了追求高收益会通过频繁交易来“赌博”。通常我们还会减去交易手续费,甚至引入夏普比率(Sharpe Ratio)来奖励风险控制得好的操作。
五、 召唤AI大神:PPO算法
环境搭好了,接下来我们不需要自己写神经网络,直接调用 Stable-Baselines3 里的 PPO 算法。
为什么选 PPO?因为它稳。在强化学习界,它就像是丰田卡罗拉,虽然不是最快的,但是最皮实耐用,不容易翻车。
from stable_baselines3 import PPO
# 1. 实例化环境
env = StockTradingEnv(df)
# 2. 定义模型
# MlpPolicy 是指使用多层感知机(简单的神经网络)
model = PPO("MlpPolicy", env, verbose=1, learning_rate=0.0003)
# 3. 开始修炼!
print("正在训练机器人,请稍候...")
model.learn(total_timesteps=100000) # 训练10万步
print("训练完成!")
当你运行这行代码时,你的CPU/GPU就开始疯狂运转了。这就像把一个新股民关在小黑屋里,让他对着过去4年的K线图反复模拟交易10万次。
六、 是骡子是马,拉出来遛遛
训练完了,效果咋样?千万别拿训练过的数据去测试,那是作弊(Overfitting,过拟合)。
你需要一段AI从未见过的数据来做回测。
# 简单的验证逻辑
obs, _ = env.reset()
for i in range(100):
action, _states = model.predict(obs)
obs, rewards, done, truncated, info = env.step(action)
env.render()
if done:
break
如果你的输出结果里,资产一直在稳步增长,恭喜你,你入门了!但如果资产归零了,也别灰心,这才是常态。
七、 避坑指南
代码跑通了,是不是觉得自己明天就能拳打巴菲特,脚踢索罗斯了?
醒醒! 这里有几个巨坑,足以让你亏得裤衩都不剩:
- 手续费猛如虎:上面的代码没算手续费。如果你不把每笔交易千分之一甚至千分之三的成本算进 Reward 里,AI 就会变成高频交易狂魔,最后钱全交给券商了。
- 未来函数 (Look-ahead Bias):千万别在今天的数据里塞进明天的收盘价。这是新手最容易犯的错,回测收益率200%,实盘直接腰斩。
- 幸存者偏差:如果你只用现在还在上市的公司数据训练,AI 就永远学不会“公司会退市”这件事。
八、 观点总结
今天我们用不到100行代码,构建了一个最基础的RL交易系统。但这只是万里长征第一步。
如果你想进阶,可以尝试:
- 把 新闻情感分析 加入到观察空间里(让AI也能看新闻)。
- 使用 LSTM 网络来处理时间序列数据。
- 做一个 多只股票 的组合管理,而不是单吊一只。
最后,老余还是要啰嗦一句:模型是理性的,但市场往往是疯狂的。 AI能帮你辅助决策,但别把身家性命全托付给它。
敬畏市场,保持学习。
下期想看我手撕哪个量化策略?评论区见!
#量化交易 #Python量化 #StableBaselines3 #强化学习 #人工智能
风险提示:投资有风险,入市需谨慎。本文仅供学习参考,不构成投资建议。

1021

被折叠的 条评论
为什么被折叠?



