フューチャー技術ブログ

自動売買ツールを自作してみよう

フューチャー夏休みの自由研究連載の6回目です。

自己紹介

  • 所属:テクノロジーイノベーショングループ
  • 社会人歴: 5年目のITコンサルタント
  • 好きな言語:Python、Go
  • 苦手な言語:日本語
  • 趣味:
    • 特定な問題を解くため、技術要素を組み合わせて応用すること
      • 例えば、ボードゲームやルービックキューブのようなパズルをモデリングしてプログラミングで解くこと
    • 時間かかる定形作業を自動化すること

夏自由の研究では、大人たちが大好きな刺激的な「おカネ」の話をしようと思います。個人プロジェクトとして、IT技術、数学と金融の知識を融合し、FXバイナリオプションの自動売買ツールを作ります。

🚧どんなに技術を使っても、ハイリスクであることは相変わらず、損する可能性も十分にあります。本記事への利用についてご注意ください🚧

本文にもFXバイナリオプションのルールを簡単に説明しますが、どうしてもやってみないとイメージつかない方は、こちらの記事 も参考ください。証券会社が提供している無料のデモ取引をやってみるのもオススメです。

自動売買ツールを自作する経緯

趣味優先

私はデータを操ることが大好きです。自然からのデータも人間活動におけるデータも収集&分析し、知られていない隠れた知識を解明することが、何よりも楽しいことだと思います。

学生時代から少しずつ株や投信やFXを試してきましたが、あまり良い資産運用の成績にならず、自分には才能も金運も無いことを自覚しました。時間とお金の無駄にならないように資金管理や投資を自動化し、時間のコストの削減と成績向上に繋げたら良いなと思い始めました。

失敗談

今年5月頃、私はFXバイナリオプションをトレードした実履歴です。入金した15万円は、1週間でほぼ全損し大失敗でした。
全損

後から振り返ると、様々な誤りや感情的な動きを発見しました。

例えば、22日14:00の操作は、画面上の「買」と「売」ボタンを間違えて逆操作してしまいました。この1ポチったミスだけで、3万円以上の損失が1秒以内に発生。投資は本当に色々な意味のハイリスクですね。

ちなみに、FXバイナリオプションは判定時刻(普通は数時間以内)のFX通貨ペアの値段は、あるターゲット値段以上になるか、以下になるかを当ててみるゲームです。もちろん、当たりなら賞金が出て、はずれなら当初の参加費を没収されます。

FXバイナリオプションのルールを簡単に説明すると、

  • 1枚の「HIGH」チケットを買うと、特定な時刻にターゲットFX通貨ペア(例えばUSD/JPY)が、もし約束の値段以上なら1000円もらえる、もし逆な場合は0円をもらえ、チケットの購入料を全額損する
  • 同じように、1枚の「LOW」チケットを買うと、特定な時刻にターゲットFX通貨ペアが、もし特定な値段よりより低いなら1000円もらえる、もし逆な場合は0円をもらえ、チケットの購入料を全額損する
  • 判定時間までにいつでもチケットを買えますが、それに必要な料金(数円〜1000円)が、ターゲット通貨ペアの値動きなどに影響され、時間と共に変動していく

上の表に結果欄にある「SETTLED」は、予測があっていた意味で、チケット枚数かける1000円のペイアウトがもらえます。「OUT_THE_MONEY」は、予測が外れ、チケット購入料を全損。値動きの途中で、損切りや利確でも行えます「SELL_BACK」。

売買の間にFXのスプレッドスプレッドのような値段差は手数料として代価になります。

上の1週間のトレードに対して、初期損益はゼロからスタートとすると、損益の変化は以下のようなグラフになります。

前半、5万円弱儲かる時期もありますが、後半は調子に乗って大額の取引を始め、一気に転落。2、3回ぐらい反発がありましたが裏返すことは無理でした。

人間性の弱点

