
失敗に学ぼう~強いボットは失敗から作られる~
こんにちは、Hohetoです。
振り返ってみると、3月は米国株も仮想通貨も底打ちして反発しました。
本当は3月は「冬の時代のbotter」をテーマにした記事を書こうとしていたのですが、趣向を変えてみたいと思います。
今回のお話は、「これから仮想通貨ボットに取り組みたい人」あるいは「すでに取り組んでいるけどなかなか成果が出ないと悩んでいる人」に向けたものです。
ですが話自体は一般的なものなので、プログラミングをしない人やそもそも仮想通貨に興味がない人まで、参考にできるところがあるのではないかと思います。
強いボットの作り方とは
twitterで爆益報告しているbotterは数多くいます。
月に1000万円以上も稼いだり、もっと言うと数分や数秒で1000万円以上稼ぐといった夢のような話が界隈には溢れています。
彼らの爆益を横目に自分の損益を見てみると…あれ?1000分の1?(下手すると爆損)みたいに悔しい思いをしている方も、それ以上に多いのではないでしょうか。
筆者も、現在開拓中のボットでは同じように悔しい思いをしています。
ですが、強いボットを作るにはそれなりに多くの研究時間、開発時間を投じなければなりません。
やりたいけれどもなかなか一歩踏み出すのが難しい、新しい領域に足を踏み入れるのを躊躇されている方(もちろん筆者も含めて)に向けて、ボット開発をスタートして改善のイテレーションに乗せるまでのポイントをまとめてみました。以下、流れです。
まずは作る。
フィードバックを作ることを大切にする。
1つ1つ、細かな改良を積み重ねる。
では、1つ1つ見ていきましょう。
1. まずは作る。
まずは作ってみる。
スタート地点に立つ、ということ。
最初から完璧なものを作ろうとしないこと。それは無理。というか完璧なものなんて存在しない。
試作品でいいので、まずは作って動かすところまで辿り着こう。
教本ばかり見ていても、手を動かさなければ上達はありえない。
「何を作っていいか分からない」という人は、最初はインターネットにあるサンプルプログラムを動かせばいい。
サンプルプログラムを選ぶのに時間をかけないこと。どうせ利益の出るものは転がっていない。
※詐欺プログラムにだけは注意しよう。
※初心者はDeFiではなく、国内取引所用のプログラムから始めよう。
実際にお金を賭けてみる。
プログラムが正常に動作することを確認したら、デモトレードではなく実際のマーケットで発注してみる。
その際、必ず少額でやること。賭けるお金を少しにしておけば、それ以上の損失が出ることは(まず)ない。賭けるお金は数千円で十分。
そして最初の損失を恐れないこと。
最初から利益を出そうとすると、いつまで経ってもスタートできない。
どの分野でもそうで、最初から上手にやるのは無理。最初は必ず失敗する。
損失は勉強代と考えること。勉強代は必ずかかる。初期投資の一部と考え、回収できるよう継続して頑張ろう。
たくさん作る。
量を作ることで質が伴ってくる。目標はアウトプット重視で立てるのがよい。
例えば、最初の1ヶ月は「週に1つボットを作る」という目標を立ててみる。
逆にいうと、1つのボットに1週間以上時間をかけないこと。名残惜しくても、次の週は違うボットを作る。
他の人が1つ試す間に複数回試すことができれば、それだけ上達のチャンスが訪れる。
そして、いろいろなタイプのボットを作ろう。簡単なものでいい。
高頻度タイプ、例えばマーケットメイクをするボットなら、とりあえず買い指値と売り指値を1つずつ出すようなボットを作ってみる。
上下予測をするスイングボットなら、直前の何本かのローソク足だけで次の上下を予測し、ポジションを作るボットを作ってみる。
DeFi上で動かすボットなら、とりあえずプログラムからスワップしてみる。
いろいろ作ってみて、まずは好きか嫌いかで判断するのがよい。
どのタイプのボットを一番育てたいか?を決めたら、次は改善のための準備をしよう。
2. フィードバックを作ることを大切にする。
手元にすでに稼働しているボットがあるとして、次はこのボットから「フィードバック」を得られるようにする。
ボットの挙動を把握する。
最もよくないのは、「自分が何をやっているか分からない」ということ。
ボットの挙動を少ない労力で把握できるようにしよう。
リアルタイムに把握できるのが最もよい。野球のスイングを練習するとき、良し悪しがその場で分かるのと次の日に分かるのでは、上達に天と地の差が生まれる。
ボットは単位時間の中で何回発注しているのか?
そのうち何回約定(何回成功)しているのか?
なぜそこで発注しているのか?
その注文から得られた利益はどの程度か?
少なくとも上記が分かっていないのであれば、きちんと把握するための仕組みを作る必要がある。立ち止まってきちんと時間をかけること。
そして、可視化に力を注ごう。
上手に可視化できれば市場の理解が進むし、改善点が明確になる。
失敗を可視化する。
失敗をなるべく分かりやすく・正確に・できれば原因を伴って把握できる仕組みを作ろう。
失敗の場所が分かれば、分析して一つ一つ改善をすることが出来る。
この繰り返しによってその後の失敗を大幅に減らせる可能性がある。
まずは、損益グラフを出力しよう。
急に損失が出ているところがあれば、そこに改善のチャンスがある。
そして、チャートの上に自分のボットが発注した場所をプロットしてみよう。どの発注が損失につながったか、視覚的に把握することができる。
損失だけが失敗ではない。
本来得られるはずの利益を得られていなければ、それは失敗になる。シミュレーションでは得られるはずだった利益を得られていないのはどこか。
きちんと把握して改善につなげよう。
失敗の可視化ができていれば、改善のチャンスは山程現れる。できていないなら、今のうちに仕組みを作ろう。
取得データの数を増やす。
失敗の原因を見極めるためには、データを測定する必要がある。
いろいろなデータを取得できる仕組みを埋め込もう。データを見れば、当時のそのボットの挙動を正確に把握できるようにしよう。
例えば、
発注の根拠となった指標はいくつだったか?
発注の価格やサイズを決める根拠となった指標はいくつだったか?
当時のポジションはいくつだったか?
APIのレスポンス時間は何msだったか?
WebSocketの遅延は何msだったか?
直前の市場はどのように動いていたか?板は?約定は?
競合はどのような動きをしていたか?
取引所の状態は正常だったか?ビジーではなかったか?
失敗の対策を正しく行うにはこれらのデータは必須だし、分析のために追加でデータが必要であれば速やかに実装する。
可視化の仕組み、フィードバックの仕組み、そして原因究明のためのデータ取得の仕組みが揃えば、改善ループのプロセスを作り上げることができる。
あとは日常的に改善ループを重ねる段階となる。

