コピュラを可視化してみた An illustrative visualisation of Copula
This article gives you an intuitive, visual guide to copula with javascript and plotly.
本記事ではコピュラの確率密度関数を3D plotで可視化してみます。損保数理や金融機関のリスク管理、デリバティブのプライシング等でおなじみのコピュラですが、javascriptとplotlyを用いて表現するとどうなるでしょうか。標準正規分布の確率密度関数も同時に図示して、コピュラの種類やパラメータを変更した際の挙動についても確認してみます。
コピュラの種類 Types of Copulas
計算前提 Assumptions
アルキメデスコピュラのパラメータ Parameter for Archimedean Copula
正規コピュラ、tコピュラのパラメータ Parameters for Gaussian & t Copula
(correlation coefficient) =(degree of freedom) =
プロット実行 Plot densities
ボタンを順番に押すとplotが表示されます。
実行結果 Results
相関係数と裾従属係数 Correlation Coefficient and Tail Dependency
Kendall's tau | Upper tail dependency | Lower tail dependency |
そもそもコピュラって? What is Copula?
コピュラは複数の確率変数の同時確率を表現するのに用いられます。例えば2つ一組のサイコロを振る場合、何の変哲もない独立なサイコロと必ずゾロ目が出るギャンブラーのサイコロは次のとおりの同時確率となります。
何の変哲もない独立なサイコロ
1 | 2 | 3 | 4 | 5 | 6 | 計 | |
---|---|---|---|---|---|---|---|
1 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/6 |
2 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/6 |
3 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/6 |
4 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/6 |
5 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/6 |
6 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/36 | 1/6 |
計 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1 |
必ずゾロ目が出るギャンブラーのサイコロ
1 | 2 | 3 | 4 | 5 | 6 | 計 | |
---|---|---|---|---|---|---|---|
1 | 1/6 | 0 | 0 | 0 | 0 | 0 | 1/6 |
2 | 0 | 1/6 | 0 | 0 | 0 | 0 | 1/6 |
3 | 0 | 0 | 1/6 | 0 | 0 | 0 | 1/6 |
4 | 0 | 0 | 0 | 1/6 | 0 | 0 | 1/6 |
5 | 0 | 0 | 0 | 0 | 1/6 | 0 | 1/6 |
6 | 0 | 0 | 0 | 0 | 0 | 1/6 | 1/6 |
計 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1 |
参考文献、サイト Reference
このプログラムは下記の文献、サイト等を参考に作成しています。
Copula全般
https://www.imes.boj.or.jp/japanese/kinyu/2005/kk24-b2-3.pdf
https://beta.vu.nl/nl/Images/werkstuk-mahfoud_tcm235-277460.pdf
Clayton copula
http://web.cecs.pdx.edu/~cgshirl/Documents/Research/Copula_Methods/Clayton%20Copula.pdf
Gaussian copula
https://www.stat.ncsu.edu/people/bloomfield/courses/st810j/slides/copula.pdf
JStat(正規分布やt-分布の分布関数の計算に使用)
jstat.github.io
Gamma function(javascriptによるガンマ関数の近似例)
www.w3resource.com
作ってみた感想
・はてなブログはjavascriptには対応しているものの、コードだけ書かれたシンプルな記事は作成できない仕様らしい。記事を成立させるためにはある程度の長さの日本語を書く必要があり、最後に蛇足的に感想を並べて締めくくります。
・当たり前の話ではあるけれど、同じ相関係数のtコピュラと正規コピュラの結果を比較すると、tコピュラを使用した場合の方が標準正規分布の裾が厚いことが確認できた。
・一方でアルキメデスコピュラはおおむね予想通りの結果となった。Wikipediaを参照すると、アルキメデスコピュラには教科書に記載されている種類以外にも様々な種類があることがわかった。余力があれば追加したい。
・同じ周辺分布でもコピュラに応じて様々なパターンが作れることが分かった。教科書上で2次元のグラフだけで見るよりも、イメージがわきやすいのではないかと思われる。
・欲を言えば3Dプロットのところは確率密度だけでなく、周辺分布も同時に表示できるようにしたい。plotlyのグラフィックスで対応できるかは不明だが、3D表示は難しいかもしれない?もし周辺分布があれば、裾従属係数をビジュアル的に表現するのが容易かもしれない。現状の表示だと裾従属係数が0かどうかは明確でない。
・今回のプロット作成は確率密度の理論値をメッシュごとに計算して作成しているだけだが、実データからのパラメータ推定やシミュレーション(乱数発生)の実装にはもう少し理解を深める必要がありそう。RやPythonではパッケージを利用できるものの、中身はよく理解できていない。シミュレーションができるとVaRの数値計算が可能になり、裾の厚さがより分かりやすくなると思われる。
・多変数の従属性を表現するのに使われるVine Copulaについてもよく理解できていないので、余力があれば実装してみたい。
・コピュラの分布関数を微分して確率密度関数にするのはなかなか骨が折れた。今回は2変数なので自力で完遂できたものの、変数が多い場合のコーディングをするのは難易度が高そう。
・ブラウザ上でインタラクティブに使えるプログラムを作るのが非常に面白く感じるようになった。現在はjavascriptとplotlyの組み合わせしか試せていないが、他にも便利な方法があれば試してみたい。
・リファレンスに記載しているJStatは統計処理ライブラリとして大変便利だった。一点言うとすれば、多変量の正規分布、t分布の分布関数、確率密度関数が提供されていないのは物足りなかったが、他には全く問題なかった。Simple Statisticsと合わせて併用するようにしたい。