MATLAB에서 주가 데이터 자동 취득 그 2 이동 평균

10036 단어 주가matlab

지금까지



지난번 Yahoo Finance에서 데이터를 Download하여 주가 데이터의 자동 취득을 할 수 있었다.
이번에는 이동 평균 필터(주가의 기본적인 해석 수법)을 적용해 본다.

이동 평균 필터



대부분의 주가 차트에서는 이동 평균선을 표시할 수 있게 되어 있다. 이것은 주가의 종가에 이동 평균 필터를 적용한 결과를 표시한 것. MATLAB의 Financial Toolbox에서 movavg라는 함수로 제공되고 있다.
예를 들면 5일간의 이동 평균선을 구하고 싶다면 다음과 같이 한다.
in = rand(100,1);
out = movavg(in, 'simple', 5)
plot(in)
hold on, plot(out)
legend('in', 'out')
shg



movavg와 filter 함수의 속도 비교



이 함수 실제로 사용해 보면 상당히 느립니다. MATLAB 본체에는 filter라고 하는 함수가 있어, 필터링 처리를 할 수 있지만, 이것에 비해 실행 시간이 어떨지 시간 측정해 보았다.
>> tic, out = movavg(sig1, 'simple', 5);, toc
経過時間は 0.028675 秒です。
>> tic, out2 = filter([1 1 1 1 1], 5, sig1); toc
経過時間は 0.000189 秒です。

무려 movavg는 150 배나 느린!
filter 함수를 사용하는 편이 좋을 것 같다. 하지만 잘 살펴보면 데이터의 시작 부분의 결과가 약간 다르다.



filter 함수에서는, 필터의 내부 상태의 초기치는 지정하지 않으면 0이 들어가 있지만, movavg의 소스 코드를 보면, 초기치의 계산으로 궁리가 되고 있다.
>> edit movavg

소스 코드에서 초기 값을 계산하는 부분
226    weightsSum = cumsum(weights);
227    weightedMA(1:windowSize,:) = weightedMA(1:windowSize,:) ./ weightsSum';

이동 평균 필터 계수의 적산 값으로 시계열 데이터를 요소별로 나눕니다. 이것을 모방
movAvgDay = [5, 10, 15];    % 5, 10, 15日移動平均

filterCoef5 = ones(1, movaveCoef(1))/movaveCoef(1);
filterCoef15 = ones(1, movaveCoef(2))/movaveCoef(2);
filterCoef30 = ones(1, movaveCoef(3))/movaveCoef(3);
weight5 = cumsum(filterCoef5);
weight15 = cumsum(filterCoef15);
weight30 = cumsum(filterCoef30);

data.AveFilt5 = filter(filterCoef5, 1, data.AdjClose);
    data.AveFilt5(1:movaveCoef(1), :) = data.AveFilt5(1:movaveCoef(1), :)./weight5';

data.AveFilt15 = filter(filterCoef15, 1, data.AdjClose);
    data.AveFilt15(1:movaveCoef(2), :) = data.AveFilt15(1:movaveCoef(2), :)./weight15';

data.AveFilt30 = filter(filterCoef30, 1, data.AdjClose);
    data.AveFilt30(1:movaveCoef(3), :) = data.AveFilt30(1:movaveCoef(3), :)./weight30';

타임테이블 데이터 표시



데이터의 클래스가 timetable이므로 stackedplot 명령으로 단번에 플롯할 수 있다.
>> stackedplot(data, 'Marker', '+')



토, 일, 공휴일 등 데이터가 누락된 부분이 잇몸 표시가 되어 버리는 것은 좋지 않다. . . 개선의 여지가 있습니다.

다음 번은 표시에 대해 쓰자.

좋은 웹페이지 즐겨찾기