AnyTrading は、FXや株式のトレーディングアルゴリズムのための強化学習環境です。
前回ご紹介した強化学習FX売買の条件を変えて実行してみます。
データの範囲を変更
前回はデータ範囲が、訓練データと検証データともに (50, 1000) でしたが、今回は訓練データ範囲を (30, 5000) 、検証データ範囲を (5000, 10000-30) としてみました。
データ量を約5倍にし、訓練データと検証データの範囲を分けた場合に、どのように成績が変化するのかを確認するのが目的です。
学習アルゴリズムや学習回数は前回同様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import os, gym import gym_anytrading import matplotlib.pyplot as plt from gym_anytrading.envs import TradingEnv, ForexEnv, StocksEnv, Actions, Positions from gym_anytrading.datasets import FOREX_EURUSD_1H_ASK, STOCKS_GOOGL from stable_baselines.common.vec_env import DummyVecEnv from stable_baselines import PPO2 from stable_baselines.bench import Monitor from stable_baselines.common import set_global_seeds
# ログフォルダの生成 log_dir = './logs/' os.makedirs(log_dir, exist_ok=True)
# 環境の生成 env = gym.make('forex-v0', frame_bound=(30, 5000), window_size=30) env = Monitor(env, log_dir, allow_early_resets=True)
# シードの指定 env.seed(0) set_global_seeds(0)
# ベクトル化環境の生成 env = DummyVecEnv([lambda: env])
# モデルの生成 model = PPO2('MlpPolicy', env, verbose=1) #model = ACKTR('MlpPolicy', env, verbose=1)
# モデルの読み込み # model = PPO2.load('trading_model')
# モデルの学習 model.learn(total_timesteps=128000)
# モデルの保存 model.save('trading_model')
# モデルのテスト env = gym.make('forex-v0', frame_bound=(5000, 10000-30), window_size=30) env.seed(0) state = env.reset() while True: # 行動の取得 action, _ = model.predict(state) # 1ステップ実行 state, reward, done, info = env.step(action) # エピソード完了 if done: print('info:', info) break
# グラフのプロット plt.cla() env.render_all() plt.show()
|
16行目 で訓練データの範囲を変更し、40行目 で検証データの範囲を変更しています。
データ範囲を変更してFXトレードを実行
上記コードを実行すると次のような結果になります。
[コンソール出力]
1
| {'total_reward': 359.60000000002213, 'total_profit': 0.9436579094404297, 'position': 1}
|
前回の結果と比較すると、FX売買結果は次のように変化しました。
- 累積報酬(total_reward)
-100 → 359.6
- 純利益(total_profit)
0.92 → 0.94
累積報酬がかなり向上しましたが、純利益はほとんど変わりませんでした。
AnyTradingのソースを確認したところ、投資費用としてユニットごとに 0.0003 が差し引かれたものが純利益として計算されるようです。