matlab使用Copula仿真優化市場風險

原文連接:http://tecdat.cn/?p=4790

使用Copula仿真優化市場風險

此示例演示了使用具備胖尾邊緣分佈的多變量copula模擬計算投資組合的風險價值和條件風險值(預期缺口)。而後使用模擬來計算最優風險收益組合的有效前沿。ios

內容

  • 導入支持歷史數據集
  • 可視化標準化價格
  • 退貨和邊際分配
  • Copula校準
  • Copula模擬
  • 計算單週期模擬VaR
  • 組合優化
  • 以給定的回報水平計算投資組合

導入支持歷史數據集

使用Datafeed Toolbox的API導入咱們將在本練習中建模的不一樣資產類別的市場數據框架

  • SPY:標準普爾500指數
  • EEM:新興市場股票
  • TLT:20年期國債(iShares Barclays)
  • COY:美國高收益債券
  • gsp:大宗商品(iPath S&P GSCI總回報指數)
  • RWR:房地產(房地產投資信託指數)
names = { 'SPY','EEM','TLT','COY','GSP','RWR' };

startPeriod = '2009-10-01' ;

endPeriod = '2013-06-24' ;

[date,prices,ds] = importFeedPrices(names,startPeriod,endPeriod);

可視化標準化價格

該圖顯示了每一個指數的相對價格走勢。每一個指數的初始水平已經標準化爲統一,以便於比較歷史記錄中的相對錶現。函數

plot(date,normPrices),datetick('x'),xlabel('Date'),ylabel('Index Value');
title('Normalized Daily Index Closings');

邊際分佈

爲準備copula建模,單獨描述每一個指數的回報分佈。雖然每一個迴歸序列的分佈能夠參數化地表徵,可是使用具備廣義Pareto尾部的分段分佈來擬合半參數模型是有用的。這使用極值理論來更好地表徵每一個尾部的行爲。工具

return = price2ret( );

如下代碼段爲每一個索引返回系列建立一個paretotails類型的對象。這些Pareto尾部對象封裝參數Pareto下尾部,非參數內核平滑內部和參數Pareto上尾部的估計,覺得每一個索引構建複合半參數CDF。優化

tailFraction = 0.1;

marginal {i} = paretotails(return(:,i),tailFraction,1 - tailFraction,'kernel');

===spa

SPY的邊際分佈:

分段分佈有3個部分code

-Inf <x <-0.0125822(0 <p <0.1):下尾,GPD(0.0380262,0.0084794)

-0.0125822 <x <0.01286(0.1 <p <0.9):內插內核平滑cdf

0.01286 <x <Inf(0.9 <p <1):上尾,GPD(0.0511828,0.00671413)

EEM的邊際分佈:

分段分佈有3個部分orm

-Inf <x <-0.0186259(0 <p <0.1):下尾,GPD(-0.00289033,0.0126097)對象

-0.0186259 <x <0.0185703(0.1 <p <0.9):內插內核平滑cdfblog

0.0185703 <x <Inf(0.9 <p <1):上尾,GPD(0.0326916,0.00981892)

TLT的邊際分佈:

分段分佈有3個部分

-Inf <x <-0.0132814(0 <p <0.1):下尾,GPD(0.137056,0.00414294)

-0.0132814 <x <0.0128738(0.1 <p <0.9):內插內核平滑cdf

0.0128738 <x <Inf(0.9 <p <1):上尾,GPD(0.027114,0.00583448)

COY的邊際分佈:

分段分佈有3個部分

-Inf <x <-0.0105025(0 <p <0.1):下尾,GPD(0.47441,0.00485515)

-0.0105025 <x <0.011195(0.1 <p <0.9):內插內核平滑cdf

0.011195 <x <Inf(0.9 <p <1):上尾,GPD(0.177151,0.00500233)

GSP的邊際分佈:

分段分佈有3個部分

-Inf <x <-0.0161561(0 <p <0.1):下尾,GPD(-0.0382412,0.0103328)

-0.0161561 <x <0.016506(0.1 <p <0.9):內插內核平滑cdf

0.016506 <x <Inf(0.9 <p <1):上尾,GPD(-0.134845,0.00778651)

RWR的邊際分佈:

分段分佈有3個部分

-Inf <x <-0.0172097(0 <p <0.1):下尾,GPD(-0.00540337,0.0114245)

-0.0172097 <x <0.0168041(0.1 <p <0.9):內插內核平滑cdf

0.0168041 <x <Inf(0.9 <p <1):上尾,GPD(0.0302092,0.0117143)

獲得的分段分佈對象容許在CDF內部進行插值並在每一個尾部進行外推(函數評估)。外推容許估計歷史記錄以外的分位數,這對於風險管理應用是很是寶貴的。在這裏,咱們將paretoTail分佈產生的擬合與正態分佈的擬合進行比較。