客観的に反省したら、これはまさに人間性の弱点を映っている鏡ではないでしょうか。

  • 人間は感情に左右される、非理性的な行動を取ること多々でしょう
    • 利益を得られる状況では、安定を求めてリスクを回避する。少しだけ評価益になった時、すぐに利確で逃げてしまう
    • 損失を被る状況では、リスクを負ってでも損失を回避し、その結果、逆に損失拡大してしまう
    • よって、いつも益が小さく、損が大きい、それを繰り返している
  • 人間は反応が遅くて冷静に計算したら時間がかかる。少し躊躇したら、利益のチャンスや損切りのタイミングなどすぐに見逃してしまう
  • 人間はどんなに慎重に操作しても、疲れや不注意でミスで誤操作を避けるのはがどうしても難しいでしょう

こんな弱い人間、武器を何も持っていないままで戦場に立つのは、勇気ではない、ただの犠牲です!

武器となる機械で実現した自動売買を使うメリットが明らかですね。

  • 機械が休まずに、僕が寝ている間でも働いてくれる
  • 機械が理性的で、我々人間のように感情的に左右されることがない
  • 同時に複数のパラメータやデータを見ることができ、短時間に反応できる

チャンスは本当にあるのか

大数の法則

機械を使って代行トレードすれば、勝つでしょうと思ったら? ちょっと待ってと!

敵は人間性だけではないのです。儲けるかどうかは期待値や確率の問題です。カジノでギャンブルのゲームたちは、勝つ確率が明確に計算されて、リターン対リスクの期待値がそもそもマイナスですね。

「マーチンゲール」という負けたら倍に賭ける方法、「パーレー法」という勝ったら倍に賭ける方法などなど、いろいろストラテジーが存在しますが、みんなカジノに負けてしまいます。

そもそも期待値がマイナスの不利な儲けは、個別に勝つ確率が確かに0ではないが、ただし長期的に繰り返すほど勝てる希望がなくなります。最終的に大数の法則につかまるわけです。

売買のスプレッドが存在する時点で、期待値が不利なわけです。言い換えると、ランダムにトレードするなら、売り手と買う手がバランス良い場合、証券会社はカジノの親のように安定な収入が入ってくるわけです。

敵は数学ですので、武器も数学にあります。

チケットの値段は判定時刻になるまでずっと変化しているので、勝つ確率とペーアウトの比率も常に変動しているんです。例えば、勝率は90%の標的は、チケット値段が950円、勝つ可能性が高いけれど、勝ったらただプラス50円益、万が一負けたら、マイナス950円損です。実は利益の期待値がマイナスなので、不利な取引です。また、仮に勝率は25%、チケット値段が200円の場合、4分の3の可能性でその200円を損しますが、勝ったら800円を得ます。それは有利なトレードです。チャンスがあれば繰り返し続けるべきです。

いつも各チケットの予想勝率と今の値段が有利か不利かをリアタイムで計算して、有利の場合しかトレードしないことは、勝ちパターンですね。

問題の根本は、やっているゲームに(例えばバイナリオプション)、スプレッドに勝てる有利なトレードのチャンスが本当にありますか、それとも、ギャンブルのように、いつもマイナス期待値の罠っだらけですか。

検証してみないとわからないですね。

予め習った有用な概念

  • 分散の長期記憶性に基づいた予測のGARCH
    モデルを使って判定時の値段帯に落ちる確率を計算する
    • 金融時系列データに対して、値動きの方向より、値動きの分散(ボラティリティ)の予測の精度が高いらしい
    • Pythonはさすがデータサイエンティストの大好物、GARCH及び拡張モデルの実装ライブラリまで提供している → arch
  • ケリー基準を使ってトレードは有利なのか不利なのか、有利ならトレードの量を何割にするかを決める
    • kelly = win_rate - (1-win_rate) * premium / (1-premium)
    • kelly値は、1回のトレードで手元にある投資用の総資金の割合の基準。それは、損失のリスクを考えた上で、論理上資金を一番効率的に増やす投資の比率である
    • kelly値はwin_rate(勝つ確率)とpremium(チケットの料金は950円、ペーアウトは1000円の場合はpremium = 950/1000 = 0.95)によって計算された
    • win_rate<=premiumの場合、kelly<=0、それは不利な取引を意味して、手を出さないほうが良い
    • win_rateが1ではない時、オールインしてはいけない。それは論理上全損のリスクを避けられて、いつまでも裏返す可能性を放棄しない

改めて、その悔しい1週間の手動の取引を振り返って見たらどうかと思い、取引発生時点以前の値動き情報をGARCHモデルに投入し、判定時の勝つ確率(win rate)を評価し、理性的な投資比率(kelly)を出してみました。

