MATLABで株価データ自動取得 その3 データ可視化


これまで

MATLABでYahoo Financeから自動データ収集をして、移動平均を求めるところまでできた。
timetableデータを可視化すると休日や祝日が歯抜けになってしまう問題が発覚。Yahoo Financeのように歯抜けにならないように表示する。

期待する表示

timetableをstackedplotやcandle関数で可視化すると以下のように歯抜けになってしまう。今年のGWは10日間も休みだったので、最初のほうに大きな歯抜けがある。

上を下(Yahooファイナンスから抜粋) の様に歯抜け無く可視化できるようにしたい。

歯抜けの解消

timetableデータを可視化することで歯抜けが発生するので、時間軸のデータを使わずに表示を行うと歯抜けが解消。

candle(data{1:end, 1:4})    % 休場日が歯抜けになるので並べ替え
legend('Candle')

hold on
% 移動平均を表示
plot(data.AveFilt5,...
    'Color', [0.9 0.3 0.3], 'DisplayName','5day')
plot(data.AveFilt15,...
    'Color', [0.7 0.3 0.1], 'DisplayName','15day')
plot(data.AveFilt30,...
    'Color', [0.5 0.3 0.1], 'DisplayName','30day')
hold off
grid on

さらにX軸の目盛り設定を行って

ha = gca;   % 休場日が歯抜けになるので並べ替え
xticksloc = ceil(ha.XTick);
tempTime = data.Time;
for n = length(data.Time)+1:max(xticksloc)+1
    % Plot上のTickはあるが、データが無いところを補完
    tempTime(end+1) = tempTime(end)+1;
end
sz1 = size(tempTime, 1);

% データ長によって軸目盛を可変
if sz1 < 50
    tempTime.Format = 'M月d日';
    ha.XTickLabel = string(tempTime(xticksloc+1));
    xlabel(year(tempTime(end)))
elseif sz1 < 105    
    tempTime.Format = 'yy年M月';
    ha.XTickLabel = string(tempTime(xticksloc+1));
    tempTime.Format = 'yy年M月d日';
    ha.XTickLabel{1} = string(tempTime(xticksloc(1)+1));
    ha.XTickLabel{end} = string(tempTime(xticksloc(end)+1));
    xlabel(year(tempTime(end)))
else
    % 上と同じ。様子を見ながら調整する。
    tempTime.Format = 'yy年M月';
    ha.XTickLabel = string(tempTime(xticksloc+1));
    tempTime.Format = 'yy年M月d日';
    ha.XTickLabel{1} = string(tempTime(xticksloc(1)+1));
    ha.XTickLabel{end} = string(tempTime(xticksloc(end)+1));
%     xlabel(year(tempTime(end)))
end
title([data.Properties.Description '  ' num2str(data.Properties.UserData)])

色も変えてみた

ついでに・・・
candle関数の中を少しいじって株価が上がったときと下がった時で色を変えてみた。

変えたのはcandle関数のここ↓

    for i = 1 : numObs
        if op(i) < cl(i)
            color = 'r';        % red
        else
            color = 'b';
        end
        h(i+1) = fill(ax, ...
                [indexLeft(i); indexLeft(i); indexRight(i); indexRight(i)], ...
                [op(i); cl(i); cl(i); op(i)], color, 'Edgecolor',color, ...
                'LineStyle','-','Marker','none','AlignVertexCenters', 'on');
    end

だいぶ見やすくなった。

終わり

Thanks to iさん