Bitflyerの端数処理およびハスーbotに関する考察・対策 – 誰が損しているのか.-

人生の貴重な時間をBitflyerの取引エンジンの端数処理を考察することに使っているみなさんこんにちは.スナフキンです.こういう無駄でくだらないことを考える時間がぼくは大好きです.

2019/3/30追記

2019/3/30 AM4:00以降端数処理が変わったようで、小数点以下の損益まで管理されることになったみたいです。以下の記事はそれ以前の話になります。

さて,bitflyerFXの端数処理が話題になって1週間ほど経つ気がするので,これまでぼくなりに考察した結果をまとめようと思います.なお,ぼく自身は端数botを作る気は今の所ありません.理由は,

  • 今のところ自分のbotの方が期待値が高いこと.
  • 端数botの応用範囲が極めて狭く,他の取引所などへの拡張性が全くないこと.
  • 加えて,エッジが極めて明確かつ公にされていて,消失までの期間も短いと予測していること.(取引所の対策があると思っている.むしろこのように情報が公に広まることで対策が早まってほしい.)
  • ビットフライヤー利用規約第8条禁止行為「本サービスに関連するまたは当社が管理するシステム、サーバー、ネットワークその他のエラー、バグ、セキュリティーホール、その他瑕疵を利用する行為」に該当する可能性があり、アカウントbanリスクがある。(わりにリターンが低い)

です.そのため、本記事を読んでいる方にも端数処理を利用したbotを作ることはおすすめしません。確信はありませんが、ビットフライヤーから売買差益以外で直接お金を吸い取っている可能性があり、むしろやめたほうがいいと思います。

ではさっそく本題に入ります.

BitflyerFXの端数処理方法と端数botのエッジ

bitflyerの証拠金の端数処理(小数点以下の損益の処理)はround関数によってなされています.

round関数の処理は,hohetoさんのtweetに書いてある通りで,例えば0.01BTCで51円幅を取った場合は0.01×51=0.51をroundで処理して,1円の利益となり,また-149 x 0.01 = -1.49をroundで処理して-1円の損失となります.つまり同じ額の利益と損失を得るのに,狭い幅で利益を得て,損切りは広い幅を許容することができるのです.これが端数のエッジの根幹部分になります.ちなみに0.01枚で50円幅を取るとround(0.5)=0となります.(0.5は0と1の両方に近いが,0が偶数なので.)なお,この端数処理は約定ごとになされるため,例えば1枚で50円幅を取った場合でも成行注文で端数botterの0.01の注文にぶつけて100分割で執行された場合には,0円の利益になります.この端数処理の影響はロットが大きくなるほどに軽減されますが,部分約定は自分ではコントロールできないので,ロットを大きくすることでの対策は難しいです.

0.01BTCで取引するとき,青(実際の値幅と損益の関係),オレンジ(p円の利益を得るときの本来必要な値幅.).縦軸:損益,横軸:値幅

誰が得していて,損しているか

さて,まず得をしている側である端数botの期待値と戦略を考えます.これは次のようになります.

  • 0.02のような0.01より大きいロットで26円幅を取るのはあまりお勧めではない.なぜなら51円幅より小さい幅で部分約定して0.01で約定させられると利益が0円になるから.
  • 期待値 = 51円幅の指値が約定する確率 x 1円 – (マイナス150円からマイナス250円幅以下になる確率 x 1円 + マイナス251円幅からマイナス349円幅になる確率x2円+マイナス350円幅からマイナス450円幅になる確率x4円)

よって,

儲かる条件:①-150円以下の約定が発生する確率(損切り発生確率)が51円幅が約定する確率(利確発生確率)に比べて十分に低く,②損切り幅が十分に小さいことが多い(=大きな損切りの発生確率が十分に小さい)

となります.

例として,次のような場合を考えます.

  • +51円幅の指値が刺さる確率が0.7(PL=1)
  • エントリーも利確も刺さらない確率が0.08(PL=0)
  • -150円から-250円幅の損切りが発生する確率が0.2(PL=-1)
  • -251円から-349円幅の損切りが発生する確率が0.01(PL=-2)
  • -350円から-450円の損切りが発生する確率が0.001(PL=-3)
  • それ以下の損切りが発生する確率が0.009でこのときの平均損切り幅は800円(PL=-8)
    (上記の確率を全部足すと1になる.)
    この場合の1取引あたりの期待値を計算すると,
    E = 1 x 0.7 + 0 x 0.08 -1 x 0.2 – 2 x 0.01 – 3 x 0.001 -8 x 0.009 = 0.404
    となり,1取引あたり平均0.404円儲かることになる.
    そして重要なのは,端数botterが増えることで①の条件と②の条件の両方が悪化し,期待値が下がることだ.51円幅の指値を出すユーザーが増えれば約定確率は下がり(=損切り発生確率が上がり),さらに損切りは滑りやすくなる(=大きい額の損切りが発生しやすくなる)ためである.

さて,ここで損している側についても考えてみます.

50円以下の約定は損益が0円になり,この値幅分はBFが得をしていることになる一方で,51円幅の端数最適化された約定分はBFが支払っている. 端数を意識しているユーザーが増えるほどBFは損をすることになる.金の流れとしてどうなっているかを整理すると,

a. 端数を意識していないユーザー⇄b. BF→c. 端数を意識しているユーザー

となる.aとcの間の端数による損益のやり取りはあるのか考えてみたが,それは直接は生じていない.ただし,端数botterが増えることによって端数を意識していないユーザーの約定数について「端数的に有利な約定数<端数的に不利な約定数」となり,間接的に通常ユーザの取引の期待値が下がると思われる.

対策

端数でできるだけ損をしない方法としては,ロットに対して端数最適な値幅を取ることを意識するのがいいと思われます.(約定枚数はコントロールできないが,値幅はコントロール可能なので.)感覚としては,300円以内の値幅ぐらいを狙う人は気にした方がいいですが,それ以上の値幅を狙うトレーダーは気にする必要がないでしょう.

考察に使ったnotebookのgistを載せておきます.自由に使ってください.最後になりましたが,bitflyerが小数点での証拠金管理を実装することを祈っています.なお,notebookで考察したときの文章をそのまま貼り付けた部分があるので,文体が散らかってましたがご容赦ください.ありがとうございました.

Gist:

https://gist.github.com/Snufkin0866/fe1a6e1bec4ecd24d879161dae998ec4

シェアする

  • このエントリーをはてなブックマークに追加

フォローする