欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > gym-anytrading

gym-anytrading

2025/2/6 6:25:50 来源:https://blog.csdn.net/gyh101010/article/details/145459246  浏览:    关键词:gym-anytrading

参考:https://github.com/upb-lea/gym-electric-motor

AnyTrading 是一组基于 reinforcement learning (RL) 的 trading algorithms(交易算法)的 OpenAI Gym 环境集合。

该项目主要用于foreign exchange (FOREX) 和 stock markets (股票市场),并提供多个 Gym environments,以简化和改进基于reinforcement learning (RL) 的交易策略开发和测试。

该项目实现了三个主要 Gym environments

• TradingEnv:一个抽象的 trading environment,可以支持所有类型的交易策略。

• ForexEnv:继承自 TradingEnv,用于外汇交易(FOREX)。

• StocksEnv:继承自 TradingEnv,用于股票交易(Stock trading)。

一、Installation

通过 PIP

pip install gym-anytrading

从仓库安装

git clone https://github.com/AminHP/gym-anytrading
cd gym-anytrading
pip install -e .

或者

pip install --upgrade --no-deps --force-reinstall https://github.com/AminHP/gym-anytrading/archive/master.zip

二、Environment Properties(环境属性)

在金融市场中,reinforcement learning (RL) agents 不能独立完成所有交易决策,因此需要简化问题,以便 RL agents 更快地学习交易策略。

以下两部分解释了如何简化 actions (交易动作) 和 positions (交易仓位),以提高学习效率。

1. Trading Actions(交易动作)

在传统交易市场中,交易者可能执行多种 actions,例如:

• Buy(买入)

• Sell(卖出)

• Hold(持有)

• Enter(进入市场)

• Exit(退出市场)

但对于 RL agents 而言,过多的 actions 可能导致:

1. 训练时间过长

2. 决策复杂度增加

3. 学习效率降低

因此,该环境仅支持以下两种 actions

• Sell = 0(卖出)

• Buy = 1(买入)

📌 简化后的 benefits(优点):

• 交易策略变得更简单

• 训练时间减少

• 代理更容易学习到有效策略

2. Trading Positions(交易仓位)

Position 是交易市场中的一个关键概念,主要有两种:

• Long Position(多头仓位):买入资产(如股票、外汇)并持有,等待价格上涨后卖出获利。

• Short Position(空头仓位):借入资产并卖出,等待价格下跌后回购,以低价偿还借款并获利。

在某些交易环境中,你可能会看到更多 positions,例如:

• Flat Position(空仓)

• Hedging(对冲仓位)

但为了简化学习,该环境仅支持:

• Short = 0(空头)

• Long = 1(多头)

三、Trading Environments(交易环境)

该项目提供了多个 Gym environments,用于不同类型的交易市场。

在开发 gym-anytrading 之前,市面上大多数 trading environments 代码复杂、参数不透明,难以理解。因此,该项目的目标是:

1. 保持代码简单

2. 提供可扩展性

3. 适用于不同类型的交易市场

1. TradingEnv(抽象交易环境)

TradingEnv 继承自 gym.Env,是所有交易环境的基类。

核心属性(Attributes)

• df:DataFrame 的缩写。这是一个 pandas 的 DataFrame,包含你的数据集,并在类的构造函数中传递。

• prices:随时间变化的真实价格。用于计算利润和渲染环境。

• signal_features:随时间提取的特征。用于创建 Gym 观测值。

方法:

• reset:重置环境状态,返回初始观测值。

• step:执行给定的动作,返回新的观测值、奖励、完成标志和信息字典。

• render:渲染当前环境状态,可视化交易过程。

• close:关闭环境,释放资源。

抽象方法:

• _process_data:在构造函数中调用,返回一个包含 prices 和 signal_features 的元组。不同的交易市场需要提取不同的特征,因此该方法使 TradingEnv 成为通用环境,特定市场(如外汇、股票等)可以实现各自的特征提取逻辑。

• _calculate_reward:为强化学习代理计算奖励的函数。

• _update_profit:计算并更新代理迄今为止获得的总利润。利润表示从初始资金 1.0 单位开始,当前所获得的货币单位数量(利润 = 最终资金 / 初始资金)。

• max_possible_profit:计算无视交易费用情况下,代理可以获得的最大可能利润。

• _process_data:处理输入数据,提取价格和信号特征。

• _calculate_reward:根据当前状态和动作计算奖励。

• _update_profit:更新当前利润。

• max_possible_profit:计算在理想情况下可能获得的最大利润。

ForexEnv 和 StocksEnv 是 TradingEnv 的具体实现,分别针对外汇和股票市场。它们实现了上述抽象方法,并具有各自的特定属性:

2. ForexEnv

