AnyTrading - ビットコイン投資を強化学習で実行 迷走編⑧

現在検証中の10種類の学習済みモデルですが、よく見たら3つの学習済みモデルの検証結果が4勝2敗でした。

これまでそのうちの2種類で30回検証を行ったので、今回は最後の1つの4勝2敗学習済みモデルの検証となります。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を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
100
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(30):
labels.append('{}'.format(i))
simulation(4)


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.show()

92行目で、学習済みモデルの⑤(4勝2敗のもの)を指定しています。

実行結果

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

実行結果


かなり負け筋の学習済みモデルとなりました。ここまで負け越した結果がでると分かりやすくて逆にいいと感じます。

ここ3回で4勝2敗モデル3種類を検証してきましたが、次のような総評となりました。

  • 学習済みモデル①
    かなりの好成績で実運用でも検証してみたいほど。
  • 学習済みモデル②
    勝ってるのか負けてるのか判断しにくいモデル。ただただイーブンの結果となった。
  • 学習済みモデル⑤
    明らかにマイナス収益先行型。ダメダメモデル。

4勝2敗となったのは期間を少しずつシフトした結果ですが、今回のように同じデータで30回検証した結果とは全然違った投資結果となりました。

強化学習って奥が深いです・・・・というよりこの検証方法が正しいのか、はたまたその前の学習方法があっているのか・・・自信がありません。

迷ってても仕方ないので、いろいろな強化学習を毎日実践していきます!

それで何かに届かなかった領域にたどり着けたら嬉しいんですけどね。。。

AnyTrading - ビットコイン投資を強化学習で実行 迷走編⑦

今回も、以前の検証で4勝2敗とそこそこだった学習済みモデルを使います。

同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を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
100
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(30):
labels.append('{}'.format(i))
simulation(1)


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.show()

92行目で、学習済みモデルの②(4勝2敗のもの)を指定しています。

実行結果

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

実行結果


同じ4勝2敗の学習済みモデルでもだいぶ結果が異なりました。

前回の学習済みモデルは本当に優秀な成績でしたが、今回のモデルはトータル負け越しているように見えます。

検証回数を増やすのは、学習済みモデルの優劣を判断するのにとても重要なことだと思われます・・・・当たり前ですかね (;^_^A

AnyTrading - ビットコイン投資を強化学習で実行 迷走編⑥

今回は、以前の検証で4勝2敗とそこそこだった学習済みモデルを使います。

同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を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
100
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(30):
labels.append('{}'.format(i))
simulation(0)


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.show()

92行目で、学習済みモデルの①を指定しています。

実行結果

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

実行結果


思ったよりいい投資成績となりました・・・・というかこれまでで一番いい結果かもしれません。

学習済みモデルの成績確認は、

  1. 同じ条件(パラメータ)下で、複数の学習済みモデルを作成する。
  2. 別条件もしくは同一条件で、何度も各学習済みモデルの投資成績を確認する。
  3. 2の結果より、トータルで成績のよい学習済みモデルを選別する。

というフローが正解なのでしょうか。。。迷走は続きます。

AnyTrading - ビットコイン投資を強化学習で実行 迷走編⑤

今回は、以前の検証で5勝1敗とかなり好成績だったもう一つの学習済みモデルを使います。

同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を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
100
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(30):
labels.append('{}'.format(i))
simulation(8)


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.show()

92行目で、学習済みモデルの⑨を指定しています。

実行結果

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

実行結果


勝率としては悪くないのですが、損失が多めにでることが気になります。

ただ以前の検証で好成績だった学習済みは、検証回数を増やしても好成績である傾向があるように感じます。

AnyTrading - ビットコイン投資を強化学習で実行 迷走編④

今回は、以前の検証で5勝1敗とかなり好成績だった学習済みモデルを使います。

同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を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
100
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(30):
labels.append('{}'.format(i))
simulation(5)


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.show()

92行目で、学習済みモデルの⑥を指定しています。

実行結果

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

実行結果


お!意外といけるような気がします。さすがに好成績だった学習済みモデルです!

同じく5勝1敗の好成績だった学習済みモデルがもう1つあるのでそれを次回同じように検証してみたいと思います。

AnyTrading - ビットコイン投資を強化学習で実行 迷走編③

今回は、一番成績の悪かった学習済みモデルを使って、同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

パラメータはすべて前回と同じですが、学習済みモデルを⑩から④に変更します。

④は一番成績の悪かった学習済みモデルです。6回検証して全敗した確かな(?)実績があります。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を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
100
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(30):
labels.append('{}'.format(i))
simulation(3)


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.show()

92行目で、学習済みモデルの④を指定しています。

実行結果

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

実行結果


微妙です。。。微妙すぎます。どうせなら大負けしてほしいのですが、こんなイーブンの結果ではランダム実行してるのとなんら変わりません。

AnyTrading - ビットコイン投資を強化学習で実行 迷走編②

迷走中なので、前回と同じように1つの学習済みモデルを使って、同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

(改善方法や今後の方向性は全く見えていません・・・)

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

パラメータはすべて前回と同じですが、学習済みモデルを⑥から⑩に変更します。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を20回行い、トータル収益を棒グラフにするコードは以下の通りです。

[ソース]

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
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(20):
labels.append('{}'.format(i))
simulation(9)


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.show()

92行目で、学習済みモデルの⑩を指定しています。

実行結果

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

実行結果


勝率は悪くないと思うのですが、もっと安定したトータル収益をあげられるようにしたいものです。

AnyTrading - ビットコイン投資を強化学習で実行 迷走編①

突然ですが、勘違いしていました。

学習済みモデルと検証データが同じであれば同じ結果になると。。

何回か実行してみたらそんなことはなく、毎回結果が変わります。なにかが間違っているのでしょうか。

とりかえず今回は、1つの学習済みモデルを使って、同じ検証データでシミュレーションを行いその結果を棒グラフに表示してみます。

強化学習のパラメータ

強化学習時のパラメータと学習用・検証用データスパンは下記の通りです。

  • 学習アルゴリズム
    PPO2

  • 参照する直前データ数
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ

ソース

1つの学習済みモデルを使い、同じデータでの検証を20回行い、トータル収益を棒グラフにするコードは以下の通りです。

[ソース]

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
101
102
103
104
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):
global means
# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# [20] 2020-06-28 10:00
idx1 = 50
#
idx2 = 350
# データ数
span = idx2 - idx1

