見出し画像

botのロットを最適化したい


「仮想通貨botter Advent Calendar 2022」投稿記事です。



最強(当社比)のbotが完成してホクホクしてるぼく
https://twitter.com/muzineco/status/1360983257202921475


ロット上げたときのぼく
https://twitter.com/muzineco/status/1362081827846975495


botは本当に儲からないのでやらない方が良い


ロット調整は難しい


勝てるbotができたときは、大体こんな感じでロット調整すると思います。

・とりあえず小さなロットで始めてみよう
・安定して勝つようならロットを増やしてみよう
・ロットを増やしても利益が上がらなくなったらやめよう

この方法は実践的だと思いますが、ロットが大きいから負け始めたのか、実は他に要因(環境変化)があって負け始めたのかがわかりづらい、という課題があります。日によってボラティリティや出来高は変わったりしますからね。

また、法人と個人で2つ口座を持っているような人あるいは知人に口座開設させてお金払って使わせてもらっている悪い大人であればABテストのような形でわずかにパラメータを変えたbotを同時に実行し、損益を比較することで判断する、という手も考えられます。

しかし、API実行時のエラー・遅延状況の違いや、どちらのbotの注文がわずかに先に到達したかによる違いなど、botパラメータに依存しない要素の影響が大きく、正確に検証できるとは限りません。

そもそも出来高が少ない取引所であれば、自分のbotが相互に影響するようなロジックになってしまい、まともに検証できない場合もあるでしょう。

本Noteでは別の視点から検証する方法を提案するものです。


ロットを上げるとは何か


大きな金額でトレードするには主に2つの方法があります。

1.最大ポジション保有量を上げる
2.最大注文サイズを上げる

他にも、指標の強さに応じて可変サイズ注文するパターンや、ポジション量に応じて平均注文サイズを変化させるパターンなど、平均的にロットを上げる方法は考えられます。が、最大値以外の数値が変わる場合の評価方法は複雑かつロジックにも依存すると思われるため本Noteでは扱いません。

難しいのでやめたほうが良い

本Noteでは上の2つを指して「ロットを上げる」と定義しています。
次節以降で評価する方法を考えます。

ロット評価の基本的な考え方


きちんと利益が出るように作られたbotであれば、ロットと利益の関係は、大体こんな感じの振る舞いを示すと思います。

①:ロットを上げるほど利益が増えるが、だんだん増加は緩やかになる
②:あるロットで利益の最大値をとる
③:以降はロットを上げるほど利益が減る(やがてマイナスへ転換)

見づらいけど、横軸=1より左範囲はすべて①、右範囲はすべて③

つまり今のロットが、①の範囲であればまだロットを増やせる、③の範囲であればロットが過剰であると判断できるわけです。

それを測るために、微分的な考え方を使います。

今のロットがほんのちょっと増えた場合の利益変化を推測し、利益が増えるなら①の範囲、利益が下がるなら③の範囲と判断します。

これが基本的な考え方です。

次節から具体的に考えていきますが、検証データとしてbotが実際に取引した直近の約定履歴を用います。

最大ポジション保有量の検証方法


最大ポジション保有量に関しては、自分の約定履歴のうち、正・負交互に最大ポジションに達した約定における約定価格のみを集計して、利益が出るかを調べます。

例えば、自分のbotが下図の通り、約定ID 0 → 20 という順番で約定・ポジション推移するとします。このbotは最大ポジションが±1です。

なんか紫とか赤とか青で囲まれてる範囲気になるけど気にしない

最大ポジション量をほんのちょっと上げた場合・・・
例えば最大ポジション量を1→1.001とするなら、下図のような推移となり、約定ID2,11,12,13,17,19(図の赤丸)のみ、約定枚数がわずかに増えるでしょう。

なんか紫で囲まれてるの気になるけど以下略

本当にそう言えるか?考えてみます。

(A)なぜ赤丸部分が変わるのか?
最大ポジションに達する際の約定は、最大ポジションを超えないように注文枚数が制限された約定であったと言えます。そのため最大ポジションが少しでも大きければ、注文サイズも大きくなっており、その分約定枚数が増えることになります。

(B)それ以外の約定では変わらないのか?
そもそも最大ポジションに達しない約定は、最大ポジションを上げたところで約定内容は変わりません。元々最大ポジションによる制約を受けていない約定だからです。

(C)赤丸以外にも最大ポジションに達する約定があるけど?
最大ポジションに達した後、反対方向の最大ポジションに達する前に再び同方向の最大ポジションに達した場合の約定(図のID4,7,16)では、最大ポジション量を上げても約定枚数は変わりません。最大ポジションに達するまでの必要枚数は変化しないからです。

よって、最大ポジション保有量を上げる前と後の違いは、赤丸部分のみなので、この部分の約定価格"のみ"の利幅(平均売却価格 - 平均購入価格)を計算します。

この時、
・利益が出るならばグラフ範囲①に位置する。つまり最大ポジション保有量を上げるべきである。
・損失となるならばグラフ範囲③に位置する。つまり最大ポジション保有量を下げるべきである。
と言えるでしょう。


最大注文サイズの検証方法


最大注文サイズに関しても、ポジションを検証したときと似たように、約定履歴の中から影響のあるものを集計します。具体的には、約定履歴の中から最大注文サイズが約定したときの約定価格のみを集計し、利益が出るかを調べます。

注文には成行と指値があるので、分けて考えてみます。

成行の場合

成行注文における「最大注文サイズが約定したときの約定価格」とは、以下の例(成行注文サイズ1)で言うと$17,060買いと$17,010売りの部分、最も悪い約定価格を指します。最大注文サイズが増えることで内容が変わるのは、この部分のみです。

こんなに執行コストがつらいロジックを組む人はいない

