学習済みの機械学習モデルを使ってFXの自動売買を行うサービスを、GCPのサーバレス環境で実現してみました。Engine)を使えばローカル環境と同じように運用できるのですが、VMはずっと起動させておくとそれなりに費用がかかってしまいます。Functionsの方が安く運用でき、最先端のクラウド技術にも触れられるという事で自分でやってみる事にしました。今回のFX自動売買の機能要件と処理の流れは次のようになります。物理ファイルや外部API連携、DBアクセスも必要となり、それなりに幅広くクラウドの機能を使う必要がありました。APIを使った売買については、先日の記事を参考にして頂ければ幸いです。月〜金の決まった時間(まずは1日1回、13時)に起動する。APIを使ってUSD_JPYの最新の価格を取得する。データの前処理を行う。(PandasのDataFrame利用)FXのテクニカル指標を計算する。(TA-Lib利用)機械学習の学習済みモデルをロードする。(今回はLightGBMのモデル)学習済みモデルを使って将来の価格が上がるか下がるかの予測を行う。おって分析するためにDBに格納する。外部から勝手に実行されないように、外から認証無しでは実行できないようにする。Functionsで実現できるのか心配でしたが、結果的にはGCPの各サービスを活用する事で問題なくできました。苦労もありましたが、一回実装すれば次からは容易に対応できると思います。Functions以外にもいくつかのサービスを組み合わせる必要がありました。機械学習の学習済みモデルを置いておきます。ドキュメントDBです。cronの時間起動でイベントを登録するためのサービスです。Functionsを呼び出すサービスです。イベントトリガーでPythonの関数を1回実行します。関数の中身だけ実装すればよいという事で、今回のサーバレスの主役です。DBやストレージの認証を行うためのサービスです。今回はFX予測して売買するためのシンプルな処理ですが、クラウド関数、クラウドストレージ、クラウドDB、クラウドスケジューラー、クラウド認証と幅広くサービスを活用する事になり、大変勉強になりました。これだけの事を物理的にサーバを立てるところから実施したらかなり大変ですが、GCPでは簡単に実現でき、本当にサービス開発が容易になってきているなと感じました。今回の実装概要をまとめておきたいと思います。Functionsで機械学習の学習済みモデルを読み込むためのStorageをセットアップしました。バケットに名前を付けて保存します。アクセス制御については、ファイル単位の制御は必要ないので、バケットレベルとしました。バケット作成後に、ローカルの機械学習の学習済みモデルをアップロードしておきました。「ファイルのアップロード」ボタンからローカルのファイルをサクッとアップロードできます。DBをセットアップしました。利用開始には難しい事は何もなく、頭を悩ますような設定もありません。スキーマレスなのでテーブルの定義、型定義など何もなく、コレクション名を決めるぐらいです。これで自動でスケールされるのですから、DB管理者は不要ですね。Functionsからデータを投入済みの状態です。FuncitonsをHTTPトリガーにしてしまうと、外部公開されてしまうということで、Pub/Subを挟んで呼び出す事にしました。Functionsが順に処理できるようになります。FunctionsをHTTPで外部公開する必要がないため、セキュリティ的にも安心です。作成はPub/Subの「トピックの作成」からトピックIDを入力して作成すれば完了です。Scheduler今回のFX自動売買は、月〜金で1日1回、13時に実行することにしました。cronと同じ形式で実行タイミングをセットできます。実行時間はどのタイミングで実行するかのタイムゾーンを指定し、ターゲットは上記で指定したPub/Subのfx_topicを指定しました。ペイロードはいまいちよく分かっていませんが、固定パラメータを渡せるようです。これで時間になるとPub/Subにトリガーが送られます。ジョブを作成した後は、実際にその時間にならなくても、「今すぐ実行」ボタンで実行できるのが便利です。Functionsを実装していきます。MBも割り当てておけば十分かと思います。トリガーにはPub/Subを、トピックにSchedulerと設定したものと同じトピックをセットします。Functionsが検知してトリガー毎に1回処理できるようになります。3.7」が選択できます。Functionsの主役はNode.jsのようで、Googleのドキュメントではjsのサンプルコードはすぐに見つかるのですがPythonはあまりなく、ところどころ苦労がありました。機械学習のライブラリやPandasを使うためにはPythonがないと困りますね。現時点ではGolangは選択できますが、.netやjavaは選択できないようです。ソースコードとしては、main.pyとrequirements.txtのみを編集します。main.pyでは複数の関数を定義できますが、呼び出す関数を一つ定義しておく必要があります。contextを受けるようになっています。requirements.txtの内容ここに必要なpythonパッケージを記入しておくと、デプロイ時に反映してくれます。Storageを利用する場合は、google-cloud-storage、firestoreを利用する場合はgoogle-cloud-firestoreを記入しておく必要があります。pandas、numpyはデータサイエンスには欠かせないライブラリですね。最強の機械学習アルゴリズムのlightgbmも問題ないくinstallしてくれました。ta-libはバイナリがなくてimportエラーになり詰んだ、、と思ったのですが、talib-binaryの方は問題なくimportできて助かりました。package>=versionpandasnumpylightgbmoandapyV20talib-binarygoogle-cloud-storagegoogle-cloud-firestorejpholidaymain.pyの内容ライブラリのインポート、DB、Storageの利用準備まずは利用する必要なライブラリをimportします。Firestoreにアクセスするための準備です。次のようにclientを設定しておくことで簡単に扱う事ができます。続いて最新の価格データを取得して前処理を行う部分ですが、今回の記事の範囲を超えるため詳細を割愛します。DataFrameに格納する処理。今回の記事の範囲を超えるため、詳細は割愛。日付を加工したり、価格を前日比にしたり、テクニカル指標を追加したり。今回の記事の範囲を超えるため、詳細は割愛。Storageに保存しておいた学習済みのモデルをblobとして取り出し、いったん/tmpに保存します。Storageから取り出したファイルを置いておくのに便利です。LightGBMのBoosterにそのモデルファイルを読み込ませ、LightGBMで予測を行います。上記までの予測結果を元に、売買の注文を行います。APIを使ってpythonから直接売買の指示を出すことが出来ます。具体的なやり方は先日の記事に記載しました。APIを使ってPythonから自動売買するその後、ドキュメントDBにJSON形式で内容をセットすればDBに格納されます。予測結果を元に売り買いの指示を出します。今回の記事の範囲を超えるため、詳細は割愛。"OK"全体の実行hello_pubsubが最初に呼ばれるようになっていますので、そこからmain_processを呼び、main_processが各関数を順に呼ぶようにしています。print(res)実装が完了したら、Pub/Subからトリガーしなくても「テスト」タブから関数を実行して試してみる事ができます。エラーになった場合はログ表示からエラーの内容を確認できます。functionsがstorageを参照できるような権限を設定しました。functionsの概要から「サービスアカウント」を確認します。storageのバケットの詳細から上記の「サービスカウント」をメンバーとして追加し、ストレージの閲覧者、作成者の権限を付与しました。まとめ以上でGCPのサービスをフル活用して最小限のコーディングで機械学習の自動売買サービスを作成する事ができました。費用もこれぐらいの使い方であれば月に数ドルで収まるように思います。1年で無料枠を使い切ることもないでしょう。いままでインフラ担当者とか基盤担当者が苦労して構築してきた事が、クラウドサービスを使えばほぼ問題なく実現できてしまうのは、凄くいい時代になりましたね。大規模なサーバ運用ではそうもいかないもかもしれませんが、スモールサービスの構築であればワードプレスぐらいのノリで労力かけずにそれなりの物が作れてしまえる、という印象を受けました。今後は、IT技術者がシステムの運用よりも、IT知識を活かして新しいサービスを生み出していく事が求められていくのかもしれませんね。requestStockLike9THERE2@THERE2AIでマイクロビジネスを。マイクロビジネスでAIを。個人ビジネスこそAIの恩恵を受けてもらいたいと思って活動でしています。upLoginユーザーは見つかりませんでした。