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より長くとった方がいいのかもしれません。

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

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

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

そのうちの2番目の学習済みモデルに対して、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(2, 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日移動)

勝敗を集計しますと8勝8敗9分となりました。

投資成績は全くイーブンということになりました。

前回もイーブンでしたので、引き分け気味の学習パラメータ設定となってしまっているのかもしれません。

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

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

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

そのうちの1番目の学習済みモデルに対して、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(1, 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日移動)

勝敗を集計しますと7勝7敗11分となりました。

検証データおよび学習データの間隔を100日と短くしたためでしょうか?投資が全く実行されないという結果(11回の引き分け)があるのが気になります。

それを踏まえてましても、投資成績は全くイーブンとさえない感じです。投資パフォーマンスを向上させるのって難しいものですね。

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

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

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

そのうちの0番目の学習済みモデルに対して、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(0, 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勝11敗となります。

やや勝ち越してはいますが、勝率は80%以上になってほしいものです。

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

AnyTrading - 学習済みモデルの作成(ACKTR)

今回はまた新しい学習済みモデルを作成していきます。

学習済みアルゴリズムはACKTRのままで、パラメータを変更します。

変更したパラメータは次の一覧の通りです。

パラメータ設定値
参照すべき直前のデータ数(window_size)30⇒10
学習データの開始位置(start_idx)100⇒10
学習データの終了位置(end_idx)300⇒110
訓練ステップ数(timesteps)128000
学習アルゴリズムACKTR

学習済みモデルの作成

学習済みモデルを作成するコードは下記の通りになります。

パラメータの内容は、コメントしていますのでご参照下さい。

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
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

def simulation(i, prm):
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

idx1 = prm['start_idx']
idx2 = prm['end_idx']

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), 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('MlpPolicy', env, verbose=1)
model = ACKTR('MlpPolicy', env, verbose=1)

# モデルの学習
model.learn(total_timesteps=prm['timesteps'])

# モデルの保存
model.save('model{}'.format(i))

prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 110, #end_idx 学習データの終了位置
'timesteps' :128000 } #timesteps 訓練ステップ数
for i in range(10):
simulation(i, prm)

上記コードを実行すると、model0.zipからmodel9.zipの10種類の学習済みモデルが作成されます。

次回からはこのモデルでどのような投資成績を出すことができるのかを検証していきます。

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

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

そのうちの9番目の学習済みモデルに対して、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, 1000, 100):
labels = []
means = []
prm = {'window_size': 30, #window_size 参照すべき直前のデータ数
'start_idx' : 100, #start_idx 学習データの開始位置
'end_idx' : 300, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(50):
labels.append('{}'.format(i))
simulation(9, 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日移動)
実行結果(100日移動)
実行結果(200日移動)
実行結果(300日移動)
実行結果(400日移動)
実行結果(500日移動)
実行結果(600日移動)
実行結果(700日移動)
実行結果(800日移動)
実行結果(900日移動)

全ての期間での勝敗を集計しますと6勝4敗となります。

うち3勝は学習データと検証データが被っているのでそれを差し引くと3勝4敗となります。

今回で11月23日に作成した学習済みモデルの検証は最後となりますが、最後まで期待を下回るパフォーマンスとなりました。

ただ今回学習する際に使ったパラメータがよくないという事が分かったので少し前進したと前向きにとらえたいと思います。

次回はまた新たにパラメータを変更して学習済みモデルを作成してみます。

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

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

そのうちの8番目の学習済みモデルに対して、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, 1000, 100):
labels = []
means = []
prm = {'window_size': 30, #window_size 参照すべき直前のデータ数
'start_idx' : 100, #start_idx 学習データの開始位置
'end_idx' : 300, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(50):
labels.append('{}'.format(i))
simulation(8, 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日移動)
実行結果(100日移動)
実行結果(200日移動)
実行結果(300日移動)
実行結果(400日移動)
実行結果(500日移動)
実行結果(600日移動)
実行結果(700日移動)
実行結果(800日移動)
実行結果(900日移動)

全ての期間での勝敗を集計しますと3勝7敗となります。

うち3勝は学習データと検証データが被っているのでそれを差し引くと0勝7敗となります。

完敗です。やはり11月23日作成のモデルは、パラメータがよくなかったのかもしれません。

今後は「パラメータを変えて学習済みモデルを複数作成し、検証データを変えて何度も検証し、すぐに各学習済みモデルの評価を行う」という処理を作成しようかと考えています。

そうすれば、どのようなパラメータの組み合わせで学習すれば投資パフォーマンスのよいモデルができるのか判断しやすくなるはずです。

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

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

そのうちの7番目の学習済みモデルに対して、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, 1000, 100):
labels = []
means = []
prm = {'window_size': 30, #window_size 参照すべき直前のデータ数
'start_idx' : 100, #start_idx 学習データの開始位置
'end_idx' : 300, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(50):
labels.append('{}'.format(i))
simulation(7, 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日移動)
実行結果(100日移動)
実行結果(200日移動)
実行結果(300日移動)
実行結果(400日移動)
実行結果(500日移動)
実行結果(600日移動)
実行結果(700日移動)
実行結果(800日移動)
実行結果(900日移動)

全ての期間での勝敗を集計しますと3勝7敗となります。

うち1勝2敗は学習データと検証データが被っているのでそれを差し引くと2勝5敗となります。

今回の学習済みモデルでも勝ち越すことはできませんでした。。。

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

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

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

そのうちの6番目の学習済みモデルに対して、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, 1000, 100):
labels = []
means = []
prm = {'window_size': 30, #window_size 参照すべき直前のデータ数
'start_idx' : 100, #start_idx 学習データの開始位置
'end_idx' : 300, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(50):
labels.append('{}'.format(i))
simulation(6, 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日移動)
実行結果(100日移動)
実行結果(200日移動)
実行結果(300日移動)
実行結果(400日移動)
実行結果(500日移動)
実行結果(600日移動)
実行結果(700日移動)
実行結果(800日移動)
実行結果(900日移動)

全ての期間での勝敗を集計しますと6勝4敗となります。

うち3勝は学習データと検証データが被っているのでそれを差し引くと3勝4敗となります。

今回の学習済みモデルでも勝ち越すことはできませんでした。。。

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

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

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

そのうちの5番目の学習済みモデルに対して、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, 1000, 100):
labels = []
means = []
prm = {'window_size': 30, #window_size 参照すべき直前のデータ数
'start_idx' : 100, #start_idx 学習データの開始位置
'end_idx' : 300, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(50):
labels.append('{}'.format(i))
simulation(5, 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日移動)
実行結果(100日移動)
実行結果(200日移動)
実行結果(300日移動)
実行結果(400日移動)
実行結果(500日移動)
実行結果(600日移動)
実行結果(700日移動)
実行結果(800日移動)
実行結果(900日移動)

全ての期間での勝敗を集計しますと3勝7敗となります。

うち1勝2敗は学習データと検証データが被っているのでそれを差し引くと2勝5敗となります。

だいぶ負け越しとなる投資結果となりました。

11月23日に作成した10種類の学習済みモデルですが、ここまでほとんどのモデルが負け越しているのでパラメータを見直すべきですね・・・

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