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

12月05日の記事にてアルゴリズム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, 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(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日移動 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分となりました。

最高勝率の前回結果ほどではありませんでしたが、そこそこの勝ち越し結果となりました。

(毎回「1モデルに対する全期間」を検証していますが、「全モデルの全期間」を検証したほうが設定した学習パラメータに対する投資パフォーマンスが分かりやすような気がしています。現在、その処理やグラフを検討中です。)

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

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

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

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

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

昨日の結果を超えてまた過去最高勝率となりました。

この程度の勝率があれば、実運用候補にしてもよいのかもしれません。

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

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敗となります。

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

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