AnyTrading - ビットコイン投資を強化学習で実行 ACKTR編(3番目)

12月05日の記事にてアルゴリズムACKTRで新たにビットコインの学習済みモデルを10種類作成しました。

そのうちの3番目の学習済みモデルに対して、50回連続で投資検証を行います。

一度に全期間の投資結果を確認します。処理内容はソースをご確認下さい。

ソース

ソースは下記の通りです。

[ソース]

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import os, gym
import datetime
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 import ACKTR
from stable_baselines.bench import Monitor
from stable_baselines.common import set_global_seeds

import numpy as np
import matplotlib.pyplot as plt

def simulation(i, prm):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)
# 環境の生成
env = gym.make('forex-v0', frame_bound=(prm['start_idx'],
prm['end_idx']),
window_size = prm['window_size'])
env = Monitor(env, log_dir, allow_early_resets=True)
# シードの指定
env.seed(0)
set_global_seeds(0)
# ベクトル化環境の生成
env = DummyVecEnv([lambda: env])
# モデルの読み込み
# model = PPO2.load('model{}'.format(i))
model = ACKTR.load('model{}'.format(i))
# モデルのテスト
env = gym.make('forex-v0', frame_bound=(prm['start_idx'] + prm['move_idx'],
prm['end_idx'] + prm['move_idx']),
window_size = prm['window_size'])
env.seed(0)
state = env.reset()
while True:
# 行動の取得
action, _ = model.predict(state) # 0 or 1
# 1ステップ実行
state, reward, done, info = env.step(action)
# エピソード完了
if done:
print('info:', info, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

for move_idx in range(0, 1201, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 110, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(50):
labels.append('{}'.format(i))
simulation(3, prm)

x = np.arange(len(labels))
width = 0.35

fig, ax = plt.subplots()

rect = ax.bar(x, means, width)
ax.set_xticks(x)
ax.set_xticklabels(labels)

plt.savefig('trading{:03d}.png'.format(move_idx))

実行結果

実行結果は次のようになりました。

実行結果(   0日移動)
実行結果(  50日移動)
実行結果( 100日移動)
実行結果( 150日移動)
実行結果( 200日移動)
実行結果( 250日移動)
実行結果( 300日移動)
実行結果( 350日移動)
実行結果( 400日移動)
実行結果( 450日移動)
実行結果( 500日移動)
実行結果( 550日移動)
実行結果( 600日移動)
実行結果( 650日移動)
実行結果( 700日移動)
実行結果( 750日移動)
実行結果( 800日移動)
実行結果( 850日移動)
実行結果( 900日移動)
実行結果( 950日移動)
実行結果(1000日移動)
実行結果(1050日移動)
実行結果(1100日移動)
実行結果(1150日移動)
実行結果(1200日移動)

勝敗を集計しますと14勝10敗1分となりました。

12月05日に作成した学習済みモデルの中では一番勝率の高い学習済みモデルとなりました。

ただこれまでの結果から検証データが100日だと結果がはっきりでないことも多いので、検証データ期間は100より長くとった方がいいのかもしれません。

次回は別の学習済みモデルを検証していきます。