# 環境の生成
env = gym.make('forex-v0', frame_bound=(idx1, idx2), window_size=20)
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{}'.format(i))

# モデルの学習
#model.learn(total_timesteps=128000)

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

# モデルのテスト
env = gym.make('forex-v0', frame_bound=(idx2+500, idx2 + span+500), window_size=20)
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, info['total_reward'])
means.append(info['total_reward'])
break
# グラフのプロット
plt.cla()
env.render_all()
plt.savefig('trading{:%Y%m%d_%H%M%S}.png'.format(datetime.datetime.now()))
#plt.show()

with open('C:/Util/Anaconda3/Lib/site-packages/gym_anytrading/datasets/data/FOREX_EURUSD_1H_ASK.csv', 'r') as f:
lines = f.readlines()
s1 = lines[idx1].split(',')[0]
s2 = lines[idx2-1].split(',')[0]
#print(s1,s2, (idx2 - idx1))

s3 = lines[idx2].split(',')[0]
s4 = lines[idx2+span].split(',')[0]
#print(s3,s4, (idx2+span - idx2))

#for i in range(10):
# simulation(i)
#labels = ['label1', 'label2', 'label3', 'label4', 'label5']
#means = [20, 34, 30, 35, 27]
labels = []
means = []

for i in range(20):
labels.append('{}'.format(i))
simulation(6)


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.show()

実行結果

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

実行結果

やっぱりばらばらの結果になってしまいました。どうしてでしょうか・・・・。今後の方向性が全く見えなくなりました。。。。

AnyTrading - ビットコイン投資を強化学習で実行 日足編⑥

ビットコインの 1日足 のデータでの投資シミュレーション6回目です。

強化学習のパラメータ

ソースはこれまでの応用なので割愛し、強化学習のパラメータだけを下記に示します。

  • 学習アルゴリズム(前回と同様)
    PPO2

  • 参照する直前データ数(前回と同様)
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ(前回と同様)

  • 検証データ
    [2019-09-23 ~ 2020-07-19] 1日足データ(500日分移動)

投資結果

実行結果は以下の通りです。

[コンソール出力]

1
2
3
4
5
6
7
8
9
10
info: {'total_reward': 2554510000.0, 'total_profit': 1.1834550378134772, 'position': 0}
info: {'total_reward': 3187060000.0, 'total_profit': 1.3450211770719407, 'position': 0}
info: {'total_reward': 2907200000.0, 'total_profit': 1.1646436426455773, 'position': 1}
info: {'total_reward': -97260000.0, 'total_profit': 0.900730605758224, 'position': 0}
info: {'total_reward': 593640000.0, 'total_profit': 1.176038814122207, 'position': 1}
info: {'total_reward': 4678830000.0, 'total_profit': 1.3116496658626056, 'position': 1}
info: {'total_reward': -9179640000.0, 'total_profit': 0.6005862765626327, 'position': 1}
info: {'total_reward': 2755750000.0, 'total_profit': 1.1967800058375302, 'position': 1}
info: {'total_reward': 5312840000.0, 'total_profit': 1.42076616228198, 'position': 1}
info: {'total_reward': -6536240000.0, 'total_profit': 0.6448759138878677, 'position': 1}

[出力画像]

実行結果( 1回目)
実行結果( 2回目)
実行結果( 3回目)
実行結果( 4回目)
実行結果( 5回目)
実行結果( 6回目)
実行結果( 7回目)
実行結果( 8回目)
実行結果( 9回目)
実行結果(10回目)


これまでの投資結果(トータル報酬)を表にまとめてみます。

