確率微分方程式とは?
一般論
のような式のことを伊藤の確率微分方程式(Stochastic Differential Equation、SDE)と呼んでいます。ここで、 が時刻 における未知数(例えば株価や生物の個体数など)、 は時間、 はドリフト係数、 は拡散係数(ボラティリティ)、 は1次元の標準ブラウン運動で、この項が確率論的なゆらぎをあらわしています。標準ブラウン運動は、平均0、分散tの正規分布に従います。この事実を使うと、確率微分方程式を数値的に解くことができるようになります。
計算結果
パラメータとしては、、、、、計算終了時刻は1としました。乱数はメルセンヌツイスターを使っています。計算結果を見ていきましょう。数値解と解析解の両方をプロットしています。青が数値解で、赤が解析解です。解析解は数値解と同じブラウン運動を使って計算します。
このように、ブラウン運動において、パスはギザギザしており微分不可能ですが、確率1で連続となります。値が増えたり減ったりランダムな動きをしていることがわかると思います。赤と青の線はほぼ重なっており、ちゃんと確率微分方程式が解けていることがわかりました。シード値を変えることにより異なるパスが実現します。いろいろ変えて遊んでみてください。
C++コード
#include <random> #include <iostream> #include <cmath> #include <fstream> #include <iomanip> #include <string> #include <sstream> using namespace std; inline double drift(double x, double t, double mu) { return x*mu; } inline double diffusion(double x, double t, double sigma) { return x*sigma; } int main() { int seed=80; mt19937 mt(seed); normal_distribution<> gauss(0.0, 1.0); ofstream file; file.open("path.txt"); double mu=1.0; double sigma=sqrt(2.0); double x=1.0; double dt=0.0001; double TotalTime=1.0; double t; double exact=1.0; double random; double W=0.0; file<<0.0<<" "<<x<<" "<<exact<<endl; for(int i=0;dt*double(i)<TotalTime;++i) { t=dt*double(i); random=gauss(mt); W+=random*sqrt(dt); x=x+drift(x,t,mu)*dt+diffusion(x,t,sigma)*sqrt(dt)*random; exact=exp(sigma*W); file<<t<<" "<<x<<" "<<exact<<endl; } return 0; }
参考文献
『微分方程式による計算科学入門』の第4章を参考にしています。この本は確率微分方程式の数値解法に関して解説してある数少ない和書で重宝しています。
あとは毛利光希氏によるこちらの資料です。
http://www-mmc.es.hokudai.ac.jp/~masakazu/Software/Manual/SDE_Solver/Manual.pdf
幾何ブラウン運動の解析解の導出は『確率微分方程式入門』のpp.77-78の例題4.3に載っています。伊藤の公式を適用するだけです。
確率微分方程式入門 ―数理ファイナンスへの応用― (数学のかんどころ 26)
- 作者:石村 直之
- 発売日: 2014/06/10
- メディア: 単行本