アルゴリズム取引のシステムを開発・運用してみて分かったこと

72
アアアアアアアアアアアアアア アア アアアアアアアアアアアア 2017/02/17 Satoshi KOBAYASHI ([email protected] )

Transcript of アルゴリズム取引のシステムを開発・運用してみて分かったこと

Page 1: アルゴリズム取引のシステムを開発・運用してみて分かったこと

アルゴリズム取引のシステムを開発・運用してみて分かったこと2017/02/17

Satoshi KOBAYASHI ([email protected])

Page 2: アルゴリズム取引のシステムを開発・運用してみて分かったこと

目次• 自己紹介• 背景• システムの概要• 遭遇した問題と得られた知見• 最近の状況• まとめ

Page 3: アルゴリズム取引のシステムを開発・運用してみて分かったこと

自己紹介

Page 4: アルゴリズム取引のシステムを開発・運用してみて分かったこと

誰?• 名前 : 小林 智史 (Satoshi KOBAYASHI)• 所属 : インターネットイニシアティブ (IIJ)• 職業 : ソフトウェアエンジニア• 備考 : 普段の業務は金融とは一切関わりがない

Page 5: アルゴリズム取引のシステムを開発・運用してみて分かったこと

元々、投資は好き• 普段の投資について

• 堅実枠• 海外 ETF を使った長期分散投資

• 趣味枠• 好きな ( 応援したい ) 企業の株を銘柄買い

Page 6: アルゴリズム取引のシステムを開発・運用してみて分かったこと

ちなみに• 年齢が若いことは投資では有利に働きやすい

• 長期間で時間分散できる• 時間分散?→ドル・コスト平均法など

• 長期間に渡って複利が効く• 複利?→利益がさらに利益を生む仕組み

• 損をしたときもダメージが少ない• 何故?→人的資本が多く残されている ( 定年まで長い )

Page 7: アルゴリズム取引のシステムを開発・運用してみて分かったこと

背景

Page 8: アルゴリズム取引のシステムを開発・運用してみて分かったこと

お金儲けについての研究• 知識と技術を使ってお金儲けができないか?

• 大学時代の研究室の先輩と二人三脚で研究• どちらも社会人なので余暇を利用

• データを駆使して市場に打ち勝つ• 今回作ったシステムはその一環で生まれた

Page 9: アルゴリズム取引のシステムを開発・運用してみて分かったこと

大学時代の研究室の先輩• 名前 : 加川 敏規 (Toshinori KAGAWA)• 所属 : 情報通信研究機構 (NICT)• 職業 : 研究者 ※博士 ( 工学 )• 備考 : 先輩も投資が好き

Page 10: アルゴリズム取引のシステムを開発・運用してみて分かったこと

システムの概要

Page 11: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どんなものを作ったか• ある金融資産を全自動で取引するシステム

• 特定のアルゴリズムにもとづいて動作する• 24 時間 365 日休まず取引し続ける

• アルゴリズムの基本• 安く買って高く売る ( 商売と同じ )• 統計の考え方を用いている

Page 12: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どのようにして作ったか• Python を使ってスクラッチで実装した

• 最初ワークフローエンジンを使おうとした• Apache Airflow とか• 学習コストの高さ、クセの強さから断念

• その後は、ひたすら下回りから書いていった

Page 13: アルゴリズム取引のシステムを開発・運用してみて分かったこと

システム構成図 ( 概要 )情報収集プログラム

取引用プログラム

レポート用プログラム

取引所RDB(MySQL)

トーク(Slack)

集計用プログラム

取引所 APIライブラリ

可視化(Re:dash)

板の取得や注文など

何かあったときはSlack に通知する

( 自作部分 )

定期実行ユーティリティ設定管理ユーティリティ

など…RDB の内容をグラフにする

各種データの集積所

Page 14: アルゴリズム取引のシステムを開発・運用してみて分かったこと

システム構成について• 役割ごとに細かくプロセスを分けた

• ティッカー、板などの情報を取得する役• 得られた色々なデータを処理して発注する役

• これは正解だった• 疎結合でデバッグしやすい

Page 15: アルゴリズム取引のシステムを開発・運用してみて分かったこと

用語の補足• ティッカー?

• 最後に成立した取引の情報• いくらで売られたか、買われたか

• 板?• まだ成立していない取引の一覧

• いくらで売ります、買います

Page 16: アルゴリズム取引のシステムを開発・運用してみて分かったこと

