4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

時系列データ分析の書籍のサンプルデータをMATLABで試してみた

Posted at

時系列データ解析の書籍

技術評論社の書籍「現場ですぐ使える時系列データ分析~データサイエンティストのための基礎知識〜」には、ファイナンス分野における時系列データ解析の実践として、Rによるコードが掲載され、サンプルデータが技術評論社のサポートページに置いてあります。著者のサンプルコード通りRで試すのも良いのですが、MATLABでも試してみたい、そんな時の備忘録メモがこちらです。

データのダウンロード

技術評論社のサポートページの「演習用データ」のリンクからデータをダウンロードできます。認証が不要なので、書籍の購読者じゃなくてもダウンロードできますね。ダウンロードされたexercise_data.zipを解凍すると、「演習用データ」フォルダーにサンプルデータ「.RData」が格納されています。.RDataはRでワークスペースを保存した際に使われるフォーマット。MATLABで言う.matと同じようなものですね。

.RDataをMATLABで読めるフォーマットに変換

ここが一番の肝でした。ネットを調べても.RDataをMATLABに直接読み込むことはできなさそうなので、R側でファイルを加工してからMATLABに取り込むことにしました。

まず試したのは、RでRDataファイルをmatファイルに変換すること。Rのワークスペースを保存したものをそのままmatファイルにしてMATLABで取り込んでしまえば最短ルートかと思い、Rのパッケージ「R.matlab」を使用しました。install.packages("R.matlab")library("R.matlab")writeMat("data.mat")のような流れで試しましたが、
結論から言うと、下記の理由からこのパッケージで当該RDataファイルmatファイルへうまく変換できませんでした。

  • 当該RDataファイルに無名列があるため、R.matlabのwriteMatでエラーが出る。
  • writeMatで作成されたmatファイルをMATLABでloadしても、変数のフィールド名が空だったりしてアクセスできない。
  • writeMatでmatファイルのバージョンを指定できるが、5までしか指定できない。現在(R2018a)のMATLABでは7がデフォルト、7.3が最新なのだが。

結局、RでCSVファイルに出力してMATLABに渡すことにしました。

R側スクリプト(R 3.5.0を使用)

convertTimeSeriesRData.R
# サンプルデータ読み込み
load(".RData")

# 変数のリストを出力
variables = ls()

# 変数毎に「変数名.csv」というファイル名で出力
for (i in 1:length(variables)){
  fname = sprintf("%s.csv", variables[i])
  write.csv(get(variables[i]), file = fname)
}

これでdata.cum.core30.csvのようにCSVファイルが21個作成されます。これをMATLABのワークフォルダーに持っていきます。

MATLAB側

matlabReadTimeSeries.m
% ファイル名をリスト出力
listing = dir('*.csv');

% CSVから変数名を取得し、同じ変数名に格納
for ii=1:length(listing)
    inputFileName = listing(ii).name;
        
    fieldName = extractBefore(inputFileName, '.csv');
    % data.cum.core30.2やdata.cum.train.2のように、変数名のプロパティが数字始まりのものは変数名をリネーム
    if ( strcmp(inputFileName, 'data.cum.core30.2.csv') )
        fieldName =  'data.cum.core30_2';
    elseif ( strcmp(inputFileName, 'data.cum.train.2.csv') )
        fieldName = 'data.cum.train_2';  
    end
    
    % 変数名=readtable(ファイル名)となるようevalで実行
    expression  = sprintf('%s = readtable(inputFileName);', fieldName);
    eval(expression)
end
% 後に使い回せるようにワークスペースに格納した変数をmatファイルに出力
save('sampleData.mat')

これでサンプルデータがsampleData.matというmatファイルに入りましたので、引き続きMATLABで中身を見てみようと思います。

変換したデータをMATLABでプロット

本格的な時系列データ解析を行う前のステップとして、書籍のChapter2-1「時系列データを観察する」で行っているプロットをMATLABでも試してみましょう。RDataに含まれていたQUICKの株価データから板硝子(x5202)、ヤマハ(x7272)、ポーラHD(x4927)、武田薬品(x4502)の4社の株価データを2012/9/28から2013/3/29までの121日分のデータを同じスケールでプロットし、価格変動の大きさを見てみます。

plotFourData.m
load('sampleData.mat');
ylimVal = [min(diff( log( price4.x5202))* 100) max(diff( log( price4.x5202))* 100)];

subplot(2,2,1)
plot(diff( log( price4.x5202))* 100)
title('板硝子')
xlabel('Time')
ylabel('x5202')
ylim(ylimVal)

subplot(2,2,2)
plot(diff( log( price4.x7272))* 100)
title('ヤマハ')
xlabel('Time')
ylabel('x7272')
ylim(ylimVal)

subplot(2,2,3)
plot(diff( log( price4.x4927))* 100)
title('ポーラHD')
xlabel('Time')
ylabel('x4927')
ylim(ylimVal)

subplot(2,2,4)
plot(diff( log( price4.x4502))* 100)
title('武田薬品')
xlabel('Time')
ylabel('x4502')
ylim(ylimVal)

MATLABでのプロット結果
MATLAB_Plot.png
書籍での説明と同様、この期間の株価データの変動は板硝子→ヤマハ→ポーラHD→武田薬品の順に変動が大きいことが分かりました。

参考として書籍に従ってRでプロットしたものが下記の図ですが、同様の結果を得られています。まずはMATLABへのデータ読み込みはうまくいっていますね。
R_Plot.png

また、書籍に掲載されていたこの後の本格的な時系列データ解析もMATLABで試していければと思います。

まとめ

  • Rのワークスペース保存ファイル「.RData」をMATLABで読み込めるようにするには一手間が必要
  • ここではCSVに出力してからMATLABで変数名=readtable(ファイル名)で取り込む方法を紹介
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?