2012-08-01 95 views
0

我有一個問題, 在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」的選項。

有關如何做到這一點的任何想法?

預先感謝您

回答

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與年平均值的向量相關聯。


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解析信息並用數字標識替換匹配的日期並使用上面的代碼。或者你可以將這個基本理論背後,並將其適應於最適合你的東西!

+0

問題是,每年都沒有均勻的價值分佈。一年可能有250個值,另一個252,另一個248.我需要根據每年的確切值計算每年的標準。我也有與每個值匹配的日期向量。有任何想法嗎?謝謝 – mario 2012-08-02 07:47:04

+0

好的,那麼你可以使用邏輯索引來提取你需要的值。我會做一些你可能需要解決的假設,但理論應該在你身邊。你可以看到我的編輯上面的代碼。 – 2012-08-02 12:27:45