時系列データ解析の書籍
技術評論社の書籍「現場ですぐ使える時系列データ分析~データサイエンティストのための基礎知識〜」には、ファイナンス分野における時系列データ解析の実践として、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を使用)
# サンプルデータ読み込み
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側
% ファイル名をリスト出力
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日分のデータを同じスケールでプロットし、価格変動の大きさを見てみます。
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でのプロット結果
書籍での説明と同様、この期間の株価データの変動は板硝子→ヤマハ→ポーラHD→武田薬品の順に変動が大きいことが分かりました。
参考として書籍に従ってRでプロットしたものが下記の図ですが、同様の結果を得られています。まずはMATLABへのデータ読み込みはうまくいっていますね。
また、書籍に掲載されていたこの後の本格的な時系列データ解析もMATLABで試していければと思います。
まとめ
- Rのワークスペース保存ファイル「.RData」をMATLABで読み込めるようにするには一手間が必要
- ここではCSVに出力してからMATLABで変数名=readtable(ファイル名)で取り込む方法を紹介