GRU(tf/keras)でBitcoin(FX)の自動売買
Posted Apr 13, 2018
少し前から私のTLを賑わしているビットコインの自動売買に挑戦してみました。売買判定ロジックは、ディープ・ラーニングの中でも時系列の予測に強いとされるRNN系のユニットであるGRUを使っています。
データ取得元
過去の価格情報は、こちらのAPIを利用しています。tickデータを加工する必要がなく、簡単に4本値(OHLC)を取得できるのはありがたい。取引所が提供するAPIが望ましいのですが、すぐに見つけられなかったので上記のサイトを利用しています。
利用する特徴量
- RSI(複数期間) bitFlyer Lightningのチャートでデフォルト表示されているため、多くの人が見ており、効くと考えました。
- リターン(複数期間) 予測対象がリターンのため、必要だとかんがえました。
チャートのデフォルト表示という意味ではMACDもあるので、追加しても良さそうです。
ネットワーク構造
TensorFlowに含まれるKerasでGRUを使ったネットワークを定義しています。 特に論文等の裏付けはありません。いろいろ模索して、誤差が小さくなった構造を使っています。
n_steps = train_x.shape[1]
n_features = train_x.shape[-1]
# structuring Network
model = Sequential()
model.add(GRU(units=32,
input_shape=(n_steps, n_features),
activation='linear',
kernel_initializer=he_normal(seed=1337),
return_sequences=True,
#dropout=0.01
))
model.add(GRU(units=16,
activation='relu',
kernel_initializer=he_normal(seed=1337),
return_sequences=True,
#dropout=0.01
))
model.add(GRU(units=16,
activation='tanh',
kernel_initializer=he_normal(seed=1337),
dropout=0.01
))
model.add(Flatten())
model.add(BatchNormalization())
model.add(Dense(units=1,
activation='linear',
))
# compile
model.compile(
loss=root_mean_squared_error,
optimizer=Nadam(),
sample_weight_mode=None,
metrics=['mse', 'mae', 'mape', 'cosine'],
)
# train
hist = model.fit(train_x,
train_y,
epochs=1000,
batch_size=5000,
verbose=0,
validation_data=(val_x, val_y),
callbacks=[EarlyStopping(monitor='val_loss', min_delta=0, patience=30, verbose=1, mode='auto')]
)
取引の概要
取引所:bitFlyer Lightning 商品:BTC-FX/JPY 最大レバレッジ:15倍 1回のトレードサイズ:レバレッジ1倍分だけ 取引頻度:最多で1時間に1回。シグナルがでなければトレードしない。
シグナルが1回出たら、レバレッジ1倍分のBTC-FXを売買します。最大レバレッジが15倍にしているため、同じ方向にシグナルが出た場合には最大で15回追加投資ができます。
成績
4/2:4,383円 4/13:7,150円
当初、証拠金をBTC建てで持っていたために発生した利益500円程度を含んでいるため、ボットが生み出した利益は2,000円程度です。利回りは凄いんですが、金額が小さいため小銭拾いしているような気分です。
今後の展望
もう少し動かしてみないと良し悪しが判断できないので、継続して動かしていこうと思います。気が向いたら追記します。