这个例子展示了如何建立一个基本的资产配置问题,使用均值-方差组合优化和文件夹
目的是估计有效的投资组合。
假设你想管理一只资产配置基金,该基金有四种资产类别:债券、大盘股、小盘股和新兴股。该基金只做多,没有借贷或杠杆,投资组合中股票的比重不应超过85%,新兴市场股票的比重不应超过35%。前三种资产的交易成本折合成年率为10个基点,新兴市场股票的交易成本则高出4倍。最后,你要确保平均营业额不超过15%。为了解决这个问题,你需要建立一个基本的均值-方差组合优化问题,然后慢慢地引入问题上的各种约束来得到一个解决方案。
为了建立投资组合优化问题,首先从与问题结构相关的已知量的基本定义开始。假设每个资产类别都有一个可交易的实时价格资产。例如,这些资产可以是交易所交易基金(ETFs)。初始投资组合,每项资产的总持有量为750万美元,另外还有6万美元的现金头寸。这些基本数量和交易成本设置在单元格数组中的资产名称的以下变量中资产
,向量中的当前价格价格
,当前投资组合中的持股矢量霍尔丁
,交易成本在向量中UnitCost
.
要分析这个作品集,你可以在一个表格
对象,以帮助跟踪价格、持股、权重等。特别是,您可以计算初始投资组合权重,并在一个名为InitPort
.
资产= {“债券”,“大型股票”,“小盘股股票”,“新兴市场”};价格= [52.4;122.7;35.2;46.9);Holding = [42938;24449;42612;15991);单位成本= [0.001; 0.001; 0.001; 0.004 ]; Blotter = table(“RowNames”,资产);吸墨纸。价格=价格;Blotter.InitHolding=保持;财富=总和(Blotter.Price.*Blotter.InitHolding);Blotter.InitPort=(1/财富)*(Blotter.Price.*Blotter.InitHolding);Blotter.UnitCost=单位成本;吸墨纸
吸墨纸=4×4表价格初始持有初始端口单位成本债券52.4 42938 0.3 0.001大盘股122.7 24449 0.4 0.001小盘股35.2 42612 0.2 0.001新兴股票46.9 15991 0.1 0.004
由于这是一个假设的例子,为了从给定的资产类别的年资产总回报的均值和协方差来模拟资产价格portsim
函数用于创建具有期望均值和协方差的资产回报。具体地说,portsim
是用来模拟5年的月总回报,然后绘制以显示模拟的总回报价格的对数
年度资产总回报的平均值和协方差在变量中保持不变资产平均
和AssetCovar
.在变量中保持了模拟的资产总回报价格(即复合总回报)Y
.所有初始资产总回报价格均标准化为1
在这个例子中。
AssetMean = [0.05;0.1;0.12;0.18);AssetCovar = [0.0064 0.00408 0.00192 0;0.00408 0.0289 0.0204 0.0119;0.00192 0.0204 0.0576 0.0336;0 0.0119 0.0336 0.1225];X = portsim(AssetMean'/12, AssetCovar/12, 60);% 5年(60个月)每月总回报率[Y,T]=ret2tick(X,[],1/12);%构成总回报价格。情节(T,日志(Y));标题(“\bF模拟资产类别总回报价格”);包含(“年”);ylabel (“记录总退货价格”);图例(资产、,“位置”,“最好的”);
为了探索有效边界上的投资组合,建立一个文件夹
对象使用这些规范:
投资组合权重是非负的,和为1
.
股权配置不超过投资组合的85%。
新兴市场股票只占投资组合的35%。
这些规范被纳入文件夹
对象p
在以下使用函数的顺序中,首先使用文件夹
对象。
初始组合的规格说明压滤
给出你的空间中资产的数量,所以你不需要指定NumAssets
直接的财产。接下来,设置默认约束(只有长约束和预算约束)。此外,建立对投资组合中的股权施加上限的群组约束(股权在群组矩阵中被识别为)1
以及新兴股市的上限约束。尽管你本可以使用setBounds
函数,注意addGroups
函数用于设置此约束。
要有一个完全指定的均值-方差组合优化问题,您必须指定资产回报的均值和协方差。从这些变量开始资产平均
和AssetCovar
,你可以使用setAssetMoments
函数将这些变量输入文件夹
对象(请记住,您假设您的原始数据是月回报率,这就是为什么您将年度输入时刻除以12以获得月回报率)。
使用总回报价格与estimateAssetMoments
函数与您的数据所包含的规范Y
是价格而不是回报来估算你的资产回报时刻吗文件夹
对象。
虽然在你的文件夹
对象的单位是月收益,由于后续成本是年化的,通过直接转换,可以方便地将其指定为年化总收益资产平均
和AssetCovar
你的属性文件夹
对象p
.
显示文件夹
对象p
.
p=投资组合(“名字”,“资产配置投资组合”,...“AssetList”资产,“InitPort”, Blotter.InitPort);p = setDefaultConstraints (p);p = setGroups(p, [0, 1, 1], [], 0.85);p = addGroups(p, [0, 0, 0, 1], [], 0.35);p = setAssetMoments(p, AssetMean/12, AssetCovar/12);p = estimateAssetMoments(p, Y,“数据格式”,“价格”);p.AssetMean = 12 * p.AssetMean;p.AssetCovar = 12 * p.AssetCovar;显示器(p)
p = Portfolio with properties: BuyCost: [] SellCost: [] RiskFreeRate: [] AssetMean: [4x1 double] AssetCovar: [4x4 double] TrackingError: [] TrackingPort: [] Turnover: [] BuyTurnover: [] SellTurnover: [] Name: 'Asset Allocation Portfolio' NumAssets: 4 Asset list: {1x4 cell} InitPort: [4x1 double] ainequal: [] bInequality: [] AEquality:[] bEquality: [] LowerBound: [4x1 double] UpperBound: [] LowerBudget: 1 UpperBudget: 1 GroupMatrix: [2x4 double] LowerGroup: [] UpperGroup: [2x1 double] GroupA: [] GroupB: [] LowerRatio: [] UpperRatio: [] MinNumAssets: [] MaxNumAssets: [] BoundType: [4x1 category]
投资组合优化的一个重要步骤是验证投资组合问题的可行性,主要的检验是确保投资组合的集合是非空的和有界的。使用estimateBounds
函数来确定投资组合集的边界。在这种情况下,由于磅
和乌兰巴托
是有限的,集合是有界的。
[lb, ub] = estimateBounds(p);显示器((磅,乌兰巴托))
0.1500 1.0000 0 0.8500 0 0.8500 0 0.3500
考虑到建造文件夹
对象,使用情节边界
函数可查看有效边界。您可以显示包含40个投资组合的边界,而不是沿边界使用默认的10个投资组合。请注意,总有效投资组合回报率每年大约在6%到16%之间。
(第40页)
的文件夹
对象p
不包括交易成本,因此在p
使用总投资回报作为回报代理。为了处理净收益,创建第二个文件夹
对象问
这包括交易成本。
q=设定成本(p,单位成本,单位成本);显示(q)
q = Portfolio with properties: BuyCost: [4x1 double] SellCost: [4x1 double] RiskFreeRate: [] AssetMean: [4x1 double] AssetCovar: [4x4 double] TrackingError: [] TrackingPort: [] Turnover: [] BuyTurnover: [] SellTurnover: [] Name: 'Asset Allocation Portfolio' NumAssets: 4 Asset list: {1x4 cell} InitPort: [4x1 double] ainequal: [] bInequality: [] bInequality:[] AEquality: [] bEquality: [] LowerBound: [4x1 double] UpperBound: [] LowerBudget: 1 UpperBudget: 1 GroupMatrix: [2x4 double] LowerGroup: [] UpperGroup: [2x1 double] GroupA: [] GroupB: [] LowerRatio: [] UpperRatio: [] MinNumAssets: [] MaxNumAssets: [] BoundType: [4x1 category]
要更具体地了解有效投资组合收益和风险的范围,请使用estimateFrontierLimits
函数获取有效边界端点处的投资组合。考虑到这些投资组合,用estimatePortMoments
函数。下面的代码生成一个表,列出初始投资组合的风险和回报,以及有效边界端点处投资组合回报的总和净时刻:
[prsk0, pre0] = estimatePortMoments(p, p. initport);pret = estimatePortReturn(p, p. estimatefrontierlimits);qret = estimatePortReturn(q, q. estimatefrontierlimits);qret displayReturns (pret0现成的)
年化投资组合回报率。。。初始投资组合总净回报率9.70%9.70%最低有效投资组合回报率5.90%5.77%最高有效投资组合回报率13.05%12.86%
结果表明,在有效边界的端点,从当前投资组合到有效投资组合的交易成本从14到19个基点不等(这些成本是投资组合的总回报和净回报之间的差异)。另外,由于股权配置的限制,投资组合的最大有效回报(13%)小于最大资产回报(18%)。
选择有效投资组合的一种常见方法是选择一个在预期投资组合回报范围内具有期望分数的投资组合。要获得有效边界上从最小到最大回报范围的30%的投资组合,请在qret
使用文件夹
对象问
然后插值得到一个30%的水平interp1
函数获取一个投资组合qwgt
.
级别=0.3;qret=estimatePortReturn(q,q.estimateFrontierLimits);qwgt=estimateFrontierByReturn(q,interp1([0,1],qret,Level));[qrsk,qret]=estimatePortMoments(q,qwgt);displayReturnLevel(Level,qret,qrsk);
投资组合在30%的回报率水平在有效边界…回报风险7.90 9.09
显示器(qwgt)
qwgt=4×10.6252 0.1856 0.0695 0.1198
从最小到最大的净收益范围的30%的目标投资组合,回报率为7.9%,风险为9.1%。
虽然您可以接受此结果,但假设您希望投资组合风险的目标值。具体来说,假设您的保守目标风险为10%,中等目标风险为15%,积极目标风险为20%,并且您希望获得满足每个风险目标的投资组合。使用estimateFrontierByRisk
函数获取变量中指定的目标风险TargetRisk
.在式中得到了三个有效组合qwgt
.
TargetRisk = [0.10;0.15;0.20);qwgt = estimateFrontierByRisk(q, TargetRisk);显示器(qwgt)
qwgt=4×30.5407 0.2020 0.1500 0.2332 0.4000 0.0318 0.0788 0.1280 0.4682 0.1474 0.2700 0.3500
使用estimatePortRisk
函数计算三个组合的组合风险,以确定目标风险已达到:
显示器(estimatePortRisk (q, qwgt))
0.1000 0.1500 0.2000
假设你想从当前的投资组合转向中等的投资组合。你可以估算购买和销售,以获得以下组合:
[qwgt, qbuy, qsell] = estimateFrontierByRisk(q, 0.15);
如果你对这个投资组合的购买和销售进行平均计算,你会发现平均营业额是17%,高于15%的目标:
显示(金额(qbuy+qsell)/2)
0.1700
由于您还希望确保平均成交量不超过15%,您可以将平均成交量约束添加到文件夹
对象使用setTurnover
:
q = setTurnover(q, 0.15);[qwgt, qbuy, qsell] = estimateFrontierByRisk(q, 0.15);
您可以将估计的购买和销售的有效投资组合输入压滤
:
Qbuy (abs(Qbuy) < 1.0.0 -5) = 0;Qsell (abs(Qsell) < 1.0.0 -5) = 0;接近0的交易权重为零。吸墨纸。端口= qwgt;吸墨纸。买= qbuy; Blotter.Sell = qsell; display(Blotter)
吸墨纸=表4×7Price InitHolding InitPort UnitCost Port Buy - Sell _____ ___________ ________ ________ ___________ ________ Bonds 52.4 42938 0.3 0.001 0.18787 0 0.11213大盘股122.7 24449 0.4 0.001 0.4 00小盘股35.2 42612 0.2 0.001 0.16213 0 0.037871新兴股46.9 15991 0.1 0.004 0.25 0.15 0
的买
和卖
的元素压滤
指投资组合权重的变化,必须转换为投资组合持有量的变化以确定交易。由于您使用的是净投资组合回报,因此必须首先计算从初始投资组合到新投资组合的交易成本。这一过程如下所示:
总成本=财富*总和(记事簿。UnitCost。*(记事簿。购买+ Blotter.Sell))
TotalCost = 5.6248 e + 03
交易成本是5625美元,所以,一般来说,在设定新的投资组合权重之前,你必须相应地调整你的初始财富。然而,为了使分析简单,请注意你有足够的现金(60万美元)来支付交易成本,而且你不会动用现金头寸来建立投资组合中的任何头寸。因此,你可以在不改变总投资财富的情况下,用新的投资组合资产和交易填充你的记事簿,从而获得新的投资组合。首先,计算持有的投资组合:
吸墨纸。霍尔丁= Wealth * (Blotter.Port ./ Blotter.Price);
计算要共享的数量买
和卖
在你的压滤
:
吸墨纸。买Share = Wealth * (Blotter.Buy ./ Blotter.Price); Blotter.SellShare = Wealth * (Blotter.Sell ./ Blotter.Price);
注意你是如何使用特别的截断规则获取单位数量的股票进行买卖。清理压滤
通过去除单位成本和买卖组合权重:
吸墨纸。买= []; Blotter.Sell = []; Blotter.UnitCost = [];
最终的结果是一个记事簿,里面包含了从你当前的投资组合到中等风险投资组合的建议交易。要进行交易,你需要出售16049股债券资产和8069股小盘股股票资产,还需要购买23986股新兴股票资产。
显示器(压滤)
吸墨纸=表4×7Price InitHolding InitPort Port Holding BuyShare SellShare _____ ___________ ________ _______ _______ ________ _________ Bonds 52.4 42938 0.3 0.18787 268890 16049大盘股122.7 24449 0.4 0.4 24449 0 0小盘股35.2 42612 0.2 0.16213 34543 0 8068.8新兴股46.9 15991 0.1 0.25 39977 23986 0
最后的情节使用了情节边界
函数,用于显示完全指定的投资组合优化问题的有效边界和初始投资组合。它还增加了中等风险或最终投资组合在有效边界上的位置。
plotFrontier (q, 40);持有在分散(estimatePortRisk(q, qwgt), estimatePortReturn(q, qwgt),“填充”,“r”);h =传奇(“初始投资组合”,“有效边界”,“最后的投资组合”,“位置”,“最好的”); 设置(h,“字体大小”8);持有从
函数displayReturns(pre0, pret, qret)“年化投资组合回报……n”);流(% 6 s % 6年代\ n,“毛”,“净”);流('初始投资回报率%6.2f %% 6.2f %%\n', 100 * pret0,100 * pret0);流('最低有效投资回报率%6.2f %% 6.2f %%\n',100*pret(1),100*qret(1));fprintf('最大有效投资回报率%6.2f %% 6.2f %%\n'100 *现成的(2),100 * qret (2));结束函数displayReturnLevel(Level, qret, qrsk) fprintf(“有效边界上%g%%回报水平的投资组合…\n”, 100 *水平);流(% 10 s % 10年代\ n,“返回”,“风险”);流(“%10.2f%10.2f\n”, 100 * 100 * qret qrsk);结束
文件夹
|setBounds
|addGroups
|setAssetMoments
|estimateAssetMoments
|estimateBounds
|情节边界
|estimateFrontierLimits
|estimateFrontierByRisk
|estimatePortRisk