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データの表示

データのクラスがtimetableなのでstackedplotコマンドで一気にプロットできる。

>> stackedplot(data, 'Marker', '+')

土日や祝日などデータが欠落している部分が歯抜け表示になってしまうのはイケてない。。。改善の余地あり。

次回は表示について書こう。