株初心者が本気で儲けるブログ

株式投資・仮想通貨に関連するテーマについて取り扱ってます。

【R言語】 xtsパッケージでの時系列データ解析





Rのような分析ソフトで分析するデータの種類の一つに、時間とともに変動する現象に対して時間の順序で測定・観測したデータである時系列データというものがあります。


時系列データの代表的なものとしては、株価および為替レートのような金融・経済データなどがあります。時系列データは、常に変動を伴うもので、過去のその振る舞いを統計的に分析し、データ変動の特徴と性質を捉え、現象の解明と将来の変動を予測・制御しようとするのが時系列分析の主要な目的です。


この時系列分析は金融関連でもっとも進んでいます。なぜかというと研究結果がそのまま「金」につながるからです。


このサイトを訪問してくださっている株価などの金融データの解析処理をしたい人にとって、時系列データの取り扱いをマスターするということが必要不可欠ともいえます。


時系列データの処理は、ts関数を使うことが一般的ですが、こいつは金融データを時系列解析するにはあんまり向いていません。そこで、以前紹介したquantmodパッケージに付随しているxtsパッケージをつかいます。xtsはRに元から入っているts(time Series)パッケージの派生で、より時系列データ、主に金融データ方面の取り扱いに特化した形式です。


xtsのすごいところは数値データとタイムインデックス組み合わせた新しいオブジェクトを作れるというところにあり、これのよってタイムインデックス(日時)で特定の要素が取り出せたりできるので、時系列データの扱いがより簡単になります。



今回はRに内臓されているMatrix形式の時系列データをxts形式に変換していきたいと思います。


まず

>library(quantmod)  ##パッケージ読み込み

※ないときは>install.packages("quantmod")でインストール


>data(sample_matrix)   ##内蔵データ、sample_matrixの呼び出し



> sample_matrix
Open High Low Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.23050 50.42188 50.23050 50.39767
2007-01-04 50.42096 50.42096 50.26414 50.33236
2007-01-05 50.37347 50.37347 50.22103 50.33459
2007-01-06 50.24433 50.24433 50.11121 50.18112
2007-01-07 50.13211 50.21561 49.99185 49.99185
2007-01-08 50.03555 50.10363 49.96971 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333
2007-01-10 49.91228 50.13053 49.91228 49.97246
2007-01-11 49.88529 50.23910 49.88529 50.23910
2007-01-12 50.21258 50.35980 50.17176 50.28519
2007-01-13 50.32385 50.48000 50.32385 50.41286
2007-01-14 50.46359 50.62395 50.46359 50.60145
2007-01-15 50.61724 50.68583 50.47359 50.48912


ここでは省略してますがまだまだあってめっちゃでかいです。一応、データの大きさを表示してくれるstr()関数で確認すると


> str(sample_matrix)
num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:180] "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" ...
..$ : chr [1:4] "Open" "High" "Low" "Close"

どうやら180行4列の行列で、行は日付、列は文字列らしいですね。


では、このデータを扱いやすくするためxts形式に変換します。
変換にはas.xts()を使います。(descrでデータの説明が付け加えられます。)



> x<-as.xts(sample_matrix,descr='new xts object')

> x
Open High Low Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.23050 50.42188 50.23050 50.39767
2007-01-04 50.42096 50.42096 50.26414 50.33236
2007-01-05 50.37347 50.37347 50.22103 50.33459
2007-01-06 50.24433 50.24433 50.11121 50.18112
2007-01-07 50.13211 50.21561 49.99185 49.99185
2007-01-08 50.03555 50.10363 49.96971 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333
2007-01-10 49.91228 50.13053 49.91228 49.97246
2007-01-11 49.88529 50.23910 49.88529 50.23910
2007-01-12 50.21258 50.35980 50.17176 50.28519


一見何も変わってないですがstr()で見てみると



> str(x)
An ‘xts’ object on 2007-01-02/2007-06-30 containing:
Data: num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "Open" "High" "Low" "Close"
Indexed by objects of class: [POSIXct,POSIXt] TZ:
xts Attributes:
List of 1
$ descr: chr "new xts object"

行の部分が日付からPOSIXに置き換わっています。POSIXとはUNIX派生のosが内臓しておくべき最低限のセットのひとつでposixctは1970年元旦からの秒数を表しています。


> class(x)
[1] "xts" "zoo"


そしてグラフを作図していくわけですが


> plot(sample_matrix)だと、openとhighの数値で勝手に線形を作ったぐちゃぐちゃなグラフになってしまいます。しかしXTSに変換しておくと


> plot(x[,1],main="sampleplot",cex.main=0.8)


f:id:oruka199665:20161229215523j:plain


時系列グラフになってくれています。もしローソク図にしたい場合は引数type="candles"を加えることで可能です。


> plot(x["2007-04-01::2007-06-01"],cex=0.8,type="candles")

このように日付で指定できるのは便利ですね。


また下のように日付を指定してデータの抽出することも可能です。


> x["2007-01-07"]
Open High Low Close
2007-01-07 50.13211 50.21561 49.99185 49.99185

他にも指定した期間のデータの平均を求めることもできます。

> apply.monthly(x[,4],mean)  #月ごとの平均
Close
2007-01-31 50.22791
2007-02-28 50.79533
2007-03-31 49.48246
2007-04-30 49.62978
2007-05-31 48.26699
2007-06-30 47.46899

※引数にはmonthlyの他にもdaily・weekly・quarterly・yearlyもあります。


> apply.monthly(x['2007-03-07::2007-06-29'],mean)  #3月7日から6月29日までの平均
Open High Low Close
2007-03-31 49.29587 49.38572 49.17500 49.26295
2007-04-30 49.62687 49.71287 49.53189 49.62978
2007-05-31 48.31942 48.41694 48.18960 48.26699
2007-06-29 47.47036 47.56333 47.37248 47.45870


> ndays(x) ##データが何日分か
[1] 180


quantmodパッケージの中には”xts”のほかにも”zoo”というパッケージがあり、こちらは欠損値がある場合に自動的に補完してくれたりとxtsと同じように金融時系列データを扱う上で欠かせないです。



関連記事

Rによる変化率の計算
quantmodパッケージの基本的な使い方





追記:quantmodやxtsについては、コチラのRとトレード 金融データ解析の基礎という本がとても参考になったので紹介しておきます。少々値段が張りますが、Rで金融データを分析するならば読んでおいて損はない参考書だと思います。