RパッケージtidyquantとExploratoryで始める0からのファイナンス計量分析

  • 11
    いいね
  • 0
    コメント

こちらは、Rパッケージ、tidyquantの作者であるMatt Danchoが書いた、Quantitative Financial Analysis For Beginners with Exploratory.io and tidyquant を、許可を得て翻訳をしたものになります。分析対象企業を日本企業にするなど、若干変更があります。


ファイナンスの計量分析は、一般的にハードルが高いと思われています。この分野には、膨大な知見がありますが、誰しもそれを全て学ぶだけの時間があるわけではありません。

この記事では、ファイナンス分析のためのRパッケージ、tidyquantと、Rのユーザー・インターフェースである、Exploratoryを使用して、定量株式分析の基礎を理解するための、株式リターンの基本的な分析の手法を紹介します。

知っておくべきこと

分析を始める前に、いくつか必要なことを理解しておきましょう。通常、株価の分析は過去のデータをもとに行うことになります。価格そのものは、それほど重要ではありません。知りたいのはリターンです。なので、リターンの統計的性質を分析していきます。

今回の分析では、ログ・リターンを指標として使用していきます。ログ・リターンは多くの理由があって、一般に広く利用されています。この記事では説明しませんが、なぜログ・リターンを使うのか、興味があれば調べてみてください。

参考:Why Log Returns?

リターンを分析することで、株の成長とボラティリティ(変動の激しさ)を理解することが可能になります。1日のログ・リターンの平均は、成長の尺度になり、標準偏差はボラティリティの尺度になります。これらが重要なのは、過去のリターンのパフォーマンスから、自分の投資戦略と一致するような株を見つけ、動向を予測する事ができるからです。

日々の株価を取得する

まず、複数の銘柄の過去の価格を取得、株価をダウンロードします。Quandlというサービスが過去の株価情報を提供しています。tidyquantというRパッケージが、そこから、分析しやすい形でダウンロードしやすくしてくれている機能をもっているので、それでデータを取得しましょう。

再現するための、簡単な環境の準備方法が最後の方にありますので、こちらに沿って準備をしてください。

今回は、日本のIT企業である、softbank、楽天、サイバーエージェント、コロプラを扱っていきます。ダウンロードをするのに、企業のコードを指定しなければいけないのですが、ここで検索することが出来ます。

quandl.png

調べると、以下のようになっていることがわかります。

  • softbank TSE/9984
  • 楽天 TSE/4755
  • サイバーエージェント TSE/4751
  • コロプラ: TSE/3668

この情報を使って、Rのスクリプトからデータを取得します。

rscript_import.png

そこで、以下のスクリプトを実行します。

library(tidyquant)
c("TSE/9984", "TSE/4755", "TSE/4751", "TSE/3668") %>%
  tq_get(get  =  "quandl",
         from =  "2013-01-01",
         to   =  "2016-01-01")

すると、以下のようにデータを簡単に、さらに扱いやすい形で一度に取得できます。

stock_data_frame.png

Summaryタブに移ると、以下のように各列の情報がわかります。

stock_data_summary.png

open(始値:取引開始時の値段)、high(高値:最大の値段)、low(底値:最低の値段)、close(終値:取引終了時の値段)、volume(売買が成立した株数)が各企業ごとに、日々記録されていることがわかります。

まずは、symbolが記号だとわかりにくいので、企業名にマップします。そのために、recodeという便利な関数があるので、それをMutateコマンドで使います。

mutate(symbol = recode(symbol, "TSE/9984" = "ソフトバンク", "TSE/4755" = "楽天", "TSE/4751" = "サイバーエージェント", "TSE/3668" = "コロプラ"))

これによって、symbolの列の中身が、企業名になりました。
そして、企業ごとに分析を行っていきたいので、symbol列でグルーピングします。

group_by.png

ログ・リターンを一気に計算する

ここから、ログ・リターンを求めていきます。
ログ・リターンは、log(その日の終値)-log(1日前の終値)となります。それを、いくつかのステップを組み合わせて算出することも可能なのですが、少々煩雑です。tidyquantには、tq_mutateという、ファイナンスのデータから簡単に指標を算出できる便利な関数が用意されているので、それをコマンドとして呼び出します。

tq_mutate(
  ohlc_fun = Cl, 
  period = "daily",
  type = "log",
  mutate_fun = periodReturn, 
  col_rename = "daily.returns.log"
)
  • ohlc_fun = Cl というのは、終値を値として使用するという意味です。
  • period = “daily”で、日毎の値の変化を出すように設定します。
  • type = "log"によって、対数にした結果を返します。
  • mutate_fun = periodReturn で、設定する期間のリターンを算出します。
  • col_rename = “daily.returns.log”で、作られるカラムの名前が設定されます。

tq_transmute.png

リターンの分布を可視化する

必要なデータが得られたので、それを視覚的に探索してみましょう。ヒストグラムは、ログ・リターンを可視化するのに適した1つの方法です。Vizタブで、TypeからHistogramを選択し、x軸にdaly.return.log、bucketsに50、およびrepeat byにsymbolを使います。

hist.png

これから、softbankのログ・リターンはコロプラ、サイバーエージェント、楽天より狭い分布になっていることがわかります。それは低いボラティリティ、つまり高い安定性を意味するので、好ましいということになります。

コロプラは、比較的広い分布になっており、高いボラティリティをもっていることがわかります。

リターンを時系列で可視化する

それぞれの銘柄のログ・リターンの平均と、標準偏差を時系列で可視化することによって比較してみましょう。ここでは、日ごとのログ・リターンの平均をMDLR(Mean daily log return)と呼び、標準偏差の方はSDDLR(Standard deviation daily log return)と呼ぶことにして、話を進めたいと思います。

