252
242

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ドワンゴAdvent Calendar 2018

Day 20

株取引AI “AI Deep Kabu” を作り10ヶ月公開運用した知見:インフラ構成・料金、収益化難度、除外すべき銘柄

Last updated at Posted at 2018-12-19

TL; DR

  • 実物はこちら
  • ※この記事では人工知能のアルゴリズムについては言及しません(商売道具になるかもしれないので🤫)
  • ※この記事では以下の内容を扱います
    • 作成したWebサービスのインフラ構成
    • 現在のシミュレーション損益値等
    • Webサービスを保守運用して気付いたこと
  • 作成したWebサービスでは下記のことを行いました
    • その日に買うべき・手仕舞い(売る)するべき株式を自作アルゴリズムに推薦させた
    • その推薦結果をtwitterとブログで毎日無料配信した
    • 仮にその情報に沿って売買した場合、最高で 2,290,530円 (約230万円)の確定した利益がでていた(含み益ではない)
  • #今回のプロジェクトから得られた教訓、知見

はじめに

自己紹介

@dogwood008 と申します。普段は プログラミング教育サービス N予備校 のバックエンドを担当しています。

一番好きなのはRuby + Rails ですが、 Python, Node.js, Android (Java, Kotlin) あたりもだいたい使えます。私が過去に書いた記事一覧はここです。

免責事項

• 本記事の内容は、著者個人が趣味の時間に自発的に行ったものです。著者が所属する会社または団体の監督指導の下に行ったものではありません。アドベントカレンダーとして表示されるため、所属する会社または団体の発表のように見えることがありますが、その会社または団体は本記事の内容について、一切関知しておらず、なんら責任や関連はありません。
• 本記事の内容は、著者個人による見解であり、所属する団体、組織、会社、その他一切の枠組みによる公式見解ではありません。また、それらは本記事に対する責任や関連も一切ありません。
• 本記事の内容は、著者個人の成果物に関する情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。
• 本記事の内容または本記事の内容を元にして作成されたWebサービスあるいはそれによる予測(以下、その成果物が生成する情報と呼称)を参考にして、投資の判断を行わないでください。また、本記事の内容またはその成果物が生成する情報が正確であることを、著者は一切保証しません。未来の出来事に対する予想も、あくまで予想であり、その時々の状況によって変わりうることにご注意ください。
• 投資を行う際には、投資を行う本人のみの判断と責任において行ってください。
• 仮に投資に失敗し、投資を行った者の資産が減ったり債務を負ったりしても、著者はなんら責任を負いません。
• その他、本記事を参考にしたかどうかに関わらず、投資の失敗や機会の損失等を含むいかなる不利益が何人に生じたとしても、著者はなんら責任を負いません。

人工知能と株取引

世の中にはいろんな人工知能があり、ポーカー用AI囲碁用AI将棋用AI等さまざまあります。じゃあ株取引のAIもあるのかと探してみると、一番良さそうなのは、ロボアドバイザー1でした。

ロボアドバイザーとは、入金して投資の配分を決めておくと勝手にリバランスを行って良い感じに分散投資してくれるというやつです(そうでないのもある)。これはこれで良いのですが、リスク(想定する±変動幅)とリターンが単元株数以上の個別株売買より抑えめになっている2ので、長期投資向けです。

一方、今回自分がやりたかったのはそうではなく、いわゆるデイトレーディングに近いことです。つまり短中期で個別株の売買を行うことでリスクを許容しつつ大きいリターンを得たいということです。素人が適当に買って勝つのはなかなか難しいと思いますが、本記事で扱うのはAIがそれを推薦したらどうなるか?というテーマです。

株式の売買で儲けるには安い時に買い、高い時に売ることが必要です。その逆、高い時に売り3、安い時に買う4こともできるのですが、手数料等株価の値動き以外にかかる費用が高くなりがちなのと、仮に株価がぐんぐん伸びた時に損失が青天井なので、今回は対応しません。今回はAIに買い時・売り時の株式を推薦させて、それにしたがって売買した際のシミュレーション値と、予測した推薦株の配信を実際に行っていたので、そのインフラ構成や得た知見を紹介します。

予定と誤算

当初は、それなりの実績を作れたら予想結果を売ろうと思っていました。しかし、個別株の売買シグナルを会員に有料販売するには 投資助言業 の認可を取る5必要があるらしいということが調べていくうちにわかりました。認可を取るのは面倒だけどせっかく作ったのをお蔵入りさせるのももったいない、じゃあ無料で配っちゃうかという感じでここまできました。後で述べますが、これにより得られたあるチャンスがありました。

