交易机器人

第 11 章详细展示过如何训练一款深度 Q 学习交易机器人,以及如何以向量化和基于事件的 方式对其进行回测。本节会根据 Oanda 的历史数据重复这方面选定的核心步骤。12.7.1 节 会展示一个 Python 模块,其中包含用于处理 Oanda 数据的环境类 OandaEnv,其用法与 第 11 章的 Finance 类相同。 下面的 Python 代码实例化了学习环境对象。在此步骤中,驱动学习、验证和测试的主要数 据相关的参数是固定的。OandaEnv 类允许包含杠杆,这在外汇和差价合约交易中是典型情 况。杠杆放大了已实现的收益率,从而增加了潜在的利润,但也增加了损失风险。执行与部署 | 295 In [50]: import oandaenv as oe In [51]: symbol = 'EUR_USD' In [52]: date = '2020-08-11' In [53]: features = [symbol, 'r', 's', 'm', 'v'] In [54]: %%time learn_env = oe.OandaEnv(symbol=symbol, start=f'{date} 08:00:00', end=f'{date} 13:00:00', granularity='S30', ➊ price='M', ➋ features=features, ➌ window=20, ➍ lags=3, ➎ leverage=20, ➏ min_accuracy=0.4, ➐ min_performance=0.85 ➑ ) CPU times: user 23.1 ms, sys: 2.86 ms, total: 25.9 ms Wall time: 26.8 ms In [55]: np.bincount(learn_env.data['d']) Out[55]: array([299, 281]) In [56]: learn_env.data.info() DatetimeIndex: 580 entries, 2020-08-11 08:10:00 to 2020-08-11 12:59:30 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 EUR_USD 580 non-null float64 1 r 580 non-null float64 2 s 580 non-null float64 3 m 580 non-null float64 4 v 580 non-null float64 5 d 580 non-null int64 dtypes: float64(5), int64(1) memory usage: 31.7 KB ➊ 将数据的粒度设置为 5 秒。 ➋ 将价格类型设置为中间价格。 ➌ 定义要使用的特性集。 ➍ 定义滚动统计数据的窗口长度。 ➎ 指定滞后的数量。 ➏ 固定杠杆。 ➐ 设置所需的最小准确率。296 | 第 12 章 ➑ 设置所需的最低性能。 在下一步中,我们将实例化验证环境,很明显,除了时间间隔之外,我们还依赖于学习环 境的参数。 图 12-3 显示了学习环境、验证环境和测试环境中使用的欧元 / 美元收盘价(从左到右)。 In [57]: valid_env = oe.OandaEnv(symbol=learn_env.symbol, start=f'{date} 13:00:00', end=f'{date} 14:00:00', granularity=learn_env.granularity, price=learn_env.price, features=learn_env.features, window=learn_env.window, lags=learn_env.lags, leverage=learn_env.leverage, min_accuracy=0, min_performance=0, mu=learn_env.mu, std=learn_env.std ) In [58]: valid_env.data.info() DatetimeIndex: 100 entries, 2020-08-11 13:10:00 to 2020-08-11 13:59:30 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 EUR_USD 100 non-null float64 1 r 100 non-null float64 2 s 100 non-null float64 3 m 100 non-null float64 4 v 100 non-null float64 5 d 100 non-null int64 dtypes: float64(5), int64(1) memory usage: 5.5 KB In [59]: test_env = oe.OandaEnv(symbol=learn_env.symbol, start=f'{date} 14:00:00', end=f'{date} 17:00:00', granularity=learn_env.granularity, price=learn_env.price, features=learn_env.features, window=learn_env.window, lags=learn_env.lags, leverage=learn_env.leverage, min_accuracy=0, min_performance=0, mu=learn_env.mu, std=learn_env.std ) In [60]: test_env.data.info() DatetimeIndex: 340 entries, 2020-08-11 14:10:00 to 2020-08-11 16:59:30 图灵社区会员 cxc_3612(17665373813) 专享 尊重版权执行与部署 | 297 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 EUR_USD 340 non-null float64 1 r 340 non-null float64 2 s 340 non-null float64 3 m 340 non-null float64 4 v 340 non-null float64 5 d 340 non-null int64 dtypes: float64(5), int64(1) memory usage: 18.6 KB In [61]: ax = learn_env.data[learn_env.symbol].plot(figsize=(10, 6)) plt.axvline(learn_env.data.index[-1], ls='--') valid_env.data[learn_env.symbol].plot(ax=ax, style='-.') plt.axvline(valid_env.data.index[-1], ls='--') test_env.data[learn_env.symbol].plot(ax=ax, style='-.'); 时间 图 12-3:Oanda 欧元 / 美元的 30 秒收盘价历史数据(左:训练集;中:验证集;右:测试集) 基于 Oanda 环境,可以对第 11 章中的交易机器人进行训练和验证。下面的 Python 代码会 执行此任务并可视化性能结果(参见图 12-4)。 In [62]: import sys sys.path.append('../ch11/') ➊ In [63]: import tradingbot ➊ Using TensorFlow backend. In [64]: tradingbot.set_seeds(100) agent = tradingbot.TradingBot(24, 0.001, learn_env=learn_env, valid_env=valid_env) ➋ 298 | 第 12 章 In [65]: episodes = 31 In [66]: %time agent.learn(episodes) ➋ ======================================================================= episode: 5/31 | VALIDATION | treward: 97 | perf: 1.004 | eps: 0.96 ======================================================================= ======================================================================= episode: 10/31 | VALIDATION | treward: 97 | perf: 1.005 | eps: 0.91 ======================================================================= ======================================================================= episode: 15/31 | VALIDATION | treward: 97 | perf: 0.986 | eps: 0.87 ======================================================================= ======================================================================= episode: 20/31 | VALIDATION | treward: 97 | perf: 1.012 | eps: 0.83 ======================================================================= ======================================================================= episode: 25/31 | VALIDATION | treward: 97 | perf: 0.995 | eps: 0.79 ======================================================================= ======================================================================= episode: 30/31 | VALIDATION | treward: 97 | perf: 0.972 | eps: 0.75 ======================================================================= episode: 31/31 | treward: 16 | perf: 0.981 | av: 376.0 | max: 577 CPU times: user 22.1 s, sys: 1.17 s, total: 23.3 s Wall time: 20.1 s In [67]: tradingbot.plot_performance(agent) ➌ ➊ 从第 11 章导入 tradingbot 模块。 ➋ 基于 Oanda 数据训练和验证交易机器人。 ➌ 可视化性能结果。 回合 总 收 益 训练数据集 回归线(训练集) 验证数据集 回归线(验证集) 图 12-4:交易机器人基于 Oanda 数据的训练集和验证集性能结果 图灵社区会员 cxc_3612(17665373813) 专享 尊重版权执行与部署 | 299 正如前两章所讨论的,训练集性能和验证集性能只是交易机器人性能的一个指标。 下面的代码为测试环境实现了交易机器人性能的向量化回测——除了使用的时间间隔参数 不同外,再次使用了与学习环境相同的参数。该代码使用了 12.7.2 节展示的 Python 模块中 的函数 backtest。报告的性能数字包括 20 倍的杠杆率。这对随时间变化的被动基准投资 和交易机器人的总体性能都是适用的,如图 12-5 所示。 In [68]: import backtest as bt In [69]: env = test_env In [70]: bt.backtest(agent, env) In [71]: env.data['p'].iloc[env.lags:].value_counts() ➊ Out[71]: 1 263 -1 74 Name: p, dtype: int64 In [72]: sum(env.data['p'].iloc[env.lags:].diff() != 0) ➋ Out[72]: 25 In [73]: (env.data[['r', 's']].iloc[env.lags:] * env.leverage).sum( ).apply(np.exp) ➌ Out[73]: r 0.99966 s 1.05910 dtype: float64 In [74]: (env.data[['r', 's']].iloc[env.lags:] * env.leverage).sum( ).apply(np.exp) - 1 ➍ Out[74]: r -0.00034 s 0.05910 dtype: float64 In [75]: (env.data[['r', 's']].iloc[env.lags:] * env.leverage).cumsum( ).apply(np.exp).plot(figsize=(10, 6)); ➎ ➊ 显示多头头寸和空头头寸的总数。 ➋ 显示执行策略所需的交易数量。 ➌ 计算包括杠杆在内的总收益。 ➍ 计算包括杠杆在内的净收益。 ➎ 可视化包括杠杆的随时间变化的总体表现。300 | 第 12 章 时间 图 12-5:随时间变化的被动基准投资和交易机器人的总体表现(包括杠杆) 简化的回测 本节中对交易机器人的训练和回测是在不现实的假设下进行的。基于 30 秒 间隔数据的交易策略可能会在短时间内导致大量交易。假设存在典型的交易 成本(买卖价差),那么这样的策略在经济上通常是不可行的。较长的间隔 数据或交易较少的策略更为现实。然而,为了在下一节中进行“快速”部署 演示,我们有意在相对较短的 30 秒间隔数据中执行训练和回测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值