USDJPYの動きを予測する3
検証したいこと
各特徴量が翌日USDJPY上昇or下落にどれほど影響しているか
特徴量は連続値がいいのか離散値がいいのか
用意した特徴量
- 5日移動平均ー当日終値
- 20日移動平均ー当日終値
- ボリンジャーバンド(1σ)上側ー当日終値
- ボリンジャーバンド(1σ)下側ー当日終値
- ボリンジャーバンド(2σ)上側ー当日終値
- ボリンジャーバンド(2σ)下側ー当日終値
- RSI
selected = ['UpDown', 'SMA5-Last', 'SMA20-Last', \ 'bband_1up-Last', 'bband_1low-Last', \ 'bband_2up-Last', 'bband_2low-Last', \ 'RSI'] data = data[selected] data.head(5)
UpDown SMA5-Last SMA20-Last bband_1up-Last bband_1low-Last bband_2up-Last bband_2low-Last RSI date 2002-05-02 0.0 0.01260 2.109245 3.609456 0.609034 5.109668 -0.891178 25.083467 2002-05-03 1.0 0.76100 2.799970 4.400991 1.198949 6.002012 -0.402072 20.543638 2002-05-06 0.0 0.41572 2.384675 4.026266 0.743084 5.667857 -0.898507 25.012210 2002-05-07 1.0 -0.58560 1.335845 2.982024 -0.310334 4.628203 -1.956513 34.633688 2002-05-08 1.0 -1.10802 0.418440 2.042785 -1.205905 3.667131 -2.830251 43.785169
そのまま学習させる
一旦、すべての特徴量を連続値のまま入れてみる。
これを目標に、改善できたらいいなあと。
# random forest features = data.drop('UpDown', axis = 1).values label = data['UpDown'] X_train, X_test, y_train, y_test = train_test_split(features, label, test_size = 0.3, random_state = 1234) # clf = RandomForestClassifier(random_state = 1234) clf = RandomForestClassifier(random_state = 1234, \ max_depth = 5, \ n_estimators = 10, \ criterion = 'entropy') clf.fit(X_train, y_train) # 評価 print('Test score: {:.3f}'.format(clf.score(X_test, y_test))) print('Train score: {:.3f}'.format(clf.score(X_train, y_train))) print('f1 score: {:.3f}'.format(f1_score(y_test, clf.predict(X_test))))
Test score: 0.674 Train score: 0.688 f1 score: 0.672
各特徴が翌日USDJPYの上昇or下落にどれほど影響与えているか
RSI
80以上or20以下でラベルづけ 80以上:1、20以下:-1、とラベルづけ
70以上or30以下でラベルづけ 70以上:1、30以下:-1、とラベルづけ
(UpDownについては、Up:1、Down:2とラベルづけ)
80以上だとラベルがつかない0の場合が多すぎるかなあと、70以上だとそこそこラベルがついてUpDownも影響ありそう。
ただ、70以上では上昇しやすく30以下では下落しやすいと、加熱感を表すとは違う感じの指標になっていそう。トレンドを示すとしてみたほうがよい?
ボリンジャーバンド
ボリンジャーバンド2σ下側ー終値がプラス
bband1up = data['bband_1up-Last'] bband1low = data['bband_1low-Last'] bband2up = data['bband_2up-Last'] bband2low = data['bband_2low-Last'] bband3up = data['bband_3up-Last'] bband3low = data['bband_3low-Last'] adj_bband2low = bband2low.apply(lambda x:1 if x > 0 else 0) adj_bband2low.name = 'adj_bband2low' view = pd.concat([data['UpDown'], adj_bband2low], axis = 1) ax = sns.countplot(x = 'adj_bband2low', hue = 'UpDown', data = view) fig = ax.get_figure() fig.savefig('output/fig1.png')
たしかに、ボリンジャーバンド2σ下側ー終値がプラスの場合、0(下落)が起こりやすい。
ボリンジャーバンド2σ上側ー終値がマイナス
bband1up = data['bband_1up-Last'] bband1low = data['bband_1low-Last'] bband2up = data['bband_2up-Last'] bband2low = data['bband_2low-Last'] bband3up = data['bband_3up-Last'] bband3low = data['bband_3low-Last'] adj_bband2up = bband2up.apply(lambda x:1 if x < 0 else 0) adj_bband2up.name = 'adj_bband2up' view = pd.concat([data['UpDown'], adj_bband2up], axis = 1) ax = sns.countplot(x = 'adj_bband2up', hue = 'UpDown', data = view) fig = ax.get_figure() fig.savefig('output/fig1.png')
たしかに、ボリンジャーバンド2σ上側ー終値がマイナスの場合も上昇トレンドが強い
「ボリンジャーバンド2σ下側ー終値がマイナス」かつ「ボリンジャーバンド1σ下側ー終値がプラス」
bband1up = data['bband_1up-Last'] bband1low = data['bband_1low-Last'] bband2up = data['bband_2up-Last'] bband2low = data['bband_2low-Last'] bband3up = data['bband_3up-Last'] bband3low = data['bband_3low-Last'] bband2low_ = bband2low.apply(lambda x:1 if x < 0 else 0) bband1low_ = bband1low.apply(lambda x:1 if x > 0 else 0) bband_trendup = bband2low_ + bband1low_ bband_trendup = bband_trendup.apply(lambda x:1 if x == 2 else 0) bband_trendup.name = 'bband_trendup' view = pd.concat([data['UpDown'], bband_trendup], axis = 1) ax = sns.countplot(x = 'bband_trendup', hue = 'UpDown', data = view) fig = ax.get_figure() fig.savefig('output/fig1.png')
ラベルがたったときは、0の下落が多い。逆張りとしては下落ではなく上昇かと思ったが、予想とは違った。
「ボリンジャーバンド2σ上側ー終値がプラス」かつ「ボリンジャーバンド1σ上側ー終値がマイナス」
bband1up = data['bband_1up-Last'] bband1low = data['bband_1low-Last'] bband2up = data['bband_2up-Last'] bband2low = data['bband_2low-Last'] bband3up = data['bband_3up-Last'] bband3low = data['bband_3low-Last'] bband2up_ = bband2up.apply(lambda x:1 if x > 0 else 0) bband1up_ = bband1up.apply(lambda x:1 if x < 0 else 0) bband_trenddown = bband2up_ + bband1up_ bband_trenddown = bband_trenddown.apply(lambda x:1 if x == 2 else 0) bband_trenddown.name = 'bband_trenddown' view = pd.concat([data['UpDown'], bband_trenddown], axis = 1) ax = sns.countplot(x = 'bband_trenddown', hue = 'UpDown', data = view) fig = ax.get_figure() fig.savefig('output/fig1.png')
ラベルがたったときは、1の上昇が多い。逆張りとしては上昇ではなく下落かと思ったが、予想とは違った。