平均約定価格は、$17,028の買いと$17,037の売りであるため、このbot全体の取引では利益が出ています。しかし、ID3とID13のみを比較すると、損失になっています。

これは注文サイズが大きすぎることによる執行コストのためです。

仮に注文サイズが1ではなく1.001であれば、$17,060の買いと$17,010の売りのみが0.001多くなるので、その分だけ利益は減ったはずです。

よってこの例では、グラフ範囲③に位置するため、最大注文サイズを減らすのが正しいでしょう。

(補足)
データ例の中で明確にできなかったのですが、注文サイズが1ではなく0.5などの成行注文、つまり最大注文サイズではない成行注文について集計する必要はありません。最大注文サイズが影響していない注文だからです。

指値の場合

約定履歴の中から最大注文サイズが約定したときの約定価格のみを集計し、利益が出るかを調べます。

再掲です

指値における上記はつまり、最大注文サイズで指値注文し、その注文が一度にすべて約定したときを指します。
例えば下図(最大注文サイズ1)の例だと、約定枚数が1となる$17,030の買いや17,050の売りのことを指します。

本当にそう言えるか?考えてみます。

(A)なぜ約定枚数が1の部分が変わるのか?
例えば最大注文サイズがちょっと増えて1.001だったら、botは1枚ではなく1.001枚の指値を注文します。このときの約定枚数は、相手方が1枚ピッタリの注文でない限り1.001枚であったはずです。

(B)他の約定は変わらないのか?
botが最大注文サイズを指値していたのか否かはわかりませんが、いずれにせよ相手方の注文がその枚数しかなかったことは確かです。つまり、「元々botが0.1枚や0.2枚しか注文していない」、「1.001枚注文していたが相手方の注文が0.1枚や0.2枚だった」のどちらかです。どちらにせよ約定枚数は変わりません。

よって、仮に注文サイズが1ではなく1.001であれば、$17,030の買いと$17,050の売りのみが0.001多くなるので、その分だけ利益は増えたはずです。

つまりこの例では、グラフ範囲①に位置するため、最大注文サイズを増やすのが正しいでしょう。

(注)
指値の場合は注意点があります。

ここまで、自分の約定履歴自体は変わらない前提で、最大ポジション保有量や最大注文サイズをちょっと変えた場合どうなるか?を考えてきました。
しかし、指値注文時は自分の注文が板乗りする影響で、自分の約定履歴の内容そのものが変わってしまう可能性があります。
極端に言うと、注文サイズが100であれば、自分の注文の前に複数の注文が差し込まれ、自分の注文が約定する枚数が少なくなると考えられます。

最大注文サイズを増やす場合は、この効果も認識したうえで増やす必要があります。おそらく「想像してたよりもあまりサイズ増やせないんだな」と認識することになると思います。逆に「想像してたよりサイズ減らしてもあまり利益変わらないんだな」と思ったりするかしれません。

やっている人にはわかる


補足


このような方法を用いてグラフ地点②を目指すと、理屈上は収益最大化します。が、ギリギリの調整はあまり収益に寄与しないでしょう。(前述のグラフの形より、イメージ的には、もっと頂点付近が平べったい形になる)
環境変化によってグラフ範囲③に転落するリスクも増え、頂点付近の調整のメリットは少ないと思われます。

また、簡単にするため「手数料」について無視していましたが、もし手数料が発生する取引であれば、「手数料分をマイナスした上で利益が出ているか?」について調べる必要があるでしょう。


実際にやってみた


以下は実際に稼働中のbotにこの考え方を適用したものです。
約定履歴を取得して検証してみます。

何やってるかバレそうだから一部内緒。値幅も隠して利益率のみ表示したよ

エイヤで決めた最大ポジション保有量と最大注文サイズでしたが、どちらも利益が出ているので増やせそうです。つまりグラフ①の範囲。

こういうbotを量産したい委員会

利益推移も順調なので、ロットを上げてみます。
するとこんな感じ。

最大ポジション保有量はまだ増やす余地がありそうですが、最大注文サイズによる利益はマイナスになってしまいました。こちらは減らした方がよさそうかな、という感じ。

そしてロットを増やしたことによる利益推移は以下。

‥‥‥効果ある?

  ( ゚д゚)
_(_つ/ ̄ ̄ ̄/_

  ( ゚д゚ ) わからん
_(_つ/ ̄ ̄ ̄/_

いかがでしたか?ロットを上げることはできるのか?その基準は?効果は?について調べてみました。
残念ながらロットを上げた効果についてはわかりませんでしたが、損益に何らかの影響を与えていそうですね。今後ロットを上げた効果が分かることを期待しています!
この記事ではロットを上げる基準とその効果についてまとめてみました。
よろしければこちらの記事についてもご覧ください!


今回の内容では元々それなりにアタリを付けたロットで始めたので、ロットを増やしてもあまり効果がなかったと考えています。

実際、ロットが影響する取引件数自体がそもそもかなり少なかったです。

ロット変更前時点で、取引件数2300回のうち最大ポジション保有量に達した回数は184回、最大注文サイズの取引に至っては9回しかありません。つまりポジション増分は8%程度、注文サイズ増分は0.4%程度の取引にしかもともと影響しないということです。

ロット変更後の取引では最大保有ポジション回数の割合は5.4%程度に減ったことから、最大保有ポジションが増えたことで、ポジション制限により取れていなかった利益を少しは取ることができたと想定しています。
一方で最大注文サイズは0.4%程度しかなく、多少増やしたところでほぼ影響しなかったと思われます。

この程度の影響だと、仮に利益が増えたとしても全体としては微々たるものです。あまりロットの限界を突き詰めても効果は薄かったということですね。

lotは儲からないので上げないほうが良い


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