ForexEnv 是一个继承自 TradingEnv 的环境,专门用于外汇交易。它实现了 _process_data、_calculate_reward 和 _update_profit 方法,以适应外汇市场的特定需求。

• frame_bound:一个元组,指定数据帧 (df) 的起始和结束索引,在构造函数中传递。

• unit_side:指定交易开始时所持货币对的哪一侧。取值为字符串 'left'(默认)或 'right'。例如,在 EUR/USD 货币对中,选择 'left' 表示以 EUR 开始交易,初始资金为 1 EUR。在构造函数中传递。

• trade_fee:每次交易时从实际价格中扣除的默认固定费用。

• frame_bound:一个元组,定义数据帧的起始和结束索引。

• unit_side:一个字符串,表示交易单位的方向,取值为 'left' 或 'right'。

• trade_fee:每笔交易的固定费用。

3. StocksEnv

StocksEnv 是一个继承自 TradingEnv 的环境,专门用于股票交易。它实现了 _process_data、_calculate_reward 和 _update_profit 方法,以适应股票市场的特定需求。

• frame_bound:与 ForexEnv 相同。

• trade_fee_bid_percent:卖出时的默认固定费用百分比。例如,trade_fee_bid_percent=0.01 表示每次卖出股票时损失 1% 的资金。

• trade_fee_ask_percent:买入时的默认固定费用百分比。例如,trade_fee_ask_percent=0.005 表示每次买入股票时损失 0.5% 的资金。

用户可以通过继承 TradingEnv、ForexEnv 或 StocksEnv,并根据需要实现自定义的奖励、利润、费用计算等策略,来创建自定义的交易环境。

Examples

1. Create an environment

以下是创建一个默认外汇交易环境的示例代码:

import gymnasium as gym
import gym_anytrading

env = gym.make('forex-v0')
# 或者创建股票交易环境
# env = gym.make('stocks-v0')

这将创建一个默认的交易环境。您可以根据需要更改数据集、frame_bound 等参数。

2. Create an environment with custom parameters

此外,您可以创建自定义环境,例如:

import gym
import gym_anytrading
import pandas as pd

# 加载您的数据集
df = pd.read_csv('您的数据.csv')

# 创建带有自定义参数的股票交易环境
env = gym.make('Stocks-v0', df=df, window_size=10, frame_bound=(10, len(df)))

在上述示例中,您可以根据自己的需求创建一个带有自定义参数的交易环境。示例展示如何使用自定义的数据集、窗口大小和帧范围来创建股票交易环境:your_dataframe 是包含市场数据的 pandas DataFrame。您可以根据需要调整 window_size 和 frame_bound 参数。

通过这种方式,您可以使用 gym-anytrading 提供的环境来开发和测试基于强化学习的交易算法。

3. 打印环境信息

 

done = False
state = env.reset()

while not done:
    action = env.action_space.sample()  # 随机选择一个动作
    next_state, reward, done, info = env.step(action)
    print(f"State: {next_state}, Reward: {reward}, Done: {done}, Info: {info}")

在与环境交互时,您可能需要打印一些信息以了解当前状态、奖励等。以下是一个示例,展示如何在每个步骤中打印相关信息

4. Plot the environment

为了可视化交易过程,您可以使用环境的渲染功能来绘制价格曲线、买卖点等。以下是一个示例,展示如何绘制环境:

import matplotlib.pyplot as plt

env.render()
plt.show()

这将生成一个图表,显示价格走势以及代理的买卖操作。

5. A complete example

import gym
import gym_anytrading
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据集
df = pd.read_csv('您的数据.csv')

# 创建股票交易环境
env = gym.make('Stocks-v0', df=df, window_size=10, frame_bound=(10, len(df)))

# 重置环境
state = env.reset()

# 与环境交互
while True:
    action = env.action_space.sample()  # 随机选择一个动作
    next_state, reward, done, info = env.step(action)
    if done:
        break

# 绘制结果
env.render()
plt.show()

 

以下是对 gym-anytrading 中 A Complete Example(完整示例) 及相关部分的详细讲解,包括代码解析、渲染优化、自定义环境、扩展方法和相关项目。

完整示例

该示例展示了如何使用 gym-anytrading 运行 FOREX(外汇) 或 Stocks(股票) 交易环境,并输出交易信息。

代码解析

import numpy as np
import matplotlib.pyplot as plt

import gymnasium as gym
import gym_anytrading
from gym_anytrading.envs import TradingEnv, ForexEnv, StocksEnv, Actions, Positions 
from gym_anytrading.datasets import FOREX_EURUSD_1H_ASK, STOCKS_GOOGL

• gymnasium → 现代化的 Gym 版本,提供强化学习环境的标准接口。

• gym_anytrading → 交易市场的 RL 环境。

• ForexEnv & StocksEnv → 外汇和股票交易环境类。

• Actions & Positions → 定义交易操作(Buy/Sell)和仓位(Long/Short)。

