
欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 250+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!
强化学习(Reinforcement Learning,RL)一直是量化交易领域的热门话题:一个能通过与市场互动来学习的智能体,听起来是不是很酷?但现实往往很骨感,大多数人都被数据格式、环境搭建、回测系统这些基础工作绊住了脚。
今天给大家介绍一个神器——TradingGym。它借鉴了 OpenAI Gym 的设计理念,为量化交易爱好者提供了一个开箱即用的交易环境。无论你是想训练 RL 智能体,还是只想回测传统策略,TradingGym 都能帮你搞定。
TradingGym 是一个 Python 工具包,专门用于在交易环境中训练和回测强化学习算法。它的核心特点包括:
遵循 OpenAI Gym 接口设计,上手无门槛;支持逐笔数据(tick data)和 K 线数据(OHLC data);内置训练环境和回测环境;同时兼容规则策略和机器学习策略。
简单来说,如果你用过 Gym,那 TradingGym 对你来说就是零学习成本。
首先克隆仓库并本地安装:
# 克隆 TradingGym 仓库
git clone https://github.com/Yvictor/TradingGym.git
# 进入项目目录
cd TradingGym
# 安装
python setup.py install
TradingGym 需要传入一个 pandas DataFrame。以下是读取 HDF5 格式逐笔数据的示例:
import random
import numpy as np
import pandas as pd
import trading_env
# 从 HDF5 文件读取市场数据
df = pd.read_hdf('dataset/SGXTW.h5', 'STW')
这里你会感受到浓浓的 Gym 风格:
# 创建训练环境
env = trading_env.make(
env_id='training_v1', # 环境类型:训练环境
obs_data_len=256, # 智能体能看到的历史数据长度
step_len=1, # 每步窗口移动的距离
df=df, # 市场数据
fee=0.1, # 每笔交易的手续费
max_position=5, # 最大持仓数量
deal_col_name='Price', # 用于计算收益的价格列
feature_names=[ # 输入智能体的特征列表
'Price', 'Volume',
'Ask_price', 'Bid_price',
'Ask_deal_vol', 'Bid_deal_vol',
'Bid/Ask_deal', 'Updown'
]
)
# 重置环境
env.reset()
# 渲染当前交易状态
env.render()
TradingGym 遵循经典的强化学习循环:状态 → 动作 → 奖励 → 下一状态。
# 执行一个随机动作,获取反馈
state, reward, done, info = env.step(random.randrange(3))
动作的含义如下:0 表示不操作,1 表示买入 1 股,2 表示卖出 1 股。
下面是一个简单的循环,智能体随机执行动作并打印交易详情:
# 随机策略测试:执行 500 步
for i in range(500):
print(i)
# 随机选择动作(0、1 或 2)
state, reward, done, info = env.step(random.randrange(3))
print(state, reward)
env.render()
# 如果回合结束,跳出循环
if done:
break
# 查看交易详情
env.transaction_details
这个策略肯定不赚钱,但它能帮你验证环境是否正常运行。
回测使用的接口与训练几乎一样,这是 TradingGym 的一大优势。
# 创建回测环境
env = trading_env.make(
env_id='backtest_v1', # 环境类型:回测环境
obs_data_len=1024, # 观察窗口长度
step_len=1,
df=df,
fee=0.1,
max_position=5,
deal_col_name='Price',
feature_names=[
'Price', 'Volume',
'Ask_price', 'Bid_price',
'Ask_deal_vol', 'Bid_deal_vol',
'Bid/Ask_deal', 'Updown'
]
)
你可以插入任何逻辑:随机策略、规则策略或神经网络。
classYourAgent:
def__init__(self):
# 在这里构建你的网络或初始化参数
pass
defchoice_action(self, state):
# 根据状态选择动作
# action=0 -> 不操作
# action=1 -> 买入 1 股
# action=2 -> 卖出 1 股
# 这里用随机策略作为示例
return np.random.randint(3)
# 实例化智能体
agent = YourAgent()
transactions = []
# 循环执行回测
whilenot env.backtest_done:
state = env.backtest()
done = False
whilenot done:
# 智能体根据状态选择动作
state, reward, done, info = env.step(agent.choice_action(state))
if done:
# 记录交易信息
transactions.append(info)
break
# 合并所有交易记录
transaction = pd.concat(transactions)
transaction
不用强化学习也能开始实验!下面是一个经典的均线交叉策略:
# 创建回测环境,使用价格和均线作为特征
env = trading_env.make(
env_id='backtest_v1',
obs_data_len=10, # 观察最近 10 个数据点
step_len=1,
df=df,
fee=0.1,
max_position=5,
deal_col_name='Price',
feature_names=['Price', 'MA'] # 价格和移动平均线
)
classMaAgent:
"""均线交叉策略智能体"""
def__init__(self):
pass
defchoice_action(self, state):
# state[-1] 是最新数据,state[-2] 是前一个数据
# state[x][0] 是价格,state[x][1] 是均线
# 金叉:价格从下方突破均线,买入
if state[-1][0] > state[-1][1] and state[-2][0] <= state[-2][1]:
return1
# 死叉:价格从上方跌破均线,卖出
elif state[-1][0] < state[-1][1] and state[-2][0] >= state[-2][1]:
return2
# 其他情况:不操作
else:
return0
# 实例化均线策略智能体
agent = MaAgent()
# 后续回测流程与前面相同
这个案例展示了 TradingGym 不仅适合 RL 玩家,对传统量化交易者同样友好。
TradingGym 虽然还不是一个生产级别的成熟框架,但它的价值在于简单易用、学习成本低。
它的核心优势包括:简洁的 Gym 风格设计让上手变得轻松;环境和智能体清晰分离,便于扩展;灵活的回测功能支持快速验证想法;同时兼容强化学习策略和传统规则策略。
如果你正在学习量化交易中的强化学习应用、需要快速验证交易想法、厌倦了从零搭建交易环境,那么 TradingGym 绝对值得一试。
核心权益如下:
星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