構成

基本的にはGCP6を使用し、一部AWS7を使用しています。理由はAWSを使ったことはあるから、GCPを使えるようになりたかったためです。

そもそもGCPに興味を持った理由は、あちこちで「GCPの方がAWSより安い」みたいな記事をみかけたことです。本当か?と思い、じゃあ実際に使ってみるか、といった感じで採用しました。実際に安いかどうかはわかりません(使い方によるとしか言えない)。

GCPの兄弟サービス?であるFirebaseは、以前調査(わかる!Firebase ~全てのサービスをおつまみ紹介~)したことがあったためなじみがありました。GCPのサービスはいくつかFirebaseでも提供されており、その辺はあまり心配はありませんでした。それに対し、他のIaaSはそもそも何のサービスが提供されているかを調べるところから始まるため、GCPより学習のイニシャルコストがかかると考えました。結果、今回は検討対象にしていません。

私がやろうとしていたことの範疇では、GCPとAWSとでは、できることは大差ありませんでした。使用したいコンピューティング環境やストレージはそんなにスペックを要求しないので、低コストで運用できれば良いなぁと思って取りかかりました。

後から気付きましたが、GCPには「アルファ版」「ベータ版」と冠の付くサービスがちょくちょくあります。今回のプロジェクトは趣味レベルなので、仮にそれらであろうとガンガン使いましたが、もしプロダクションレベルで必要になったら、使用するのは少し躊躇するかもしれません。その辺は運用するサービス次第だと思います。

推薦部

買い目・売り目の株を推薦する部分のインフラ構成は下図のようになっています。

ai-deep-kabu.png

株価取得サーバが Cloud Functions で動いており、これは App Engine により、決められた時刻に Cloud Pub/Sub でイベントが発火することにより起動&決められた動作を行います。

同様に毎朝08:50になると、App EngineGoogle Compute Engine を起動します(ここは後で詳しく述べます。)。ここで起動されたマシンは続けて起動スクリプトを実行します。これにより、指定した Python のスクリプトが自動的に実行されます。

起動スクリプトで実行される Python スクリプト内では、 Pub/Sub の予測開始epicの Subscribe を行うようになっています。現在の株価取得完了後に Publish されるエピックを Subscribe するようになっており、この時に初めて各株式の現在値と過去の値をGoogle Cloud Storageから取得し、買い目株の推測を行うようになっています。

推測された買い目の株式は、その後 Twitter の API を Python から叩くようになっています。これの続きは#配信部で詳細に述べます。

イベント通知

前述の通り、イベント通知には Cloud Pub/Sub を使用しています。これはAWSでいうところの SNS 8のように使えます。

イベント(Pub/Subではトピックと呼ばれる)通知をトリガーとして、 Google Compute Engine
を起動したり、 Cloud Functions を動かしたりすることができます。

開発中では、Publisher が Publish したエピックを Subsucribe しようとすると「エピックがない」という旨のエラーが発生し、うまく Subscribe できないことがちょくちょくありました。これは「毎日新しくエピックを新規作成し、不要になったらエピックを削除する」ことで解決できました。

タスクの定期実行

定期実行、つまりcronのように「事前に定めたある日時」であることをトリガーにエピックを Publish するために、GCPでは App Engine を使用します。これで例えば「毎日 08:45にイベントをpublishする」といったことができるようになります。

この時、 Cloud Pub/Sub を使用して、 Subscriber に向けてエピックを Publish します。

AWS でやるなら

AWSであれば Amazon CloudWatch Events で、cron式を用いてイベントをpublishできます

その次はGCPとは異なり、 AWS Lambdaへイベントを流し、LambdaがEC29をキックして起動する、という流れになります。

Publish されたイベントを順番に処理(FIFO)する必要がある場合は SQS10 へイベントを流すこともできます。

サーバレスアーキテクチャ

サーバレスアーキテクチャとは、ソースコードだけアップロードしてデプロイしておけば、後はそれを動かす環境はIaaS側でよしなに用意して実行してくれるといった構成です。

GCP のサーバレスアーキテクチャサービスである Cloud Functionsは、AWS Lambda と同じようなことができます。

AI Deep Kabu では Pub/Sub で流れてきたイベントを拾って、サーバレスで一時的なアプリケーションを実行する環境を用意し、予め用意したコードを実行する、という使い方をしています。

