⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dfdb_port_opt.m

📁 Efficient frontier from Yahoo or database data.
💻 M
📖 第 1 页 / 共 4 页
字号:
	ylabel('Annual Rate of Return (%)','fontsize',8)
%     ticks = get(gca,'yticklabel');
%     nticks=num2str(100*str2num(ticks));
%     set(gca,'yticklabel',nticks)
	title('Efficient Frontier','color','k')
    grid on
    
    
    % Display rate of return corresponding to minimun risk, and place weights of
    % each security needed to reach that rate next to the security name.
    
    %%%%%%%%%
    [MinRisk,idx] = min(PortRisk);
	RoR = PortReturn(idx);
    
    Rateofreturn = findobj(gcf,'tag','rorstr');
    Risk = findobj(gcf,'tag','riskstr');
    
    maxRoR = max(PortReturn);
    minRoR = min(PortReturn);
    maxRisk = max(PortRisk);
    minRisk = min(PortRisk);
    
    plotrisk = minRisk + 0.5*(maxRisk - minRisk);
    plotror = interp1(PortRisk,PortReturn,plotrisk);
    
    set(Rateofreturn,'string',sprintf('%1.2f',100*plotror));
	set(Risk,'string',sprintf('%1.4f',plotrisk));
    
    PortReturn = round(PortReturn*10000)/10000;
%     PortWts = str2num(sprintf('%1.4f',PortWts));
%     PortRisk = str2num(sprintf('%1.4f',PortRisk));
    setappdata(Rateofreturn,'PortReturn',PortReturn);
    setappdata(Rateofreturn,'PortWts',PortWts);
    setappdata(Rateofreturn,'PortRisk',PortRisk);
    
    Securtext = findobj(gcf,'tag','securtxt');
    Securweights = findobj(gcf,'tag','securwts');
    Securtextpos = get(Securtext,'pos');
    Securweightspos = get(Securweights,'pos');

    WtText = findobj(gcf,'tag','wttxt');
    WtWeight = findobj(gcf,'tag','wtwt');
    
    delete(WtText)
    delete(WtWeight)
    clear WtText WtWeight
            
    for i=1:length(data)
		WtText(i) = uicontrol('style','text','pos',[Securtextpos(1) Securtextpos(2)-.03*i .1 .03], ...
            'string',symcell(i),'backgroundcolor',[.8 .8 .8],'tag','wttxt');
		WtWeight(i) = uicontrol('style','text','pos',[Securweightspos(1) Securweightspos(2)-.03*i .1 .03], ...
            'string',sprintf('%1.4f',PortWts(idx,i)),'backgroundcolor',[.8 .8 .8],'tag','wtwt');
    end
    %%%%%%%%%%
    
    
    % Display maximum and minimum possible rates of return and plot red line
    % corresponding to these values
    
    hold on
    xaxislims = get(gca,'xlim');
    yaxislims = get(gca,'ylim');
    
    plot(xaxislims,[maxRoR maxRoR],'r--',xaxislims,[minRoR minRoR],'r--','linewidth',.1)
    plot([minRisk,minRisk],yaxislims,'r--',[maxRisk, maxRisk],yaxislims,'r--','linewidth',.1)
    set(gca,'xlim',xaxislims)
    set(gca,'ylim',yaxislims)
    
    ticks = get(gca,'yticklabel');
    nticks=num2str(100*str2num(ticks));
    set(gca,'yticklabel',nticks)
    
    maxRoRtxt = text(xaxislims(2),maxRoR,[' ',sprintf('%1.2f',100*maxRoR)],'color','r', ...
        'tag','mxRotxt');
    minRoRtxt = text(xaxislims(2),minRoR,[' ',sprintf('%1.2f',100*minRoR)],'color','r', ...
        'tag','mnRotxt');
    minRisktxt = text(minRisk,yaxislims(1) - 0.12*diff(yaxislims),sprintf('%1.4f',minRisk), ...
        'tag','mnRitxt','color','r');
    maxRisktxt = text(maxRisk,yaxislims(1) - 0.12*diff(yaxislims),sprintf('%1.4f',maxRisk), ...
        'tag','mxRitxt','color','r');
    
    vert = plot([plotrisk plotrisk],[yaxislims(1) plotror],'g','tag','vertlin','ButtonDownFcn', ...
        'dfdb_port_opt(''Animatevline'',''start'')','erasemode','xor','linewidth',2);
    horz = plot([xaxislims(1),plotrisk],[plotror plotror],'g','tag','horzlin','ButtonDownFcn', ...
        'dfdb_port_opt(''Animatehline'',''start'')','erasemode','xor','linewidth',2);
    Frontleg = legend('Frontier','Min/Max Risk/Return',2);
    set(Frontleg,'tag','frleg');
    hold off
    set(Effront,'tag','efax')
    percent = text('units','norm','pos',[-.55 .72 0],'string','%','color','b');
    sigma = text('units','norm','pos',[-.18 .72 0],'string','\sigma','color','b');
    
    if length(data) > 10
        err = errordlg('Warning: Only 10 asset weights can be viewed','Generate Frontier');
        set(err,'windowstyle','modal')    
    end
    
