zoukankan      html  css  js  c++  java
  • matlab代写使用Copula仿真优化市场风险

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

    使用Copula仿真优化市场风险

    此示例演示了使用具有胖尾边缘分布的多变量copula模拟计算投资组合的风险价值和条件风险值(预期缺口)。然后使用模拟来计算最优风险收益组合的有效前沿。

    内容

    • 导入支持历史数据集
    • 可视化标准化价格
    • 退货和边际分配
    • Copula校准
    • Copula模拟
    • 计算单周期模拟VaR
    • 组合优化
    • 以给定的回报水平计算投资组合

    导入支持历史数据集

    使用Datafeed Toolbox的API导入我们将在本练习中建模的不同资产类别的市场数据

    • SPY:大盘美国(标准普尔500指数)
    • EEM:新兴市场股票
    • TLT:20年期国债(iShares Barclays)
    • COY:美国高收益债券
    • 普惠制:大宗商品(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);

    nAssets = length(名字);

    可视化标准化价格

    该图显示了每个指数的相对价格走势。每个指数的初始水平已经标准化为统一,以便于比较历史记录中的相对表现。

    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');

    fprintf('%s的边缘分布: n',名称{i});

     

    SPY的边际分布:

    分段分布有3个部分

    -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个部分

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

    -0.0186259 <x <0.0185703(0.1 <p <0.9):内插内核平滑cdf

    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的线性相关矩阵的校准很简单,但是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; %#模拟观测值

    U = copularnd('t',rhoT,DoF,nPoints); %从t copula模拟U(0,1)

    [〜,ax] = plotmatrix(R); title('模拟回报的成对相关');

    计算单周期模拟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);

    p = p.setDefaultConstraints();

    wts = p.estimateFrontier(20);

    portRisk = p.estimatePortRisk(wts);

    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秒。

    如果您有任何疑问,请在下面发表评论。

  • 相关阅读:
    鼠标移动,背景变色
    datatable 删除行
    GridView新增一行,更新所有行實現
    让层垂直居中于浏览器窗口
    extjs学习笔记(转)
    Extjs中的panel
    JDK和JRE的区别(转)
    EXTJS中form添加按钮触发事件
    web.xml详解
    Oracle数据库中的诊断文件(转)
  • 原文地址:https://www.cnblogs.com/tecdat/p/9635283.html
Copyright © 2011-2022 走看看