Pythonを用いてビットコイン自動売買botを作った
はじめに
Raspberry Pi 4Bを入手したので、これを有効活用しようということで、ビットコイン自動売買システムをラズパイ上で24時間回し続けることにしました。今回作成したシステムは、一儲けするためというよりはPythonの練習のために作成したもので、採用している取引アルゴリズムも簡単なものです。そのため利益には期待しませんが、とりあえず作成したプログラムについて備忘録的にまとめておきます。
システムの概要
本システムの概要を以下に示します。
環境
本システムを走らせる環境は以下の通りです。
| 取引所 | bitFlyer |
| 機器 | Raspberry Pi 4B 4GBモデル |
| OS | Raspberry Pi OS |
| 開発言語 | Python 3.9.7 |
取引のルール
今回作成したシステムでは、以下のルールに則って取引を行うことにします。
- 売り買いのタイミング:
売り買いのタイミングの決定には、最も一般的なインジケータの一つである移動平均線(EMA)を用います。1時間足のチャートで5日EMAと20日EMAがゴールデンクロスを形成したタイミングでビットコインを購入、デッドクロスを形成したタイミングで保有するビットコインを売却することにします。 - ポジション:
簡単のため、ポジションは最大で1つしか保有しないことにします。つまり、ビットコインを購入する際には所有している日本円を全て使ってビットコインを購入し、これを売却するまでは新たなポジションを取らないことにします。また、ビットコインの売却の際は、保有しているビットコインを全て売却します。また、ポジションはロングのみとし、売りから入るショートのポジションは取らないことにします。 - 損切りのタイミング:
ビットコインの価格が購入時の90%を下回った時、保有しているビットコインを全て売却します。
取引の流れ
取引の流れの概要を以下のフローチャートに示します。

取引は「市場分析」、「トレード」、「残高記録」の3ステップからなります。
市場分析ステップでは、テクニカル指標(今回はEMAのみ採用)をチェックし、買いシグナルや売りシグナルの有無をチェックします。
次に、トレードステップでは、市場分析ステップで判断した売り/買いシグナルの有無をもとに、売り/買い注文を入れます。ここで、今回はポジションを一つだけ持つことにしているため、ポジションを持っていない場合のみ買い注文を出すようにします。また、売りから入るショートのポジションは取らないため、ポジションを持っている場合のみ売り注文を出すようにします。
注文が時間内に約定すれば、約定日時、価格、量をcsvファイルに出力します。また、売り注文の場合、利益も同時に記録します。さらに、これらcsvファイルに出力した内容を自分のLINEアカウントにも通知します。
最後に残高記録ステップでは、現在保有している日本円、ビットコイン、ビットコインの評価額の3つのデータをcsvファイルに出力します。
これら3ステップの作業を1時間に一度行うことを繰り返します。また、ポジションを持っている場合、これら3ステップの作業と同時並行で、保有するビットコインの価格が購入時の90%を下回っていないかどうかを常時チェックします。下回った場合、保有するビットコインを全て売却します。
おまけ: テクニカル分析指標
過去の相場の変動のパターンから将来の値動きを予測する手法をテクニカル分析と呼びます。テクニカル分析を行うための指標としてはEMAやボリンジャーバンドなどが有名ですが、これらテクニカル分析指標はトレンド系の指標とオシレーター系の指標の2種類に分けられます。
- トレンド系:
その名の通り、現在トレンドが発生しているかどうか、発生しているなら上昇トレンドなのか下降トレンドなのかを分析するための指標。代表例はEMAやボリンジャーバンド。 - オシレーター系:
相場の過熱感を分析するための指標。ある銘柄が買われ過ぎなのか、売られ過ぎなのかを判断するために用いる。代表例はMACDやRSI。
今回作成したアルゴリズムはトレンド系の指標であるEMAのみを用いていますが、今後時間があればオシレータ系の指標も追加してみようと思います。「上昇トレンドだが買われすぎの傾向があるので買いを見送る」といったより高度な判断ができるアルゴリズムに進化させたいですね。