case 'Animatevline'
    
    F1 = findobj('tag','dfdbportopt');
    Rateofreturn = findobj(gcf,'tag','rorstr');
    Risk = findobj(gcf,'tag','riskstr');
    vert = findobj(gcf,'tag','vertlin');
    horz = findobj(gcf,'tag','horzlin');
    frontierline = findobj(gcf,'tag','frontline');
    x = get(frontierline,'xdata');
    y = get(frontierline,'ydata');
    
    xaxislims = get(gca,'xlim');
    yaxislims = get(gca,'ylim');
    
    switch varargin{2}
        
        case 'start'
            
            set(F1,'WindowButtonMotionFcn','DFDB_port_opt(''Animatevline'',''move'')')
            set(F1,'WindowButtonUpFcn','DFDB_port_opt(''Animatevline'',''stop'')')
            
        case 'move'
            
            currPt = get(gca,'CurrentPoint');
            
            if currPt(1,1) - min(x) < -0.000001
                currPt(1,1) = min(x);
            end
            if currPt(1,1) - max(x) > 0.000001
                currPt(1,1) = max(x);
            end
            
            newRisk = currPt(1,1);
            newRoR = interp1(x,y,currPt(1,1));
            set(vert,'xdata',[newRisk newRisk],'ydata',[yaxislims(1) newRoR],'tag','vertlin','linewidth',2)
            set(horz,'xdata',[xaxislims(1) newRisk],'ydata',[newRoR newRoR],'tag','horzlin','linewidth',2)
            set(Rateofreturn,'string',sprintf('%1.2f',100*newRoR));
            set(Risk,'string',sprintf('%1.4f',newRisk));
            
        case 'stop'
            
            set(F1,'WindowButtonMotionFcn','')
            set(F1,'WindowButtonUpFcn','')
            DFDB_port_opt('WeightCalcRoR')
    end

    