index = 1;

dist = marginal {index};

CLF

h = probplot(gca,@ dist.cdf);

set(h,'Color','r');

title([ 'Semi-Parametric / Piecewise Probability Plot:' names {index}])

Copula擬合

咱們使用統計工具箱功能來校準和模擬數據。

使用每日索引返回,使用函數copulafit估計高斯和t copula的參數。因爲在標量自由度參數(DoF)變得無限大時,copula變爲高斯copula,所以兩個copula實際上屬於同一族,所以共享線性相關矩陣做爲基本參數。

統計工具箱軟件提供了兩種在copula校準的技術:如下代碼段首先經過上面導出的分段半參數CDF將每日居中的回報轉換爲均勻變量。而後它將Gaussian和t copula擬合到轉換後的數據:

[〜,ax] = plotmatrix(U); title('擬合Copula以前的轉換回報');

估算copula的參數。注意從t copula校準得到的相對較低的自由度參數,代表明顯偏離高斯狀況。

[rho,DoF] = copulafit('t',U,'ApproximateML')

rhoT =

1 0.88229 -0.59693 0.40875 0.58027 0.81485

0.88229 1 -0.52371 0.38906 0.63175 0.73608

-0.59693 -0.52371 1 -0.28404 -0.37285 -0.43114

0.40875 0.38906 -0.28404 1 0.2953 0.36207

0.58027 0.63175 -0.37285 0.2953 1 0.47097

0.81485 0.73608 -0.43114 0.36207 0.47097 1

DoF =

9.5014

估計的相關矩陣與線性相關矩陣類似但不相同

corrcoef(return) 每日收益的%線性相關矩陣

ans =

1 0.89745 -0.61065 0.4677 0.59174 0.83717

0.89745 1 -0.54167 0.45612 0.63322 0.76712

-0.61065 -0.54167 1 -0.30377 -0.3918 -0.44429

0.4677 0.45612 -0.30377 1 0.33312 0.43525

0.59174 0.63322 -0.3918 0.33312 1 0.49161

0.83717 0.76712 -0.44429 0.43525 0.49161 1

Copula模擬

如今已經估計了copula參數,使用copularnd函數模擬聯合依賴的均勻變量。

而後,經過外推Pareto尾部並對平滑後的內部進行插值,經過每一個索引的逆CDF 將從copularnd導出的均勻變量轉換爲每日居中返回。這些模擬的居中回報與從歷史數據集得到的迴歸一致。假設回報在時間上是獨立的,但在任什麼時候間點都具備由給定的copula引發的依賴性和等級相關性。

nPoints = 10000; %#模擬觀測值

計算單週期模擬VaR

來自copula模型的多變量模擬可用於計算樣本組合的風險值和預期不足(CVaR)。

%樣本組合組件權重

wts = [.1 .2 .3 .2 .1 .1]';

%從模擬組件返回生成組合返回

portReturns = R * wts;

%計算VaR

var = -prctile(portReturns,1);

cvar = -mean(portReturns(portReturns <-var));

%與正態分佈比較

R2 = mvnrnd(mean(returns),cov(returns),10000);

normReturns = R2 * wts;

var2 = -prctile(normReturns,1);

cvar2 = -mean(normReturns(normReturns <-var2));

disp('Copula Value-at-Risk ----------------------');

fprintf('99 %% VaR:%0.2f %% \ n99 %% CVaR:%0.2f %% \ n \ n',var * 100,cvar * 100);

disp('多變量正常風險值---------');

fprintf('99 %% VaR:%0.2f %% \ n99 %% CVaR:%0.2f %% \ n \ n',var2 * 100,cvar2 * 100);

Copula風險價值----------------------

99%的風險價值:1.78%

99%CVaR:2.58%

多變量正常風險值---------

99%VaR:1.49%

99%CVaR:1.71%

組合優化

之前,咱們使用模擬回報來計算樣本組合的風險。相反,咱們能夠找到一個最佳投資組合(權重),爲咱們提供必定的回報風險。咱們可使用PortfolioCVaR框架來完成此任務。

p = PortfolioCVaR('ProbabilityLevel',。99,'AssetNames',名稱);

p = p.setScenarios(R);



portRet = p.estimatePortReturn(wts);

CLF

visualizeFrontier(p,portRisk,portRet);

以給定的回報水平計算投資組合

wt = p.estimateFrontierByReturn(.05 / 100);

TOC;

pRisk = p.estimatePortRisk(wt);

pRet = p.estimatePortReturn(wt);

通過的時間是0.635017秒。

相關文章
相關標籤/搜索