mmbotを何種類か作った時のメモ書き

記事の大部分は無料で読めます。有料部分は投げ銭がてら僕の改善メモ。

Liquidにて何種類かmmbotを作成し、実際に稼働した時のメモ。現在も試行錯誤中。
mmbotについての説明はこの記事を見ている人には不要だと思われるので省略。自分なりに考え、理解した部分を噛み砕いて文章化。間違ってるところも当然あると思うのでご了承ください。

2019.08.21:5. おまけ 追記により2000円値上げ

1. 戦略の種類

一括りにmmbotと言っても多くの戦略が存在し、界隈では多種多様なHFTbot(高頻度取引)も全てまとめてmmbotにされている気がする。ので以下mmbotで統一。
調べていくうちに、僕がmmbotに使用できる戦略は以下のようなものがあると仮定した(名称は勝手に命名)。

1.1 価格追従タイプ
MidPriceを基準にその付近の上下に指値を出し、そのスプレッド分の利益を得るという戦略。他と比べて最もマーケットメイク戦略っぽい。
t秒間に取りうる値幅(以下アクティブスプレッド)をいかに予測し、目一杯利益を得られるかがポイント。以下イメージ図

ある時点での板状況が上の状態であったとします。ここでもしbest askとbest bidの内側に指値を打つとしたら100299円ショート、100251円ロングになり、両方約定出来たとしたら差額の48円が利益となりますよね。
これがもし次のt秒間で100150円から100450円の間まで変動すると予測出来たらどうでしょうか。100449円ショートと100151円ロングで差額298円となり単純に最良価格の間に挟むよりも利益が大きくなります。
歩み値や板情報等の分析を行い、このアクティブスプレッドを予測することがこの戦略の要であり、予測精度の高さがそのまま利益に直結すると言えるでしょう。当然100%予測出来ることはまず無いため、片方だけ約定。あるいは両方約定しないということが多々あります。(在庫を抱えるリスク)
不利なポジションを持ったまま価格が動いてしまうとその分が損となるため、アクティブスプレッドだけではなく自分のポジションも要素として考慮する必要があります。
そしてこれはアクティブスプレッド間だけではなく、スプレッド間でも同じことが言えます。実際にスプレッドの内側に指値を打ち続けるとジワジワ損していきます。

メリット
・値動きの少ない相場に強い。
・ボラの大きい相場に強い

デメリット
・一方的な値動きに弱い。(いわゆる逆選択のリスク)
・在庫管理が重要。

1.2 投資指標タイプ
とある投資指標に従い指値を入れる方向を決め、反転時までの値幅を利益とする戦略。mmbotだけではなく、5分足や1時間足の時間軸でも多く用いられているものでしょう。以下イメージ図

反転するまでに積んだポジションの値幅が損益となります。

これは戦略を練っている最中に見つけたとある指標のスコアZ(横軸)と5秒後の値動き(縦軸)の散布図。情報係数は様々な期間で計測しましたがおおよそ0.06~0.1程度。このような指標を計算し、例えばスコアが 1.0<Z<3.0 ならばロング。-3.0<Z<-1.0ならばショートのようにします。
投資指標を計算する際に用いるパラメータ。また、エントリーするスコアの閾値も同じくパラメータであり、設定する値が重要になっています。
バックテストはもちろんのこと、用いている指標がカーブフィッティングされたものではないかのウォークフォワード分析が必要です。

メリット
・一方的な値動きも得意とする。

デメリット
・値動きが少ないとジワジワマイナスになるかも(これは僕の場合で、用いる指標がもっと優秀であれば、あるいはパラメータの選択が良ければそんなことはないのかもしれません。)
・反転時の決済時に指値の場合は約定せずに置いていかれるリスクがある。

1.3 指値ばら撒きタイプ
これは多分板情報とOHLCVデータを元に、値幅いっぱいに指値をばら撒きまくるもの。ナンピン戦略?まだ研究してないため詳しいことは分からない。というか逆選択のリスクが高そうであまり良さそうには見えない。

1.4 機械学習タイプ
ディープラーニングを行い、学習データを生成してそれを取引に用いる戦略。これもまだ勉強中であり、詳しいことは分からない。
おそらく学習データをベースとして他の戦略と組み合わせることになるのだろう。

2. 戦略の組み合わせと時間軸

