MLBOTを取引所APIに配置する

richmanbtc先生式のMLBOTを作りたい。

前回の記事ではrichmanbtc先生のチュートリアルを入門して一通りなぞってみました。

MLBOTチュートリアル部分では

過去データの読み込み~バックテストまでで、

肝心なBOTの作り方と設置方法がのってなかったので自分で調べて作ってみます。

今回はBOTの実装とBOTの設置までやりたいです。

BOTの作り方

今回0から自分で調べて作ります。手順としては、こんな感じでやっていきます。

①こういうの出来たらいいなぁ(ゴール設定)

②ネットでググる

③(*’ω’)ひらめく

④メモる

⑤書き出す

⑥実装する

最初はなんとなく「こういうの作りたいなぁ」というのを決めます。そして周辺知識を調べてメモるを繰り返します。先にゴールを設定して必要なものを割り出します。

richmanbtc方式のBOTを作ってサーバー設置までしたい(ゴール設定)

以下、調べたことと閃いたこと覚えたこことです。

  • Dockerをそのままサーバーに置ける方法が楽みたい。
  • GCPに無料枠あるらしい
  • ConohaVPSがおすすめらしい
  • AWS使った方がいいよ派もいるみたい
  • Pythonの無限ループ式のBOTで良さそう
  • Pandasでローソク足作れる
  • Pybottersというライブラリが良さそう
  • ローソク足15分足作ればいけそう
  • SSHなどの設定めんどくさそう
  • Dockerでいい
  • テクニカル指標ライブラリのTa-lib付きのDockerイメージがあるみたい
  • エディタはVScodeが良さそう
  • GCPは使った分だけ課金なので良さそう

決定事項

  • Docker
  • pandas
  • Pybotters
  • GCPでDocker動かす
  • VScode

ここまで調べたので、スモールステップでちょっとづつ手を動かします。

手始めに最小限のDockerイメージを作ってGCPに設置、Pythonを動かすまでしてみます。

DockerはYoutubeの動画を観て少し理解しました。

まずはDockerにPython入れてイメージにしてGCPに入れます。一行のファイル作ってUP。ログが表示されれば設置完了になります。

また調べてみると、Dockerファイルの保管するサービスとコードを保管するサービスとPythonを実行するサーバーサービスと3つ使う必要があるそうです。

Pythonコード、Dockerファイルの保管、バージョン管理GitHub
Python実行するサーバーCloud Run

GitHub新規リポジトリ作成

GitHubにコードを保存していきます。

リポジトリの作成
リポジトリの名前と公開、非公開を選択

Privateで非公開リポジトリです。

リポジトリの作成が完了
空っぽのリポジトリ状態

これ使う。

デスクトップに新規ファルダ作る
botというフォルダつくった
できた
コマンドプロンプト開く
cmdで検索したらでる
コマンドプロンプトでファルダに移動
cd → ドラッグアンドドロップ →enter
githubのリポジトリ初期化する
githubのコマンドをコピペで貼り付けてenterを繰り返す
リポジトリ初期化完了

ここにコードを順次アップロードします。

Visual Studio Codeをインストール

VSCodeをインストールします。

使い方はしまぶーさんに動画がわかりやすい。

VSCodeでGitHubに接続します。

コードの保存→GitHubのリポジトリにプッシュでコード管理できます。

GitHubとVSCodeの連携方法参考サイト

設置するサーバーを悩む

サーバーってどこ使えばいいんだろ。

GCPには仮想PCサービスがあってメモリから選べたりします。

でもメモリ・ディスク・CPU・GPU・ネットワーク・DNS・固定IP・ネットワークとインフラ周りの知識が必須になるのでちょっと難しい。

サーバーレスという選択

昨日は仮想PCで作ろうと思ったけどかなり工程が難しかったのでサーバーレスサービスであるCloud Runでいいなと思いました。

ネットに転がっているのがWhileループ型のBOTなので一回落ちたらメモリのデータが消滅してしまいます。

そこで、データベースに価格を保存するBOTとデータベースから価格を取得するBOTをつくる方法を考えました。

このほうがシンプルですしね。

Dockerで一番簡単なファイルをつくってGitHubにプッシュ

フォルダ構成

bot/
 ├ Dockerfile
 ├ sample.py

これでGitHubにプッシュします。

Cloud Runにデプロイ

GCPのメニューからCloudRun
サービスの作成
GitHubからコードを取得して自動設置するCLOUD BUILDを使う
SET UP WITH CLOUD BUILD 押下
Git Hubのリポジトリと紐づける
デフォルトで保存
他もデフォルトでOK、作成を押す

ちょっと待つとGitHubのコードを読み取りCloudRunへ自動でデプロイ(設置)されます。

エラー

エラーでました。公式チュートリアル読むとWebアプリである必要があるみたいです。

