Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

estimateMaxSharpeRatio

估计有效投资组合以最大化 Portfolio 对象的夏普比率

说明

示例

[pwgt,pbuy,psell] = estimateMaxSharpeRatio(obj) 估计有效投资组合以最大化 Portfolio 对象的夏普比率。有关工作流的详细信息,请参阅 Portfolio Object Workflow

示例

[pwgt,pbuy,psell] = estimateMaxSharpeRatio(___,Name,Value) 添加可选的名称-值对组参数。

示例

全部折叠

估计使夏普比率最大化的有效投资组合。estimateMaxSharpeRatio 函数可使有效边界投资组合中的夏普比率最大化。此示例使用默认的 'direct' 方法估计最大夏普比率。有关 'direct 方法的详细信息,请参阅算法

p = Portfolio('AssetMean',[0.3, 0.1, 0.5], 'AssetCovar',...
[0.01, -0.010,  0.004; -0.010,  0.040, -0.002;  0.004, -0.002,  0.023]);
p = setDefaultConstraints(p);
plotFrontier(p, 20);
weights = estimateMaxSharpeRatio(p);
[risk, ret] = estimatePortMoments(p, weights);
hold on
plot(risk,ret,'*r');

Figure contains an axes. The axes with title \bfEfficient Frontier contains 2 objects of type line.

估计使夏普比率最大化的有效投资组合。estimateMaxSharpeRatio 函数使有效边界上的投资组合中的夏普比率最大化。此示例对未指定跟踪误差且仅使用线性约束的 Portfolio 对象 (p) 使用 'direct' 方法。setSolver 函数用于控制 SolverType SolverOptions。在本例中,SolverType quadprog。有关 'direct' 方法的详细信息,请参阅算法

p = Portfolio('AssetMean',[0.3, 0.1, 0.5], 'AssetCovar',...
[0.01, -0.010,  0.004; -0.010,  0.040, -0.002;  0.004, -0.002,  0.023]);
p = setDefaultConstraints(p);
plotFrontier(p, 20);
p = setSolver(p,'quadprog','Display','off','ConstraintTolerance',1.0e-8,'OptimalityTolerance',1.0e-8,'StepTolerance',1.0e-8,'MaxIterations',10000); 
weights = estimateMaxSharpeRatio(p); 
[risk, ret] = estimatePortMoments(p, weights);
hold on
plot(risk,ret,'*r');

Figure contains an axes. The axes with title \bfEfficient Frontier contains 2 objects of type line.

估计使夏普比率最大化的有效投资组合。estimateMaxSharpeRatio 函数使有效边界上的投资组合中的夏普比率最大化。此示例对指定了跟踪误差且使用非线性约束的 Portfolio 对象 (p) 使用 'direct' 方法。setSolver 函数用于控制 SolverType SolverOptions。在本例中,fminconSolverType

p = Portfolio('AssetMean',[0.3, 0.1, 0.5], 'AssetCovar',...
[0.01, -0.010,  0.004; -0.010,  0.040, -0.002;  0.004, -0.002,  0.023],'lb', 0,'budget', 1);
plotFrontier(p, 20);

p = setSolver(p, 'fmincon', 'Display', 'off', 'Algorithm', 'sqp', ...
        'SpecifyObjectiveGradient', true, 'SpecifyConstraintGradient', true, ...
        'ConstraintTolerance', 1.0e-8, 'OptimalityTolerance', 1.0e-8, 'StepTolerance', 1.0e-8); 

weights = estimateMaxSharpeRatio(p);        

te = 0.08;
p = setTrackingError(p,te,weights);

[risk, ret] = estimatePortMoments(p,weights);
hold on
plot(risk,ret,'*r');

Figure contains an axes. The axes with title \bfEfficient Frontier contains 2 objects of type line.

estimateMaxSharpeRatio 函数使有效边界上的投资组合中的夏普比率最大化。在具有无风险资产的投资组合的情况下,有多个有效的投资组合可以最大化资产线的夏普比率。鉴于 'direct''iterative' 方法自身的性质,上述每种方法的投资组合权重 (pwgts) 输出可能会有所不同,但夏普比率是相同的。此示例演示了 pwgts 不同而夏普比率相同的情形。

