I am using the following code to calculate peaks in a time series data across various assets. Peak is defined as any point in time series which is greater than its neighboring points. Based on the number of peaks I calculate a score in the code as shown below. The input_args is in this format and rc is size of input_args. This code works fine but takes a lot of time when I call it across assets for long time series. Is their a way to make this code more efficient. I am looking for a solution through which I can make a logical array to identify the points in time series which satisfy the condition of being a peak and then isolate them to calculate the score ?
Data:-
1
0.997
0.979
0.952
0.935
0.942
0.987
1.027
1.036
1.049
function [maxhill] = hill_calc(input_args,rc)
for i=2:rc(1)-1
if and(input_args(i)>input_args(i+1),input_args(i)>input_args(i-1))
output_args_hills(i-1) = 2*input_args(i)-input_args(i+1)-input_args(i-1);
else output_args_hills(i-1) = NaN;
end
end
maxhill = max(output_args_hills);
end
解决方案
You can compute the indices of the peaks easily as follows:
ind = 1+find((input_args(2:end-1)>input_args(1:end-2)) & ...
(input_args(2:end-1)>input_args(3:end)));
Example_
>> input_args = [1 2 5 4 7];
gives
ind =
3
meaning that only the third value is a peak.