📄 dfdb_port_opt.m
字号:
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 + -