MDLRは、中心傾向の尺度となります。正の値は、価格が平均的に成長していることを示し、負の値は減少していることを示します。

SDDLRは、ボラティリティの尺度になります。値が小さい場合にはリスクが少なく、大きい場合はリスクが大きいことになります。

それらを組み合わせることで、その銘柄の期待リターンの質、つまり、どれだけのリスクをとって、高いリターンを目指すのかを考えることができます。

まずは、どれだけ株価が伸びているのかを見るのに、年ごとのMDLRを見てみましょう。Vizタブに移動し、lineを選択し、x軸にDate, y軸にdaily.return.logを選択します。x軸の右側ではYEAR、y軸の右側ではAVEを選択します。これで、日々のログ・リターンにおける、年ごとの平均が表示されます。

line_mean.png

それでは次に、SDDLRを別のグラフを作って可視化してみましょう。MDLRのチャートのドロップダウンから、Copyを選択します。

copy.png

そして、Y軸のAVEをSDに変更します。すると、チャートは次のようになります。

line_sd.png

重要な指標である。SDDLRの大きさや傾向を見てみましょう。リターンが良かった2013年は、同時に比較的ボラティリティが高い年でもあったことが伺えます。2014年、2015年にかけて落ち着いていきました。
これが、投資家がリターンを得るために取っているリスクということになります。これらの企業の株取引において、2013年は、とても積極的にリスクが取られていた年だと言うことが出来るでしょう。

最後に、それぞれの銘柄のMDLRとSDDLRを同じチャートで一緒に比べてみましょう。

4つ目のチャートをつくります。今回は、y軸を足します。Repeat Byにsymbol、設定のNumber of Columnsに4を指定します。これで、銘柄ごとのチャートを横に並べて表示することが出来ます。

last_chart.png

最後に

このように、Exploratoryのユーザー・インターフェイスの中から直接tidyquantというRのパッケージを使うことで、簡単に株式のデータを取得できます。さらに、ファイナンスの計量分析に欠かせない指標を素早く計算、さらにはインタラクティブに可視化して分析することができます。
近年において、プラスの平均リターンが出ているのは、サイバーエージェントということになりますが、ボラティリティも高く、リスクがあると言えます。リスクが少ないという点では、ソフトバンクが一番のようです。しかし、平均リターンとしてはマイナスなので、上手にタイミングを見てトレードをしていかないと、リターンが得られないかもしれません。
このような分析を積み重ねていくことで、どの株を買うか、売るかという意思決定を行っていくのがファイナンスの定量分析になります。まずは自分の興味ある企業を、このように分析してみてはいかがでしょうか😉

まとめ

今回、2つのツール、Exploratoryと、tidyquantを用いて、定量株式分析の基礎を紹介しました。

  • tq_get関数を使用してWebから株価データを収集することからはじめ、日々のログ・リターンを算出しました。
  • 視覚的にパフォーマンスを分析することによって、株式リターンを検討しました。
  • ヒストグラムや、折れ線グラフを用いて、日々のログ・リターンを計算し、株のリターンの性質を読み取りました。
  • データの解析、可視化から、各企業のパフォーマンスの特徴を導き出しました。

Exploratoryで再現する

こちらに、最後に作成されたグラフをシェアしてあります。それをインポートすることで、今回の分析のステップ、グラフが手元で再現できます。

download_edf.png

こちらでインポートします。

import_edf.png

tidyquantのインストール方法

まずは、CRANからtidyquantをインストールします。

install_tidyquant.png

Installed Packagesタブで、インストールされたことが確認できます。
installed_tidyquant.png

現在CRANにあるバージョンが0.4.0なのですが、0.4.0.9020から付け加えられた機能を使用するので、それ以上でない場合は、以下の方法でアップグレードします。

新しく依存パッケージとして加わった、Quandlをインストールします。

install_quandl.png

以下のリンクから、0.4.0.9020バージョンのビルドファイルがダウンロード出来るので、それをインストールし、アップグレードします。

macの場合はこちら

windowsの場合はこちら

ダウンロードしたファイルを、こちらからインストールします。
local_install.png
Select R Package Fileボタンから、ダウンロードしたファイルを選択すると、tidyquantパッケージが使えるようになります。

それを、プロジェクトの中で有効にします。

package_register.png

開いたダイアログで、tidyquantのチェックボックスを有効にして、OKボタンを押します。
これで、このプロジェクトでtidyquantを使うことが出来るようになります。

package_dialog.png

分析に戻る

Rで再現する

エクスポートされたR Scriptは以下になります。
再現するには、exploratoryパッケージのインストールが必要になりますが、こちらからダウンロードできます。

# Load required packages.
library(dplyr)
library(exploratory)

# Custom R function as Data.
japanese_stock_data.func <- function(){
  library(tidyquant)

  c("TSE/9984", "TSE/4755", "TSE/4751", "TSE/3668") %>%
    tq_get(get = "quandl",
      from = "2013-01-01",
      to   = "2016-01-01")
}

# Steps to produce the output
japanese_stock_data.func() %>% exploratory::clean_data_frame() %>%
  mutate(symbol = recode(symbol, "TSE/9984" = "ソフトバンク", "TSE/4755" = "楽天", "TSE/4751" = "サイバーエージェント", "TSE/3668" = "コロプラ")) %>%
  group_by(symbol) %>%
  tq_mutate(   ohlc_fun = Cl,    period = "daily",   type = "log",   mutate_fun = periodReturn,    col_rename = "daily.returns.log" )