load BlueChipStockMoments

mret = MarketMean;
mrsk = sqrt(MarketVar);
cret = CashMean;
crsk = sqrt(CashVar);

p = Portfolio('AssetList', AssetList, 'RiskFreeRate', CashMean);
p = setAssetMoments(p, AssetMean, AssetCovar);

p = setInitPort(p, 1/p.NumAssets);
[ersk, eret] = estimatePortMoments(p, p.InitPort);

p = setDefaultConstraints(p);
pwgt = estimateFrontier(p, 20);
[prsk, pret] = estimatePortMoments(p, pwgt);
pwgtshpr_fully = estimateMaxSharpeRatio(p,'Method','direct');
[riskshpr_fully, retshpr_fully] = estimatePortMoments(p,pwgtshpr_fully);

q = setBudget(p, 0, 1);
qwgt = estimateFrontier(q, 20);
[qrsk, qret] = estimatePortMoments(q, qwgt);

绘制有效边界及其切线(现金比例为 01)。

pwgtshpr_direct = estimateMaxSharpeRatio(q,'Method','direct');
pwgtshpr_iter = estimateMaxSharpeRatio(q,'Method','iterative');
[riskshpr_diret, retshpr_diret] = estimatePortMoments(q,pwgtshpr_direct);
[riskshpr_iter, retshpr_iter] = estimatePortMoments(q,pwgtshpr_iter);

clf;
portfolioexamples_plot('Efficient Frontier with Capital Allocation Line', ...
                {'line', prsk, pret, {'EF'}, '-r', 2}, ...
                {'line', qrsk, qret, {'EF with riskfree'}, '-b', 1}, ...
                {'scatter', [mrsk, crsk, ersk, riskshpr_fully, riskshpr_diret, riskshpr_iter], ...
    [mret, cret, eret, retshpr_fully , retshpr_diret, retshpr_iter], {'Market', 'Cash', 'Equal','Sharpe fully invest', 'Sharpe diret','Sharpe iter'}}, ...
                {'scatter', sqrt(diag(p.AssetCovar)), p.AssetMean, p.AssetList, '.r'});  

Figure contains an axes. The axes with title \bfEfficient Frontier with Capital Allocation Line contains 40 objects of type line, scatter, text. These objects represent EF, EF with riskfree.

当投资组合中没有无风险资产时,换句话说,当投资组合已全部用于投资时,有效边界为曲线,对应于上图中的红线。因此,存在一个使夏普比率最大化的唯一(风险,收益)点,'iterative''direct' 方法都可以找到该点。如果允许投资组合投资无风险资产,则红色有效边界线的一部分将被资产配置线代替,从而得到具有无风险投资的投资组合的有效边界(蓝线)。直的蓝线上的所有(风险,收益)点都具有相同的夏普比率。此外,'iterative''direct' 方法很可能以不同的点结束,因此存在不同的投资组合分配。

为三项资产创建一个 Portfolio 对象。

AssetMean = [ 0.0101110; 0.0043532; 0.0137058 ];
AssetCovar = [ 0.00324625 0.00022983 0.00420395;
               0.00022983 0.00049937 0.00019247;
               0.00420395 0.00019247 0.00764097 ];  
p = Portfolio('AssetMean', AssetMean, 'AssetCovar', AssetCovar);
p = setDefaultConstraints(p);           

使用具有半连续约束的 setBounds 为所有 i = 1,...NumAssets 设置 xi = 00.02 <= xi <= 0.5

p = setBounds(p, 0.02, 0.5,'BoundType', 'Conditional', 'NumAssets', 3);                    

当使用 Portfolio 对象时,setMinMaxNumAssets 函数支持您为纯多头投资组合设置基数约束。这为 Portfolio 对象设置了基数约束,其中满足非零半连续约束的已分配资产总数介于 MinNumAssetsMaxNumAssets 之间。通过设置 MinNumAssets = MaxNumAssets = 2,仅对投资组合的三项资产中的两项进行了投资。

p = setMinMaxNumAssets(p, 2, 2);  

使用 estimateMaxSharpeRatio 估计有效投资组合以最大化夏普比率。

weights = estimateMaxSharpeRatio(p,'Method','iterative')
weights = 3×1

    0.0000
    0.5000
    0.5000