case 'Animatehline'
    
    F1 = findobj('tag','dfdbportopt');
    Rateofreturn = findobj(gcf,'tag','rorstr');
    Risk = findobj(gcf,'tag','riskstr');
    vert = findobj(gcf,'tag','vertlin');
    horz = findobj(gcf,'tag','horzlin');
    frontierline = findobj(gcf,'tag','frontline');
    x = get(frontierline,'xdata');
    y = get(frontierline,'ydata');
    
    xaxislims = get(gca,'xlim');
    yaxislims = get(gca,'ylim');
    
    switch varargin{2}
        
        case 'start'
            
            set(F1,'WindowButtonMotionFcn','DFDB_port_opt(''Animatehline'',''move'')')
            set(F1,'WindowButtonUpFcn','DFDB_port_opt(''Animatehline'',''stop'')')
            
        case 'move'
            
            currPt = get(gca,'CurrentPoint');
            
            if currPt(1,2) - y(find(x==min(x))) < -0.000001
                currPt(1,2) = y(find(x==min(x)));
            end
            if currPt(1,2) - y(find(x==max(x))) > 0.000001
                currPt(1,2) = y(find(x==max(x)));
            end
            
            newRoR = currPt(1,2);
            newRisk = interp1(y,x,currPt(1,2));
            set(vert,'xdata',[newRisk newRisk],'ydata',[yaxislims(1) newRoR],'tag','vertlin','linewidth',2)
            set(horz,'xdata',[xaxislims(1) newRisk],'ydata',[newRoR newRoR],'tag','horzlin','linewidth',2)
            set(Rateofreturn,'string',sprintf('%1.2f',100*newRoR));
            set(Risk,'string',sprintf('%1.4f',newRisk));
            
        case 'stop'
            
            set(F1,'WindowButtonMotionFcn','')
            set(F1,'WindowButtonUpFcn','')
            DFDB_port_opt('WeightCalcRoR')
    end

    
    
