AnyTrading - Yahooから為替データ取得してAnyTrading用に加工

今まではビットコインのデータで検証を行ってきましたが、とても成績のいい学習済みモデルがあったので為替データを使って検証したいと思います。

まずは前準備として、為替データを取得しAnyTrading用に加工します。

為替データの取得はPythonのライブラリを使うと簡単にできます。

インストール

下記のコマンドを実行しpandas_datareaderというライブラリをインストールします。

[インストールコマンド]

1
pip install pandas_datareader

為替データの取得

為替データを取得するソースは下記の通りです。

USDJPY1日足データ2010年から2020年までの10年分取得しています。

ファイル出力するときに、AnyTrading用にデータを整形しています。

[ソース]

1
2
3
4
5
6
7
8
9
10
import pandas_datareader.data as pdr
import datetime

data = pdr.get_data_yahoo('JPY=X', start='2010-01-01', end='2021-01-01')

with open('(AnyTradingインストール先フォルダ)/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'w') as f:
f.write('Time,Open,High,Low,Close,Volume\n')
for i in range(len(data.index)):
f.write('{:%m.%d.%Y} 00:00:00.000,{:.2f},{:.2f},{:.2f},{:.2f},0\n'.format(
data.index[i], data.Open[i], data.High[i], data.Low[i], data.Close[i]))

アカウントやアクセスキーを準備することなく、為替データが取得できるのでとても便利ですね。

次回はこのデータを使って、ビットコインで好成績を叩き出した学習モデルの検証を行います。

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

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

そのうちの4番目の学習済みモデルが16勝1敗ととびぬけた好成績だったので再検証してみます。

ソース

いつもは50日ずつデータを移動しながら30回検証していますが、今回は20日ずつ移動しながら30回検証を行います。(2.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
#for move_idx in range(0, 801, 50):
for move_idx in range(0, 801, 20):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 20日移動 40日移動
60日移動 80日移動 100日移動
120日移動 140日移動 160日移動
180日移動 200日移動 220日移動
240日移動 260日移動 280日移動
300日移動 320日移動 340日移動
360日移動 380日移動 400日移動
420日移動 440日移動 460日移動
480日移動 500日移動 520日移動
540日移動 56日移動 580日移動
600日移動 620日移動 640日移動
660日移動 680日移動 700日移動
720日移動 740日移動 760日移動
780日移動 800日移動

勝敗を集計すると37勝4敗となりました。

やはりかなりの好成績です。実運用を試してみたいと思うほどです。

次回はこの学習済みモデルをビットコインではないほかのデータで検証してみたいと思います。

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

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

そのすべてのモデルに対して、30回連続で投資検証を行った結果をまとめてみます。

結果

学習済みモデル勝敗数
0番目5勝11敗1分
1番目7勝10敗
2番目4勝12敗1分
3番目11勝6敗
4番目16勝1敗
5番目7勝10敗
6番目7勝10敗
7番目7勝10敗
8番目9勝8敗
9番目7勝10敗

同じパラメータを使って学習させてもその結果がここまで変わるものなんですね。

強化学習の結果を確認するためには、複数のモデルを作成し複数回のテストを行って検証する必要があるのを痛感しました。

負け越すことが多かったのですが、そんな中4番目の結果があまりにも優秀すぎます。

次回はこの4番目の学習モデルを別の方法で検証したいと思います。

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

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

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

ソース

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

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

勝敗を集計すると7勝10敗となりました。

12月15日に作成した10種類の学習済みモデルで何度もみた勝敗結果となりました。

次回はこれまで行った検証結果10回分を総括したいと思います。

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

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

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

ソース

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

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

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

トータルイーブンといったところですが、これまでは負け越しが多かったのでまだマシな結果だと思います。

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

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

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

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

ソース

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

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

勝敗を集計すると7勝10敗となりました。

前回結果、前々回ととまったく同じ勝率です。

どうやら今回学習したモデルの平均値はこのあたりの勝率に収束しそうです。(前回と同じコメントとなってしまいました・・・)

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

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

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

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

ソース

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

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

勝敗を集計すると7勝10敗となりました。

前回結果とまったく同じ勝率です。

どうやら今回学習したモデルの平均値はこのあたりの勝率に収束しそうです。

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

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

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

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

ソース

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

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

勝敗を集計すると7勝10敗となりました。

前回モデルはほぼ全勝だったのですが、今回はまた負け越しの結果となりました。

1記事あたり1モデルの投資検証を行っていますが、結果を把握しやすいように最終的には全10学習済みモデルの結果一覧を作成しようかと考えています。

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

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

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

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

ソース

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

前回次の2点を改善しました。

  • 期間ごとに平均収益と勝ち負け数をカウントしてグラフ上部に表示。
  • 30回投資での勝敗からその期間の勝ち負けを決める。
    全期間の最終的な勝ち負け数をコンソールに表示。

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

勝敗を集計すると16勝1敗となりました。

これまでのさえない検証結果から一転して、高投資パフォーマンスとなりました。

今回作成した学習済みモデルはそれぞれの投資結果の差が大きくておもしろいです。

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

AnyTrading - ビットコイン投資を強化学習で実行 ACKTR編(3番目)※処理改善あり

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

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

ソース

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

今回は次の2点を改善しています。

  • 期間ごとに平均収益と勝ち負け数をカウントしてグラフ上部に表示。
  • 30回投資での勝敗からその期間の勝ち負けを決める。
    全期間の最終的な勝ち負け数をコンソールに表示。

[ソース]

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 count(lst):
cnt_win = 0
cnt_lose = 0
for x in lst:
if x > 0:
cnt_win += 1
else:
cnt_lose += 1

return cnt_win, cnt_lose

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']) # info: {'total_reward': 8610370000.0, 'total_profit': 1.7844206334206751, 'position': 1} 8610370000.0
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()

cnt_win = 0
cnt_lose = 0
for move_idx in range(0, 801, 50):
labels = []
means = []
prm = {'window_size': 10, #window_size 参照すべき直前のデータ数
'start_idx' : 10, #start_idx 学習データの開始位置
'end_idx' : 510, #end_idx 学習データの終了位置
'move_idx' : move_idx} #学習データからの移動分。移動したものを検証データとする。
for i in range(30):
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)

#print(means, np.average(means), count(means))
cnt = count(means)
plt.title('[Average]{:,.0f} [Win]{} [Lose]{}'.format(np.average(means), cnt[0], cnt[1]))

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

if cnt[0] > cnt[1]:
cnt_win += 1
else:
cnt_lose += 1

print('{}勝 {}敗'.format(cnt_win, cnt_lose))

実行結果

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

0日移動 50日移動
100日移動 150日移動
200日移動 250日移動
300日移動 350日移動
400日移動 450日移動
500日移動 550日移動
600日移動 650日移動
700日移動 750日移動
800日移動

勝敗を集計すると11勝6敗となりました。悪くありません。

前回の結果がかなり悪かった(4勝12敗1分)ので、今回勝ち越せたのは少々意外でしたが。。

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