2010/09/28

マルコフ連鎖モンテカルロ法を実装してみよう

"Chain Bridge, Budapest" by szeke

約2ヶ月ぶりということで、ご無沙汰しております。書きたいネタというのは結構あって書こう書こうとは思っているんですが、なにより書くとなるとあれもこれも伝えなきゃいけないみたいな思いになって、結局分量の多さから諦めてしまうというのが結構続いています。もう少し気を張らずに更新していきたいものです。

さて、最近の自分はマルコフ連鎖モンテカルロ法(Markov Chain Monte Carlo, MCMC)についておりました。何にも知らない方ににとってはよく分からないかもしれませんが、この手法はマルコフ連鎖が持つ簡明さとモンテカルロ法が持つ実用性が合わさった凄まじい手法なんです。そしてなによりとてもエレガント。

とりあえず知らない人のためにてきとーに解説しますと、与えられた適当な関数から確率変数をサンプリングするための公式です。べつにこれじゃなくても確率変数のサンプリングにはいろんなアルゴリズムがあるわけですが、これを使うと関数の計算コストがやけに高い場合だとか、ピーク部分を集中的にサンプリングしてくれたりとかで結構便利で、金融や工学、物理の分野でも非常に役立っております。計算物理をやる人にとっては必須に近い手法といっても過言ではありません。

そんなMCMCですが、実際に提案されている手法には様々なものがあります。不変分布から遷移確率を逆算するため、自由度が増えるから遷移確率は一意じゃなくなってしまうんです。今回は最も有名なMetropolis-Hastingsアルゴリズム(*1)を用いて、任意の関数に従って乱数のサンプリングを行うコードを練習がてらpythonで書いてみました。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sys
import math
import random

def main():
   f = lambda x: math.exp(-x*x / 10.0)
   for x, fx in metropolis(f):
       print x, fx

def metropolis(func, start=0.0, delta=2.0, burn_in=100, seed=1):
   metro_iter = _metropolis(func, start, delta, seed)
   for i, value in enumerate(metro_iter):
       if i > burn_in:
           yield value
           break
   for value in metro_iter:
       yield value

def _metropolis(func, start, delta, seed):
   random.seed(seed)
   initial_x = start
   initial_fx = func(initial_x)
   proposed_x, proposed_fx = 0.0, 0.0
   while True:
       proposed_x = initial_x + random.uniform(-delta, delta)
       proposed_fx = func(proposed_x)
       ratio = proposed_fx / initial_fx
       if ratio > 1.0 or ratio > random.random():
           initial_x, initial_fx = proposed_x, proposed_fx
           yield proposed_x, proposed_fx
       else:
           yield initial_x, initial_fx

if __name__ == '__main__':
   sys.exit(main())
うーん・・・きれいだ(*2)・・・

こいつのすごいところは、アルゴリズム自体は非常にシンプルで実装しやすいというところにあります。行数も上を見ると分かるのですがとっても少ないし、コア部分はたった25行くらいで構成されています。

なのに使っている学問は結構複雑で、定常分布から遷移行列を導出するために詳細釣り合いの条件からMetropolis的制約を用いて導出、サンプリングを行っております。このアルゴリズム自体は結構知ってる人が多いかもしれませんが、実際に理論方面で理解している人はどうなんでしょう。

んで、正規分布のガウス関数からサンプリングを行った結果がこれ。


赤線が元の確率分布。きちんとサンプリングが行われているようです。今回は正規分布で計算を行いましたが、非負の関数であればなんでも構いません。

あとはこれを研究テーマへと落とし込むことができれば、とりあえず一区切りつけるかなって感じです。

*1: 提案確率関数が対称であるという制約を持つのがMetropolis。それを非対称の場合にも拡張したのがHastings。個人的にはMetropolis-HastingよりMetropolisのほうが綺麗で好きです。というか提案確率密度関数が非対称じゃないといけないようなシチュエーションがよく分からない
*2: yieldとジェネレータって便利ですよね。計算速度も効率的だし、慣れてくるとすべて遅延評価で行わせたいくらい