case 'WeightCalcRoR'
    % Find and display the fraction of each asset needed to reach a desired
    % rate of return of a portfolio of the entered assets.
    
   
    Rateofreturn = findobj(gcf,'tag','rorstr');
    Risk = findobj(gcf,'tag','riskstr');
    Effront=findobj(gcf,'tag','efax');
    Frontleg = findobj(gcf,'tag','frleg');
    minRoRtxt = findobj(gcf,'tag','mnRotxt');
    maxRoRtxt = findobj(gcf,'tag','mxRotxt');
    
    if isempty(findobj(Effront,'type','line'))
        err = errordlg('First generate frontier','Rate of Return');
        set(err,'windowstyle','modal')
        set(Rateofreturn','string','')
        return
    end
    
    
    % Keep weights from displaying as NANs and keep green lines on plot
    desiredRoR=str2num(get(Rateofreturn,'string'))/100;
    F1 = findobj(0,'tag','dfdbportopt');
    
    Portdata = getappdata(Rateofreturn);
    
    if (isequal([' ',num2str(desiredRoR*100)],get(minRoRtxt,'string'))) & (desiredRoR < min(Portdata.PortReturn))
        desiredRoR = min(Portdata.PortReturn);
    end
   
    if (isequal([' ',num2str(desiredRoR*100)],get(maxRoRtxt,'string'))) & (desiredRoR > max(Portdata.PortReturn))
        desiredRoR = max(Portdata.PortReturn);
    end
    
    if (desiredRoR - max(Portdata.PortReturn) > 0.000001) | (desiredRoR - min(Portdata.PortReturn) < -0.000001)
        err = errordlg('Desired return is outside the range of possible values.');
        set(err,'windowstyle','modal')
        return
    end
	
    
    weights = interp1(Portdata.PortReturn,Portdata.PortWts,desiredRoR);
    risk = interp1(Portdata.PortReturn,Portdata.PortRisk,desiredRoR);
    
    set(Risk,'string',sprintf('%1.4f',risk));
    WtWeight=sort(findobj(gcf,'tag','wtwt'));

    
	for i=1:length(weights) 
        set(WtWeight(i),'string',sprintf('%1.4f',weights(i)));
    end
    
    axes(Effront)
    RRlines = findobj(gcf,'type','line','color','g');
    hold on
    delete(RRlines)
    clear RRlines
    xaxislims = get(gca,'xlim');
    yaxislims = get(gca,'ylim');
    vert = plot([risk risk],[yaxislims(1) desiredRoR],'g','tag','vertlin','ButtonDownFcn', ...
        'dfdb_port_opt(''Animatevline'',''start'')','erasemode','xor','linewidth',2);
    horz = plot([xaxislims(1),risk],[desiredRoR desiredRoR],'g','tag','horzlin','ButtonDownFcn', ...
        'dfdb_port_opt(''Animatehline'',''start'')','erasemode','xor','linewidth',2);
    hold off
    axes(Frontleg)
    set(Effront,'tag','efax')
    
        
    
case 'WeightCalcRisk'
    % Find and display the fraction of each asset needed to assume a desired
    % risk given the entered assets.
    
    Rateofreturn = findobj(gcf,'tag','rorstr');
    Risk = findobj(gcf,'tag','riskstr');
    Effront=findobj(gcf,'tag','efax');
    Frontleg = findobj(gcf,'tag','frleg');
    minRisktxt = findobj(gcf,'tag','mnRitxt');
    maxRisktxt = findobj(gcf,'tag','mxRitxt');
    
    if isempty(findobj(Effront,'type','line'))
        err = errordlg('First generate frontier','Risk');
        set(err,'windowstyle','modal')
        set(Rateofreturn','string','')
        return
    end
    
    desiredRisk=str2num(get(Risk,'string'));
    F1 = findobj(0,'tag','dfdbportopt');
    
    Portdata = getappdata(Rateofreturn);
    
    if (isequal(num2str(desiredRisk),get(minRisktxt,'string'))) & (desiredRisk < min(Portdata.PortRisk))
        desiredRisk = min(Portdata.PortRisk);
    end
    
    if (isequal(num2str(desiredRisk),get(maxRisktxt,'string'))) & (desiredRisk > max(Portdata.PortRisk))
        desiredRisk = max(Portdata.PortRisk);
    end

    if (desiredRisk - max(Portdata.PortRisk) > 0.000001) | (desiredRisk - min(Portdata.PortRisk) < -0.000001)
        err = errordlg('Desired return is outside the range of possible values.');
        set(err,'windowstyle','modal')
        return
    end
	
    weights = interp1(Portdata.PortRisk,Portdata.PortWts,desiredRisk);
    RoR = interp1(Portdata.PortRisk,Portdata.PortReturn,desiredRisk);
    
    set(Rateofreturn,'string',sprintf('%1.2f',100*RoR));
    WtWeight=sort(findobj(gcf,'tag','wtwt'));

    
	for i=1:length(weights) 
        set(WtWeight(i),'string',sprintf('%1.4f',weights(i)));
    end
    
    axes(Effront)
    RRlines = findobj(gcf,'type','line','color','g');
    hold on
    delete(RRlines)
    clear RRlines
    xaxislims = get(gca,'xlim');
    yaxislims = get(gca,'ylim');
    vert = plot([desiredRisk desiredRisk],[yaxislims(1) RoR],'g','tag','vertlin','ButtonDownFcn', ...
        'dfdb_port_opt(''Animatevline'',''start'')','erasemode','xor','linewidth',2);
    horz = plot([xaxislims(1),desiredRisk],[RoR RoR],'g','tag','horzlin','ButtonDownFcn', ...
        'dfdb_port_opt(''Animatehline'',''start'')','erasemode','xor','linewidth',2);
    hold off
    axes(Frontleg)
    set(Effront,'tag','efax')
    
  case 'Calendar'
    % Bring up an ActiveX calendar to view and select a starting date for time series
    
  if ~exist('cal') | isempty(cal)
      F1 = findobj(0,'tag','dfdbportopt');
      mainfigpos = get(F1,'pos');
    
      calfig=figure('pos',[mainfigpos(1)+300 mainfigpos(2)+300 200 185],'menubar','none', ...
          'name','Calendar','numbertitle','off','tag','calenfig','closerequestfcn', ...
          'dfdb_port_opt(''Calclosereqfcn'')');
      cal=actxcontrol('MSCAL.Calendar.7',[0 35 200 150],calfig);
      drawnow
      set(cal,'showtitle',0);

      OKbut = uicontrol('pos',[6 4 93 27],'string','OK','callback','dfdb_port_opt(''CalClose'')');
      Cancelbut = uicontrol('pos',[104 4 93 27],'string','Cancel','callback', ...
          'dfdb_port_opt(''Calcancel'')');
      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -