【仮想通貨の自動売買を目指して】機械学習のための目的関数を計算する

スポンサーリンク

はじめに

機械学習を使って仮想通貨の自動売買をするために、自動売買における機械学習の目的関数を検討していきます。

問題設定

簡単に今回の問題設定について説明します。

使うデータ

  • 15分足のチャート
  • 含まれるデータは始値・高値・安値・終値・ボリューム

取引ルール

問題設定をシンプルにするために取引のルールは下記のようにします。

  • 15分ごとに予測して売買
  • 終値で購入して次の終値(15分後の終値)で売る

チャートデータ

利用するデータは下記のような形式になります。

timestampophiloclvolume
2018-09-15 11:30:00+00:00728673.0729760.0728673.0729760.00.199951
2018-09-15 11:45:00+00:00729450.0729450.0729450.0729450.00.500000
2018-09-15 12:15:00+00:00728200.0728200.0728200.0728200.00.029999
2018-09-15 12:30:00+00:00728200.0730000.0728200.0730000.00.199951
2018-09-15 12:45:00+00:00729665.0729665.0729665.0729665.00.090027
..................
2022-08-07 19:45:00+00:003132167.03133392.03125780.03127879.021.546875
2022-08-07 20:00:00+00:003128427.03134851.03126710.03131100.044.156250
2022-08-07 20:15:00+00:003131376.03143194.03130540.03137914.017.843750
2022-08-07 20:30:00+00:003137540.03142587.03137540.03138801.020.312500
2022-08-07 20:45:00+00:003138663.03144460.03138037.03143075.07.839844

データの取得方法は下記を参考にしてください。

【仮想通貨の自動売買を目指して】過去チャート取得
はじめに仮想通貨の自動売買に向けて、まずはとにかくデータを集めます。今回は過去のチャートを取得し、過去データでのシミュレーションや機械学習モデルの作成などで活用できるようにしたいと思います。CryptowatchとはCryptowa...
【仮想通貨の自動売買を目指して】GCPで定期的にbitflyerのチャートを取得してデータを格納する
はじめにGCPで定期的にBitflyerのチャート情報を取得して、データを貯めていくツールを構築していきます。このツールをベースに、ビットコインの取引機能を実装することで、自動取引ができるようにしたいと思います。どんなものを構築するの...

目的関数の計算

目的関数について考えていきます。

下記3つの目的関数が考えられると思います。

  • 価格(回帰問題)
  • リターン(回帰問題)
  • 価格の動きの方向(分類問題)

実際に計算してみます。以降出てくるdfはチャートデータのDataFrame形式になります。

価格

まずは価格です。

シンプルに価格を予測することになります。

計算方法は下記の通りです。

df['y_price'] = df['cl'].shift(-period)

グラフにしたものが下記になります。

リターン

次はリターンです。

価格を予測する場合、ビットコインは価格の変動が激しい(古いデータほど価格が低く、新しいデータは高い傾向にある)ため予測しにくいことが考えられます。そこで、リターン(利益)を予測することで、定常的にします。

計算方法は下記の通りです。

df['y_return'] = np.log(df['cl'].shift(-1)/df['cl'])

グラフにしたものが下記になります。価格のグラフとは異なり、ある程度定常的なグラフになりました。

価格の方向

最後は、価格の動く方向です。

そもそも利益が出る箇所で取引ができればいいので、価格やリターンの値を予測する回帰問題ではなく、次に価格が上がるタイミングを予測するような分類問題にして、目的関数をシンプルにします。

計算方法は下記の通りです。

df['y_direction'] = np.where(df['cl'].shift(-1)-df['cl']>0, 1, 0)

まとめ

回帰問題で価格やリターンを予測する必要はないので、シンプルに価格が上がるのかどうかを目的関数にするのがいいかと思いました。

参考

非常に参考になるのでおすすめです。

タイトルとURLをコピーしました