2010/07/23

ドルコスト平均法は賢い投資方法と言えるのか? 補足

"Pyramid of Capitalism" by Warren Noronha


以前ブログの記事を読んでいただいた友人から感想を伺うと、「なんかよく分からない」といった感想が帰ってきました。基本的に説明が不足しているなぁと思った箇所は実際いくつもあって、金融の確率論を少しでもやると大体感覚的に理解できるのですが、普通の人はそんなのやらないのが当たり前ですので、基本的な概念について少し説明したいと思います。この分野に興味ない人でもちょこちょこと面白そうな話を挟んでいくので、暇つぶしに見てやってください。

1. 確率変数、期待値、分散

確率変数というのは試行によって出てくる値が確率的に異なってくる変数のことです。これは抽象的なので、もうすこし具体的にいきましょう。例えば、以下のコイントスゲームを考えます。最初あなたは1万円を所持していたとして、表であれば所持金が2倍となり、一方で裏であれば所持金が0.5倍、つまり半分になります。このような試行を3回行ったとして、最終的な資金額をXと表すと、このゲームは以下の式で表せます。


ここでのX1はそれぞれの試行の確率変数に相当し、50%の確率で0.5, 50%の確率で2.0の値をとります。
で、これだけではただ定式化しただけで、何にも面白いことは分かりません。ですがこいつの期待値と分散を求めてやることで、このゲームは得なのか損なのか、またどれくらいのリスクがあるゲームなのか調べてやることができるのです。

例えば、Xの期待値をE[X]としてやりましょう。ここで、期待値の性質として以下を確認しておきましょう。まず、XとYが確率変数とすると、その和の期待値は単純にそれぞれの期待値の和で表せます。


また、XとYが独立(それぞれの試行がもう一方の試行に影響を及ぼさない)であるとすると、その積も同じような性質を持ちます。


この性質を用いると、Xの期待値は以下のように表せます。


つまり、このゲームを行うことによってあなたは9500円くらいの利益を得ることが期待できます。もうこれはやるっきゃないと。

このゲームが得であることは理解できましたが、ただこのゲームにどれくらいリスクがあるのかは不透明です。期待値が10000円プラスになるからといって、40%の確率で全財産を失ってしまうみたいなゲームですと、普通は行いたくないですよね。このリスクについて求めるためには分散を計算してやればいいのですが、これはそれなりに面倒です(*1)。前回ごっちゃごっちゃやってたのはこの面倒さによるものが大半ですので、今回は説明しません。とりあえず分散がリスクに対応しているということが大事です。

世の中の投資行動には常にリスクとリターンが付きまといます。一般的にリスクとリターンは紙一重と言われており、リスクの高い行動はよりリターンも大きいというのが感覚的な理解です。ただ、このリスクとリターンを確率変数を用いて計算することによって、どの行動が一番リスクとリターンのバランスが取れている行動であるのか、判断することができます。

で、どの戦略を用いれば合理的に資産を増やすことができるのかという問題ですが、実はこの戦略は既に知られており、ある戦略を用いればリスクをリターンに変化させることで指数関数的に資産を増やすことができます。その戦略について興味がある方は適当に調べると出てくると思います。

2. なぜ乗法モデルを仮定しているのか?

まず、株価の変動は確率的であるから確率変数として表せるという話は納得できると思います。では、株価などの資産モデルには様々なものがあるのに、なぜそれぞれの確率変数が独立と仮定した乗法モデル


をわざわざ採用するのでしょうか?別に、例えば


のような加法モデルでも構わないわけです。何故なんでしょう?

まず独立と仮定した理由については、単に計算が楽だからです。正直独立と仮定しないと、ここまで綺麗な形がでるのか、そもそも解析的に解けるのかどうかすら分かりません。ただこれを仮定したことによって、ごちゃごちゃ計算できて結果的にそれなりに綺麗な数式へと展開することができたという次第です。

