【仮想通貨の自動売買を目指して】機械学習のための目的関数を計算する
はじめに
機械学習を使って仮想通貨の自動売買をするために、自動売買における機械学習の目的関数を検討していきます。
問題設定
簡単に今回の問題設定について説明します。
使うデータ
- 15分足のチャート
- 含まれるデータは始値・高値・安値・終値・ボリューム
取引ルール
問題設定をシンプルにするために取引のルールは下記のようにします。
- 15分ごとに予測して売買
- 終値で購入して次の終値(15分後の終値)で売る
チャートデータ
利用するデータは下記のような形式になります。
timestamp | op | hi | lo | cl | volume |
---|---|---|---|---|---|
2018-09-15 11:30:00+00:00 | 728673.0 | 729760.0 | 728673.0 | 729760.0 | 0.199951 |
2018-09-15 11:45:00+00:00 | 729450.0 | 729450.0 | 729450.0 | 729450.0 | 0.500000 |
2018-09-15 12:15:00+00:00 | 728200.0 | 728200.0 | 728200.0 | 728200.0 | 0.029999 |
2018-09-15 12:30:00+00:00 | 728200.0 | 730000.0 | 728200.0 | 730000.0 | 0.199951 |
2018-09-15 12:45:00+00:00 | 729665.0 | 729665.0 | 729665.0 | 729665.0 | 0.090027 |
... | ... | ... | ... | ... | ... |
2022-08-07 19:45:00+00:00 | 3132167.0 | 3133392.0 | 3125780.0 | 3127879.0 | 21.546875 |
2022-08-07 20:00:00+00:00 | 3128427.0 | 3134851.0 | 3126710.0 | 3131100.0 | 44.156250 |
2022-08-07 20:15:00+00:00 | 3131376.0 | 3143194.0 | 3130540.0 | 3137914.0 | 17.843750 |
2022-08-07 20:30:00+00:00 | 3137540.0 | 3142587.0 | 3137540.0 | 3138801.0 | 20.312500 |
2022-08-07 20:45:00+00:00 | 3138663.0 | 3144460.0 | 3138037.0 | 3143075.0 | 7.839844 |
データの取得方法は下記を参考にしてください。
【仮想通貨の自動売買を目指して】過去チャート取得
はじめに 仮想通貨の自動売買に向けて、まずはとにかくデータを集めます。 今回は**過去のチャー
【仮想通貨の自動売買を目指して】GCPで定期的にbitflyerのチャートを取得してデータを格納する
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
目的関数の計算
目的関数について考えていきます。
下記3つの目的関数が考えられると思います。
- 価格(回帰問題)
- リターン(回帰問題)
- 価格の動きの方向(分類問題)
実際に計算してみます。以降出てくるdf
はチャートデータのDataFrame形式になります。
価格
まずは価格です。
シンプルに価格を予測することになります。
計算方法は下記の通りです。
1df['y_price'] = df['cl'].shift(-period)
グラフにしたものが下記になります。
リターン
次はリターンです。
価格を予測する場合、ビットコインは価格の変動が激しい(古いデータほど価格が低く、新しいデータは高い傾向にある)ため予測しにくいことが考えられます。そこで、リターン(利益)を予測することで、定常的にします。
計算方法は下記の通りです。
1df['y_return'] = np.log(df['cl'].shift(-1)/df['cl'])
グラフにしたものが下記になります。価格のグラフとは異なり、ある程度定常的なグラフになりました。
価格の方向
最後は、価格の動く方向です。
そもそも利益が出る箇所で取引ができればいいので、価格やリターンの値を予測する回帰問題ではなく、次に価格が上がるタイミングを予測するような分類問題にして、目的関数をシンプルにします。
計算方法は下記の通りです。
1df['y_direction'] = np.where(df['cl'].shift(-1)-df['cl']>0, 1, 0)
まとめ
回帰問題で価格やリターンを予測する必要はないので、シンプルに価格が上がるのかどうかを目的関数にするのがいいかと思いました。
参考
非常に参考になるのでおすすめです。