どうやら汗が出るほどびっくりしました。手動で取引したのは、半分以上が不利な(kelly<0)取引だったことが分かりました。そして、有利な取引に対しても、もっと「正確な」比率で資金を出せば、もっと良い結果になったはずです。悔しくてたまりません。

自動売買ツールを自作する流れ

市販より自作

「自動売買」をグーグルで検索したら、つないで出てくるキーワードは、「比較」「おすすめ」とかはもちろん出てきますが、なんと「詐欺」「稼げない」のも出るので、危ない感を楽しめるリスク屋さん向けの雰囲気が湧いています。

私も市販の自動売買をあまり信用しない派です。なぜなら、みんなが掘りに行く金鉱には、もう金が無いと思うからです。売買シグナルやインジケータは最初はよく効くかもしれませんが、広く知られたら、真似られて利益も山分けになって利益が小さくなるのです。

自作の良い点をあげます。

  • 手数料がかからないので、手数料が利益に勝てない心配なし
  • 中身がすべて把握できて安心
  • 自作なのでカストマイズしやすく、随時に進化できる

ターゲットをバイナリオプションに設定

主流のFXや株の戦場を避けて、ちょっと亜流系のバイナリオプションを対象にしています。
理由は下記のようにリストアップします。

  • 売買や勝負のルールは簡単
  • ルールによって、バイナリオプションはハイリスクだが、利益と損失の限界が取引の前にも読める
  • ターゲットはFXデータなので、公開性がある
  • 比較的に値動きの方向より、値動きの分散(ボラティリティ)の予測の精度が高いらしく、バイナリオプションは、値動きの分散の大小の予測でトレード可能(後述のストラドル法)
  • リスクとリターンの最大値が操作する前にも読める。比較的に単純なルールなので、自動化しやすいところがある
  • 自動売買に委ねるが、高頻度の売買操作が不要(1シリアルは例えば2時間で1回の操作のみ)のため、不正操作の理由でアカウントがフリーズされるリスクが減った(ただしゼロリスクではない)

具体的に実践した流れはこんな感じ

  • アカウント開き、やり方やルールを慣れていく(2、3年前から)
  • データ収集を自動化(今年4~5月から、コロナのGWの暇つぶしでスタート)
  • 画面上の手動操作の代わりに、売買操作の機械化、自動化(5~6月)
  • 予測モデルを導入し、直近の歴史データを使ってシミュレーションを実施(←直近まで)
  • パラメータ調整しつつ、実運用を試みる(←今ここ)
  • 経済指標などの外部要素の影響を分析し、もう一層モデルの予測精度を向上(将来プラン)

この自動売買システムが本当に儲けられるか? 実績はどうだったの? を報告したかったんですが、まだそのステップに進行していなくて、ちょっと残念です。今回はシミュレーション結果だけ出します。
本運用開始してから継続的に報告しようと思います。

システムの構成はこんな感じ

システム構成

(1)ポーリングクライアント

Pythonのrequestパッケージのセッションを使って、ログイン後のCookie情報を保持しながら継続的にAPIを本物クライアントの発信頻度でデータをポーリングするクライアントです。将来的にデータを分析にするため、Elasticsearchを使って溜め込んでいます。

Kibanaですぐに可視化できるのが便利ですね。

Kibanaで可視化

(2)取引に関するAPIクライアント

取引命令を出すコンポーネントです。ポーリングのクライアントとほぼ同じ作りですが、管理上の利便さと開発時の誤操作を防ぐため、別コンポネントに分けています。

(3)予測モデル

前述のGARCHライブラリを使って、2〜4時間の履歴データを使って、近い将来の確率をイメージとして、このような情報を出す感じです。

「次の判定時刻20:20に、USD/JPYはターゲット値段106.6より高い確率は32%、106.6以下の確率は68%」

(4)意思決定

1ターンの中に、資金数や保有できるチケット数の数の上限がありますので、kelly値がプラスになったらすぐに動作するのではなく、全体的なベストを求めたいのです。

早い段階に決断したら、後からもっと良いチャンスを失うかもしれませんが、ずっと躊躇して決めないままで、過去に戻れないし、最良の停止タイミングを探す秘書問題が参考になるかと思います。
そして、いろんなストラテジーやパラメータをシミュレーションして継続的に調整するのです。

(5)シミュレーション

Elasticsearchに溜めた過去データは学習の材料になって、どのようなストラテジーやパラメータを適用したら儲かるか、そして、過学習にならないように、今回使っているデータだけにフィットするじゃなくて、モデルのパラメータをなるべく減らします。

GARCHモデルのベイズ情報量規準 BIC(モデルのパラメータの数が多いほどモデル精度の評価に罰を与える評価基準)を参考しながら、一定の水準以下のものだけ採用する形になります。

以下はいい加減なパラメータを使ったシミュレーションです。初期10000円の資本金とその後の変化の結果です。

6月1ヶ月間の実データを使っています。私手動で1週間全損より、1ヶ月間でほぼ全損でしたね。

全損グラフ

パラメータを適度に調整して、少し改善された例ですが、まだ右肩下がりのトレンドですね。

右肩下がりのトレンド

以下は、ストラドル戦略と普通の売買のミックスを使ったシミュレーションの資本金の変化の結果です。
月末に月初の2.5倍になりました。

ストラドル戦略の利用結果

ストラドル戦略とは、前述の値動きの方向を予測しなくて、値動きの変動(分散やボラティリティ)の量を予測できたら儲かる方法です。

【補足】ストラドル戦略

オプション取引の戦略の1つです。

例えば、USD/JPY 108.7 HIGHUSD/JPY 108.6 LOWの同枚数を購入し、相場が108.6〜108.7の範囲で動くと損失、相場がその範囲外に大きく動いた場合は利益です。

このストラテジーは、ある程度リスクのヘッジが可能です。もっと大きい意味は、予測モデルを使って、値段の動き方向の精度とは関係なく、値段の分散(ボラティリティ)の予測は、ある程度の精度が出るなら問題ありません。

注意書き

バイナリオプションは1アカウントつき買えるロット数は上限がある(ギャンブルとかも一緒)、複利として回せません。つまり、他の金融投資みたいに、儲かったお金を用いて、比率的に拡大していくことは不可能なので、長期的な運用には向いていません。一定規模の資金になったら、配当のように徐々に出金していくのが賢明的ですね。

どんなに技術を使っても、ハイリスクであることは相変わらず、損する可能性も十分にあります。

その理由は以下です。

  • 予測モデルのインプットがあくまで過去のデータだけ、未来に対する予測の精度が有限である
  • 有利なトレードでも、個別に損することが十分ありうる。続けてやらないと、大数の法則の威力が発揮できない

まとめ

  • 今回自動売買ツールを自作する理由
    • トレーディングは人間性違反で、私もそれに才能がない
    • 信用しない市販系ツールにお金をかけたくない
    • IT技術なら持っており、数学・金融の知識なら勉強できる
    • 本当に行けるかどうかを探求したい好奇心駆使、何よりも趣味が大事
  • 今回自動売買ツールを必要な知識、技術
    • FXバイナリオプションの概念とルール
    • GARCHモデル:分散の長期記憶性に基づいた予測のGARCHモデル
    • ベイズ情報量規準:過剰適合を防止のため、モデルの精度をあげる同時にパラメータの数を最小化する用の指標
    • Kelly基準:勝率とペーアウトが分かれば、取引が有利か不利かを判別でき、有利な取引に対して何割を賭けたほうが効率的なのが分かる
    • ストラドル戦略:値動きの方向の予測を諦め、分散の予測で儲かる手法(経済指標などの開示前に使うのが有効かもしれない ←将来にこの要素を自動取引に取り込むと思います)
    • 自動化データ収集、変形、分析に必要なIT技術
    • 丁寧なパラメータ調整、長く続く忍耐
  • 今回自動売買ツールを作った結果
    • 手動トレーディングはダメダメでしたが、自動化によって、リターンの期待値がマイナスの不利なトレードを避けられた
    • ストラドル戦略などリスクヘッジの手法を併用して、いい結果を得られるシミュレーションをした
    • システムの改善をしつつあるが、手動トレードをやめて、完全に自動化するのはこれから。

寝ている間もチャリンチャリンが聞こえるかもしれません(笑)

豚の貯金箱