SSブログ

Rで遺伝的アルゴリズムを使ってみた [プログラミング]

投資対象の時系列データに投資戦略を適用して得られる投資効率を最大化することを考えます。投資効率は投資戦略を特定するパラメータ群の関数となりますが,かなりザラザラした関数らしく,Rのoptim関数といった通常の最適化ライブラリでは手に負えません。

いったんは焼きなまし法を自己流でプログラミングしたりもしましたが,どうも感触があまりよくなく,最適解になかなかたどり着けません。そこで,Rの遺伝的アルゴリズムのライブラリを使ってみることにしたので,備忘のため書き留めておくものです。[1] 遺伝的アルゴリズムとは

ググればいろいろ出てくるので詳しくは述べませんが,要は最適化関数のパラメータ群の候補を有性生殖と淘汰という遺伝子のシミュレーションによって育てていこうというものです。

ここでいう淘汰とは基本的に最適化関数の値が悪いものを捨てることで,有性生殖とは交叉と突然変異による新たな遺伝子を作り出すことです。

[2] Rの遺伝的アルゴリズムのパッケージ

RにはGAという遺伝的アルゴリズムのパッケージがあります。取説は https://cran.r-project.org/web/packages/GA/GA.pdf ですが,使い方は極めて簡単で,gaという関数に,最適化したい関数,パラメータ群のとりうる範囲,チューニングのパラメータ,をセットして呼び出すだけです。

[3] チューニングのパラメータについて

パラメータ群の大半が実数のため,typeはreal-valuedを選択します。一部に整数のパラメータがありますが,実数を四捨五入する形で実装しました。通常の最適化問題では禁じ手に近いですが,遺伝的アルゴリズムのフトコロの広さを感じさせる部分です。

fitnessは最適化したい関数を定義します。最大化なので注意。複数パラメータの場合は例えばxを引数とし,関数の中でx[1],x[2],…を使います。複数パラメータの場合はmin,maxもc(…)のベクトルの形で定義します。

popSizeはパラメータ群(=遺伝子)の集合の個数です。デフォルトは50ですが,よくわからないのでそのままにしてあります。

crossoverは交叉率です。デフォルトは0.8ですが,後述する突然変異率を大きくしたいので0.6に下げています。

mutationは突然変異率です。デフォルトは0.1ですが,0.2に上げています。wikiによれば,crossover+mutation<1でなければいけないらしい。

elitismは評価値が高いものを次世代に残す場合の個数です。要はエリート。デフォルトはpopSizeの5%ですが,ワタクシはpopSizeの50%にしています。

suggestionsはパラメータ群(=遺伝子)の集合の初期値です。定義しなくても適当に決めてくれますが,前回のga関数の結果を引き継いで計算する場合に極めて重要です。前回のga関数を変数zに格納した場合,最後の集合はz@populationに格納されているので,次回のga関数の引数にsuggestions=z@populationを入れておけばよい。

おしまい。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。