2013-06-19 45 views
0

我希望將相同的數據分析應用於多個數據時間序列。但是,數據序列的數量是可變的。因此,我不希望對每個系列的分析進行硬編碼,而是希望能夠指定基金的數量和名稱,然後在將它們合併到一個投資組合之前對所有人進行相同的數據處理。 具體而言,我有一個exel文件,其中每個工作表是一個時間序列,其中第一列是日期,第二列是價格。所有基金的日期可能不一致,因此必須對所有基金中發生的日期篩選單個工作表,然後將其組合成一個數據集,其中有一列日期和所有其他列與當前每個基金的數據相對應。 然後分析這個組合數據集的手段和差異等 我目前已經計算出如何進行合併和分析(下面),但我想知道我可以簡單地添加或刪除資金(即通過包括包含excel文件中個人基金數據的新工作表),而無需重新編寫和添加/刪除額外/超額的matlab代碼。多系列運行時間序列分析Matlab

*% LOAD DATA* 

XL='XLData.xlsx'; 
formatIn = 'dd/mm/yyyy'; 
formatOut = 'mmm-dd-yyyy'; 

*%SPECIFY WORKSHEETS* 

Fund1Prices=3; 
Fund2Prices=4; 

*%RETRIEVE VALUES* 

[Fund1values, ~, Fund1sheet] = xlsread(XL,Fund1Prices); 
[Fund2values, ~, Fund2sheet] = xlsread(XL,Fund2Prices); 

*%EXTRACT DATES AND DATA AND COMBINE (TO REMOVE UNNECCESSARY TEXT IN ROWS 1 
%TO 4) FOR FUND 1.* 

Fund1_dates_data=Fund1sheet(4:end,1:2); 
Fund1Dates= cellstr(datestr(datevec(Fund1_dates_data(:,1),formatIn),formatOut)); 
Fund1Data= cell2mat(Fund1_dates_data(:,2)); 

*%EXTRACT DATES AND DATA AND COMBINE (TO REMOVE UNNECCESSARY TEXT IN ROWS 1 
%TO 4) FOR FUND 2.* 

Fund2_dates_data=Fund2sheet(4:end,1:2); 
Fund2Dates= cellstr(datestr(datevec(Fund2_dates_data(:,1),formatIn),formatOut)); 
Fund2Data= cell2mat(Fund2_dates_data(:,2)); 

*%CREATE TIME SERIES FOR EACH FUND* 

Fund1ts=fints(Fund1Dates,Fund1Data,'Fund1'); 
Fund2ts=fints(Fund2Dates,Fund2Data,'Fund2'); 

*%CREATE PORTFOLIO* 

Port=merge(Fund1ts,Fund2ts,'DateSetMethod','Intersection'); 

*%ANALYSE PORTFOLIO* 

Returns=tick2ret(Port); 
q = Portfolio; 
q = q.estimateAssetMoments(Port) 
[qassetmean, qassetcovar] = q.getAssetMoments 

回答

2

基於編輯的問題,得到的答案被改寫

你可以把你的代碼放到一個function。這function可以保存爲.m-文件並從Matlab調用。
但是,您想用自動的方式來計算特定工作表(Fund1Prices=3)的調用次數,以找出有多少工作表。下面是如何做到這一點的功能的一種方法:

function [Returns,q,qassetmean,qassetcovar] = my_data_series_analysis(XL) 

% All input this function requires is a variable 
% containing the name of the xls-file you want to process 

formatIn = 'dd/mm/yyyy'; 
formatOut = 'mmm-dd-yyyy'; 

% Determine the number of worksheets in the xls-file: 

[~,my_sheets] = xlsfinfo(XL); 

% Loop through the number of sheets 
% (change the start value if the first sheets do not contain data): 

% this is needed to merge your portfolio 
% in case you do not start the for-loop at I=1 

merge_count = 1; 

for I=1:size(my_sheets,2) 

    % RETRIEVE VALUES 
    % note that Fund1Prices has been replaced with the loop-iterable, I 

    [FundValues, ~, FundSheet] = xlsread(XL,I); 

    % EXTRACT DATES AND DATA AND COMBINE 
    % (TO REMOVE UNNECCESSARY TEXT IN ROWS 1 TO 4) 

    Fund_dates_data = FundSheet(4:end,1:2); 
    FundDates = cellstr(datestr(datevec(Fund_dates_data(:,1),... 
             formatIn),formatOut)); 
    FundData = cell2mat(Fund_dates_data(:,2)); 

    % CREATE TIME SERIES FOR EACH FUND 

    Fundts{I}=fints(FundDates,FundData,['Fund',num2str(I)]); 

    if merge_count == 2 
     Port = merge(Fundts{I-1},Fundts{I},'DateSetMethod','Intersection'); 
    end 
    if merge_count > 2 
     Port = merge(Port,Fundts{I},'DateSetMethod','Intersection'); 
    end 

    merge_count = merge_count + 1; 

end 

% ANALYSE PORTFOLIO 

Returns=tick2ret(Port); 
q = Portfolio; 
q = q.estimateAssetMoments(Port) 
[qassetmean, qassetcovar] = q.getAssetMoments 

-file要處理這個函數將返回Returnsqqassetmeanqassetcovar變量在xls所有工作表。可變XL應該這樣指定:

XL = 'my_file.xls'; 

你也可以遍歷多個xls -file。像這樣:

% use a cell so that the file names can be of different length: 
XL = {'my_file.xls'; 'my_file2.xls'} 

for F=1:size(XL,1) 
    [Returns{F},q{F},qassetmean{F},qassetcovar{F}] = my_data_series_analysis(XL{F,1}); 
end 

確保成存儲從所述功能中cell S(如圖所示)或struct S(未示出)返回的值以考慮這樣的事實,可能有不同數量的片材的每個文件。

+0

謝謝!非常有效!我甚至用不同數量的紙張進行了測試,並且工作非常順利。這很棒,我很開心。感謝您爲此付出的全部努力。 – Mary

+0

@瑪麗很高興幫助(帶我瞭解了一下之後)。我插入了缺少的「結束」。 – Schorsch