将具有(不同的)缺失日期的多个时间序列合并到矩阵

时间:2016-10-18 21:38:13

标签: matlab merge time-series

我的每日收盘价在2000-01-01'之间。和' 2014-12-31' 3000股票。他们都错过了周末,但另外,不同的股票随机错过了不同的日子。

e.g。

stock_1 = { 
    { '2014-12-01'    [1.1] }     % thu
    { '2014-12-02'    [1.2] }     % fri
                                  % mon
    { '2014-12-06'    [1.3] }  }; % tue

stock_2 = { 
    { '2014-12-01'    [2.1] }     % thu
                                  % fri
    { '2014-12-05'    [2.2] }     % mon
    { '2014-12-06'    [2.3] }  }; % tue

(注意它们是cell代表时间序列而不是timeseries个对象。

我试图构建一个矩阵:

mat = [
    [1.1 2.1]    % thu
    [1.2 2.1]    % fri
    [1.2 2.2]    % mon
    [1.3 2.3] ]  % tue

如何将stock_1stock_2等合并到mat中,以便用最后一个有效值替换缺失值?

我想第一步可能是一个日期并从时间开始返回“工作日#”的函数'然后运行第一列。

所以,如果我有:

stock_1a = { 
    { 1    1.1 }     % thu
    { 2    1.2 }     % fri
    { 4    1.3 }  }; % tue

......等等,我可以预先分配一个矩阵并从中填写。

然后我必须弄清楚如何替换0元素。

我总是可以使用循环进行C风格(最大丑)并让它继续运行,因为它是一次性预处理。但它会让我的内心编码器哭泣。

干净的方法是什么?

1 个答案:

答案 0 :(得分:1)

如果你使用MATLAB datenum类型,你应该可以对它进行排序(你可以使用datetime来稍微简化一下,但是后来它会使插值部分复杂化)。我的想法如下:

% First, generate a list of all of the dates you're looking at
dates = datenum(2000,1,1):datenum(2014,12,31);
% Then determine the day of the week for each
wkdy = weekday(dates);
% Then, exclude the weekends
dates = dates(wkdy~=1 & wkdy~=7); % Saturday is 7, Sunday is 1

这会列出我们期望股票价值的所有日期。您可以按如下方式从单元阵列中提取数据:

s = reshape([stock_1{:}],2,[]);
stock_1_date = datenum(s(1,:));
stock_1_data = [s{2,:}];

您现在可以使用interp1填写缺失的数据:

filled_stock_1_data = interp1(stock_1_date,stock_1_data,dates,'previous');

然后重复每个其他股票价值。