MATLAB에서 주가 데이터 자동 취득 그 2 이동 평균
지금까지
지난번 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', '+')
토, 일, 공휴일 등 데이터가 누락된 부분이 잇몸 표시가 되어 버리는 것은 좋지 않다. . . 개선의 여지가 있습니다.
다음 번은 표시에 대해 쓰자.
Reference
이 문제에 관하여(MATLAB에서 주가 데이터 자동 취득 그 2 이동 평균), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SacredTubes/items/aa27a2d8bc122f8e572e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
대부분의 주가 차트에서는 이동 평균선을 표시할 수 있게 되어 있다. 이것은 주가의 종가에 이동 평균 필터를 적용한 결과를 표시한 것. 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', '+')
토, 일, 공휴일 등 데이터가 누락된 부분이 잇몸 표시가 되어 버리는 것은 좋지 않다. . . 개선의 여지가 있습니다.
다음 번은 표시에 대해 쓰자.
Reference
이 문제에 관하여(MATLAB에서 주가 데이터 자동 취득 그 2 이동 평균), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SacredTubes/items/aa27a2d8bc122f8e572e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
>> tic, out = movavg(sig1, 'simple', 5);, toc
経過時間は 0.028675 秒です。
>> tic, out2 = filter([1 1 1 1 1], 5, sig1); toc
経過時間は 0.000189 秒です。
>> 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', '+')
토, 일, 공휴일 등 데이터가 누락된 부분이 잇몸 표시가 되어 버리는 것은 좋지 않다. . . 개선의 여지가 있습니다.
다음 번은 표시에 대해 쓰자.
Reference
이 문제에 관하여(MATLAB에서 주가 데이터 자동 취득 그 2 이동 평균), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SacredTubes/items/aa27a2d8bc122f8e572e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)