コンピューティング環境

時間貸しのVPSのようなものがGCPで提供されており、 Google Compute Engine と呼ばれています。 AWS でいうところの EC2 です。

App Engine を使用することで、タイマー起動・終了が可能になります。例えば08:50に起動して、09:10に終了する、といった使い方です。これにより、スポット的に必要な時間のみコンピューティング環境を使用することができ、不要なリソースによる課金を回避できます。詳しくは次の記事を参考にしてください: GCEの自動起動・自動停止をスケジューリングする

AI Deep Kabu では、朝9時ちょっと過ぎにバッチがまわるようになっています。これを実現するために Pub/Sub と App Engine を組み合わせて使用しています。

予めタイマー起動しておいたインスタンスでバッチ開始のトリガーとなるトピックを Subscribe しておき、予め仕込んでおいた時間になったら App Engine がトピックを Publish します。それを受けて Subscribe していた GCE インスタンスはバッチ処理を開始する、という流れになっています。図で表現すると、次のような流れです。

GCE + Pub/Sub + App Engine

Google Compute Engine での信頼性の高いタスクのスケジューリングより引用。2018年12月12日閲覧。

ストレージ

過去の株価情報を保存するためにストレージサービスを使用しています。GCP では Google Cloud Storage という名前で提供されています。 AWS でいうところの S3 です。

私の利用用途では、Route 53 のエイリアス先に S3 を選べること以外は、両者の間に特筆すべき違いはないように思います。

コード管理

GitHub の private レポジトリで行っています。GCP や AWS にも Cloud Source Repositories, AWS CodeCommit と呼ばれるサービスがありますが、今回は使用しませんでした。理由は、既に github の Developer プランに加入しており、無制限に private リポジトリを作れるためです。

Pythonでの開発と実行環境

Pythonでの開発は基本的に Jupyter Notebook 上で行っています。保存するとファイル名が hoge.ipynb になります。これを保存時に自動実行されるスクリプトで hoge.py に変換するようにしてあります。スクリプト実行時には .ipynb ではなく .py の方を実行するようにしています。

これには理由があり、 .ipynb だとgithubでのレビュー時にコード差分が読みづらいというのと、 .ipynb のままでターミナルからスクリプトを実行することはできないと思い込んでいたためです(後から知りましたが、実際はできる)。

配信部

Twitter

推薦部で推薦された買い目/売り目の株式を Twitter を使って配信します。これは Twitter の API を Python から叩くことで行われます。

この際、例えば2日続けて買い目株が無い場合は全く同じ内容をツイートすることになります。しかし、Twitter の API は、連続して同じ内容をツイートしようとすると受け付けてくれない仕様( [187] status is a duplicate )になっています。このため、AI Deep Kabu では 12月10日の株価予測結果(買い) のように、日付をツイート文の前に入れることでこれを回避しています。

また、毎日14:30過ぎにその日の売り目(手仕舞い推奨)株式の推測を行います。これの流れも買い目株の推測と同様です。

ブログ

https://blog.ai-deep-kabu.com/

はてなのブログにも、twitterと同様に予想結果を配信します。これには pythonでwsse認証を用いて、はてなブログにエントリーを投稿する を参考に自分で実装したクラスからポストしています。

Static HTML page

Twitter での配信とは別に、 AI Deep Kabu には静的ページで作成された Landing Page があります。

https://ai-deep-kabu.com

これは Cloud Storage ではなく AWS の S3 + CloudFront + Route 53 で構成されています。これは、Zone Apex をエンドポイントにしたかったのが理由です。

どういうことかというと、 AWS の Route 53 を使用すると、本来はCNAMEレコードを設定できない http://ai-deep-kabu.com に対して、 CloudFront のエンドポイントを Alias レコードとして設定することができる、ということです。

つまり、 http://ai-deep-kabu.com にアクセスされた際、 S3 に置いてある静的ページを CF 経由で表示することができます。これにより、サーバレスでWebサイトをサブドメイン無しでホストすることができます。

また、SSL/TLS証明書も無料で作ることができるため、CFで設定することにより、httpプロトコルでアクセスされた際に自動的にhttpsプロトコルのものへリダイレクトさせることができます。さらに、HTTP/2で配信することも可能です。実際にAI Deep KabuのLPではHTTP/2で配信されています。

image.png
画像はhttps://http2.pro/check?url=https%3A//ai-deep-kabu.com/より

