コピュラを可視化してみた An illustrative visualisation of Copula

This article gives you an intuitive, visual guide to copula with javascript and plotly.
本記事ではコピュラの確率密度関数を3D plotで可視化してみます。損保数理や金融機関のリスク管理デリバティブのプライシング等でおなじみのコピュラですが、javascriptとplotlyを用いて表現するとどうなるでしょうか。標準正規分布確率密度関数も同時に図示して、コピュラの種類やパラメータを変更した際の挙動についても確認してみます。

f:id:r_std:20200209200802p:plain
An example of
Frank Copula density

コピュラの種類 Types of Copulas


共単調コピュラ Minimum copula
反単調コピュラ Maximum copula
積コピュラ Independence copula
フランクコピュラ Frank copula
ガンベルコピュラ Gumbel copula
クレイトンコピュラ Clayton copula
正規コピュラ Gaussian copula
tコピュラ t copula

計算前提 Assumptions

アルキメデスコピュラのパラメータ Parameter for Archimedean Copula

 \alpha  =\\\

正規コピュラ、tコピュラのパラメータ Parameters for Gaussian & t Copula

 \rho\\\ (correlation coefficient) =
 \eta\\\ (degree of freedom) =

プロット実行 Plot densities

ボタンを順番に押すとplotが表示されます。


実行結果 Results

相関係数と裾従属係数 Correlation Coefficient and Tail Dependency

Kendall's tauUpper tail dependencyLower 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
サイコロ1つずつの周辺確率(緑色のセル)に注目すると、どちらのケースでも1から6の目が1/6ずつ出ていますが、2つのサイコロを組み合わせとしてみた場合、同時確率は大きく異なっていることが分かります。同じ周辺確率でも、コピュラによって様々な同時確率を作ることが可能になります。 複数の確率変数をモデル化する場合、それぞれの依存性や相関関係をコピュラを用いて精緻に表現することが重要になります。例えば、日本で地震が発生するリスクと株価が下落するリスクには強い依存性があると考えられます。リスクモデル上はコピュラを用いることでこれらのリスク間の依存性を精緻に表現することが考えられます。

参考文献、サイト 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と合わせて併用するようにしたい。