【Python】【AWS】仮想通貨の自動取引プログラム
仮想通貨を自動で取引するプログラムをPythonで作成しました。時間足(1分足, 30分足, 4時間足)ごとにボリンジャーバンドやRSIといったテクニカル指標を判定し、現在価格において自動で取引するプログラムです。更にAWSのEC2インスタンス上において継続的に動作させます。
GitHubはこちらから
https://github.com/takehiro-A-2/Automatic-Trading
仮想通貨は24時間取引可能なため、これを自動取引出来ればと考え、Pythonで仮想通貨を自動で取引するプログラムを作成しました。特に複数の時間足・テクニカル指標判定結果にに重みを設定し、その総合得点で取引判断する部分の実装に注力しました。実際の取引にはCoinCheckのAPIを使用します。また、過去の価格データは「Cryptowatch」のAPIサービスを使って取得します。(2023年10月でサービス終了)
起動時
新規取引を行うには、+ボタンを押し、取引名に名前を付けます。これらは端末内に保存されます。前の取引設定を呼び出すことも可能です。これらの設定画面はPySimpleGUIというライブラリを使用して作られています。
実行前に取引緒言を入力します。
取引諸元一覧
・銘柄、取引量(日本円)
・シミュレーションモード On/Off
・各テクニカル指標の設定
取引諸元の設定画面 ↓
各テクニカル指標の設定
テクニカル指標と時間足に対して、それぞれ重み付け(点数)を設定します。一定期間ごとにテクニカル指標を計算・判定し、これらの合計点数がユーザが設定した閾値を超えた場合、売買を行います。
テクニカル指標諸元一覧
・使用するテクニカル指標の設定
・使用する時間足の設定
・上記2つの指標に対する重み付けの設定
・上記3つの合計点の閾値の設定
重み付けの設定画面 ↓
設定を終え、右上にある開始ボタンを押すとfor文が回り始めます。このようにして自動取引を開始します。※
※このプログラムにはシミュレーションモードがあり、実際の売買を行うことなく、設定した値でどのような売買がされるのかを確かめる事が出来ます。
記録
Pythonライブラリのloggingを用いて、売買時刻や売買時の価格、テクニカル指標の判定結果を記録します。
またCSVにはローソク足を記録します。Excel等を使い、各時刻のローソク足をグラフ化するとチャートが得られます。
取引ログ(取引時刻 金額 通貨量 判定結果等々 ) ↓
CSV形式で保存されたローソク足 ↓
取引結果
一例ですが、このプログラムを使用しビットコインを売買した結果を掲載します。
2023年 4月3日20時20分〜4月5日13時20分の30分チャートおよび取引記録(赤枠) ↓
赤枠内は取引を行いポジションがあることを表します。赤枠左で購入し右で売却しています。
図のように価格が反発するタイミングで購入し、反落するタイミングで売却することが確認出来ます。
この自動取引について簡単に説明すると、
購入時は、
・1分足RSIが低く、売られすぎと判断したため(1分足: +1.0点)
その合計点が、設定した0.5点を超えたため、自動で購入をしました。
売却時は、
・5分足ボリンジャーバンドのマイナス2σに価格が触れたため(5分足: +1.0点)、
・4時間足において下降トレンドであるため(4時間足: +1.0点)、
その合計点が、設定した1.5点を超えたため、自動で売却をしました.。
このように、事前に設定した諸元に基づいた取引を自動で行うプログラムになります。※
※特にうまくいった取引ケースを示しています。実際には価格急落等に対応出来ず、トータルとして利益を上げることはかなり難しいです。
Pythonポートフォリオの一つとして掲載しているに留まります。
実装内容
実装内容について簡単に説明します。このプログラムは1分間に渡り価格経過を取得します。取得後、各テクニカル指標の判定をし、取引する場合はCoincheckのAPIを使用します。取引しない場合は再び、1分間に渡り価格経過を取得します。これを繰り返しています。1分間の間では2秒ごとに取引所の最新取引を取得し、その中で一番高い価格を高値('high')とし、安値('low‘)とします。また、1分間の間の内、初めの価格を始値('open')、最後の価格を終値('close')とします。このようにして1分足のローソク足を作成します。このように得られたローソク足はPythonのライブラリpandasのDataframeに格納されます。以下にローソク足Dataframeの構造を示します。
ローソク足DataFrameの構造 ↓
得られたローソク足と過去の価格推移のデータを併せて、テクニカル指標による判定を行います。テクニカル指標はそれぞれメゾットとして定義され、メゾットに上記のDataframeを渡すと、指標を計算し判定結果を返します。
次に、各メゾットが「買い」判定をしたのか「売り」判定をしたのかを集計します。集計結果は、bool型要素を持つtuppleとしてメゾットに渡され、pandasのSeriesに格納されます。
集計された判定結果を取引決定メゾットに渡します。
取引決定メゾット ↓
ここでの合計点が、設定された閾値を超えない場合には、再びローソク足の取得に戻ります。
閾値を超えた場合は取引に移ります。
現在のポジションが無い場合は、API経由で成行買いをします。この時同時に、購入した価格より3%程度低い価格で逆指値注文を行います(ロスカット)。
現在のポジションがある場合は、買った金額の分だけAPI経由で成行売りをします。売りには上記のロスカット注文をキャンセルする必要があるので、先にキャンセルをしてから成行売りをします。
成行買い、逆指値注文、注文キャンセル、成行売りの判定部分 ↓
ロスカット注文の実装部分 ↓
売却が完了するとアセスメントを行い、取引時刻や得られた利益を記録します。
また、ローソク足が増え続け、メモリの圧迫を防ぐため、予め設定した時間ごとにローソク足の一部を消去します。
メモリ対策の実装部分 ↓
補足
このプログラムはfor文が回り続け基本的には、継続的に取引が行われるプログラムになってますが、CoinCheckによる処理負担の低減のためか、一週間に1回以上はAPIアクセスを拒否され、想定外の動作を起こすことがあります。そのため、継続的なメンテナンスが必要です。
このプログラムはCoinCheckに限らず、APIを公開している取引会社ならば、コードを少し修正するだけで対応可能です。
AWS上での継続的な動作
このプログラムを24時間365日動作させるためにAWSを用います。AWSの無料利用枠において、EC2インスタンス種類であるt2.microは月750時間まで無料のため、こちらを用いて継続的な実行環境を構築します。Amazon Linux 2023をAMIとするEC2インスタンスには予めPython3がインストールされているので、Python自体の環境構築の必要はなくライブラリのインストール等をするだけで、比較的簡単に実行環境を用意する事ができます。
冒頭に説明したように、このプログラムはPySimpleGUIを用いてメニューを作成しています。EC2上ではGUI環境がないためこれを廃止し、コマンドからの引数で取引諸元を入力し、プログラムを実行します。
取引諸元を引数入力させる実装部分 ↓
EC2上での実行コマンド(引数に取引諸元) ↓