Hello World

でもログにHelloWorldが表示されているのでデプロイは問題なくできたようです。

公式チュートリアルのコードを参考にして元のコードを改変します。

PythonライブラリFlaskでWebアプリ化させます。

sample.py →main.py

フォルダ構成

bot/
 ├ Dockerfile
 ├ main.py

改変したのをGitHubにプッシュして、コンソールから未承認のURLを許可してアクセスしてみると、

Hello Worldがブラウザに表示されました。これで、OK。

認証をいれて非公開にします。

ここまでを振り返ると、PythonをGCPへ設置が完了まで出来ました。

次は価格保存用のデータベースを用意します。

データベースの準備

色々と調べたのですが、従来からあるSQLはGCPで使おうとすると月額料金が3000円ぐらいかかるみたいだったので、格安で使える「FIrestore」を使います。

ここからはネットに情報手がかりが少なく手探りの情報のため間違ってるかもしれません。
詳しい人はコメントで教えてください

データベースの準備

GCPのメニューからFirestore
ネイティブモード
ロケーション(地域)はシンガポールに決定
空っぽのデータベースが完成

ここに価格情報をいれていきます。

まずはデータベースのテストします。

Dockerファイル更新 ー RUN pip install google-cloud-firestore を 追加。

ライブラリgoogle-cloud-firestore を追加、データベースへ書き込むコードを追加

bot/
 ├ Dockerfile
 ├ main.py

GitHubにプッシュしたのでこれでデータベースへ書き込みテストします。

ブラウザでHelloWorldを更新するとデータベースへ書き込みされると思います。

できた

コレクションは”test”

ドキュメントは空白なのでユニークなIDが付与されるみたいです。

フィールドの作成日時はUTC+9なので日本時間です。

書き込みできたのでデータベースの読み込みしてみましょう。

データベース書き込みから読み込みに変更します。

bot/
 ├ Dockerfile
 ├ main.py

情報を取得できた。

よーし次はリアルタイムティックでリアルタイムに価格を取得してデータベースへ書き込むプログラムですね。

GMOコインから価格を取得してデータベースへ書き込む

richmanbtc式のBOTは15分足があればOK

GMOコインでKline(始値、高値、安値、終値、取引高)情報を取得できるみたいです。

しかし、前日の価格しか取得できません。

今回は、何秒おきに価格を取得してデータベースへ書き込むスクリプトを作成します。

GMOコイン

GMOコインから価格取得してみます。

GMOコインからコピペして動かす

コピペで動きましたのでこれ使います。

実行結果はこちら

{“channel”:”ticker”,”ask”:”3685001″,”bid”:”3685000″,”high”:”3698147″,”last”:”3685001″,”low”:”3680000″,”symbol”:”BTC”,”timestamp”:”2022-05-29T01:02:54.656Z”,”volume”:”109.9471″}

現在価格がリアルタイムティックで取得出来ています。

データベースへ書き込むコードを変更します。

変更前

変更後

コレクション名を”price”へ変更

引数priceを受け取りpriceをデータベースへ書き込みます。

GMOのコードを価格を返す関数に変更します。

変更前

変更後

現在のファイル構成です。

bot/
 ├ Dockerfile
 ├ main.py

サーバータイムスタンプとGMOコインの価格の取得ができた

起動すれば最新価格をデータベースに保存します。

Cloud Schedulerで定期実行させる

アプリを定期的に起動させれば価格がデータベースに入る。

Cloud Schedulerで1分間おきに実行させてみます。

スケジュール作成して定期実行させたい
メニューからCloud Scheduler
押す
名前、頻度、タイムゾーンを決定
「* * * * *」で1分おき実行
HTTPでアクセスさせる
オプションはデフォルト

これでデータベースに定期的に価格が保存されます。

1分おきに価格が保存されてる

あとはアプリを1分間価格取得するように変更します。

アプリを1分間価格取得するように変更

bot/
 ├ Dockerfile
 ├ main.py

データベースの無料割り当て

単数だと無料枠を超えるのでリストで一度にデータベースに書き込みして書き込み回数を減らす。読み込みも課金防止のため出来るだけ少なくするとよさそう。

変更前

変更後

これで1個目の価格情報を取得してデータベースに保存するBOTが完成。

次はデータベースから価格情報を取得して過去のデータベース削除するやつ作りたい

今日はここまで、気が向いたら更新します。

データベースから価格情報を取得して過去のデータは削除して綺麗にたもつ

データベースから価格情報を取得して過去のデータベース削除するやつ作りたい。

エンドポイントを増やして機能を拡大させてみます。

ごちゃごちゃしてきたのでClass化させてみます。

Class2個作ってエンドポイントでBOT機能分けました。

url/trade にアクセスするとデータベース削除される

