僕が僕のために作っているトレードアプリの話なのだが、AIプログラミングにおいてどういうバグが発生するかの参考になると思われるため、こういうことが起きて、それを観測するたびに修正している、ということを記事にする。
BitbankBot: アプリ概要
現在のバージョン: v1.5.7
このアプリは、BitbankのAPIを使って、BTCやDOGEなど複数通貨ペアにおいて、独自のアルゴリズムに則って自動でトレードをするものである。
特殊な制約として、取引所Bintbankは一つの通貨ペアにつき30しか指値注文を記憶してくれないため、それ以上の指値注文をしたい場合は真のオーダーブックをこちら側で管理する必要がある。バグの原因はだいたいこれに起因するエッジケースで、今回もこれ。
症状とその発見
ある通貨ペアにおいて、同じ指値で大量の注文を発注してはキャンセルする、ということを無限に繰り返していた。
Bitbankの公式Webアプリ上で大量の発注とキャンセルを繰り返しているのを直接観測したことで発覚した。
原因
実際に「現在この価格での指値で注文とキャンセルが繰り返されている」とAIに伝えて原因調査を依頼し、原因が判明した。Gemini 3.1 Proを使った。
同一の指値における注文が、アプリ上で指定した「最大注文数」を超える時に発生していた。たとえば最大注文数が10であるにも関わらず、同一価格の指値注文が15予定されていた場合、15注文しようとするロジックと、最大注文数以上になったらキャンセルするロジックが衝突し、発注とキャンセルを繰り返す状態になっていた。
対応
まずさしさたっての対応として、同一価格においては「古い注文から順番に実現」として、最大注文数を超えた場合はそれ以上の発注がないようにした。
発注とキャンセルのループが止まったことを確認したので、次にもう少しマシな対応を考える。
そもそも現在のロジックは、同一価格の指値注文が多くなりすぎるものだった。それは無意味なので、マージして注文量を増やすことで、オーダーブックがスッキリすることが期待され、そのように修正した。
将来的には、注文価格が細かくなりすぎないように一定の幅で注文するようにすべきかもしれない。
所感
今回Gemini 3.1 Proでバグの調査と修正をした。バグ周りは上位モデルを使いたいため、上位モデルの残量は常にある程度残しておくことが望ましい。Proプランでいつまで使わせてもらえるか不安である。
こういうバグが割とカジュアルに発生するので、AI製アプリを他人のために作るのは実は難しい。どうでもいいサービスならどうでもいいだろうから作れると思うが、このアプリのように金銭のやりとりが直接的に発生するものになると深刻度が一気に上る。
仕様について注意深く見て、あらゆるエッジケースを想定してテストすればできそうではあるが、何しろ金が動くようなものは本番環境がすべてであるため、その再現コストは膨大になるだろう。なにより、エッジケースの発見を机の上だけで全部できると考えるのは傲慢である。しかしそうして頑張ってテストしようとすると、結局そこがボトルネックになるため、AIプログラミングの有難みが薄れる。
AIプログラミングをやるからには全責任を自分で負うし、また失敗時にはその痛みを負うという覚悟のもとでその威力が発揮されるものと思う。まぁ今回のバグはそんな大した痛みにはならんのだけれど、ただ無駄に取引所に負荷かけてしまい、その点に関して申し訳なく、また制限をかけられる可能性もあったわけで、深刻にならなかったのは結果であり、やはりバグとしては重大だったなぁと思う。
コメント