No.トータル報酬(5回前)トータル報酬(4回前)トータル報酬(3回前)トータル報酬(2回前)トータル報酬(前回)トータル報酬(今回)
737,820,000円 1,225,670,000円-2,424,490,000円-129,460,000円 3,543,310,000円 2,554,510,000円
4,451,760,000円 2,672,370,000円 -3,870,060,000円8,007,910,000円 -1,553,380,000円 3,187,060,000円
4,724,240,000円 -996,930,000円 -5,277,570,000円-1,596,410,000円-11,847,060,000円 2,907,200,000円
-3,133,420,000円-5,494,530,000円 -4,064,980,000円-3,328,340,000円-5,097,430,000円 -97,260,000円
7,880,400,000円 7,793,260,000円 -2,953,150,000円-8,788,740,000円4,813,240,000円 593,640,000円
2,833,180,000円 -2,393,360,000円 7,233,760,000円 5,385,110,000円 145,830,000円 4,678,830,000円
2,268,160,000円 -815,410,000円 1,480,400,000円 -2,390,800,000円-6,559,180,000円 -9,179,640,000円
1,437,600,000円 839,630,000円 -5,552,340,000円-3,432,660,000円-6,925,330,000円 2,755,750,000円
-3,185,920,000円2,794,730,000円 4,312,270,000円 1,127,100,000円 3,223,430,000円 5,312,840,000円
-5,817,080,000円-5,354,750,000円 821,240,000円 8,186,140,000円 5,182,330,000円 -6,536,240,000円

10種類の学習済みモデルは、7勝3敗となかなかの成績となりました。

学習モデルごとの結果としては、No⑥、No⑨が5勝1敗となかなかの好成績となっています。

AnyTrading - ビットコイン投資を強化学習で実行 日足編⑤

ビットコインの 1日足 のデータでの投資シミュレーション5回目です。

強化学習のパラメータ

ソースはこれまでの応用なので割愛し、強化学習のパラメータだけを下記に示します。

  • 学習アルゴリズム(前回と同様)
    PPO2

  • 参照する直前データ数(前回と同様)
    50

  • 学習データ
    [2017-07-13 ~ 2018-05-11] 1日足データ(前回と同様)

  • 検証データ
    [2019-06-15 ~ 2020-04-10] 1日足データ(400日分移動)

投資結果

実行結果は以下の通りです。

[コンソール出力]

1
2
3
4
5
6
7
8
9
10
info: {'total_reward': 3543310000.0, 'total_profit': 1.5464109977834202, 'position': 0}
info: {'total_reward': -1553380000.0, 'total_profit': 1.1390683471614786, 'position': 1}
info: {'total_reward': -11847060000.0, 'total_profit': 0.5500536430705991, 'position': 1}
info: {'total_reward': -5097430000.0, 'total_profit': 1.1233650881463042, 'position': 1}
info: {'total_reward': 4813240000.0, 'total_profit': 1.5235928722550143, 'position': 0}
info: {'total_reward': 145830000.0, 'total_profit': 0.9612141186720539, 'position': 0}
info: {'total_reward': -6559180000.0, 'total_profit': 0.7725324354543073, 'position': 0}
info: {'total_reward': -6925330000.0, 'total_profit': 0.677925186974139, 'position': 0}
info: {'total_reward': 3223430000.0, 'total_profit': 1.2687930517984403, 'position': 1}
info: {'total_reward': 5182330000.0, 'total_profit': 1.1655638373126338, 'position': 0}

[出力画像]

実行結果( 1回目)
実行結果( 2回目)
実行結果( 3回目)
実行結果( 4回目)
実行結果( 5回目)
実行結果( 6回目)
実行結果( 7回目)
実行結果( 8回目)
実行結果( 9回目)
実行結果(10回目)


これまでの投資結果(トータル報酬)を表にまとめてみます。

No.トータル報酬(4回前)トータル報酬(3回前)トータル報酬(2回前)トータル報酬(前回)トータル報酬(今回)
737,820,000円 1,225,670,000円-2,424,490,000円-129,460,000円 3,543,310,000円
4,451,760,000円 2,672,370,000円 -3,870,060,000円8,007,910,000円 -1,553,380,000円
4,724,240,000円 -996,930,000円 -5,277,570,000円-1,596,410,000円-11,847,060,000円
-3,133,420,000円-5,494,530,000円 -4,064,980,000円-3,328,340,000円-5,097,430,000円
7,880,400,000円 7,793,260,000円 -2,953,150,000円-8,788,740,000円4,813,240,000円
2,833,180,000円 -2,393,360,000円 7,233,760,000円 5,385,110,000円 145,830,000円
2,268,160,000円 -815,410,000円 1,480,400,000円 -2,390,800,000円-6,559,180,000円
1,437,600,000円 839,630,000円 -5,552,340,000円-3,432,660,000円-6,925,330,000円
-3,185,920,000円2,794,730,000円 4,312,270,000円 1,127,100,000円 3,223,430,000円
-5,817,080,000円-5,354,750,000円 821,240,000円 8,186,140,000円 5,182,330,000円

10種類の学習済みモデルは、5勝5敗とイーブンでした。

学習モデルごとの結果としては、No⑥、No⑨が4勝1敗となかなかの好成績となっています。