乗法モデルを仮定した理由については、金融業界の指数関数的な性格によるものです。例えば、ローンなんかは年利15%ーフリーローンですとこんくらいでしょうかーとありますが、これは1年間につきローンが15%増加していくので、ふるまいとしては指数的になります。同様に、国債についても年利で計算するので指数的な計算となります。金利が低いといってほいほい借金をすると危険だという理由もこれによるものです。逆に、金持ちがより金持ちになる理由の一つでもあります。

これは個人的な意見ですが、金融の世界で乗法モデルが成り立っている理由は、人間が金に対して貧欲であるからだと思っています。はっきりと言いますが、世の中の結構な割合の人間は指数的なふるまいを理解できません。ですからマイホームを数十年ローンでぽんと買ってしまったり、リボ払いで決済をしたりしてしまいます。

ちなみに、これらの金額はすべて年金公式と呼ばれる公式で算出できます。1期間後に支払いを始め、n期間にわたって金額Aを支払う場合、金利をrとおくと借入額Pは


もしくは


と表せます。これはすごく役立つ公式なので、店員の言葉に騙されないでおくこともできるかもしれません。ついでに、ローンを借りて全額返した場合に損をする差額はnA-Pで計算できて、


となります。こういう情報ってあんまり表沙汰にならないんですけれど。

追記(10/08/23)
上の式は正直汚いからどんな振る舞いをするのか感覚的に理解し辛いですけど、利率が少ない、つまりrが微小のときは (1+r)^n ~ 1 + nr で近似できますから損失額は


となります。ですから利率が低いときは、分割回数をちょっと多くしても線形的な負担にかならない。確かに損失額が増えることは確かですけど、一括払いで生活に支障がでるよりは、3, 4回くらいローンで払うっていう選択肢もありなのかもしれません(*2)。

*1: 1次元のising模型の解析解を求めたり、極座標のラプラシアン導出するのよりは面倒じゃない
*2: ただそこまでして本当に欲しいものかそれっていう疑問はありますし、30年ローンとかで家を購入するような場合には全く通用しません。そもそもこのご時勢に長期のローンを組むなんて狂気の沙汰です。狂っている。

2010/06/05

BLESS by Overture


BLESS from Overture on Vimeo.

KiraKiraというアイスランドのミュージシャンの音楽PV。作ったのはOvertureというアメリカのユニット。

これの何が凄いのかっていうと、たった2人の夫婦によって作られたっていうところです。やった人は分かると思うんですが、アニメーション制作というのは本当に大変です。それを夫婦の共同作業でやっちゃってるところが仲良さそうで素敵。しかもその作品もとても個性溢れていて、気持ちがいいなぁと思う作品でした。

ブログも良かったらごらんになってください。奥さんが日本人なので片方は日本語で書かれています。

2010/05/31

ドルコスト平均法ははたして賢い投資方法と言えるのか? part2

"Soviet poster of the transport sector during the Five Year Plan. 1930" by National Library of Scotland

3. 計算

前回の記事で株価が乗法モデル


に従った場合の一般投資戦略とドルコスト戦略の資産はそれぞれ



で与えられることが分かりました。

それではこれよりリスクの定量的評価を行います。私たちが知りたいのは、それぞれの資産のリスクとリターンの値です。この場合リターンは確率変数の期待値、リスクは確率変数の分散(より正確に言うと標準偏差)にそれぞれ対応していることが分かりますので、 XN の期待値と分散をそれぞれ求めてやればよさそうです。
3.1 期待値の計算
まず簡単な期待値から調べていきましょう。 Ri と Rj は i≠j の場合独立であり、さらに Ri の期待値を μ 、分散を σ2 と仮定しているため、 XN(1) の期待値は


XN(2) の期待値は