僕の考えられる限りでは大きく分けて1.戦略の種類の項で上げた戦略があり、そしてそれらは部分的に組み合わせることが可能だ。
今現在は1.1+1.2として、1.1の戦略をベースに投資指標を用いてアクティブスプレッドを予測している。
また、さらにそれらの戦略があるうえで時間軸の違いによっても変わってくる。
例えばOHLCVデータを用いるのならば、それが1秒足なのか、5秒足なのか。2秒足、3秒足、4秒足、10秒足といった軸で戦っている人もいると思う。ここにもmmbotとしての個性が出てくる。
もし仮にとりうる値幅を全て取れるとしたら、取引量は多ければ多いほどよく、時間軸は短いほど有利になるが実際には例えば1秒足をベースに1秒後の値動きを…なんていうのを1秒周期に行うのは不可能。これについては次の3.ロジックのコストにて説明する。

3. ロジックのコスト

僕は現在Python3でコーディングしたbotをConoHaVPS上に置いて稼働させています。そのため、Pythonをベースに説明します。
コストというのはここでは処理時間、CPUやメモリ等の使用率などとします。

前提として、コストはなるべく少なくしたほうが良いです。
処理時間が長くなるとそれだけmmbotにおいて不利になってしまう。極端な話をすると例えば1秒周期でループさせたいロジックがあるとして、1秒後の値動きを予測できたとしてもその計算を行い、発注までに2秒かかっていたらまるで意味がないです。
ミリ秒単位で細かく高速化を図り、そのミリ秒の差で指値を打てたおかげで約定できた ということも起きるかもしれませんので。

CPUやメモリについてもなるべく省コスト化することで、botを稼働させるサーバーのマシンも低スペックで済みます。低スペックで良いということはサーバーレンタル費もそれだけ節約できます。

ロジックのコストというものが何か、というのを大きく3つに分けます。

3.1 APIによるコスト
APIに関わるコストは主に2つあり、1つ目は通信によるコスト。もう一つはアクセス回数制限です。

1つ目について、歩み値取得やポジション取得、発注時やキャンセル時など、あらゆる時にAPIによる通信が行われます。そしてその処理は0秒ではなく、ミリ秒単位ですが確実に時間がかかってしまいます。APIによる通信は可能な限り減らすべきであり、もしくは大きな部品ごとにサブスレッドによる処理としてなるべく通信のラグを減らすなどが考えられます。(その場合は代わりにCPUやメモリのコストが高まりますが…)

2つ目について、取引所によってAPIによる通信回数には一定期間毎に上限があり、Liquidの場合は5分間区切りで300回までです。
仮に1秒間で1周するロジックがあるとし、その中でバランス取得→歩み値取得→ポジション取得→注文のキャンセル→板情報の取得→売り指値発注→買い指値発注と7回APIによる通信を行うとします。そうすると(300秒(5分間)/1秒 * 7回)は2100回の通信となり、300回の上限を優に超えてしまいます。通信時間によるコスト増加も考えると、APIによる通信はやはり可能な限り減らすべきです。

追記:実際には上記の通りでないようです。でもPrivateAPIが5分間に300回まで っていうわけでもなさそう。よくわかんない。

3.2 コード処理によるコスト(時間)
取得したデータはそのまま使うわけではなく、当然コード内で加工しているかと思います。その処理時間も0秒ではなく、ミリ秒単位で時間がかかってしまいます。
処理は可能な限り高速化を図るべきであり、余計な処理は入れないこと。

3.3 コード処理によるコスト(CPU,メモリ)
処理時間だけでなく、CPUとメモリにも配慮できるとなお良いです。例えば僕は一時期AWSの無料枠でbotを動かしていましたが、メインスレッドとサブスレッド3つ動かすロジックを組んだ際にCPUコストが高すぎてAWSの無料枠じゃ動かすことが出来ず、ConohaVPSの1GBプランをレンタルし、稼働させました。今では低コスト化に成功しましたが、面倒なのでConohaVPSを使用し続けています。またコストが増大する日も来ると思うので。あと美雲このはちゃんがかわいいので。
マルチスレッド化、変数の肥大化などによりCPU使用率とメモリが食われてしまうと、マシンに負荷がかかり、処理時間に影響が出てしまうことがあります。


以下有料部分(メモにつき、投げ銭だと思ってもらえれば。)

ここから先は

1,634字

¥ 4,000

この記事が気に入ったらサポートをしてみませんか?