以上の技術と設定により、 www 等のサブドメイン無しでWebサイトを運用しています。S3で静的Webサイトをホスティングする詳しい手順は別の記事で記載したので、下記をご覧ください。

AWS S3で静的Webページをホスティングする

運用

利用規約

利用規約の作成には、Webサイトの利用規約を参考にさせていただきました。非常に多くの時間を節約することができました。ありがとうございます :bow:

成績

各取引をまとめたスプレッドシートはこちらにあります。

下図は運用開始から12月17日までの損益を計算したグラフです。横軸は日付を、縦軸は合計の損益を表します。また、各約定日について、青は利益が出た日、赤は損失が出た日を表します。なお、手仕舞いによる利益確定・損切りのみを掲載しているので、含み損益はこのグラフにはあらわれていません。

pubchart.png

コツコツと利益を重ねていくような形で、11月19日には最高で 2,290,530円 (約230万円)の確定した利益をだしていました11。しかし、大きく3回ほど負けた日があります。1日に50万円以上の損失を確定させた日は 6月21日11月26日同30日 の3回でそれぞれの銘柄コードは 7974 7974 5019です。つまり、7974 だけで合わせて100万円以上の損失が発生している計算になります。これが無かったら今頃プラスなんだよなぁ…

7974 の6月21日、11月26日の株価は、それぞれ 36,720 32,320 です。ここから得られた教訓は、「株価が高い銘柄は、他の銘柄に比べて注意を要する」ということでした。次のバージョンアップでは高い株価の銘柄は組み込まないようにします…

12月17日現在の各種数値は下記のようになっています。

項目名 数値 単位
総利益額 -109,320
勝率 66.8 %
総取引回数 1,594
開始からの経過日数 328

最新の値は、 AI Deep Kabu のLPにて公開中です。

なお、ここで示した数値は下記の条件に基づいて算出しています。

  • 買い予測で配信した指値がその日の安値以上なら、単元株数で買いポジションを持つ
    • 既に買いポジションで持っている株に対し、買い予測が配信された場合、単元株数だけ買い増す
  • 手仕舞い予測で配信された株式のうち、保有するものがあればその日の終値で全て手仕舞いする
  • 手数料、利息、その他諸経費は0円とする

費用

以下は2018年のAI Deep Kabuの開発・運用にかかったGCPのインフラ費用です。

実は工数が足りずdev環境とprod環境で共存していたのですが、それによりサービスがダウンしてしまうことが何度かありました。安定稼働が必須のサービスであれば、あたりまえですが dev と prod が同居するのは良くないですね。これらが同居しているため、月の費用にばらつきがあります。AWSも他のプロジェクトをやっていたりしているので、毎月一定ではありません。

ただ、多く使わない月は GCP と AWS を合わせて毎月1000円程度あれば十分であるため、常時サーバ稼働が必要なサービスに比べるとかなり安くすんでいると思われます。

GCP費用(円) AWS費用(米ドル) AWS費用(円※)
4 342 0.88 99.88
5 590 0.86 97.61
6 319 0.84 95.34
7 323 0.89 101.02
8 322 1.47 166.85
9 295 1.10 124.85
10 480 0.65 73.78
11 1061 7.72 876.22
※1米ドル=113.5円で計算

実際に運用してわかったこと

結構細かいところまで見られている

「専門家に任せておくのが良いよ」位の意味合いで3秒で考えたクソザコキャッチコピーなので、そのうち変えるかもです…

利用規約、誰も読まないでしょと思ってたのでかなり無茶な条項入れておいたのですが、ちゃんと見ていただけて嬉しい?です。さすがにちょっと無茶すぎたかもなので、そのうち修正します12

無料で公開しても、思ったほどフォロー数が伸びない

やっぱり怪しく見えるのでしょうか…おそらく私に無料で公開するメリットがないように見えるからだと思います。

フリーミアムモデルで始めるなら、なぜ無料なのか、どのように収益化するか等を真摯に説明しないと「ただの怪しいサービスっぽい」で終わってしまうのかもしれません。運営しているのが有名な企業や団体ならそうはならないかもしれないのですが、残念ながら無名な個人なので…

ソースまるごと一式を買い取って有効活用していただける企業・団体様がいれば、違った結果になったのかもしれません。

サーバ代は回収できそうだが、人件費まで直接回収するのは無理そう

ブログに AdSense を貼り付けています。金額を公表すると規約違反になってしまうので、認められた範囲で言うと「毎月のサーバ代を払うと何も残らないか、そもそも足りない」くらいのお金が発生しています。