サーバ• 某 VPS 上で稼働させている

• OS: Ubuntu 16.04 LTS• CPU: 3C• RAM: 2GB• DB: MySQL 5.7

Page 17: アルゴリズム取引のシステムを開発・運用してみて分かったこと

遭遇した問題と得られた知見

Page 18: アルゴリズム取引のシステムを開発・運用してみて分かったこと

取引はいつか必ず失敗する… それも連続で

Page 19: アルゴリズム取引のシステムを開発・運用してみて分かったこと

取引が失敗する主な原因• 外的要因

• 取引所のメンテナンス・障害など• 内的要因

• 自作した取引システムの障害• 連携させている口座の残高不足など

Page 20: アルゴリズム取引のシステムを開発・運用してみて分かったこと

一旦失敗すると長引くことも• 一過性 (数分〜 ) のものなら特に問題はない

• Slack のログが汚れるだけ• 長期間 (数時間〜 ) に渡って失敗することも

• 意外とよくある• 人間が介入しないと直らなかったり、とか

Page 21: アルゴリズム取引のシステムを開発・運用してみて分かったこと

取引が失敗するデメリット• 機会損失

• 失敗している間はお金儲けができない• スプレッド分の損が連続して発生しうる

• これが特にやばい

Page 22: アルゴリズム取引のシステムを開発・運用してみて分かったこと

何がヤバイのか• 複数注文の組み合わせで取引したいことがある• 組み合わせはトランザクション的に扱いたい

• つまり All or Nothing にしたい• もし失敗したときはロールバックさせる

• 買った所で直後に売ることになる• あるいはその逆

Page 23: アルゴリズム取引のシステムを開発・運用してみて分かったこと

何か問題が?• 売値と買値はイコールではない

• 必ず売値 < 買値の関係になっている• 高く買って安く売りたい人はいない

• 両者の差額をスプレッドという• 単純に買って売るだけでも差額分を損する

Page 24: アルゴリズム取引のシステムを開発・運用してみて分かったこと

失敗し続けるのはまずい• 買って売っての繰り返し

• スプレッド分を延々と損し続ける• それも、数時間単位で!

Page 25: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どう解決する?• 単位時間あたりの失敗数に上限を設ける

• 閾値を超えて失敗すると、関連する注文を中止• これをペナルティーと名付けた

• 復帰条件• 一定期間が経過する• 人間が介入して状態を解除する

Page 26: アルゴリズム取引のシステムを開発・運用してみて分かったこと

取引手数料は最大の敵

Page 27: アルゴリズム取引のシステムを開発・運用してみて分かったこと

前述したスプレッドに関連• 多くの取引所では取引自体に手数料がかかる

• 一回の約定あたりでいくら、とか• 板に最初から上乗せされていることも

• ギャンブルでいう「控除率」に相当する• 胴元の懐に入るお金という意味で同じ

Page 28: アルゴリズム取引のシステムを開発・運用してみて分かったこと

控除率の壁を超える必要あり• 超えられないと損し続けることに

• HFT 的なことをすると特に問題になる• HFT?→ 高頻度取引

• 頑張って手数料ばっかり払い続ける

Page 29: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どう解決する?• なるべく手数料の少ない取引所・商品を選ぶ

• 最初、高いものを使って痛い目を見た• アルゴリズムを改良して壁を超える

• 壁を超える利益が得られそうかを計算する

Page 30: アルゴリズム取引のシステムを開発・運用してみて分かったこと

ティッカーの値段では買えない

Page 31: アルゴリズム取引のシステムを開発・運用してみて分かったこと

ティッカーは単なる過去の実績• 開発の初期において

• ティッカーの情報を元に注文を入れていた• 想定と異なる約定が頻発した

• 成行注文 : 想定より高い・安い• 指値注文 : 買えない・売れない

Page 32: アルゴリズム取引のシステムを開発・運用してみて分かったこと

得られた気づき• ティッカーだけを見ていてはいけない

• 直近の取引で成立したというのに過ぎない• 市場は刻一刻と変化している

• 過去の実績と今の市場は異なる• 約定した取引量も分からない

Page 33: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どう解決する?• ティッカーの代わりに板の情報を使う

• 板の情報は成立していない注文の一覧• 今出ている注文を見て自分の注文を入れる

• いくらで売買できそうかを計算する

Page 34: アルゴリズム取引のシステムを開発・運用してみて分かったこと

板の値段でなら買える!… と思った?

