stockedge.jpの技術メモ

http://stockedge.jp/の中の人が書いてる技術メモ

市場平均に勝てることは既に実証されている!? Online Portfolio Selectionについて

ポートフォリオ最適化と聞くとMarkowitzの平均分散モデルを思い浮かべる人が多いかもしれない。しかし最近はオンラインポートフォリオ選択(Online Portfolio Selection、以下OLPS)という手法が研究されており、これが目覚ましい成果を挙げている。その成果の割にはOLPSの存在があまり知られていない気がするので、ここで紹介したい。

突破口を開いたAnticor

事の発端は2004年に公開されたこの論文。
[1107.0036] Can We Learn to Beat the Best Stock
著者らはAnticorというアルゴリズムを提案している。このアルゴリズムを使うと、市場平均リターンを超えるリターンを得られる上に、そのリターンは最も値上がりした個別株のリターンすらも超えるというのだ。

Anticorでは、ある一つの株価の時系列には負の自己相関があり、複数の株価の時系列間にはラグのある正の相関があると仮定する。つまり、値上がりしている株はその後値下がりし値下がりしている株はその後値上がりする、そしてそれらの値動きは複数の株の間で連動している、と仮定する。この相関関係を利用して逐次的に(一日毎に)ポートフォリオを最適化するのがAnticorである。
以下にPythonで書かれたAnticorのコードを示す。
31-39行目がAnticorの仮定を反映しているもっとも重要な部分である。Anticorでは値下がりしている株はその後値上がりすると仮定しているので、銘柄jより銘柄iの方が過去のリターンの期待値が大きかった場合、未来においてはその関係が逆転する(と仮定している)ので、銘柄iの重みを銘柄jに移動させている。さらに自己相関の強さに応じて重みの移動量を大きくしている。


こんな簡単なアルゴリズムで市場平均のリターンを超えられるというのは不思議な感じがする。研究で使われたデータに選択バイアスがあるのではないか、という疑いも湧く。しかしAnticorが論文で発表された後、より多くのデータセットでの検証においてもAnticorの有効性は確かめられている。詳細は下記論文を参照してほしい。
Portfolio management: an empirical study of the Anticor algorithm


では、試しにAnticorを動かしてみよう。ただしAnticorの実装はOctaveで書かれたものを使う(単に私がPythonよりOctaveに慣れているため)。
対象とするデータは、MSCIを構成する24カ国のインデックス。期間は2006年4月1日から2010年3月31日までの1043営業日。
OLPS_cli.mを以下のように書き換えてから実行する。
注目して欲しいのは以下の二行。

Market(tc=0.0010), Cumulative return: 0.91

Anticor(W:30, tc:0.0010), Final return: 2.30

上が市場平均のリターン。下はAnticorのリターン。Anticorの方が大きなリターンになっていることがわかる。


ところで、Anticorは株価が平均回帰することを仮定している。つまり、値上がりしている株はその後値下がりし、値下がりしている株はその後値上がりすると仮定している。この平均回帰するという仮定に基づくアプローチをFollow-the-Loserと呼ぶ。
逆に、値上がりしている株は値上がりし続け、値下がりしている株は値下がりし続ける(なので平均に回帰しない)という仮定に基づくアプローチをFollow-the-Leaderと呼ぶ。

その他のFollow-the-Loser型アルゴリズム

Anticorの登場以後、Follow-the-Loserのアプローチをとりながら、Anticorよりも性能の良いアルゴリズム(リターンにおいても計算量においても)がいくつか開発されている。Anticor以外のFollow-the-Loser型アルゴリズムに興味がある方は、OLPSについての非常に包括的なサーベイ論文があるのでこれを参照されたし。
[1212.2129] Online Portfolio Selection: A Survey

しかし、現実はそこまで甘くない

では、このFollow-the-Loser型アルゴリズムを使って億万長者になれるのかというと、まぁ現実はそんなに甘いものではない。確かにFollow-the-Loser型アルゴリズムは長期的には市場平均を上回るリターンを生み出してくれる。しかし短期的には市場平均に負けることがあり、しかもそのときのドローダウンは非常に大きく、並の投資家が耐えられるものではない。

オンライン・ポートフォリオ選択アルゴリズムは本当に機能するか?

面白いことに、Follow-the-Loser型アルゴリズムが機能しない時期にはFollow-the-Leader型アルゴリズムの方が良いパフォーマンスを出せるようだ。
Quantopian - Comparing OLPS algorithms (OLMAR, UP, et. al.) on ETFs
なので、例えば異常検知のような手法を使いFollow-the-Leader型アルゴリズムとFollow-the-Loser型アルゴリズムを適切に使い分ける事ができれば、ドローダウンを抑えることができるかもしれない。
興味がある方は下記のOLPS実装を使って色々と試してみて欲しい。

OLPSの実装

Pythonで書かれたもの。OLPSのアルゴリズムを包括的に実装している。コードも読みやすく、一番おすすめ。

Octaveで書かれたもの。これもOLPSのアルゴリズムを包括的に実装している。

Javaで書かれたもの。実は私が書いた。Robust Median Reversionというアルゴリズムだけを実装している。コードは汚いしカブロボに不完全に対応しているし、あまりおすすめはしない。

Quantopianという、日本でいうカブロボのようなサイトがあり、ここでもOLPSの実装がいくつか公開されている。Pythonで書かれているが、動かすにはQuantopianのAPIが必要。