TradingGym

GitHub
1.9k 370 简单 1 次阅读 昨天MIT插件
AI 解读 由 AI 自动生成,仅供参考

TradingGym 是一个专为金融交易设计的开源工具包,旨在为强化学习算法和规则策略提供高效的训练与回测环境。它深受 OpenAI Gym 启发,采用了标准化的交互框架,让开发者能够轻松构建、测试并优化自动交易智能体。

在量化交易领域,复现真实市场动态并验证策略有效性往往充满挑战。TradingGym 通过模拟真实的订单簿数据(如买卖价差、成交量等),解决了从数据预处理到策略评估的全流程痛点。它不仅支持高频的 Tick 数据,也兼容传统的 OHLC(开高低收)格式,允许用户自定义手续费、最大持仓等关键参数,从而在接近实盘的环境中进行低成本试错。

这款工具特别适合量化研究员、AI 开发者以及希望探索强化学习在金融领域应用的学生使用。其独特的技术亮点在于灵活的数据接口设计,能够处理包含买一卖一价格及成交量的复杂特征,并内置了可视化渲染功能,直观展示交易过程。虽然部分高级深度学习模型(如 A3C、DQN)的示例仍在完善中,但其核心架构已足够支撑用户加载自定义代理进行策略回测,是连接理论算法与实战交易的有力桥梁。

使用场景

某量化团队正在研发基于高频 Tick 数据的做市策略,急需验证强化学习模型在真实市场摩擦下的表现。

没有 TradingGym 时

  • 环境搭建繁琐:开发者需从零编写代码来模拟订单簿、处理买卖价差及滑点,难以复现真实的微观市场结构。
  • 回测与训练割裂:训练用的仿真环境与实盘回测逻辑不一致,导致模型在训练时表现优异,一旦上线便因环境差异而失效。
  • 数据格式适配难:原始 Tick 数据包含复杂的买卖盘口信息,手动将其转化为适合强化学习的状态空间(State Space)极易出错且耗时。
  • 交易细节不透明:缺乏内置的交易记录追踪机制,难以复盘每一笔成交的手续费扣除、持仓变化及具体盈亏来源。

使用 TradingGym 后

  • 开箱即用的仿真:直接加载包含 Bid/Ask 价量的 DataFrame,TradingGym 自动构建符合 OpenAI Gym 标准的交易环境,原生支持手续费和最大持仓限制。
  • 训测一体化框架:同一套环境配置既可用于 DQN、A3C 等算法的训练,也可无缝切换至回测模式,确保策略逻辑在不同阶段的高度一致性。
  • 灵活的状态定义:通过 feature_names 参数即可轻松指定输入特征(如买卖成交量、涨跌方向),自动处理滚动窗口数据,大幅降低预处理门槛。
  • 详尽的成交归因:执行结束后直接输出 transaction_details,清晰展示每一步的动作奖励、持仓状态及详细流水,便于快速迭代优化。

TradingGym 通过统一训练与回测的高保真环境,让量化开发者能专注于策略逻辑本身,显著缩短了从算法构思到实盘验证的周期。

运行环境要求

操作系统
  • 未说明
GPU

未说明

内存

未说明

依赖
notes该工具主要用于强化学习交易训练和回测,支持 Tick 数据和 OHLC 数据格式。安装方式为克隆仓库后运行 'python setup.py install'。README 中提到的深度学习算法(如 DQN, A3C 等)标记为 'WIP'(开发中),因此当前主要依赖基础数据科学库。示例代码显示需要读取 HDF5 格式的数据集。
python未说明
numpy
pandas
trading_env
TradingGym hero image

快速开始

TradingGym

构建状态

TradingGym 是一个用于训练和回测强化学习算法的工具包。它受到 OpenAI Gym 的启发,并模仿了其框架结构。除了训练环境之外,还提供了回测功能,未来还将通过 Interactive Brokers API 等接口实现实时交易环境。

该训练环境最初是为分笔数据设计的,但也支持 OHLC 数据格式。目前仍在开发中。

安装

git clone https://github.com/Yvictor/TradingGym.git
cd TradingGym
python setup.py install