estimateMaxSharpeRatio 函数使用 MINLP 求解器来求解此问题。使用 setSolverMINLP 函数来配置 SolverType 和选项。

p.solverOptionsMINLP
ans = struct with fields:
                           MaxIterations: 1000
                    AbsoluteGapTolerance: 1.0000e-07
                    RelativeGapTolerance: 1.0000e-05
                  NonlinearScalingFactor: 1000
                  ObjectiveScalingFactor: 1000
                                 Display: 'off'
                           CutGeneration: 'basic'
                MaxIterationsInactiveCut: 30
                      ActiveCutTolerance: 1.0000e-07
                  IntMasterSolverOptions: [1x1 optim.options.Intlinprog]
    NumIterationsEarlyIntegerConvergence: 30

输入参数

全部折叠

投资组合的对象,使用 Portfolio 对象指定。

注意

无风险收益率是从 Portfolio 对象的属性 RiskFreeRate 中获得的。如果未设置 RiskFreeRate,则假定为 0。如果投资组合的最大收益率小于 RiskFreeRate,则解会设置为最大收益率时的 pwgt,得到的夏普比率为负数。

有关创建 Portfolio 对象的详细信息,请参阅

数据类型: object

名称-值对组参数

指定可选的以逗号分隔的 Name,Value 参数对组。Name 是参数名称,Value 是对应的值。Name 必须放在引号内。您可以按任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN

示例: [pwgt,pbuy,psell] = estimateMaxSharpeRatio(p,'Method’,'iterative')

估计夏普比率的方法,指定为以逗号分隔的对组,其中包含 'Method' 和具有下列值之一的字符向量:

注意

如果您在 estimateMaxSharpeRatio 中使用具有半连续和基数约束(由 setBoundssetMinMaxNumAssets 指定)的 Portfolio 对象,则只能使用 'iterative' 方法。

数据类型: char

输出参数

全部折叠

具有最大夏普比率的有效边界投资组合,返回为 NumAssets 向量。

相对于初始投资组合,为建立具有最大夏普比率的有效边界上的投资组合需要进行的买入交易,以 NumAssets 向量形式返回。

Portfolio 输入对象 (obj) 返回 pbuy

相对于初始投资组合,为建立具有最大夏普比率的有效边界上的投资组合需要进行的卖出交易,以 NumAssets 向量形式返回。

Portfolio 输入对象 (obj) 返回 psell

详细信息

全部折叠

夏普比率

夏普比率是投资组合收益率均值与无风险利率之差除以投资组合收益标准差的比率。

estimateMaxSharpeRation 函数可使有效边界投资组合中的夏普比率最大化。

提示

您也可以使用圆点表示法来估计最大化夏普比率的有效投资组合。

[pwgt,pbuy,psell] = obj.estimateMaxSharpeRatio;

算法

通过使用 'direct''iterative' 方法来实现夏普比率最大化。对于 'direct' 方法,假定有以下情形。最大化夏普比率的公式为:

MaximizeμTxrfxTCx,s.t.xi=1,  0xi1,

其中,μ 和 C 是均值和协方差矩阵,rf 为无风险利率。

对于所有 x,如果 μT x - rf ≤ 0,则使夏普比率最大化的投资组合就是具有最大收益率的投资组合。

如果 μTx - rf > 0,则使 t=1μTxrf

且 y = tx (Cornuejols [1] section 8.2)。然后,通过一些替换,我们可以将原始问题转换为以下形式:

Minimize yTCy, s.t. yi=t, t>0, 0yit , μTyrft=1. 

只需求解一次优化,因此称为 “direct”。可以通过以下方式恢复投资组合权重:x* = y* / t*

对于 'iterative' 方法,目的是通过迭代方式在有效边界上探索不同收益率水平的投资组合,并找到具有最大夏普比率的投资组合。因此,在此过程中会求解多个优化问题,而不像使用 'direct' 方法时只需求解一次。因此,与 'direct' 方法相比,'iterative' 方法要慢一些。

参考

[1] Cornuejols, G. and Reha Tütüncü. Optimization Methods in Finance. Cambridge University Press, 2007.

在 R2011b 中推出