【问题标题】:Reading and Combining Excel Time Series in Matlab- Maintaining OrderMatlab中Excel时间序列的读取与组合——维护顺序
【发布时间】:2013-10-13 17:06:36
【问题描述】:

我有以下代码来读取时间序列数据(包含在 Excel 工作簿的第 5 到 19 页中)。每个工作表的标题为“TS”,后跟时间序列的编号。除了一件事之外,该过程运行良好 - 当我研究回报时,我发现所有时间序列都移动了 5。即 TS 6 成为“回报”数据中的第 11 列,TS 19 成为第 5 列,TS 15成为第一列等。我需要它们的顺序与读取它们的顺序相同——例如 TS 1 在第一列,TS 2 在第二列,依此类推。 这是一个问题,因为我阅读了工作表(“AssetList”)的标题,这些标题在后续代码中保持其实际顺序。因此,当我重新组合标题和回报时,我发现它们不匹配。当例如第 4 列标题为“TS 4”但实际上包含 TS 18 的数据时,这会使进一步的操作变得复杂。 这段代码有什么地方我错了吗?

XL='TimeSeries.xlsx';

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


Bounds=3;
[Bounds,~] = xlsread(XL,Bounds);

% 确定 xls 文件中的工作表数量:

FirstSheet=5;
[~,AssetList] = xlsfinfo(XL);
lngth=size(AssetList,2);
AssetList(:,1:FirstSheet-1)=[];

% 循环遍历张数和 RETRIEVE VALUES

merge_count = 1; 

for I=FirstSheet:lngth



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

% 提取日期和数据并合并 %(删除第 1 到第 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

% 分析投资组合

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

【问题讨论】:

  • 那么你是说FundDatesFundData 在每次循环迭代中都没有对齐?您还可以访问 Matlab 2013b 吗?因为那时您应该检查新的readtable 命令作为xlsread 的替代命令。
  • 我有 2011 年。它正确对齐日期行和时间序列行。但只是移动列。这不是什么大问题,但工作表“边界”只能包含工作簿中工作表顺序的数据。这会导致为错误的时间序列指定错误的上限/下限 - 例如TS 1 的边界应用于 TS 5,依此类推。
  • 仍然很难准确地跟踪这种错位发生的位置。也许您可以在您的问题中准确地添加您在代码中使用的变量名的错位?
  • 谢谢丹,我已经澄清了这个问题。

标签: excel matlab time-series portfolio xlsread


【解决方案1】:

这可能是由于merge。默认情况下,它按字母顺序对列进行排序。不幸的是,由于您的命名模式是“FundN”,这意味着,例如,Fund10 通常会排在 Fund9 之前。因此,当您从 5 到 19 循环遍历 I 时,您将拥有 Fund10,到 Fund19,然后是 Fund4Fund9

解决此问题的一种方法是始终使用零填充(Fund01、Fund02 等),以便字母顺序和数字顺序相同。或者,通过将 SortColumns 设置为 0 来强制它保持读取/合并数据的顺序:

Port = merge(Port,Fundts{I},'DateSetMethod','Intersection','SortColumns',0);

【讨论】:

  • 感谢 nkjt。我使用 TS 命名约定只是为了说明这一点。实际上,工作表的名称是文字——基金的名称。但是,您是否建议“SortColumns”在这种情况下仍然有效?
  • 'SortColumns', 0 基本上只是将其设置为不排序 - 因此它应该保持列的读取/添加顺序。 (使用您的 ['Fund',num2str(I)] 示例进行测试)。
  • 太棒了。效果很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2013-12-20
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多