Page 35: アルゴリズム取引のシステムを開発・運用してみて分かったこと

想定外は減った、しかし…• 板の情報を使っても完璧ではない

• 他の人も注文をバンバン入れている• 板は取得した直後に過去の情報となる• 想定外の約定は生じうる

Page 36: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どう解決する?• 板を見てから注文までのディレイを減らす

• 処理の最適化・高速化• 「想定外」の取捨選択をする

• 成行取引 : 想定より高い・安いを許容する• 指値取引 : 中途半端な約定に対処する

Page 37: アルゴリズム取引のシステムを開発・運用してみて分かったこと

中途半端な約定?• 商品が売買される単位はバラバラ

• 「 100 買う」という注文を指値で出したとする• その値段で 50 だけ買えた (約定 )• 残りはいつまでたっても買えない

• 上記のような状況が起こりうる• アルゴリズムが複雑化しがち

Page 38: アルゴリズム取引のシステムを開発・運用してみて分かったこと

ちなみに高速化では…• ボトルネックが自作システム以外にあることも

• 取引所や途中経路が重いこともよくある• 注文が受理されるまで数秒かかるとか• その間クライアントがブロックする• 別のスレッドにして他の仕事させよう…

Page 39: アルゴリズム取引のシステムを開発・運用してみて分かったこと

