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

📄 dfdb_port_opt.m

📁 Efficient frontier from Yahoo or database data.
💻 M
📖 第 1 页 / 共 4 页
字号:
            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 + -