mmbotの作成方法(バックテストのソースコード公開)

2019年10月29日

こんにちは、しゃちです。

今回はmmbotについて説明していきたいと思います。

※mmbotの基礎を身に着けたい方は下記の本を一読すると隅々まで理解できます。古い本ですので中古で100円ぐらいで手に入るのでおすすめです。

mmbotとはなにか

mmbot(market maker bot)とは現在値の上下に指値をいれて、それらが約定したときの値幅を利益とするbotです。

図1.mmbotの構図

値動きが上下に動いてくれるほど、利益がどんどん増えていく構造になっています。

ただし、指値の幅や提示時間によっては、片方しか約定せずに置いてけぼりになるリスクもあります。

例えば、下図のように売り指値だけ約定した状態で価格が値上がってしまうと損失を出してしまうことになります。

図2.損失を出すときの動き

ただしmmbotの性質上、片方だけ約定する瞬間は必ずあります。

これは同時に買い・売り指値が約定することはないため仕方がない部分ではあります。

値動きがどちらに動くか予測できない状態で在庫をかかえているということは、常に損失のリスクに晒されているということを意味しています。

そのためmmbotではこのリスクをどれだけ減らすかを考慮することが大切になってきます。

mmbotを作るうえで重要なパラメーター

実際にmmbotを作成する場合について考えていきましょう。

考慮すべきポイントは下記の3つです。

①指値の幅

②指値の提示時間

③在庫が偏った時の対処

これら3つのパラメーターを適切に設定すれば利益を取れるmmbotを作ることができます。

①指値の幅

指値の幅を小さく設定すると価格が大きく値動きした際にたくさんの在庫を抱えてしまいます。

しかしそのリスクを恐れて指値の幅を大きくしすぎても約定することができません。

適切な幅を取ることによって最適な利益を得られます。

図3.指値の幅が小さい場合

②指値の提示時間

指値を提示する間隔は約定させる上で重要なパラメーターになります。

間隔が短すぎると値動きが起こる前に指値を取り消してしまうため指値が約定しません。

間隔が長すぎると約定回数が少なくなってしまいます。また、価格が上昇・下降したときに指値を修正できずに置いてけぼりにされるリスクがあります。

③在庫が偏った時の対処

指値の幅や提示時間を適切に設定しても在庫を抱えてしまう場合があります。

その際に在庫を減らす仕組みを用意しておくことが重要です。

対処方法の一例として下記2つがあります。

①指値のロット数を増やす

②指値の幅を短くする

抱えている在庫を処分できる方の指値に対して①または②を行います。

mmbotのバックテストの作り方

先の3つのパラメーターに対して最適な値を見つけるにはどうすればよいのでしょうか。

解決策のひとつとしてバックテストを行うという方法が考えられます。

バックテストとは過去の価格を用いることで疑似的に取引を行う検証方法です。

それでは、バックテストの作成方法について説明していきます。

バックテストの概要

今回のバックテストでは下記の処理を行います。

①現在値から離れた位置に指値を置く。

②指値が約定したら、次回更新まで指値は消える。

③指定時間が経過したら①に戻る。片方の指値だけ約定していた場合は①の処理の際に残っている方だけ指値を出す。

 

注意事項としては下記となります。

・指値計算時に使用する現在値は約定データを利用しています。BestBid-BestAskの中間値ではありませんのでお気をつけください。

・遅延を考慮していませんので、実際にmmbotを稼働させる時は必ずしもバックテスト通りの結果となる訳ではありません。

バックテストの下準備(①データ収集)

バックテストを行うためには過去データを収集する必要があります。

今回はBitflyerの約定データを利用してバックテストを行うことを想定しています。

スナフキンさんのブログにpythonでの収集方法が記載されています。

約定データを集めたい人はこちらを参考にしてみるとわかりやすいと思います。

BitFlyerの約定履歴を取引開始時から現在まで全て取ってくるスクリプト

バックテストの実行

約定データを収集出来たらバックテストを行います。

バックテストのコード(python)は下記の通りになります。

内容についてはコメントアウトに説明書きを入れながら作成したのでそれを読んでください。

※上記ソースコードの無断転載は禁止です

 

パラメーターの設定

パラメーターの設定方法は「設定項目」内の変数を修正してください。

それ以外の項目は変更しなくても問題ありません。

変更項目は下記4つになります。

①変数「csv_file」 → 約定データのファイル名

②変数「limittime」 → 指値の提示時間

③変数「sasinedelta」 → 設定した数値の分だけ現在値から離して指値を置く

④変数「lot」 → 指値に乗せる注文量

 

参考例として下記のパラメーターの場合の記載方法を記します。

①約定データのファイル名「test2018.csv」

②指値の提示時間「5秒」

③指値の距離「100」

④指値の注文量「0.1枚」

 

上記の設定をpython内の項目に変更する時は下記のように修正します。

csv_file = “./test2018.csv” #バックテストのコードと同じ階層に約定データを置いた場合

limittime = 5

sasinedelta = 100

lot = 0.1

 

バックテストの実行

参考例として、2018年1月31日のデータを使ってバックテストを行った結果を見ていきます。

使用したパラメーターは下記の通りです。

limittime = 5

sasinedelta = 50

lot = 0.01

上記パラメーターでバックテストを行った結果は下記のようになりました。

右肩上がりのグラフになっており良さそうな感じはします。

このようにバックテストを行うことで理想的なパラメーターを見つける手助けになります。

まとめ

バックテストを通してmmbotの仕組みが少しでも伝わったと思います。

次は実際にmmbotを作成しますが、この工程はご自分で作成してみてください。

mmbotの仕様としてはおおまかには下記の通りの内容になります。

①指値がある場合は指値をキャンセル

②現在値を取得し、買い・売り指値を出す。

③一定時間の待機をして①に戻る。

※(厳密には、部分約定した場合の端数の処理などを考える必要もあります)

 

ちなみにソースコードを公開しない理由は2つあります。

1つは自分でプログラムを開発できるスキルを身に着けて頂きたいからです。

これはnoteで販売しているbotを購入する人にも言えることです。

botを購入して終わりになってしまっては意味がありません。

自分の手で開発を行い、常に改善を行う必要があります。

相場は常に変動しているからです。

そのbotはいつか役に立たなくなります。

その時に自分で改善できるスキルを身に着けておく必要があります。

mmbotの開発は難しくはないのでひとつひとつの動作をネットで調べながらプログラムを書いてみてください。

mmbotを作成していくうえで色々なアイデアが湧き出てくると思います。

その時に自分で作成したプログラムならば隅々まで理解しているので簡単に修正することができます。

 

2つ目の理由は競合を増やさないためです。

mmbotの収益は市場の成り行き売買が源泉となっています。

つまりmmbotが乱立すると源泉の取り合いを行うことになるのです。

また、本当に価値のあるmmbotがあるならば絶対に公開することはありません。

mmbotを公開してしまうと同じアルゴリズムが市場の指値を占有してしまい自分の利益が少なくなってしまいます。

それならば、最初から自分のbotでロット数を増やした方が利益になります。

 

 

また、高頻度取引の本を調べると下記のような本などがありますので参考にしてみてください。


※もしバックテストのmmbotの作り方がどうしても分からないというのであれば、ここでソースコードを販売してます。このnoteで得た利益は、私のお昼ご飯代になるだけなので出来るだけご自分で作成してみてください。

また、こんなbotのアイデアがあるんだけどもどうしても作れないという方がいれば、いつでもお手伝いいたしますのでご相談ください。

 

という訳で本記事は以上になります。