nearcorr
説明
例
最近相関行列の計算
特定の半負定値行列について、フロベニウス ノルムの最近相関行列を求めます。
区間 [-1, 1]
内のすべての要素と単位対角をもつ N
行 N
列の対称行列を指定します。
A = [1.0000 0 0 0 -0.9360 0 1.0000 -0.5500 -0.3645 -0.5300 0 -0.5500 1.0000 -0.0351 0.0875 0 -0.3645 -0.0351 1.0000 0.4557 -0.9360 -0.5300 0.0875 0.4557 1.0000];
eig
を使用して A
の固有値を計算します。
eig(A)
ans = 5×1
-0.1244
0.3396
1.0284
1.4457
2.3107
最小固有値は 0
より小さくなっています。これは、A
が半正定値行列ではないことを示しています。
既定のニュートン アルゴリズムをもつ nearcorr
を使用して、最近相関行列を計算します。
B = nearcorr(A)
B = 5×5
1.0000 0.0372 0.0100 -0.0219 -0.8478
0.0372 1.0000 -0.5449 -0.3757 -0.4849
0.0100 -0.5449 1.0000 -0.0381 0.0996
-0.0219 -0.3757 -0.0381 1.0000 0.4292
-0.8478 -0.4849 0.0996 0.4292 1.0000
B
の固有値を計算します。
eig(B)
ans = 5×1
0.0000
0.3266
1.0146
1.4113
2.2475
固有値はすべて 0
以上です。これは、B
が半正定値行列であることを意味しています。
nearcorr
を使用する場合、名前と値のペアの引数 'method'
を 'projection'
に設定することで、交代射影アルゴリズムを指定できます。
nearcorr(A,'method','projection')
ans = 5×5
1.0000 0.0372 0.0100 -0.0219 -0.8478
0.0372 1.0000 -0.5449 -0.3757 -0.4849
0.0100 -0.5449 1.0000 -0.0381 0.0996
-0.0219 -0.3757 -0.0381 1.0000 0.4292
-0.8478 -0.4849 0.0996 0.4292 1.0000
また、'Weights'
の名前と値のペアの引数を指定することで、要素単位の重みを課すこともできます。要素単位の重みの詳細については、Weightsを参照してください。
W = [0.0000 1.0000 0.1000 0.1500 0.2500
1.0000 0.0000 0.0500 0.0250 0.1500
0.1000 0.0500 0.0000 0.2500 1
0.1500 0.0250 0.2500 0.0000 0.2500
0.2500 0.1500 1 0.2500 0.0000];
nearcorr(A,'Weights',W)
ans = 5×5
1.0000 0.0014 0.0287 -0.0222 -0.8777
0.0014 1.0000 -0.4980 -0.7268 -0.4567
0.0287 -0.4980 1.0000 -0.0358 0.0878
-0.0222 -0.7268 -0.0358 1.0000 0.4465
-0.8777 -0.4567 0.0878 0.4465 1.0000
さらに、'Weights'
の名前と値のペアの引数を指定することで、N
行 1
列のベクトル化された重みを課すこともできます。ベクトル化された重みの詳細については、Weightsを参照してください。
W = linspace(0.1,0.01,5)'
W = 5×1
0.1000
0.0775
0.0550
0.0325
0.0100
C = nearcorr(A,'Weights', W)
C = 5×5
1.0000 0.0051 0.0021 -0.0056 -0.8490
0.0051 1.0000 -0.5486 -0.3684 -0.4691
0.0021 -0.5486 1.0000 -0.0367 0.1119
-0.0056 -0.3684 -0.0367 1.0000 0.3890
-0.8490 -0.4691 0.1119 0.3890 1.0000
C
の固有値を計算します。
eig(C)
ans = 5×1
0.0000
0.3350
1.0272
1.4308
2.2070
固有値はすべて 0
以上です。これは、C
が半正定値行列であることを意味しています。
欠損値のある株の相関行列の生成
nearcorr
を使用して、欠損値のある株の相関行列の半正定値行列を作成します。
株価に欠損値があると仮定します。
Stock_Missing = [59.875 42.734 47.938 60.359 NaN 69.625 61.500 62.125 53.188 49.000 39.500 64.813 34.750 56.625 83.000 44.500 55.750 50.000 38.938 62.875 30.188 43.375 NaN 29.938 65.500 51.063 45.563 69.313 48.250 62.375 85.250 46.875 69.938 47.000 52.313 71.016 37.500 59.359 61.188 48.219 61.500 44.188 NaN 57.000 35.313 55.813 51.500 62.188 59.230 48.210 62.190 61.390 54.310 70.170 61.750 91.080 NaN 48.700 60.300 68.580 61.250 70.340 61.590 90.350 52.900 52.690 54.230 61.670 68.170 NaN 57.870 88.640 57.370 59.040 59.870 62.090 61.620 66.470 65.370 85.840];
corr
を使用して相関行列を計算してから、eig
を使用して相関行列が半正定値かどうか確認します。
A = corr(Stock_Missing, 'Rows','pairwise'); eig(A)
ans = 8×1
-0.1300
-0.0398
0.0473
0.2325
0.6278
1.6276
1.7409
3.8936
A
は 0
より小さい固有値を持っています。これは、相関行列が半正定値ではないことを示しています。
この相関行列で nearcorr
を使用して、すべての固有値が 0
以上である半正定値行列を生成します。
B = nearcorr(A); eigenvalues = eig(B)
eigenvalues = 8×1
0.0000
0.0000
0.0180
0.2205
0.5863
1.6026
1.7258
3.8469
Copyright 2019 The MathWorks, Inc.
入力引数
A
— 入力相関行列
行列
入力相関行列。区間 [-1 1]
内のすべての要素と単位対角をもつ N 行 N 列の対称近似相関行列を指定します。A
の入力は半正定値行列である場合と、そうでない場合があります。
例: A = [1.0000 0 0 0 -0.9360 0 1.0000 -0.5500 -0.3645 -0.5300 0 -0.5500 1.0000 -0.0351 0.0875 0 -0.3645 -0.0351 1.0000 0.4557 -0.9360 -0.5300 0.0875 0.4557 1.0000]
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: nearcorr(A,'Tolerance',1e-7,'MaxIterations',500,'Method','newton','Weights',weight_vector)
は、フロベニウス距離を最小化することで、最近相関行列を返します。
Tolerance
— アルゴリズムの終了許容誤差
1e-6
(既定値) | 正のスカラー
アルゴリズムの終了許容誤差。'Tolerance'
と正のスカラーから構成されるコンマ区切りのペアとして指定します。
例: 'Tolerance',1e-7
データ型: single
| double
MaxIterations
— ソルバーの最大反復回数
200
(既定値) | 正の整数
ソルバーの最大反復回数。'MaxIterations'
と正の整数から構成されるコンマ区切りのペアとして指定します。
例: 'MaxIterations',500
データ型: single
| double
Method
— 最近相関行列の問題を解くメソッド
'newton'
(既定値) | 'projection'
最近相関行列の問題を解くメソッド。'Method'
と次のテーブルのいずれかの値から構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'newton' | ニュートン アルゴリズムは二次収束アルゴリズムです。
|
'projection' | 交代射影アルゴリズムは、高精度かつ最高の線形で最近相関行列に収束できます。
|
例: 'Method','projection'
データ型: char
| string
Weights
— 入力行列のエントリの信頼度に関する重み
[ ]
(既定値) | matrix
| vector
入力行列のエントリの信頼度に関する重み。'Weights'
と、対称行列または N
行 1
列のベクトルのいずれかで構成されるコンマ区切りのペアとして指定します。
メモ
行列の重みは相関行列の個々のエントリに重みを適用します。非スパース行列を指定しなければなりませんが、どのエントリが一致するのがより重要であるかを制御できます。あるいは、ベクトルの重みはすべての列 (および対応する行) に重みを適用します。行列の重みと比較して、指定しなければならない重みは小さいですが、列全体 (および対応する行) が単一の重みで重み付けされます。
例: 'Weights',W
データ型: single
| double
参照
[1] Higham, N. J. "Computing the Nearest Correlation Matrix — A Problem from Finance." IMA Journal of Numerical Analysis. Vol. 22, Issue 3, 2002.
[2] Qi, H. and D. Sun. "An Augmented Lagrangian Dual Approach for the H-Weighted Nearest Correlation Matrix Problem." IMA Journal of Numerical Analysis. Vol. 31, Issue 2, 2011.
[3] Pang, J. S., D. Sun, and J. Sun. "Semismooth Homeomorphisms and Strong Stability of Semidefinite and Lorentz Complementarity Problems." Mathematics of Operation Research. Vol. 28, Number 1, 2003.
拡張機能
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数は、スレッドベースの環境を完全にサポートします。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
バージョン履歴
R2019b で導入
参考
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)