となります。
3.2 分散の計算
次に一番知りたい分散についてですが、正直これは期待値に比べて少々面倒くさい。これは分散が期待値のような線形的な関係を持たない上に、ドルコスト平均法の Ri の項が折りたたまっているために生じているのですが、そんなことを憂いていても仕方がないのでさっさと計算していきます。

まず比較的簡単な XN(1) の分散ですが、


ここで右式の V にのみ注目すると、分散の定義より


関係式


に注意すると、上式は


となりました。よって XN(1)


と表現できます。これは比較的何も悩まずに展開できました。

次にドルコスト戦略 XN(2) について同じように求めていきます。


2つの項が現れました。それぞれの項は結構面倒ですので、分けて考えることにします。まず第二項についてですが、


次に第一項について計算します。まず


ここで


についてそれぞれの Rk で乗算し、独立性から期待値を分割して求めるわけですが、きちんと注目してやると
  • Rk となっている変数は全部で |i-j| 個
  • Rk2 となっている変数は全部で min(N-i+1, N-j+1) 個
となっているため、上式は


と展開できます。

ここで対称性について考えます。当たり前ですが i と j を反転させても上式の値は不変であるため、反転対称性から上式は以下のように展開できます。


以上から、 XN(2) の分散の値は


となります。ここで、数式を見やすくするために


と定義しておくことにし、便宜的にこの変数を『修正バリアンス』とでも名づけておきます。この命名が正しいのかどうか、そもそも名前がつけられているのかについてはよく分かりません。

この分散、和の項が3つ並んできたり少々面倒くさい形になっていますが、よくよく注目してみると σ に関して単調増加の形をしており、 σ=0 を代入すると結果に0が帰ってきたりとちゃんとしたリスク関数になっているのが確認できます。ただこの関数が一般投資戦略に比べてリスクを分散する形になっているかどうかはちょっと判別しにくいですね。

まぁそんなこんなで XN(1) と XN(2) それぞれにおける期待値と分散を求めることができました。次回はこの関数を利用して定量的な調査を行っていきます。
Note. σに関して単調増加であることと0であることの説明
まず、式の形よりVN(2)はσに関して単調増加関数であることは自明。
次にσ=0を代入すると修正バリアンスはμ2になるので、次数を調整した後で合計のラベリングを変更してやると、


となる。

2010/05/29

ドルコスト平均法は賢い投資方法と言えるのか? part1

"Soviet poster from the Five year plan showing economic investment. 1930" by National Library of Scotland

1. 概要

ドルコスト平均法という投資法があります。一応簡単に説明しておくと、ある区切られた期間ごとに同じ金額だけ対象の商品を購入しておくことで、安定した収益が得られるという戦略です。信託投資やFXをやっている方にとっては馴染み深い戦略かもしれませんし、ファイナンシャルプランナーからお勧めされた方も多いかもしれません。

一定期間同じ金額だけ同じ商品を買うだけというこの戦略、よく初心者にお勧めの投資法として雑誌などでは紹介されていますが、はたして本当にお勧めできる投資法なのでしょうか?またリスクを軽減できるとありますが、一体どれくらいのリスク軽減が望めるのでしょうか?それに対して、リターンはどれくらい減少するのでしょうか?以上を明らかにしていくのが今回の記事の目的です。
  • 定量的に評価するために少々数式が登場してきますが、一応大学の経済学を専攻していたり、統計学について初歩的な知識(期待値や分散など)を持っている方ならばすいすいと読み進めることができるくらいのレベルを目指しています。
  • 金融工学に関しての知識はまったく必要ありません。必要な箇所はすべて簡単に解説していきます。
  • 今回の記事は式の導出までを行います。結果だけ知りたい方は読み飛ばしてもらっても構いません。

2. 2つの戦略

ここではドルコスト戦略についてより詳しく説明した後に、数式を用いて定式化していきたいと思います。今回は比較のため、ドルコスト戦略の他にもう一つ『一般投資』を取り上げていきます。

