USDJPYの動きを予測する3

検証したいこと

  • 各特徴量が翌日USDJPY上昇or下落にどれほど影響しているか

  • 特徴量は連続値がいいのか離散値がいいのか

用意した特徴量

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

RSI|オシレーター分析|マネックス証券

  1. 80以上or20以下でラベルづけ 80以上:1、20以下:-1、とラベルづけ f:id:iiiiikamirin:20200927165450p:plain

  2. 70以上or30以下でラベルづけ 70以上:1、30以下:-1、とラベルづけ f:id:iiiiikamirin:20200927165556p:plain

(UpDownについては、Up:1、Down:2とラベルづけ)

80以上だとラベルがつかない0の場合が多すぎるかなあと、70以上だとそこそこラベルがついてUpDownも影響ありそう。

ただ、70以上では上昇しやすく30以下では下落しやすいと、加熱感を表すとは違う感じの指標になっていそう。トレンドを示すとしてみたほうがよい?

ボリンジャーバンド

ボリンジャーバンド|トレンド分析|マネックス証券

  1. 順張り型 2σを超えた場合、順張りサインなのですなわち

ボリンジャーバンド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')

f:id:iiiiikamirin:20200927172533p:plain たしかに、ボリンジャーバンド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')

f:id:iiiiikamirin:20200927173843p:plain たしかに、ボリンジャーバンド2σ上側ー終値がマイナスの場合も上昇トレンドが強い

  1. 逆張り型 レンジ相場とみて、逆張りするパターン

ボリンジャーバンド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')

f:id:iiiiikamirin:20200927182425p:plain ラベルがたったときは、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')

f:id:iiiiikamirin:20200927182751p:plain ラベルがたったときは、1の上昇が多い。逆張りとしては上昇ではなく下落かと思ったが、予想とは違った。