主要内容

债券投资组合优化应用投资组合对象

这个例子展示了如何使用投资组合目标是建立一个10年、20年和30年国债的最佳投资组合,持有期限为一个月。整个资产配置流程的工作流程为:

  1. 加载市场数据-从FRED®下载的历史每日国债收益率被加载。

  2. 计算市场不变量——选择到期收益率的日变化作为不变量,并假设为多元正态。由于30年期债券的数据缺失,采用期望最大化算法估计不变量的均值和协方差。不变量的统计数据被预测到投资范围。

  3. 模拟水平上的不变量——由于收益率曲线的高度相关性和固有结构,主成分分析应用于不变量统计。在PCA空间中进行多元正态随机抽取。使用PCA加载将模拟转换回不变空间。

  4. 计算水平回报的分布——收益率曲线的模拟月变化被用来计算水平投资组合证券的收益率。这需要从模拟的收益率曲线上插值值,因为投资组合证券的期限将比10年、20年和30年少一个月。每种情况/证券的利润和损失都是通过使用模拟和插值的收益率对国债定价来计算的。模拟线性收益和它们的统计数据是从价格中计算出来的。

  5. 优化资产配置-使用投资组合对象,对国债收益统计数据进行均值-方差优化,以计算沿有效边界的十个点的最优投资组合权重。投资者的偏好是选择最接近可能夏普比率的平均值的投资组合。

负荷市场数据

加载DGS6MO, DGS1, DGS2, DGS3, DGS5, DGS7, DGS10, DGS20, DGS30的历史到期收益率数据,日期为2000年9月1日至2010年9月1日,从:https://fred.stlouisfed.org/categories/115注意:使用Datafeed Toolbox™,使用如下命令下载数据:>>康涅狄格州弗雷德;>>数据fetch(康涅狄格州,‘DGS10’,‘9/1/2000’,‘9/1/2010’);结果已经聚合并存储在二进制文件中HistoricalYTMData.mat方便归档。

