📄 dfdb_port_opt.m
字号:
startdate = get(Startdatebox,'string');
if isempty(get(Symbols,'string'))
err = errordlg('First enter symbols','Get Time Series');
set(err,'windowstyle','modal')
return
end
if isempty(startdate)
err = errordlg('First enter starting date.','Get Time Series');
set(err,'windowstyle','modal')
return
end
quitcase = 'no';
Wtbardf = waitbar(0,'Retrieving Data From Yahoo');
for i=1:length(symcell)
try
data{i} = fetch(C,symcell(i),'Close',startdate,yesterday);
catch
err = errordlg('Invalid Symbol','Symbol Selection');
set(err,'windowstyle','modal')
quitcase = 'yes';
break
end
waitbar(i/length(symcell),Wtbardf)
end
close(Wtbardf)
if strcmp(quitcase,'yes')
return
end
% Preprocess data for plotting
maxlength = max(cellfun('length',data));
for i=1:length(data)
if length(data{i}(:,1)) == maxlength
timevector = data{i}(:,1);
break
end
end
pricearray = ones(maxlength,length(data));
for k=1:length(data)
if cellfun('length',data(k)) == maxlength
pricearray(:,k) = data{k}(:,2);
else
pricearray(:,k) = [data{k}(:,2);NaN*ones(diff([cellfun('length',data(k)),maxlength]),1)];
end
end
else
%
% database data input option
%
% try
conn = getappdata(Symbols,'connection');
if isempty('conn')
err = errordlg('First Select Data Source','Get Time Series');
set(err,'windowstyle','modal')
return
end
% conn = getappdata(Symbols,'connection');
dates = getappdata(Symbols,'dates');
tablelist = getappdata(Symbols,'Tables');
% conn = database('DFDBsample','','');
cursorA=exec(conn,['select ',dates,' from ', tablelist{1}]);
% cursorA=exec(conn,['select ',dates,' from ', tablelist]);
cursorA=fetch(cursorA);
Dates=cursorA.data;
% Dates=datenum(Dates);
Wtbardb = waitbar(0,'Retrieving Data From Database');
for j=1:length(symcell)
selectstring = ['select ',symcell{j},' from ', tablelist{1}];
cursor = exec(conn,selectstring);
cursor = fetch(cursor);
data{j} = cursor.data;
waitbar(i/length(symcell),Wtbardb)
end
close(Wtbardb)
timevector = cat(1,Dates{:});
pricearray = ones(length(Dates),length(data));
for k = 1:length(data)
for m=1:length(data{k})
pricearray(m,k)=data{k}{m};
end
end
startdate = [];
% catch
% err = errordlg('Invalid Date and/or Asset','Get Time Series');
% set(err,'windowstyle','modal')
% return
% end
end
% Plot time series
axes(Tseries)
hold off
if strcmp(getpref('DFDBpref','scaling'),'off') == 1
plot(timevector,pricearray)
xlabel('Time','fontsize',8)
ylabel('Price','fontsize',8)
title('Time Series','color','k')
set(Tseries,'tag','tsax')
dateaxis('x',12);
leg = legend(symcell,2);
set(leg,'tag','legend')
grid on
else
[m,n]=size(pricearray);
scaledpricearray = ones(size(pricearray));
pref=getpref('DFDBpref','datainput');
if strcmp(pref,'db') == 1
for i = 1:n
scaledpricearray(:,i) = pricearray(:,i)./pricearray(1,i);
end
else
indivprices = ones(m,1);
for i = 1:n
indivprices = pricearray(:,i);
scaledpricearray(:,i) = pricearray(:,i)./indivprices(max(find(~isnan(indivprices))));
end
clear indivprices
end
axes(Tseries)
hold off
plot(timevector,scaledpricearray)
xlabel('Time','fontsize',8)
ylabel('Worth of $1 Invested','fontsize',8)
title('Time Series','color','k')
set(Tseries,'tag','tsax')
dateaxis('x',12);
leg = legend(symcell,2);
set(leg,'tag','legend')
grid on
end
% Set appdata to be used later in the code
setappdata(Effront,'data',data);
setappdata(Effront,'symcell',symcell);
setappdata(Tseries,'TickTimes',timevector);
setappdata(Tseries,'TickSeries',pricearray);
setappdata(Tseries,'SymCell',symcell);
setappdata(Startdatebox,'startdate',startdate);
set(Rateofreturn,'enable','on')
set(Rateofreturnprompt,'enable','on')
set(Risk,'enable','on')
set(Riskprompt,'enable','on')
set(Frontiercall,'enable','on')
set(Securtext,'enable','on')
set(Securweights,'enable','on')
axes(Effront)
percent = text('units','norm','pos',[-.55 .72 0],'string','%','color','b');
sigma = text('units','norm','pos',[-.18 .72 0],'string','\sigma','color','b');
% catch
% err = errordlg('Invalid Symbol','Symbol Selection');
% set(err,'windowstyle','modal')
% return
% end
case 'ScaleTS'
Tseries = findobj(gcf,'tag','tsax');
timevector = getappdata(Tseries,'TickTimes');
pricearray = getappdata(Tseries,'TickSeries');
symcell = getappdata(Tseries,'SymCell');
TSscale = findobj(gcf,'tag','scalechk');
if get(TSscale,'value') == 1
setpref('DFDBpref','scaling','on')
[m,n]=size(pricearray);
scaledpricearray = ones(size(pricearray));
pref=getpref('DFDBpref','datainput');
if strcmp(pref,'db') == 1
for i = 1:n
scaledpricearray(:,i) = pricearray(:,i)./pricearray(1,i);
end
else
indivprices = ones(m,1);
for i = 1:n
indivprices = pricearray(:,i);
scaledpricearray(:,i) = pricearray(:,i)./indivprices(max(find(~isnan(indivprices))));
end
clear indivprices
end
axes(Tseries)
hold off
plot(timevector,scaledpricearray)
xlabel('Time','fontsize',8)
ylabel('Worth of $1 Invested','fontsize',8)
title('Time Series','color','k')
set(Tseries,'tag','tsax')
dateaxis('x',12);
leg = legend(symcell,2);
set(leg,'tag','legend')
grid on
else
setpref('DFDBpref','scaling','off')
axes(Tseries)
hold off
plot(timevector,pricearray)
xlabel('Time','fontsize',8)
ylabel('Price','fontsize',8)
title('Time Series','color','k')
set(Tseries,'tag','tsax')
dateaxis('x',12);
leg = legend(symcell,2);
set(leg,'tag','legend')
grid on
end
case 'EffFront'
% Calculate and plot efficient frontier of a portfolio of given securities
Effront=findobj(gcf,'tag','efax');
tempdat = getappdata(Effront);
Tseries = findobj(gcf,'tag','tsax');
symcell = tempdat.symcell;
data = tempdat.data;
warning off
% check for time series data first
if isempty(data)
err = errordlg('Get time series first');
set(err,'windowstyle','modal')
return
end
% test for Data Source
if isequal(getpref('DFDBpref','datainput'),'df') % Datafeed scenario
% Put times and prices of securities into the order of oldest to most recent,
% and make the length of all time series (TS) vectors equal to the TS length
% of the security with the minimum amount of data.
%%%%%%%%
secur=cell(1,length(data));
for i=1:length(data)
secur{i} = data{i}(:,2);
end
lengths = cellfun('length',data);
minlength = min(lengths);
maxlength = max(lengths);
for i=1:length(data)
if length(data{i}(:,1)) == minlength
[TickTimes, index]=sort(data{i}(:,1));
break
end
end
for k=1:length(data)
empty = rem(lengths(k),minlength);
if empty ~= 0
secur{k}(1:empty) = [];
end
secur{k} = secur{k}(index);
end
%%%%%%%%%
TickSeries = ones(length(secur{1}),length(data));
for j=1:length(data)
TickSeries(:,j) = secur{j};
end
else %Database scenario
TickSeries = getappdata(Tseries,'TickSeries');
TickTimes = getappdata(Tseries,'TickTimes');
end
% Generate expected return of each security and the covariance matrix
RetSeries=tick2ret(TickSeries, TickTimes);
[ExpReturn, ExpCovariance]=ewstats(RetSeries);
% Convert daily rate of return to annual by
% assuming number of business days per year is 253
ExpReturn=ExpReturn*253;
% Generate Efficient Frontier
[PortRisk,PortReturn,PortWts]=portopt(ExpReturn,ExpCovariance,30);
axes(Effront)
frontierline = plot(PortRisk,PortReturn,'tag','frontline');
xlabel('Volatility (\sigma)','fontsize',8)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -