2009-05-24 遺伝的アルゴリズム事始め
遺伝的アルゴリズムは,最適化手法のひとつです。名前のとおり生物の進化に触発された方法らしく,人工知能と呼ばれるもののひとつだそうです。
上場投資信託(ETF,Exchange Traded Fund)の値動きを分析するために,遺伝的アルゴリズムに挑戦してみることにしました。最近,業界で流行っているみたいですし。(本当なの?)
要件
簡単にソフトウェアの要件を考えてみることにしました。
- 個体数1万×100世代の進化を,実用的な時間でシミュレートできること
- 汎用性を持たせるために,遺伝的アルゴリズムのフレームワークを作成する。フレームワークの上にアプリケーションを実装する
- Windowsプラットフォームに特化する
- 処理系にはVisual J# .NETを使う
静的構造
「やりたいこと」がだいたい決まったところで,ソフトウェアの静的構造を考えてみることにしました。
<画像の説明>ソフトウェアの静的構造です。遺伝的アルゴリズムのフレームワークと,上場投資信託を分析するための実装クラスを描きました。(全体構造ではありません。収まりを良くするために,主要なクラスを抜粋して記述しています。)
静的構造の説明を少々。はじめに,遺伝的アルゴリズム特有の事柄を抽象化することにしました。特有の事柄とは,「交叉」「突然変異」「適応度関数」のみっつです。「進化によって個体の状態が変わる」という性質と,個体が持たなければならない性質は細かく分けることにして,各々をEvolvableインターフェイスとAgentインターフェイスに追いやることにしました。
つぎに個体に実行時間を与える方法と,実行時文脈を渡す方法を考えました。これには,Agentインターフェイスの実装クラスのprocess(...)メソッドに実行時のコードを書くという,よく見かける方法を採用することにしました。Javaの世界だとinit(...)の方が好まれそうですが,あえてprocess(...)にしてみました。
今回はシーケンスがさほど複雑ではないので,静的構造が決まったら,9割はできたようなものでした。ほかの細かな点は,実装しながら考えることにしました。
実装
実装には,Visual J# .NET(Visual Studio .NET 2003)を使ってみました。Visual J# .NETを選んだ理由は,手持ちのPCにインストールされていたからです。最初は純粋なJavaを使おうと思っていたのですが,止めました。最近のJavaの開発には,Eclipseという開発ツールを使います。わざわざEclipseをインストールするのは面倒に感じたのと,Eclipseは過去に速度が遅いという評判があったので,軽快に動作するVisual Studio .NET 2003で済ませてしまうことにしました。
気になる実行結果は,「日経225連動型上場投資信託の取引パターン」でお話しています。
今回の目標のひとつは,遺伝的アルゴリズムのフレームワークを作ることでした。出来上がったものを見ると,フレームワークと呼べるほどの汎用性のある構造には仕上がっていないのかもしれません。
個体の表現はクラスであり,クラスを具象化したものがオブジェクトです。よって,「オブジェクトが進化する方法」を考えることになるのですが,オブジェクトが進化するって,どういうことなのでしょうか。
私は,「単純にオブジェクトの内部状態が書き換わること。進化の良し悪しは適応度関数の値が決めることであって,本質的な問題ではない」と考えました。オブジェクトの内部状態を決めるのは,変数です。変数の表現をどうすべきか,最後まで悩みました。実装クラス(Trader)にべったりくっついてしまう結果になりましたが,これが良いのか悪いのか,どうもすっきりしません。