• FOREX_EURUSD_1H_ASK & STOCKS_GOOGL → 预定义的市场数据集(外汇 & 股票)。

创建环境

env = gym.make('forex-v0', frame_bound=(50, 100), window_size=10)
# env = gym.make('stocks-v0', frame_bound=(50, 100), window_size=10)

• frame_bound=(50, 100) → 数据帧范围,表示仅使用 df[50:100] 作为训练数据。

• window_size=10 → 代理每次观察 10 个数据点,类似于滑动窗口。

运行环境

observation = env.reset(seed=2023)
while True:action = env.action_space.sample()  # 随机选择动作observation, reward, terminated, truncated, info = env.step(action)done = terminated or truncated# env.render()  # 每步渲染(不推荐,会浪费时间)if done:print("info:", info)break

• env.reset(seed=2023) → 复位环境,并设定随机种子,确保实验可复现。

• env.step(action) → 执行 action,返回:

• observation → 代理的新观测值

• reward → 交易奖励

• terminated → 是否达到终止状态

• truncated → 是否提前终止

• info → 交易信息(total_reward, total_profit, position)

• env.render() → 渲染每步(但会浪费时间,推荐 render_all())

优化渲染

plt.cla()
env.unwrapped.render_all()
plt.show()

• env.unwrapped.render_all() → 只在最后一步渲染,而不是每个 step 后渲染(提高运行速度)。

• plt.show() → 显示交易图表,包含价格曲线、买卖点、持仓情况。

示例输出

info: {'total_reward': 27.89, 'total_profit': 0.9898, 'position': <Positions.Long: 1>}

• total_reward → 代理获得的总奖励

• total_profit → 交易回报率

• position → 代理最终的持仓状态(Long/Short)

渲染图像分析

你会注意到,在图表上,前 10 个点(window_size=10)没有 position(持仓)。

• 这是因为它们仅用于初始化代理的观测值,不影响 reward 和 profit

• 环境的 _start_tick = 10,_last_trade_tick = 9,表示交易从第 10 个数据点开始。

自定义数据处理

如果你想在环境外部处理数据,可以使用两种方法:

方法 1(推荐)

在 环境外 处理数据,然后覆盖 _process_data 方法:

def my_process_data(env):
    start = env.frame_bound[0] - env.window_size
    end = env.frame_bound[1]
    prices = env.df.loc[:, 'Low'].to_numpy()[start:end]
    signal_features = env.df.loc[:, ['Close', 'Open', 'High', 'Low']].to_numpy()[start:end]
    return prices, signal_features


class MyForexEnv(ForexEnv):
    _process_data = my_process_data  # 直接替换默认数据处理方法


env = MyForexEnv(df=FOREX_EURUSD_1H_ASK, window_size=12, frame_bound=(12, len(FOREX_EURUSD_1H_ASK)))

• 适用于快速修改数据提取逻辑,不需要更改 ForexEnv 本身。

方法 2(自定义类)

完全继承 StocksEnv 并手动传入 prices 和 signal_features:

def my_process_data(df, window_size, frame_bound):
    start = frame_bound[0] - window_size
    end = frame_bound[1]
    prices = df.loc[:, 'Low'].to_numpy()[start:end]
    signal_features = df.loc[:, ['Close', 'Open', 'High', 'Low']].to_numpy()[start:end]
    return prices, signal_features


class MyStocksEnv(StocksEnv):
    
    def __init__(self, prices, signal_features, **kwargs):
        self._prices = prices
        self._signal_features = signal_features
        super().__init__(**kwargs)

    def _process_data(self):
        return self._prices, self._signal_features

    
prices, signal_features = my_process_data(df=STOCKS_GOOGL, window_size=30, frame_bound=(30, len(STOCKS_GOOGL)))
env = MyStocksEnv(prices, signal_features, df=STOCKS_GOOGL, window_size=30, frame_bound=(30, len(STOCKS_GOOGL)))

• 适用于完全自定义数据处理逻辑,并且想在 StocksEnv 基础上扩展更多功能。

相关项目

如果你希望使用更高级的交易环境,可以尝试以下项目:

1️⃣ DI-engine

• 一个 mid-level 工具,介于 gym-anytrading 和 gym-mtsim 之间。

• 功能:

• 5 种交易动作(Buy, Sell, Hold 等)

• 3 种仓位(Long, Short, Flat)

• 改进的 Reward function

• 适用人群: 半专业(Semi-expert)交易策略开发者。

2️⃣ gym-mtsim

• 适用于真实交易环境(MetaTrader 5)

• 更复杂的市场建模

• 适用于真实外汇交易者

📌 如果你是初学者,推荐 gym-anytrading

📌 如果你是进阶用户,可以尝试 DI-engine 或 gym-mtsim

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com