3. 1つ1つ、細かな改良を積み重ねる。
要素を分割する。
ボットの収益力に関わる要素を、なるべく細かく分割して、漏れなくリストアップする。
そして、それぞれの要素について、まずは少しだけでいいので改善する可能性のある施策を考える。
それぞれに対する細かな改善の積み重ねが、ボットの総合力を決める。
いきなり「最強のボット」を目指すのではなく、コツコツと小さな改善を繰り返えそう。
要素とは、例えば以下のようなもの。これをさらに細分化していく。
予測力。
もちろん高いほうがよい。が、最高のものを求めるといつまで経っても開発に着手できない。まずひとつ作る。他ができてから改善に着手する。
発注速度やキャンセル速度。
もちろん早いほうがいいが、改善のためにさらに細分化すること。指標計算の速度、サーバのスペックや場所、…
遅延耐性…
実運用での劣化度合い…
いきなりすべて改善しなくてもよい。以前より少しだけ改善できればいい。
改善に費やした時間と収益に与える影響は、比例しない。
「ほとんど時間のかからない改善であっても、収益に与えるインパクトが大きいもの」があるし、数十時間かけて改善しても収益力は微増するだけ、というものもある。
だから時間のかかる改善を1つ行うよりも、簡単に行える改善を複数種類行うほうがよい。
それぞれの改善についてBestを求めると時間がかかりすぎる。Betterを積み重ねるのがよい。
ABテストを検討する。
改善の前後について、正確に効果を把握するのは案外難しい。
例えば、「平均10msの処理が改善後は平均5msになった」というのは分かりやすいが、「指値の出し方をこう変えると収益が1.5倍になった」というのを正確に評価するのは難しい。
その修正を行わなくても、収益は1.5倍かそれ以上になったかもしれない(単に相場が変わっただけ)。
こういうときは、ABテストを検討する。
1箇所だけ変更を加えた同じプログラムをそれなりの期間同時に動かして、実際にどの程度改善されているかを判断する。
1つ1つの改善によって「本当に1歩先に進めているか」を確認することが大切。
1歩ずつでも先に進めれば、そのうち効果は目に見えてくる。
改善ループをなるべく素早く、なるべくたくさん回す。
あとは、改善ループを回す。
本気でボットで収益化したいなら、試行錯誤と改善を繰り返すこと。
この改善ループを回しやすいことから、ボット開発には比較的短時間・高頻度の取引を行うタイプの取引形態のほうが向いていると考えられる。
ところで界隈には、突出した能力(金融機関での豊かな経験、MLに関する深い造詣、インフラ~アプリケーションまでカバーする幅広いエンジニアスキルなど)を備えた人が、収益力の高い強ボットを開発していることがあるが、
改善ループのやり方はそういった能力を持たない人でも、やり方次第で実行することができる。
終わりに
偉そうに語りましたが、自分はまだまだ探求の途中の身なので!
共に研鑽を積んでいきましょう。
では、ビットコおじさんことイーロン・マスクの名言で締めたいと思います。
"Don't be afraid of new arenas"
「新しい舞台に立つことを恐れるな」
"Don't be afraid of new arenas" - Elon Musk pic.twitter.com/ntRQfa3Fvi
— Elon Musk News (@ElonMuskNewsOrg) March 16, 2018
では、よきbotterライフを!
来月をお楽しみに。