とりあえず、データベース削除機能つけたのでこれも定期実行させます。

2時間おきに実行させます。

今日はここまでで。

思ってたよりも料金がかさむ

ごめんなさい。

Cloud Runで24時間稼働させて価格を取得するように設定したけど、思ったよりも料金がかさんでしまいました。

4日間で無料枠を超えてしまった。

価格を取得する機能をCloud Functionに移植します。

急遽Cloud RunをCloud Functionsへ変更

GCPのメニューからCloud Functions
関数の作成
構成
ランタイム
ランタイムをPythonへ変更
Nodeから
Pythonへ
main.py
requirements.txt
価格取得のスケジュールURLを変更
URLはCloud Functionsのトリガーから取得できます。
移植時の変更ポイント

①Cloud RunのコードをコピペでCloud Functions へ貼り付けします。

②hello_world() → hello_world(request)

③Webアプリ化の不要な部分を削ります。

④外部ライブラリの

・requests

・google-cloud-firestore

はrequirements.txtに記載すると pip install してくれます。

Cloud Functions では「価格取得の取得」と「データベースへの価格保存」までの役割を持たせます。

ローソク足15分足4本値(OHLC)を作る

ここからはPythonの表計算ライブラリのpandasを使っていきます。

pandasの便利機能を使うとローソク足が一瞬で作れる

pandasのohlc()という関数を使うと価格情報をohlcに変換してくれます。

pandasの入門はこのサイトがおすすめ
この動画もpandas入門におすすめです

自分のパソコンからGCPのデータベースにアクセスするには?

こっからちょっと難しい。

GCPのアプリからデータベースへは自動的に認証されてアクセスが出来ますがローカルPC(自分のPC)からGCPのDBにアクセスする方法ってどうやるんでしょうか?

そこで登場するのがGCPの認証システムです。

秘密鍵という”権限の許可証”を発行します。

やってみたほうが理解しやすいと思うのでとりあえずやってみましょう。

GCPのメニューからIAMと管理
サービスアカウント
作成
名前を決める
firebaseとフィルタ検索
Firebase接続用のロール(許可証)を選択
FirestoreはFire baseサービスに含まれる
3は省略可能なので省略
サービスアカウントが完成
タイトルを押して詳細画面へ

詳細からキー
鍵を追加
新しい鍵を作成
JSONを選択
作成を押す
鍵のJSONファイルが保存される
ファイルを開く
JSONファイルを開いてみよう
ファイルの中身
これがデータベースへの許可証
名前をつけて保存
botファイルに保存しておく
key.jsonで保存
VSCodeで確認しよう
key.jsonが追加された
秘密鍵がGitHubに保存されないように「.gitignore」ファイルを作成する
.gitignore
変更されたファイルの一覧にアップロードしたくない「key.json」がある
key.jsonはGitHubに保存したくない
.gitiignoreにkey.jsonを入力してctrl+Sで保存
保存されるとファイル名の右が×になる
.gitignoreを保存が終わると変更されたファイルの一覧からkey.jsonが消える
くれぐれも鍵の取り扱いには注意してください。

お疲れ様でした。

以上でデータベースの許可証の発行と鍵の保存まで完了です。

データベースへの許可証である秘密鍵は公開しないように気をつけてください。

Firestoreに自分のパソコンから接続してみる

自分のPCからGCPのFirestoreデータベースへ接続します。

pip install firebase-admin
ターミナルから pip install firebase-admin を実行
公式クイックスタートのページを参考にコードをコピペ
データベース接続テスト用にfirestore.pyをつくる
公式からコピペしてファイルパスを「key.json」へ変更する
docsの0番目のコレクションidを表示させてみる
実行させてみると?
ドキュメントIDの取得ができた。

ドキュメントのフィールドを取得してみよう

変更前

変更後

改行されてないから読みづらいですね。

今度はライブラリpprintを使ってデータを読みやすくしてみましょう。

BOT開発、この作業死ぬほどやりますw

必要な情報が”現在価格”と”時刻”ですね。

priceの0番目の”last”
priceの0番目の”timestamp”
を表示させてみます。

おさらいするとデータベースの価格情報までアクセスできました。

次は表計算ライブラリのpandasにデータを読み込ませる。

表計算ライブラリのpandasを使う

まずはインストールします。

ターミナルでpandasをPIPインストールする

テスト用にpandas-test.pyファイルを作る

まずは適当にテスト

価格と時刻の表ができた

df.set_index(‘時刻’, inplace = True)でindexを指定します。

時刻をindex指定

datetime型でサンプルつくる

ohlc!!!!

あとはかくかくしかじかで

10秒足が完成

今日はここまでで

  • -
    コピー

この記事を書いた人

最近のコメント

  1. アバター
  2. アバター
  3. アバター
  4. アバター
  5. アバター

人気記事