histData = load(“HistoricalYTMData.mat”);%每个系列的到期时间tsYTMMats = histData.tsYTMMats;%观察到速率的日期tsYTMObsDates = histData.tsYTMObsDates;观察率tsYTMRates = histData.tsYTMRates;可视化屈服面[X,Y] = meshgrid(tsYTMMats,tsYTMObsDates);冲浪(X, Y, tsYTMRates EdgeColor =“没有”)包含(“成熟的时间”) ylabel (“观察日期”) zlabel (“到期收益率”)标题(“历史收益率面”

计算市场不变量

对于市场不变量,使用标准:每个系列的到期收益率的日变化。你可以估计它们的统计分布是多元正态分布。对每个不变序列的IID分析都产生了不错的结果——“独立”因子比“相同”因子更明显。使用更复杂的分布和/或时间序列模型进行更彻底的建模超出了本例的范围。需要考虑的是在缺少数据的情况下对分布参数的估计。30年期债券在2002年2月至2006年2月期间停止发行,因此这段时间没有收益。

不变量假设为YTM利率的每日变化。tsYTMRateDeltas = diff(tsYTMRates);

原始数据集中约有1/3的30年期利率(第9列)缺失。而不是抛出所有这些观察,一个期望最大化程序ecmnmle用于估计不变量的均值和协方差。使用默认选项(初始估计的NaN跳过)。

[tsInvMu,tsInvCov] = ecmnmle(tsYTMRateDeltas);

计算标准偏差和相关性使用cov2corr

[tsInvStd,tsInvCorr] = cov2corr(tsInvCov);

投资期限为1个月。(9/1/2010至10/1/2010期间21个工作日)。由于不变量是可求和的,正态分布的均值和方差是正态的,您可以将不变量投影到投资期限如下:

hrznInvMu = 21*tsInvMu';hrznInvCov = 21*tsInvCov;[hrznInvStd,hrznInvCor] = cov2corr(hrznInvCov);

市场不变量投影到地平线有以下统计数据:

disp (”的意思是:“);
意思是:
disp (hrznInvMu);
1.0e-03 * -0.5149 -0.4981 -0.4696 -0.4418 -0.3788 -0.3268 -0.2604 -0.2184 -0.1603
disp (的标准差:);
标准偏差:
disp (hrznInvStd);
0.0023 0.0024 0.0030 0.0032 0.0033 0.0032 0.0030 0.0027 0.0026
disp (的关系:);
相关:
disp (hrznInvCor);
1.0000 0.8553 0.5952 0.5629 0.4980 0.3338 0.3338 0.3088 0.8553 1.0000 0.7901 0.7246 0.6685 0.6175 0.5952 0.8282 1.0000 0.9653 0.9114 0.8589 0.6642 0.5629 0.7901 0.9653 1.0000 0.9519 0.9106 0.8664 0.7764 0.7789 0.9519 1.0000 0.9725 0.9438 0.4467 0.6685 0.8589 0.9106 0.9725 1.0000 0.9730 0.9218 0.8863 0.4028 0.6175 0.8055 0.8664 0.9438 0.9730 1.0000 0.9562 0.3338 0.3349 0.7789 0.8728 0.9562 1.00000.9758 0.3088 0.4973 0.6642 0.7361 0.8322 0.8863 0.9267 0.9758 1.0000

在Horizon模拟市场不变量

高相关性对于不变量在水平面上的分布(以及最终的证券价格)的模拟并不理想。使用主成分分解提取正交不变量。这也可以用于降维,然而,由于不变量的数量仍然相对较小,保留所有九个分量,以实现更精确的重建。然而,市场数据中的缺失值使您无法直接根据时间序列数据进行估计。相反,这可以直接从协方差矩阵中得到

使用不变量的协方差进行PCA分解。[pcaFactorCoeff,pcaFactorVar,pcaFactorExp] = pcacov(hrznInvCov);保留主成分分解的所有分量。numFactors = 9;创建一个PCA因子协方差矩阵。pcaFactorCov = corr2cov(sqrt(pcaFactorVar),eye(numFactors));定义模拟次数(随机抽取)。numSim = 10000;为可重复的结果修复随机种子。流= RandStream(“mrg32k3a”);RandStream.setGlobalStream(流);从均值为零的多元正态分布中随机抽取%和对角线协方差。pcaFactorSims = mvnrnd(零(numFactors,1),pcaFactorCov,numSim);转换为水平不变量并计算统计信息。hrznInvSims = pcaFactorSims*pcaFactorCoeff + repmat(hrznInvMu,numSim,1);hrznInvSimsMu = mean(hrznInvSims);hrznInvSimsCov = cov(hrznInvSims);[hrznInvSimsStd,hrznInvSimsCor] = cov2corr(hrznInvSimsCov);

模拟不变量具有与原始不变量非常相似的统计量:

disp (”的意思是:“);
意思是:
disp (hrznInvSimsMu);
1.0e-03 * -0.5222 -0.5118 -0.4964 -0.4132 -0.3255 -0.3365 -0.2508 -0.2171 -0.1636
disp (的标准差:);
标准偏差:
disp (hrznInvSimsStd);
0.0016 0.0047 0.0046 0.0025 0.0040 0.0017 0.0007 0.0005 0.0004
disp (的关系:);
相关:
disp (hrznInvSimsCor);
1.0000 0.8903 0.7458 -0.4746 -0.4971 - 0.4885 -0.2353 -0.0971 -0.0889 -0.0889 0.7458 0.9463 1.0000 -0.8578 -0.7610 - 0.4659 - 0.2631 -0.4746 -0.7155 -0.8578 1.0000 - 0.9093 -0.4999 0.2378 0.1084 - 0.4972 -0.6787 -0.7610 0.9093 1.0000 -0.7159 0.3061 0.1118 -0.2976 0.4885 0.5164 0.4659 -0.4999 -0.7159 1.0000 -0.5360 -0.1542 0.1327 -0.2353 -0.2238 -0.1890 - 0.3061 -0.5360 1.0000 -0.1108 -0.0971 -0.0889 -0.08240.1084 0.1118 -0.1542 0.3176 1.0000 0.0093 0.1523 0.2198 0.2631 -0.2972 -0.2976 0.1327 -0.1108 0.0093 1.0000

计算地平线证券收益的分布

投资组合将包括10年、20年和30年到期的国债。为简单起见,假设这些是在结算日发行的新债券,并按当前收益率曲线推断的市场价值定价。利润和损失的分配是通过对每一种证券在期限内的每个模拟收益率定价并减去购买价格来计算的。地平线价格要求非标准到期时间收益率。这些计算使用三次样条插值。模拟线性回报是他们从盈利和亏损场景中计算出来的统计数据。

确定购买和投资期限。。settedate = datetime(2010,9,1);hrznDate = datetime(2010,10,1);定义新发行国库券的到期日%结算日期。国债期限= [datetime(2020,9,1), datetime(2030,9,1), datetime(2040,9,1)];上选择利息证券的观测收益率%结算日期。国库yytmatsettle = tsYTMRates(end,7:9);初始化数组以供以后使用。国库yytmathorizonsim = 0 (numSim,3);valuypricesatset = 0 (1,3);valuypricesathorizonsim = 0 (numSim,3);使用年化收益率的实际/实际天数计算基础。基= 8;

在结算日为国库券定价bndprice使用已知到期收益率。为简单起见,假设这些证券都不包括息票支付。虽然价格可能不准确,但价值之间的整体结构/关系是为资产配置过程保留的。

j=1:3 treasuryPricesAtSettle(j) = bndprice(treasury yytmatsettle (j),0, settedate,...treasuryMaturities (j),“基础”、基础);结束

要在未来为国债定价,你需要知道每个模拟的9年11个月,19年11个月和29年11个月的到期收益率。你可以近似这些使用三次样条插值使用interp1

将模拟不变量转换为视界处的YTM。hrznYTMRatesSims = repmat(tsYTMRates(end,:),numSim,1) + hrznInvSims;hrznytmmaturity = [datetime(2011,4,1),datetime(2011,10,1),datetime(2012,10,1),datetime(2013,10,1),datetime(2015,10,1),datetime(2017,10,1),datetime(2020,10,1),datetime(2030,10,1),datetime(2040,10,1)];将日期转换为数字序列日期。x = datenum(hrznytmmaturity);xi = datenum(国库期限);为了数值精度,将x值从0开始。minDate = min(x);x = x - minDate;xi = xi - minDate;

对于每个模拟和成熟度,在10年、20年和30年节点附近近似收益。请注意,样条拟合与线性拟合的效果对最终的理想分配有显著影响。这是由于使用线性拟合点时,产量的严重低估。

i=1:numSim国库yytmathorizonsim (i,:) = interp1(x,hrznYTMRatesSims(i,:),xi,样条的);结束可视化一个模拟的收益率曲线与插值。图;情节(x, hrznYTMRatesSims (1:)' k o '“罗”);包含(的时间(天));ylabel (“收益”);传奇({“模拟收益率曲线”“窜改收益率”},“位置”“本身”);网格;标题(“放大查看样条与线性插值”);

为每个模拟到期收益率的国债定价。请注意,这里所做的假设与前面调用中的相同bndprice

base = 8*ones(numSim,1);j=1:3 treasuryPricesAtHorizonSim(:,j) = bndprice(treasury yytmathorizonsim (:,j),0,...hrznDate treasuryMaturities (j),“基础”、基础);结束计算线性收益的分布。treasuryReturns = (treasuryPricesAtHorizonSim - repmat(treasuryPricesAtSettle,numSim,1))./repmat(treasuryPricesAtSettle,numSim,1);计算返回统计信息。retsMean =均值(treasuryReturns);retsCov = cov(国库收益);[retsStd, retscoor] = cov2corr(retsCov);可视化30年的国库结果。图直方图(treasuryReturns(: 1), 100年,标准化=“pdf”EdgeColor =“没有”)举行直方图(treasuryReturns(:, 2), 100年,标准化=“pdf”EdgeColor =“没有”)直方图(treasuryReturns(: 3), 100年,标准化=“pdf”EdgeColor =“没有”)举行标题(10年、20年、30年国债的收益分布);网格传奇({“十年”“20年”“30年”});

优化资产配置使用投资组合对象

优化资产配置投资组合对象。十大最佳投资组合(NumPorts)的计算方法为estimateFrontier并计算其夏普比率。根据投资者的偏好,最优投资组合是最接近夏普比率最大值的投资组合。

创建一个投资组合对象使用投资组合.你可以使用setAssetMoments的资产收益的矩(均值和协方差)投资组合对象和setDefaultConstraints建立和为1的非负权重的投资组合约束。

创建一个投资组合对象。p =投资组合;p = setAssetMoments(p,retsMean,retsCov);p = setDefaultConstraints(p)
p =组合与属性:BuyCost: [] SellCost: [] RiskFreeRate: [] AssetMean: [3×1 double] AssetCovar: [3×3 double] TrackingError: [] TrackingPort: [] Turnover: [] BuyTurnover: [] SellTurnover:[]名称:[]NumAssets: 3 AssetList: [] InitPort: [] AInequality: [] bInequality: [] AEquality: [] bEquality: [] LowerBound: [] LowerBudget: 1 UpperBudget: 1 GroupMatrix: [] LowerGroup: [] UpperGroup: [] GroupA: [] GroupB: [] LowerRatio: [] UpperRatio: [] MinNumAssets:[] MaxNumAssets: [] BoundType: [3×1 categorical]

计算有效边界投影上的10个点estimateFrontier而且estimatePortMoments来估计投资组合收益的时刻投资组合对象。

NumPorts = 10;porttwts = estimateFrontier(p,NumPorts);[PortRisk, PortReturn] = estimatePortMoments(p, porttwts);可视化投资组合。图;次要情节(2,1,1)情节(PortRisk PortReturn,' k o ');包含(“风险投资”);ylabel (“投资回报”);标题(“高效前沿投影”);传奇(“最佳组合”“位置”“本身”);网格;次要情节(2,1,2)酒吧(PortWts ',“堆叠”);包含(组合数的);ylabel (的组合权重);标题(“投资于每份国债的百分比”);传奇({“十年”“20年”“30年”});

使用estimateMaxSharpeRatio来估计夏普比率最大化的有效投资组合投资组合对象。

investorPortfolioWts = estimateMaxSharpeRatio(p);

投资者在10年、20年和30年国债中的配置比例为:

disp (investorPortfolioWts);
0.6078 0.1374 0.2548

另请参阅

|||||||

相关的例子

更多关于