まず一般投資戦略とは特になんにも考慮することなく、自分の手持ち資産のうち一部分を対象の金融商品に投資して、その後は満期まで放置しておくという戦略です。

一方で、ドルコスト戦略はまず自分の手持ち資産のすべてをN分割し、一定期間毎に対象の金融商品を購入するという行為をN回行って、満期まで保持しておくという戦略です。

この2つの戦略を定式化する前に、まず以下の仮定を行っていきましょう。
  1. 時間を離散化してN期間として考え、現在いる時点を0時点、満期をN時点とします。
  2. 株価をSnで表し、Snは以下の『乗法モデル』に従うとします。


    ここで、Riは確率変数とします。つまり、Siも確率変数となります。ただし、S0だけは現時点で株価が判明しているのでただの実数となります。
    Ri自体の確率分布は全く仮定していないことに注意してください。つまり、Riは正規分布に従うとは限りません。
  3. 計算を簡単にするため、異なる確率変数RiとRjは完全に独立であり、また期待値と分散は同一の値μとσ2を付与するものと仮定します。
    もちろん、これは理想化された仮定で、現実的ではありません。実際、Riが過去の値に影響することは数々の測定から明らかになっています。が、そんなこといちいち考慮に入れるととっても大変ですし、そもそも今回の目的とは趣向が異なります。そこまで正確にやるんでしたら連続時間と仮定して確率微分方程式を解くべきですしね。こういうことするのは専門家だけで結構ですので今回はやりません。
以上の仮定を用いて、実際に2つの戦略を定式化します。まず一般投資戦略の場合、Xnをn時点での手持ち資産と定義すると、以下のように表せます。


ここで、λは手持ち資産のうち投資にかけるウェイトとして定義され、0<λ<1の間をとります。

次に、ドルコスト戦略の場合は、少々複雑ですが以下のように表せます。


ただし、後の計算を楽にするため、


とおきました。

ここで注目しておきたいのが、上式の形です。RNの項が最も多く出現し、満期から現時点まで下がっていくにつれて出現回数が減少していくのが分かるでしょう。このことから何が言えるのかというと、『ドルコスト平均戦略は満期近くの株価の変動に最も大きな影響を受ける』ということです。つまり、初期時点で株価が上昇しても、満期近くに株価が大きく下落した場合、ドルコスト戦略を用いると資産がマイナスになってしまうのです。

もちろん、λ=1(全力投資)の場合の投資戦略よりはリスクは分散されていることは式の違いにより明らかです。それは確かなので、ドルコスト戦略はリスクを軽減する戦略であることは間違いありません。ですが、これはλの値を調整することで同じ効果を与えそうです。

ここから分かる結論としては、『ドルコスト戦略は満期近くに株価が大きく上昇すると予想した場合に効力を発揮する戦略である』ということです。ですが通常の場合ですと、満期近くの株価の変動なんて正直予想できるはずがありません(明日の株価ですら予想は難しいというのに)。ドルコスト戦略が初心者にお勧めできるという論調は少々疑問であります。

そうなると結局のところ、フィナンシャルプランナーがドルコスト平均法を進める主な理由は『商品を定期購入してくれる客を作り出す』ためである気がしてなりません。だって長期投資という名目の元で、給料の一定金額を毎月自分たちに差し出してくれて、しかもその回数分だけ手数料をいただける。これほど美味しい客はありません…

…いやいや、そう考えるのはまだ早い。もしかしたらきちんとリスクを定量的に評価した上で勧めているのかもしれません。となると次に気になってくるのが『一体どれくらいリスクが減少するのか、その上でリターンはどれくらい減少するのか』という点です。「どうしてもドルコスト平均法じゃないといけないんですか?最初っから投資額を抑えることもできるんじゃないですか?」という声がどこからか聞こえてきそうです。

疲れたので今日はここまで。次回から実際のリスクとリターンの評価を行っていきます。