快速入门

import random
import numpy as np
import pandas as pd
import trading_env

df = pd.read_hdf('dataset/SGXTW.h5', 'STW')

env = trading_env.make(env_id='training_v1', obs_data_len=256, step_len=128,
                       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()

state, reward, done, info = env.step(random.randrange(3))

### 随机选择动作并显示交易详情
for i in range(500):
    print(i)
    state, reward, done, info = env.step(random.randrange(3))
    print(state, reward)
    env.render()
    if done:
        break
env.transaction_details
  • obs_data_len: 观测数据长度
  • step_len: 调用 step 时,滑动窗口会增加 step_len
  • df 示例
index datetime bid ask price volume serial_number dealin
0 2010-05-25 08:45:00 7188.0 7188.0 7188.0 527.0 0.0 0.0
1 2010-05-25 08:45:00 7188.0 7189.0 7189.0 1.0 1.0 1.0
2 2010-05-25 08:45:00 7188.0 7189.0 7188.0 1.0 2.0 -1.0
3 2010-05-25 08:45:00 7188.0 7189.0 7188.0 4.0 3.0 -1.0
4 2010-05-25 08:45:00 7188.0 7189.0 7188.0 2.0 4.0 -1.0
  • df: 包含交易数据的 DataFrame

serial_number -> 每日重新计算的成交序号

  • fee: 每笔交易需支付的手续费,根据您的产品设置。
  • max_position: 您可持有的最大市场头寸数量。
  • deal_col_name: 用于计算奖励的列名。
  • feature_names: 用于交易状态的特征列列表。

gif

训练

简单 DQN

  • 开发中

策略梯度

  • 开发中

策略-价值网络(Actor-Critic)

  • 开发中

带 RNN 的 A3C

  • 开发中

回测

  • 加载与训练时相同的环境
env = trading_env.make(env_id='backtest_v1', obs_data_len=1024, step_len=512,
                       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):
        ## 您的规则条件、最大Q值动作或策略梯度动作
         # 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))
        #print(state, reward)
        #env.render()
        if done:
            transactions.append(info)
            break
transaction = pd.concate(transactions)
transaction
step datetime transact transact_type price share price_mean position reward_fluc reward reward_sum color rotation
2 1537 2013-04-09 10:58:45 Buy new 277.1 1.0 277.100000 1.0 0.000000e+00 0.000000e+00 0.000000 1 1
5 3073 2013-04-09 11:47:26 Sell cover 276.8 -1.0 277.100000 0.0 -4.000000e-01 -4.000000e-01 -0.400000 2 2
10 5633 2013-04-09 13:23:40 Sell new 276.9 -1.0 276.900000 -1.0 0.000000e+00 0.000000e+00 -0.400000 2 1
11 6145 2013-04-09 13:30:36 Sell new 276.7 -1.0 276.800000 -2.0 1.000000e-01 0.000000e+00 -0.400000 2 1
... ... ... ... ... ... ... ... ... ... ... ... ...
211 108545 2013-04-19 13:18:32 Sell new 286.7 -1.0 286.525000 -2.0 -4.500000e-01 0.000000e+00 30.650000 2 1
216 111105 2013-04-19 16:02:01 Sell new 289.2 -1.0 287.416667 -3.0 -5.550000e+00 0.000000e+00 30.650000 2 1
217 111617 2013-04-19 17:54:29 Sell new 289.2 -1.0 287.862500 -4.0 -5.650000e+00 0.000000e+00 30.650000 2 1
218 112129 2013-04-19 21:36:21 Sell new 288.0 -1.0 287.890000 -5.0 -9.500000e-01 0.000000e+00 30.650000 2 1
219 112129 2013-04-19 21:36:21 Buy cover 288.0 5.0 287.890000 0.0 0.000000e+00 -1.050000e+00 29.600000 1 2

128 rows × 13 columns

规则基础使用的示例

  • 移动平均线交叉与反向交叉
env = trading_env.make(env_id='backtest_v1', obs_data_len=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):
        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
# 然后同上

常见问题

相似工具推荐

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|2天前
插件开发框架

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85.1k|★★☆☆☆|今天
图像数据工具视频

OpenHands

OpenHands 是一个专注于 AI 驱动开发的开源平台,旨在让智能体(Agent)像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点,通过自动化流程显著提升开发速度。 无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员,还是需要快速原型验证的技术团队,都能从中受益。OpenHands 提供了灵活多样的使用方式:既可以通过命令行(CLI)或本地图形界面在个人电脑上轻松上手,体验类似 Devin 的流畅交互;也能利用其强大的 Python SDK 自定义智能体逻辑,甚至在云端大规模部署上千个智能体并行工作。 其核心技术亮点在于模块化的软件智能体 SDK,这不仅构成了平台的引擎,还支持高度可组合的开发模式。此外,OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩,证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能,支持与 Slack、Jira 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。

70.8k|★★★☆☆|今天
语言模型Agent开发框架

gstack

gstack 是 Y Combinator CEO Garry Tan 亲自开源的一套 AI 工程化配置,旨在将 Claude Code 升级为你的虚拟工程团队。面对单人开发难以兼顾产品战略、架构设计、代码审查及质量测试的挑战,gstack 提供了一套标准化解决方案,帮助开发者实现堪比二十人团队的高效产出。 这套配置特别适合希望提升交付效率的创始人、技术负责人,以及初次尝试 Claude Code 的开发者。gstack 的核心亮点在于内置了 15 个具有明确职责的 AI 角色工具,涵盖 CEO、设计师、工程经理、QA 等职能。用户只需通过简单的斜杠命令(如 `/review` 进行代码审查、`/qa` 执行测试、`/plan-ceo-review` 规划功能),即可自动化处理从需求分析到部署上线的全链路任务。 所有操作基于 Markdown 和斜杠命令,无需复杂配置,完全免费且遵循 MIT 协议。gstack 不仅是一套工具集,更是一种现代化的软件工厂实践,让单人开发者也能拥有严谨的工程流程。

67k|★★☆☆☆|今天
Agent插件

gpt4free

gpt4free 是一个由社区驱动的开源项目,旨在聚合多种可访问的大型语言模型(LLM)和媒体生成接口,让用户能更灵活、便捷地使用前沿 AI 能力。它解决了直接调用各类模型时面临的接口分散、门槛高或成本昂贵等痛点,通过统一的标准将不同提供商的资源整合在一起。 无论是希望快速集成 AI 功能的开发者、需要多模型对比测试的研究人员,还是想免费体验最新技术的普通用户,都能从中受益。gpt4free 提供了丰富的使用方式:既包含易于上手的 Python 和 JavaScript 客户端库,也支持部署本地图形界面(GUI),更提供了兼容 OpenAI 标准的 REST API,方便无缝替换现有应用后端。 其技术亮点在于强大的多提供商支持架构,能够动态调度包括 Opus、Gemini、DeepSeek 等多种主流模型资源,并支持 Docker 一键部署及本地推理。项目秉持社区优先原则,在降低使用门槛的同时,也为贡献者提供了扩展新接口的便利框架,是探索和利用多样化 AI 资源的实用工具。

66k|★★☆☆☆|4天前
插件语言模型Agent

meilisearch

Meilisearch 是一个开源的极速搜索服务,专为现代应用和网站打造,开箱即用。它能帮助开发者快速集成高质量的搜索功能,无需复杂的配置或额外的数据预处理。传统搜索方案往往需要大量调优才能实现准确结果,而 Meilisearch 内置了拼写容错、同义词识别、即时响应等实用特性,并支持 AI 驱动的混合搜索(结合关键词与语义理解),显著提升用户查找信息的体验。 Meilisearch 特别适合 Web 开发者、产品团队或初创公司使用,尤其适用于需要快速上线搜索功能的场景,如电商网站、内容平台或 SaaS 应用。它提供简洁的 RESTful API 和多种语言 SDK,部署简单,资源占用低,本地开发或生产环境均可轻松运行。对于希望在不依赖大型云服务的前提下,为用户提供流畅、智能搜索体验的团队来说,Meilisearch 是一个高效且友好的选择。

57k|★★☆☆☆|今天
图像Agent数据工具