【问题标题】:calculate standard deviation of daily data within a year计算一年内每日数据的标准差
【发布时间】:2012-07-30 10:07:41
【问题描述】:

我有一个问题, 在 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 年中每一年的每日数据的平均值。到目前为止,一切都很好..现在我正在尝试做同样的事情,但不是每年计算平均值,而是每年计算标准值,但似乎函数“toannual”没有这样的选项。

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

提前致谢

【问题讨论】:

    标签: performance matlab indexing time-series


    【解决方案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 应该是一个列向量,它与您的 C 年平均值向量 1:1 相关。


    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 来解析信息并将匹配的日期替换为数字标识符并使​​用上面的代码。或者,您可以采用这背后的基本理论并将其调整为最适合您的方法!

    【讨论】:

    • 问题是每年的值分布不均匀。一年可能有 250 个值,另外 252 个,另外 248 个。我需要根据每年的确切值计算每年的标准值。我也有匹配每个值的日期向量。有任何想法吗?谢谢
    • 好的,那么您可能可以使用逻辑索引来提取多年来所需的值。我将做出一些您可能需要解决的假设,但理论应该适合您。你可以在上面看到我的代码编辑。
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 2019-09-17
    • 1970-01-01
    • 2019-09-18
    • 2019-05-12
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多