2016-06-15 3 views
0

У меня есть набор данных выглядит следующим образом:MATLAB как фильтровать временные данные минутных баров, чтобы рассчитать реализованную волатильность?

'2014-01-07 22:20:00'  [0.0016] 
'2014-01-07 22:25:00'  [0.0013] 
'2014-01-07 22:30:00'  [0.0017] 
'2014-01-07 22:35:00'  [0.0020] 
'2014-01-07 22:40:00'  [0.0019] 
'2014-01-07 22:45:00'  [0.0022] 
'2014-01-07 22:50:00'  [0.0019] 
'2014-01-07 22:55:00'  [0.0019] 
'2014-01-07 23:00:00'  [0.0021] 
'2014-01-07 23:05:00'  [0.0021] 
'2014-01-07 23:10:00'  [0.0026] 

Первый столбец время записи данных штамп все 5 мин, второй столбец возврата.

Для каждого дня, я хочу рассчитать сумму квадратов 5 минут. Здесь я определяю день с 17:00 до 17:00. (Таким образом, дата 2014-01-07 составляет от 2014-01-06 17:00 до 2014-01-07 17:00). Поэтому для каждого дня я собирал квадратные возвращения с 17:00 до 17:00. Результат будет примерно таким:

'2014-01-07'  [0.046] 
'2014-01-08'  [0.033] 

Как это сделать?

+0

вы уже получили что-то или же начать с нуля? Кроме того, этот набор данных считывается из файла и в табличном формате? – Finn

+0

Я прочитал дату с excel csv в формате ячейки Matlab. первый столбец является строкой, второй - номером – user3845799

+0

, вы уверены, что у вас есть vlaue каждые 5 минут (без пропущенных данных), и данные начинаются с 5 вечера, или файл можно отрезать, чтобы начать с 5 вечера? – Finn

ответ

0

Это альтернативное решение Просто определите некоторые данные randome

t1 = datetime('2016-05-31 00:00:00','InputFormat','yyyy-MM-dd HH:mm:ss '); 
t2 = datetime('2016-06-05 00:00:00','InputFormat','yyyy-MM-dd HH:mm:ss '); 
Samples = 288;  %because your sampling time is 5 mins    
t = (t1:1/Samples:t2).'; 
X = rand(1,length(t)); 

Сначала мы находим образец, который имеет заданные критерии (может быть все что угодно, в вашем случае это было 00:05:00)

n = find(t.Hour >= 5,1,'first') 
    b = n; 

Найти общее количество дней после данного образца

totaldays = length(find(diff(t.Day))) 

и квадрат и накапливать «return'for каждый день

for i = 1:totaldays - 1 
    sum_acc(i) = sum(X(b:b + (Samples - 1)).^2); 
    b = b + Samples; 

end 

Это только для визуализации данных

Dates = datetime(datestr(bsxfun(@plus ,datenum(t(n)) , 0:totaldays - 2)),'Format','yyyy-MM-dd') 
table(Dates,sum_acc.','VariableNames',{'Date' 'Sum'}) 

    Date  Sum 
__________ ______ 

2016-05-31 93.898 
2016-06-01 90.164 
2016-06-02 90.039 
2016-06-03 91.676 
+1

Я немного изменил ваш код, чтобы рассмотреть тот факт, что некоторые 5-минутные записи могут быть пропущены. Ваша идея работает хорошо. Благодаря! – user3845799

0

Я признаю, что ваши даты находятся в ячейке и ваши значения в векторе.

Так, например, у вас есть:

date = {'2014-01-07 16:20:00','2014-01-07 22:25:00','2014-01-08 16:20:00','2014-01-08 22:25:00'}; 

value = [1 2 3 4]; 

Вы можете найти сумму на каждую дату с:

%Creation of an index that separate each "day". 

    [~,~,ind] = unique(floor(cellfun(@datenum,date)+datenum(0,0,0,7,0,0))) %datenum(0,0,0,7,0,0) correspond to the offset 

for i = 1:length(unique(ind)) 
    sumdate(i) = sum(number(ind==i).^2) 
end 

И вы можете найти соответствующий день каждой суммы с

datesum = cellstr(datestr(unique(floor(cellfun(@datenum,date)+datenum(0,0,0,7,0,0)))))