復刻:ランダムウォーク続き

復刻記事の続きです。2006年7月31日の記事をリフォーマットして再掲します。


 

前回、ランダムウォークの乱数の作り方で終わってしまいましたが、どうやら良い乱数の作り方としてメルセンヌ・ツイスタ法というのがあるそうです。

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

詳しいことはおいておいて、簡単に言うと長周期、高次元均等分布ということらしいです。周期は2の19937乗(10進数6000桁)ととてつもなく長いです。

さらに生成速度も速く、メモリ効率もよいということなので、文句なく採用です。

Cのソースコードも公開されているので、簡単に実装することができました。

これで白色ノイズが作れたので、続いてガウスノイズです。これは白色ノイズから作るのですが、中心極限定理、Box Muller 法が知られています。但し、中心極限定理では乱数の数を固定しておかなくてはいけないのでちょっと都合が悪いです。

Box Muller 法では2個の一様乱数から2個の正規乱数を作っていくので乱数の長さに関係ないということで、以下のサイトを参考にして三角関数の計算を省略できる高速版を採用してみました。

http://www.taygeta.com/random/gaussian.html

ランダムウォークも大詰めです。ガウスノイズは平均0、標準偏差1ですが、これを実際の為替の動きに合うように動き幅を決める必要があります。

ここで、実際の為替の日足チャートを参考にし、EUR/USD, GBP/USD, USD/CHF, USD/JPY のメジャー通貨ペアから1日での動き幅の平均と標準偏差を求めてみました。

10年近いデータなので、やはり平均はほとんど0に近く、標準偏差はだいたい0.5%から0.7%くらい(ちなみに0.5%なのは意外にポンドドル)なので、大きめに取って0.7%としてみました。

ガウスノイズに0.007をかけ、それに1を加えたものを前日の終値にかけることでランダムウォーク系列を生成してみました。初期値を1として、3万個のデータを作った一例です。

rnd_walk2

当然ながら毎回全然違う形状のものができてきます。ただ、今回はプログラムを無限に回すことにより事実上無限に長いランダムウォークを生成することができました。


ここからは現在の私からのコメントです。

当時、乱数に凝ってたみたいですね。今は乱数がいいか悪いかには、そうこだわりはありません。人間変わるもんです。

それより、復刻して気づいたんですが、ランダムウォークの計算の仕方がちょっと怪しいです。前の記事のような単純ランダムウォークだと、前の終値にガウスノイズを足していくはずですが、次の記事で説明しているジオメトリックランダムウォークと混同しているようです。いい加減ですみません。次の記事で補足します。



コメントは受け付けていません