勉強にかかった時間・授業料(数十〜百数十時間?の人件費と学費年数十万円)、開発運用保守にかかった時間(数十〜百数十時間の自分の人件費)等トータルで考えると、数字では残念なほどマイナスです。

しかし、このWebサービスをきっかけに私自身に興味を持っていただけたり、お話しをさせていただける機会を頂戴したりすることができました。

今回は、人件費と学費をお金という形で回収することはできませんでした。しかし、完璧ではないにしろある程度機械学習がわかる、人工知能を作れるという武器や、人・会社に会う手がかりになるというチャンスを手に入れることができたことを考えると、今後長い年月を掛けてそれらを回収することができるのではないかと考えています。

今回のプロジェクトから得られた教訓、知見

  • 機械学習や人工知能の勉強は、数式がたくさん出てきて難しそうに見えるけど面白い
  • お金を殖やすためには、お金が必要だった
    • 資本主義とは富める者がますます富む構造だった
      • お金がないと株を買うことすらできない
      • わかってはいたが、現実に直面した
    • プレイヤーにならずにプラットフォーマーになる方が、金を抜きやすいし負けにおびえなくて良い
      • 証券会社や新聞雑誌は(客が付けば)強い…
    • Bitcoinをはじめ暗号通貨の予測配信ならお金取れるだろうか?
  • 株価が高い銘柄を保有するのは危険
    • 当たり前のことなのですが、負けた時の損失がでかい
    • バージョンアップの際に株価が高い銘柄を除外するのがよさそう
  • インターネット環境があり、かつtwitterアカウントを持っていない人数は自分の予想よりいる13ので、サービスをつくるときはtwitterアカウントを持っていることを前提にして大丈夫か考えておくべき
    • 「株取引に興味があってtwitterアカウントを持っていない人」と「スパムtwitterアカウント」は同数程度だった
      • @ai_deep_kabuでフォローバックすると、ちょくちょく「フォロー数: 1, フォロワー数: 0」のアカウントがいる
        • AI Deep Kabuのためだけにtwitterアカウントを作ってくださった人々
      • スパムはDMで「画面ポチポチだけで数十万儲かる!」のような詐欺の勧誘文書を送ってくる
    • 自分のメールアドレスを知らない・わからない人が一定数いるのでtwitterアカウントを持っていなくても不思議な話ではなかった
    • SMTPがRFC 821として制定されたのが1982年、もう36年前のこと
      • 電子メールを置換するような、みんなが確実にアカウントを持っていてメッセージを届けられるサービスか何かがそろそろできてほしい

おわりに

Future work

株価が高い銘柄を推薦対象から外すことが最優先だと考えています。また、損益算出のスプレッドシートを手作業で更新しているので、これを自動化したいです14。今Pythonスクリプトのリファクタリングを進めているので、それらを徐々に進めていこうと思います。

その他やっていること

大学時代の同期と組んでBotで暗号通貨の自動取引をさせたり、三角裁定取引をさせたりと、ちょっと面白いこともやっています。こちらも充実させていきたいです。
https://blog.2x3dimensions.tech/

ひとこと

長文でしたが、ここまでご覧いただきありがとうございました。この記事のどこか一部でも参考になれば幸いです。
参考になったらページ左側の「いいね」ボタンを押してもらえると励みになります :pray:

本記事中で何かあれば、コメント欄、TwitterのDMここに記載のメールアドレスまでお願いします。

Special thanks

Pub/Subでうまくイベントをpublishできなかった時、相談に乗ってくださった @namusyaka さん、ありがとうございました :bow:

  1. 赤いやつとか青いやつとか、具体的な名前を出すのは法に触れるかわからないので止めておきます、この記事はそれらの勧誘を目的とするものではありません

  2. ロボアドバイザーに預ける額にもよる

  3. 人から株を借りて売る

  4. 買い戻して借りた人に株を返す

  5. 法人成りして供託金500万円を積んで投資助言業者になる

  6. Google Cloud Platform

  7. Amazon Web Services

  8. Amazon Simple Notification Service (Social Networking Service ではない)

  9. Amazon Elastic Compute Cloud

  10. Amazon Simple Queue Service

  11. 含み益ではない

  12. 「第9条(利用規約の変更)」による

  13. 少なくとも日本においては

  14. 面倒くさい & スキルにならない & ミスを生みうるので、人間がやる仕事ではなかった…

252
242
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
252
242

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?