買えなかった (´ ・ ω ・ `)… いや、実は買えていた!

Page 40: アルゴリズム取引のシステムを開発・運用してみて分かったこと

取引に時間がかかるのは困る• 注文内容が市場の相場から乖離してしまう• 一定期間で API 呼び出しをタイムアウトする

• しかし取引所では処理が続いていることも• 「実は買え ( 売れ ) てた!」がたまに起こる

Page 41: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どう解決する?• システムが「実は」を直後に検出する

• 検出後は失敗時のロールバックと同じ• この「実は」の検出が意外と難しい

• または問題が顕在化した時点で対処する• アルゴリズムによってはこれで済むことも

Page 42: アルゴリズム取引のシステムを開発・運用してみて分かったこと

その他の雑多な知見

Page 43: アルゴリズム取引のシステムを開発・運用してみて分かったこと

複利を活かすなら口座情報を活用しよう

Page 44: アルゴリズム取引のシステムを開発・運用してみて分かったこと

取引量• 何をいくつ売買するか• 口座情報を元に調整すると複利が効きやすい• 固定量だと人間が定期的に調整する必要あり

Page 45: アルゴリズム取引のシステムを開発・運用してみて分かったこと

余談• ギャンブルで賭け金をいくらにすべきか?

• 色々な手法が考案されている• マーチンゲール法 (倍プッシュだ… )• ケリーの公式

※ ここらへんの話は『ツキの法則 -「賭け方」と「勝敗」の科学』という本を読むと面白い

Page 46: アルゴリズム取引のシステムを開発・運用してみて分かったこと

貯めたデータを可視化しよう

Page 47: アルゴリズム取引のシステムを開発・運用してみて分かったこと

Re:dash• RDB のデータをグラフ化できる• 定期的に実行してモニタリングとか• 色んなデータの推移を見られるように

Page 48: アルゴリズム取引のシステムを開発・運用してみて分かったこと

注意点• クエリによっては RDB に負荷がかかる• 普段から結構メモリを食う

• 以前は RAM 1GB のサーバで運用してた• ある日 OOM Killer が発動して大惨事に

Page 49: アルゴリズム取引のシステムを開発・運用してみて分かったこと

バックテストしよう

Page 50: アルゴリズム取引のシステムを開発・運用してみて分かったこと

バックテスト?• 過去の履歴を使った検証

• 過去にあるアルゴリズムで運用していたら?• 機械学習系の知識は役に立ちそう

• 教師信号への過学習で喜んでないかとか

Page 51: アルゴリズム取引のシステムを開発・運用してみて分かったこと

二つのフェーズ• 第一段階

• 上手くいくのか?• アルゴリズム自体の検証

• 第二段階• 利益を最大化するには?

• ハイパーパラメータの調整

Page 52: アルゴリズム取引のシステムを開発・運用してみて分かったこと

セキュリティについて考えよう

Page 53: アルゴリズム取引のシステムを開発・運用してみて分かったこと

大前提• それぞれ適切にセキュリティ対策を施す

• サーバ:ファイアウォールとか• 取引所:二要素認証とか

Page 54: アルゴリズム取引のシステムを開発・運用してみて分かったこと

仮にサーバが乗っ取られたら?• 乗っ取られたときのことを考える

• 嫌がらせ以上のことができないようにする• 外部に送金されたりするとまずい

• 取引所によっては API 経由でできてしまう• 権限を適切に絞る

Page 55: アルゴリズム取引のシステムを開発・運用してみて分かったこと

問題が起きたとき気付けるようにしよう

Page 56: アルゴリズム取引のシステムを開発・運用してみて分かったこと

開発の最初期• 色んな問題が起こった

• 気づいたら止まってた• 想定外の○○

• 気付けないと対処のしようがない• 気付けるようにすることが大事

Page 57: アルゴリズム取引のシステムを開発・運用してみて分かったこと

Slack への通知• 何かあったときは Bot が発言する

• 取引の失敗とか例外とか何でも• スマホのアプリがおすすめ

• 問題が起きたことに素早く気付ける

Page 58: アルゴリズム取引のシステムを開発・運用してみて分かったこと

運用やデバッグでREPL が活躍する

Page 59: アルゴリズム取引のシステムを開発・運用してみて分かったこと

REPL?• Read-eval-print loop

• 対話型評価環境• Python には組み込みで付属している

• ちょっとしたスニペットを気軽に試したり

Page 60: アルゴリズム取引のシステムを開発・運用してみて分かったこと

運用やデバッグへの応用• 何か問題が起こったときは REPL に入る

• 取引システムの API を手動で実行できる• デバッグに大活躍する

• これがなかったらと思うと…

Page 61: アルゴリズム取引のシステムを開発・運用してみて分かったこと

スモールスタートしよう

Page 62: アルゴリズム取引のシステムを開発・運用してみて分かったこと

実装の面でのスモールスタート• 優先順位をつけて作れるところから

• データ収集は最優先、取引部分は後回し• データさえあれば取引はシミュレートできる

• 実際にやってみると失敗も多い• 増改築しやすいように作る

Page 63: アルゴリズム取引のシステムを開発・運用してみて分かったこと

金額の面でのスモールスタート• 最初はシミュレーションから始めた

• 実際には注文せず「もししていたら?」を分析する• 次のフェーズとして数週間は少額の取引をやってみた

• 一取引あたり数百円規模• 上手くいくことを確認しながら繰り返し増資

• 今ではひとつの取引で数十万円が動いている

Page 64: アルゴリズム取引のシステムを開発・運用してみて分かったこと

最近の状況

Page 65: アルゴリズム取引のシステムを開発・運用してみて分かったこと

Q: で、儲かってるの?

Page 66: アルゴリズム取引のシステムを開発・運用してみて分かったこと

A: 割りと

Page 67: アルゴリズム取引のシステムを開発・運用してみて分かったこと

どれくらい?• 半年間の実績 : 投入資金が 1.3 倍になった

• 内、金融資産の価格上昇由来 : 82.7%• 買ったまま特に何もしなくても増えた分

• 内、アルゴリズム取引由来 : 17.3% • 取引することで増えた分 ( こちらが重要 )

Page 68: アルゴリズム取引のシステムを開発・運用してみて分かったこと

ある日の取引益 (24H)

※ 上記はチャンピオンデータではなく、この資料を作っているときに、ふと取得したもの

長期間で見ると振動しながら上昇トレンドを続ける

ごく短期間で見るとマイナスに振れることもある このグラフでは、金融資産の価格変動分を補正して除外している

Page 69: アルゴリズム取引のシステムを開発・運用してみて分かったこと

とはいえ• 一年だけ成績の良い金融商品はゴロゴロある• 継続して良い成績を残すことが重要

• まだ本格稼働してから半年しか経っていない

Page 70: アルゴリズム取引のシステムを開発・運用してみて分かったこと

今後も儲け続けられるか?• おそらく!ただし…

• 全く同じ手法が通用する期間は限られるはず• 以下のどれか、あるいは組み合わせの影響

• 市場の傾向が大きく変化する• 壁を超えるのが困難なレベルで手数料が上がる• マーケットインパクトが大きくなる

Page 71: アルゴリズム取引のシステムを開発・運用してみて分かったこと

まとめ• アルゴリズム取引のシステムを作ってみた

• 開発と運用を通して色々な知見が得られた• 楽しい!

• ✌('ω'✌ ) 三✌ ('ω')✌ 三 ( ✌'ω')✌

Page 72: アルゴリズム取引のシステムを開発・運用してみて分かったこと

ありがとうございました