强化学习一直是量化交易领域备受关注的技术方向:一个能与市场环境互动并自我学习的智能体,听起来颇具吸引力。然而,现实往往是,许多人在数据格式处理、环境搭建和回测系统构建等基础环节就遇到了阻碍。
今天我们来介绍一个实用工具——TradingGym。它借鉴了OpenAI Gym的设计理念,为量化交易的研究者和开发者提供了一个开箱即用的交易模拟环境。无论你的目标是训练一个强化学习智能体,还是仅仅想回测一个传统策略,TradingGym都能提供有力的支持。
TradingGym 是什么?
TradingGym是一个基于Python的工具包,专门用于在交易场景中训练和回测强化学习算法。它的核心设计特点包括:
- 接口友好:遵循OpenAI Gym的接口设计,对熟悉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 进行回测
回测功能的接口与训练环境几乎一致,这是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'
]
)
定义你的智能体
你可以在这里实现任何逻辑:随机策略、传统规则策略,或者复杂的神经网络模型。
class YourAgent:
def __init__(self):
# 在这里构建你的网络或初始化参数
pass
def choice_action(self, state):
# 根据状态选择动作
# action=0 -> 不操作
# action=1 -> 买入 1 股
# action=2 -> 卖出 1 股
# 这里用随机策略作为示例
return np.random.randint(3)
运行回测
# 实例化智能体
agent = YourAgent()
transactions = []
# 循环执行回测
while not env.backtest_done:
state = env.backtest()
done = False
while not done:
# 智能体根据状态选择动作
state, reward, done, info = env.step(agent.choice_action(state))
if done:
# 记录交易信息
transactions.append(info)
break
# 合并所有交易记录
transaction = pd.concat(transactions)
transaction
实战案例:均线交叉策略
即使不涉及复杂的人工智能算法,你也可以用TradingGym快速开始实验。下面演示一个经典的均线交叉策略:
# 创建回测环境,使用价格和均线作为特征
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'] # 价格和移动平均线
)
class MaAgent:
"""均线交叉策略智能体"""
def __init__(self):
pass
def choice_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]:
return 1
# 死叉:价格从上方跌破均线,卖出
elif state[-1][0] < state[-1][1] and state[-2][0] >= state[-2][1]:
return 2
# 其他情况:不操作
else:
return 0
# 实例化均线策略智能体
agent = MaAgent()
# 后续回测流程与前面相同
这个案例清晰地展示了TradingGym不仅服务于强化学习研究者,对于传统的量化交易策略开发同样非常友好。
总结
TradingGym可能还不是一个适用于生产环境的成熟框架,但它的核心价值在于其简单、易用和低学习门槛。
它的主要优势可以概括为:
- 设计简洁:遵循Gym接口,大幅降低上手难度。
- 结构清晰:环境与智能体分离明确,便于模块化扩展和测试。
- 回测灵活:内置的回测功能支持快速验证各类交易想法。
- 策略兼容:同时为强化学习策略和传统规则策略提供了统一的实验平台。
如果你正在探索量化交易中强化学习的应用、需要快速验证一个交易想法,或者厌倦了从零开始搭建交易环境,那么TradingGym无疑是一个值得尝试的高效工具。