Code covered by the BSD License  

Highlights from
Building and Extending Portfolio Optimization Models with MATLAB

image thumbnail

Building and Extending Portfolio Optimization Models with MATLAB

by

 

Object-oriented implementations of the Portfo and the Black-Litterman approach

PortfolioBL
classdef PortfolioBL < Portfolio
    %PortfolioBL Black-Litterman Optimization model implementation
    %   This Class extends the Portfolio object and implements methods to
    %   support Black-Litterman Optimization
    
    %   -------------------------------------------------------------------
    %   Author: Sri Krishnamurthy,CFA
    %   Contact: skrishna@mathworks.com
    %   Copyright 1984-2013 The MathWorks, Inc.
    
    
    properties
        % Views
        P % Link matrix ; Size : [No of Views * No of Assets]
        Q % Views vector Size: [ No of views]
        % Confidence
        Omega % Omega Matrix
        Tau % Tau parameter
        IndexData
        PI % Implied Excess Returns
        ExcessHistoricalReturns
        ExcessImpliedReturns
    end
    
    methods
        % Set Methods
        function obj = setP(obj,P)
            obj.P = P;
        end
        
        function obj = setQ(obj,Q)
            obj.Q = Q;
        end
        
        function obj = setTau(obj,Tau)
            obj.Tau = Tau;
        end
        
        function obj = setOmega(obj,Omega)
            obj.Omega = Omega;
        end
        
        function obj = setIndexData(obj,indexData)
            obj.IndexData = indexData;
        end
        
        function obj = setPI(obj,PI)
            obj.PI = PI;
        end
        % Compute Methods
        
        function obj = PortfolioBL(varargin)
            obj = obj@Portfolio(varargin{:});
        end
        
        % Function to compute the expected covariance and expected excess
        % returns vector
        function obj = computeBlackLitterman(obj)
            viewPart1 = obj.P'*(obj.Omega\obj.P);
            viewPart2 = obj.P'*(obj.Omega\obj.Q);
            if isempty(viewPart1)
                blMean = obj.PI;
            else
                blMean = (inv(obj.Tau*obj.AssetCovar) + viewPart1)...
                    \((obj.Tau*obj.AssetCovar)\obj.PI + viewPart2);
            end
            obj.AssetMean = blMean + obj.RiskFreeRate;
        end
        
        function obj = inputExpectedReturnViews(obj)
            views = View;
            obj.P = views.P;
            obj.Q = views.Q;
        end
        
        function obj = computeExcessHistoricalReturns(obj,portfolio,rfAsset)
            obj.ExcessHistoricalReturns = mean(portfolio-repmat(rfAsset,1,size(portfolio,2)))';
        end
        
        function obj = computeExcessImpliedReturns(obj,portfolio,market,rfAsset,mktCaps )
            % PI = delta*sigma*wMkt
            sigma = cov(portfolio);
            wMkt = mktCaps/(sum(mktCaps));
            % delta = Avg Excess return on market / Variance of market
            delta = mean(market - rfAsset)/(var(market));
            
            obj.ExcessImpliedReturns = delta * sigma * wMkt;
        end
        
        % Function to compute the Omega matrix
        function obj = computeOmega(obj)
            % Compute Omega using Black-Litterman's approach
            if ~isempty(obj.P)
                obj.Omega = obj.Tau*obj.P*obj.AssetCovar*obj.P';
            else
                obj.Omega = [];
            end
        end
        
        % Helper function to review the Views matrix
        function reviewViewsMatrix(obj)
            f = figure('Position', [100 100 1000 150], 'Name','Analyst Views','Menubar','None');
            %f = figure('Position', [100 100 1000 150], 'Name','Analyst Views');
            t = uitable('Parent', f, 'Position', [25, 25, 950 100]);
            set(t, 'Data', [obj.Q obj.P]);
            rownames = cell(length(obj.Q));
            for i = 1: length(obj.Q)
                rownames{i} = strcat('View ',num2str(i));
            end
            set(t, 'RowName', rownames);
            set(t, 'ColumnName',['Q:View of expected excess returns',obj.AssetList]);
            foregroundColor = [1 1 1];
            set(t, 'ForegroundColor', foregroundColor);
            backgroundColor = [.2 .1 .1; .1 .1 .2];
            set(t, 'BackgroundColor', backgroundColor);
            s = sprintf('Q: Expected return values \nP is the absolute and relative views');
            set(t,'TooltipString',s)
        end
    end
end

Contact us