计算一年内每日数据的标准差

时间:2012-08-01 13:36:42

标签: performance matlab indexing time-series

我有一个问题, 在Matlab中,我有一个20年日常数据(X)的向量和相关日期(DATES)的向量。为了找到每年每日数据的平均值,我使用以下脚本:

A = fints(DATES,X);                          %convert to financial time series
B = toannual(A,'CalcMethod', 'SimpAvg');     %calculate average value per year
C = fts2mat(B);                              %Convert fts object to vector

C是20个值的向量。显示20年中每一年的每日数据的平均值。到目前为止,这么好..现在我想做同样的事情,但不是每年计算平均值,我需要每年计算std,但似乎没有这样的选项功能“toannual”。

关于如何做到这一点的任何想法?

先谢谢你

1 个答案:

答案 0 :(得分:1)

我假设X是财务信息,每年都是均匀分布。如果不是这样,你将不得不修改它。只是为了澄清,通过均匀分布,我的意思是如果有20年且X有200个值,那么每年有10个值。

你应该可以这样做:

num_years = length(C);
span_size = length(X)/num_years;
for n = 0:num_years-1
    std_dev(n+1,1) = std(X(1+(n*span_size):(n+1)*span_size));
end

这个想法是你只需将给定年份的日期(日期值)传递给matlab的标准偏差函数。这将返回当年的std-dev。 std_dev应该是一个列向量,它将1:1与您的C年平均值向量相关联。


unique_Dates = unique(DATES) %This should return a vector of 20 elements since you have 20 years.
std_dev = zeros(size(unique_Dates)); %Just pre allocating the standard deviation vector.
for n = 1:length(unique_Dates)
    std_dev(n) = std(X(DATES==unique_Dates(n)));
end

现在假设您的DATES矩阵可以传递给唯一函数,并且它将返回预期的日期列表。如果你有一个数字形式的日期我知道这将有效,我只关心字符串形式的日期。

如果它们是字符串形式,您可以查看使用regexp解析信息并用数字标识符替换匹配日期并使用上面的代码。或者你可以采用这背后的基本理论,并使其适应最适合你的方法!