Python3 進化する自動売買BOTのつくりかた:遺伝的アルゴリズムによる最適パラメータ探索手法の解説①

こんにちは!magitoです。

空前絶後のBOTブームで界隈は大盛り上がりですね!AKAGAMIさん(@kanakagami1978)とUKIさん(‎@blog_uki)の「ドテン君」、モイさん(@moycoin)の「MANA」など、様々なタイプのBOTが連日話題となっています。

かくいう僕もブームに便乗してBTCFX界隈に乗り込んできた身で、テクニカル指標の勉強や新ロジックの開発に日夜勤しんでいるところであります。(ちなみに以前はアルトコインの裁定取引BOTを中心に運用してました)

最近は「MANAコミュニティ」の活動を大いに参考にさせて頂いているのですが、そんな中、こんなことを試してみたり↓




MANAちゃん、進化させちゃいました。



、、、


「なるほど、、わからん。」

「ふぁ!?」

というような反響を結構いただいたので、「これ何やってんの?」ってとこを種明かし的に解説していきたいと思います。

まず、PART1(本記事)では遺伝的アルゴリズムのざっくりとした概要を説明し、次回の記事PART2では実際の自動売買BOTへの実装方法を解説するという2部構成となります。

ちなみに、僕自身、機械学習関連は先月から、プログラミング自体も初めて数ヶ月でして、至らない点や間違っている点が多々あるかもしれません、、そのときはバシバシ指摘いただけると嬉しいです!(特に機械学習を専門とされてる方の容赦ないツッコミを密かに期待しております、、!)

※念のため断っておきますが、本記事の手法をそのまま使うにせよ、アレンジするにせよ、必ず利益が出せるという保証はどこにもありませんのでご留意ください。あくまで「こんな方法もあるよ!」という提案の形で紹介させていただきます。

--------------------------------------------------------

目次

1.  遺伝的アルゴリズムとは

2. バックテストと最適パラメータ探索

3. 自動売買BOTを進化させる

--------------------------------------------------------


1.  遺伝的アルゴリズムとは

突然ですがみなさん、「ダーウィンの進化論」ってご存知でしょうか?高校生物を履修した方なら一度は耳にしたことがあるかと思います。その名の通り、ダーウィンさんが提唱した生物進化に関する理論なのですが、その中に「自然選択説」という考えがあります。

自然選択説(しぜんせんたくせつ、英: natural selection)とは、進化を説明するうえでの根幹をなす理論。厳しい自然環境が、生物に無目的に起きる変異(突然変異)を選別し、進化に方向性を与えるという説。出典:フリー百科事典『ウィキペディア(Wikipedia)』

つまり、動物のキリンさんを例に挙げると、「キリンさんの先祖は、高い所にあるきのみを食べたくて首を長くしたのでなく、たまたま他の個体より首が長くきのみを食べることができた個体が生き残り、子孫を残すことができた」ということです。(わかりにくかったらすみません、、)

逆にいうと、「きのみを食べられない首の短い個体は環境に適応できず、子孫を残せなかった」のです。これを自然選択(自然淘汰)と言います。


この自然選択を含め、生物進化の過程では、以下の3つの現象が起こります。

選択(淘汰):より環境に適した特徴をもつ個体が生き残り、繁殖すること。

交叉:個体の遺伝子が親から子に伝わるときに、その組み換えが起こること。

突然変異:個体の遺伝子がランダムに変化すること。

もし選択(淘汰)だけだと、全ての個体がそのときの環境に適応しすぎてしまい、みんな特徴や個性のない画一的な集団となるでしょう。そうすると、急激な環境変化が起こったときにどの個体も適応できず、種が絶滅してしまいます。そのリスクに対し、交叉や突然変異により多様性を保持することで、種が存続する可能性を高めているわけです。

これらの現象が、種が世代交代を繰り返す中で幾度となく起こり、結果としてキリンは首が長く、象は鼻が長く、ヒトは脳が大きくなった(と一説では考えられている)わけです。

「遺伝的アルゴリズム」とは、このような生物進化のメカニズムを、コンピュータ計算における最適解の探索に応用した手法のことです。

遺伝的アルゴリズムの分かりやすい使用例をモイさんが紹介されてますね↓


2. バックテストと最適パラメータ探索

ガラッと話は変わりますが、BOTトレーダーであれば、自作のBOTを稼働させる前には必ず過去データを用いてバックテストをしますよね!(市販BOTをそのまま使用されてる方はこの限りではないかもしれませんがw)

なぜバックテストをするかというと、「このロジックで実際に利益が出る見込みがあるか?」を確認するためです。

ですが、仮にロジックがどれだけ完璧でも、BOTの設定パラメータ(例えば利確/損切タイミングなど)が適切でなければ、大きく損をしてしまう可能性があります。そのため、バックテストによる最適パラメータの探索は、ロジックの確認に負けず劣らず重要なステップだと言えます。

最適パラメータ探索を一番てっとり早く行う方法は、「各パラメータのとりうる値の範囲を決めて、それらの組み合わせを総当たりで計算する」ことです。

しかし、この方法には弱点があります。「パラメータのとりうる値の範囲が広くなるほど、またパラメータの種類が増えるほど、その組み合わせ数は爆発的に増加する」という点です。

例えば、あるBOTのパラメータa、b、cがそれぞれ1から20の間の整数値をとるとします。このとき、全組み合わせ数は20×20×20=8,000通りで、1回のバックテストに0.001秒かかるとすると、計算にかかる時間は合計8秒で済みます。しかし、さらに同様の範囲をとるパラメータd、e、fが加わると全組み合わせ数は8,000×8,000=64,000,000通りとなり、合計64,000秒(約18時間)もかかってしまいます。

実際のBOTではパラメータの構成がより複雑になることも想定されますので、全部計算していると日が暮れるどころか僕たちの寿命がきてしまうことも、、w

上記の問題は、最適パラメータ探索に「機械学習」を利用することで解決できるかもしれません。「機械学習」による最適化は、「100%のパフォーマンスを出す完璧な解ではなくとも、90%〜程度のそこそこの解を短時間で見つけられればOK」なケースに有効です。

そして、この「機械学習」的な最適化手法の一つが「遺伝的アルゴリズム」というわけです。


3. 自動売買BOTを進化させる

それでは、遺伝的アルゴリズムをどのように使えば、BOTを進化(パラメータを最適化)させることができるでしょうか。

まず、BOTのパラメータを次のように置き換えてみます。

①パラメータ(a、b、c など)→遺伝子

②パラメータの組み合わせ([a=1,b=3,c=2]など)→個体

③パラメータの組み合わせのセット→世代

こうすると、1で説明した現象は次の操作に読み替えられます。

選択(淘汰):より適応度(BOTのパフォーマンス)の高いパラメータの組み合わせを優先的に選び、次世代にコピーする。

交叉:コピーされた2つの個体のパラメータ値をランダムに交換する。

突然変異:コピーされたある個体のパラメータ値をランダムに選び、変化させる。

ここまでくれば、あとはこれらの操作をコンピュータで処理できるようにプログラムに落とし込めば、「進化」する自動売買BOTの完成です。どのようなプログラムをかけばよいかは、次回のPART2にてソースコードを交えて具体的に説明したいと思います。


PART1は以上になります。

最後まで読んでいただき、ありがとうございました!