我有一个问题, 在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”。
关于如何做到这一点的任何想法?
先谢谢你
答案 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
解析信息并用数字标识符替换匹配日期并使用上面的代码。或者你可以采用这背后的基本理论,并使其适应最适合你的方法!