2013-06-19 3 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 

Эта функция возвращает переменную Returns, q, qassetmean и qassetcovar для всех рабочих листов в xls -file вы хотите обработать. Переменная XL должна быть указана следующим образом:

XL = 'my_file.xls'; 

Вы можете также цикл более одного xls -файла. Как это:

% 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 с (как показано) или struct с (не показан), чтобы учесть тот факт, что там может быть разное количество листов за файл.

+0

Спасибо! Работает фантастически! Я даже тестировал его с разным количеством листов, и он работает очень плавно. Это здорово, и я действительно счастлив. Спасибо вам за все усилия по этому поводу. – Mary

+0

@ Mary Рад помочь (взял меня немного, чтобы понять, что вам нужно). Я вставил недостающий «конец». – Schorsch

Смежные вопросы