首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多序列Matlab的运行时间序列分析

多序列Matlab的运行时间序列分析
EN

Stack Overflow用户
提问于 2013-06-19 16:43:24
回答 1查看 614关注 0票数 0

我希望将相同的数据分析应用于多个数据时间序列。然而,数据序列的数量是可变的。因此,我希望能够指定基金的编号和名称,然后对所有基金进行相同的数据操作,然后将它们合并为一个投资组合,而不是对每个系列的分析进行硬编码。具体地说,我有一个exel文件,其中每个工作表都是一个时间序列,其中第一列是日期,第二列是价格。所有基金的日期可能不一致,因此在合并为一个数据集之前,必须筛选各个工作表中出现在所有基金中的日期,其中有一列日期,所有其他列对应于每个当前基金的数据。然后分析这个组合数据集的均值和方差等。我目前已经知道如何执行合并和分析(如下所示),但我想知道如何简单地添加或删除基金(即,通过在excel文件中包含包含单个基金数据的新工作表),而不必重写和添加/删除额外/多余的matlab代码。

代码语言:javascript
复制
*% 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-19 19:36:31

基于对问题的编辑,答案被重写为

您可以将代码放入function中。这个function可以保存为.m-file并从Matlab中调用。

但是,您希望将对特定工作表(Fund1Prices=3)的调用替换为自动计算工作表数量的方法。下面是在函数中实现这一点的一种方法:

代码语言:javascript
复制
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

此函数将返回要处理的xls-file中所有工作表的Returnsqqassetmeanqassetcovar变量。应按如下方式指定变量XL

代码语言:javascript
复制
XL = 'my_file.xls';

您还可以循环遍历多个xls-file。如下所示:

代码语言:javascript
复制
% 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

确保将函数返回的值存储在cells (如图所示)或structs (未显示)中,以说明每个文件可能有不同数量的工作表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17186702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档