AI開発とコード性能の最適化に関する中間報告書

ストーリータイトル画像

ポーカーボットは死んだ、ビットサーファー万歳!- いやマジで何があったんだ?

PokerBotとPoker Advisorはとても面白いプロジェクトで、どちらもとても勉強になりました!ポーカーアドバイザーは、画面からカードを拾い上げ、自動でAIに入力してハンドの結果を予測します。ポーカーボットは、それ自体を再生することが計画されていたが - すべてが準備されていたが、オンラインポーカーはかなりスイスで禁止されていました。

だから、前に進む時が来たのです。しかし、次の大きな課題は何だったのでしょうか?

ビットコインの価格チャート

私は、ビットコインにほとんど興味を持っていたCoinbaseというクリプトブローカーに偶然出会いました。

彼らはきちんとメタトレーダーなどのお気に入りの取引ソフトを接続できるAPIを持っています。でもダメだ

計画はもちろん、お気に入りのトレーディングソフトとのインターフェイスではありません。むしろ、自分のニーズを考えて一から自分のインターフェイスを作っていこうというのが、私の考えでした。それは信じられないほど難しく、非常に急な学習曲線でしたが、それは確かに努力する価値がありました。

最初のアルファ版ができました。インターフェースは非常に醜いですが、フォームは機能に従っています。私の考えるよくできたソフトウェアは、主に派手なユーザーインターフェースではありません。むしろ、私は自分のソフトウェアを単純に動作させたいのです。その通りだ背景にはインストールも何も、画面の前に座ってソフトに次の作業を指示することもありません。ただそれを実行して、魅力的に見てください。

インターフェースは、基本的に市場データの可視化とAIの正規化された入力データで構成されています。

何を学んだのか?まず、Coinbaseに接続する必要がありました。私はAPIについて多くのことを学びましたが、幸いにも利用可能なパッケージがあるので、とても簡単でした。

プログラミングのパフォーマンス面の紹介

AIのためのデータ構造化については、基本的にはコードのパフォーマンスに関する知識を多く学ばなければなりませんでした。完全に狂ってしまうほどに。それはほとんどが私がまだトレーニングから帰ってきた7歳のマシンに取り組んでいることについてでした。いい感じに熟成されていますが、本当に年季が入っているのがわかります....私の次の差し迫ったコンピュータからは、私のユースケースのために約10倍の性能を期待できますプロセッサだけでも、スレッドをたくさん消費すれば400%くらい速くなる(私がやっている)。

気がつくと、以下のような状況になっていました。

私のコードは8年分のデータを処理するのに約1週間かかります(各データポイントは2S~126,000,000の価格ポイント)。一方で、次世代のプロセッサやグラフィックスカードは数ヶ月先の話で、非常に期待が持てます。

処理するデータ量が膨大なので、コードのパフォーマンス最適化にハマってしまいました。マルチスレッドワーカーで複数のタスクを同時に処理する経験はすでにありました。結果、私のCPUは4コアなので、すでに3.5倍弱の性能を持っていました。8年分のデータを処理するのに2日かかっていました。それにしても酷すぎた。バックテストを実行すると、結果が見たくなる。そして、私はそれを早くしたいのです。

パフォーマンスの最適化をもっと調べて、C#のタスクをベースにしたワーカーの抽象化を独自に開発しました。基本的には、INA Lahrでのインターンシップで学んだファブリケーションの方法を実装しています。入力キューと出力キューを持つマシン(またはワーカー)を持っているようなものです。キューはバッファのような役割を果たし、各CPUコアが均等に作業を分散させるのに役立ちます。ワーカーがキューやバッグからアイテムを取り出して処理する、モジュール式でスケーラブルなワーカーパイプラインのようなものです。

これにより、パフォーマンスも大幅に向上しました。一晩くらいで全てのデータを処理できるようになったのですが、どこまでできるのかだけで、さらにレプリケーションしてみることにしました。私はVisual Studioの拡張機能「dotTrace」を購読していますが、これはコード内のボトルネックを見つけるのに最適です。トレースを記録して、実行にかかる時間を関数ごとに見ることができます。全く期待していなかった機能を発見しました - 出力文字列ビルダーはパイプライン全体をスロットル化します。で詳しく紹介されています。スタックオーバーフロー問題

全体的に、プロセスは非常に簡単です。

  1. 最大の電力負荷を特定する
  2. 排除する
  3. 納得のいく性能になるまでやり続けましょう。

上の例では、これが ID 10584 の CLR ワーカープロセスになります。 この時点では少し混乱しそうですが、JetBrains には右側のコールツリーがあり、どの関数が使用されているかを確認することができます。

結論と課題

この辺はもっとパワーがあるだろうけど、今のところ結果にはかなり満足している。

今は2年が4分も経たずにあっという間に過ぎていきますが、もっと近くで見られる行動ならばとシフトチェンジしました。

バックテスターのスクリーンショット

エクイティラインだけでなく、統計も保存されています。僅かなパフォーマンスの低下だけで、口座数や戦略をいくらでもシミュレーションすることが可能です。

私はすでにインジケーターなどでいろいろな戦略を試しています。有望な結果がなければ結局、私は代わりにこれらのことを何もしない必勝法を見つけました。トレンドを追うわけでも、それに賭けるわけでもありません。何も予測しようとしない完璧なエントリーポイントでも、完璧な出口でもありません。かなりシンプルですが、攻略の詳細には踏み込みません。箱の外で考えれば、何かが見つかるかもしれません。

エクイティライン上昇

年率20%という驚異的なリターンだ。公平に考えれば、買い持ち株戦略で余裕を持たせたはずなのに、一方で何も予測していない、こんな非常識なスパイク(とタンブリング)があるわけがない。

何が可能で何がダメなのかを見極められるようになりました。サンドボックスでの完全な市場シミュレーション。ほぼ無限の可能性を秘めたテスト環境。

今日はここまでです。私の現在進行中のプロジェクトを垣間見ていただけたでしょうか。