knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.path = "man/figures/README-",
  out.width = "100%"
)

YahooFinance: Yahoo!ファイナンスの株価データのウェブスクレイピング

このパッケージはYahoo!ファイナンスの株価データをウェブスクレイピングするときに便利な関数を提供する。 このパッケージの特徴は以下の通り。

  1. JPXの公開データを用いて、企業名から銘柄コードを検索できる
  2. 複数の銘柄コードもしくは企業名を指定することで、一つの関数で複数の企業の株価データを取得できる

ウェブスクレイピングの際に、tidyverse/rvestパッケージを使用する。

インストール

このパッケージはCRANに登録していないので、 GitHubからインストールする。

# install.packages("devtools")
devtools::install_github("KatoPachi/YahooFinance")

使い方

このパッケージで主に使用する関数は三つ

  1. scrape_onefirm: 1社分の株価データを取得する関数
  2. scrape_more2firm: 1社以上の株価データを同時に取得する関数
  3. code_detect: 企業名から銘柄コードを調べる関数

銘柄コードからスクレイピング

ソニーと任天堂の2014年上半期の月次単位の株価データを取得する例を示す。 取得したい株価データの期間はstart_dateend_date引数を用いて"yyyymmdd"の形で指定する。

ここでは、start_date = 20140101end_date = 20140630となる。

Yahoo!ファイナンスは日単位・週単位・月単位のデータを提供している。 データの種類はdatatype引数で指定できる。

ここでは、datatype = "m"となる。

ソニーの銘柄コードは6758、任天堂の銘柄コードは7974である。 ここでは、二社の株価データを取得することを試みるので、scrape_more2firmを使う。

library(YahooFinance)

scrape_more2firm(
  c(6758, 7974),
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m"
)

取得されたデータの詳細は以下の通り

append = FALSEを引数に加えると、銘柄別にデータを取得することもできる。

sepdt <- scrape_more2firm(
  c(6758, 7974),
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m",
  append = FALSE
)

各銘柄のデータはsepdt$b(銘柄コード)で取り出せる。 たとえば、ソニーの銘柄コードは6758なので、sepdt$b6758でソニーの株価データを取り出せる

sepdt$b6758

scrape_more2firmscrape_onefirmをfor loop構文で繰り返し処理をしているだけなので、 1社だけの株価データもスクレピングできる。

scrape_more2firm(
  6758,
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m"
)

これは、scrape_onefirmと同じ結果となる。

scrape_onefirm(
  6758,
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m"
)

企業名からスクレイピング

scrape_more2firmは企業名を指定するname引数を備えている。 この引数を指定してスクレイピングする場合、scrape_more2firmは以下のようなプロセスを実行する。

  1. code_detect関数を使って、銘柄コードを検索する
  2. scrape_onefirm関数の繰り返し処理

code_detect関数はname引数で指定した企業名と部分的に一致する企業を JPXの公開データから探し、 部分マッチした企業の銘柄コードを返す関数である。

find <- code_detect(c("ソニー", "任天堂"))
find$code

企業名から正しく銘柄コードを発見出来ていることがわかる。 また、find$infoでマッチしたデータを確認できる。 さらに、JPXの公開データはdata(BrandCode)で確認できる。

name引数を用いたスクレイピングは以下のコードで実行できる。

scrape_more2firm(
  name = c("ソニー", "任天堂"),
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m"
)

name引数を指定したとき、銘柄コードを指定する必要はない。 仮に企業名と銘柄コードを同時に指定したならば、企業名が優先されることに注意されたい。

scrape_more2firm(
  c(6785, 7947),
  name = c("ソニー", "任天堂"),
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m"
)

企業名が1つである場合、scrape_more2firmscrape_onefirmの両方を使用できる。

scrape_more2firm(
  name = "ソニー",
  start_date = 20140101,
  end_date = 20140630,
  datatype = "m"
)

使用例

日本空港ビルデングの2019年~2021年の日次株価データを取得し、始値の時系列データをプロットしてみる。

dt <- scrape_more2firm(
  name = "日本空港ビルデング",
  start_date = 20190101,
  end_date = 20211231,
  datatype = "d"
)

library(ggplot2)

ggplot(dt, aes(x = date, y = open_price)) +
  geom_line() +
  scale_x_date(date_labels = "%Y-%b") +
  theme_classic()

スクレイピングは時間がかかる

注意したいことは、スクレイピングは時間がかかるという点である。 なぜなら、スクレイピングする必要があるページ数が増えるほど、 for loopによる繰り返し処理の時間がかかるからである。 例として、さきほどの例のスクレイピングの実行時間を記しておく。 経過という名前の時間がコマンドの起動から終了までに要した時間であり、 単位は秒。

system.time(
  dt <- scrape_more2firm(
    name = "日本空港ビルデング",
    start_date = 20190101,
    end_date = 20211231,
    datatype = "d"
  )
)


KatoPachi/YahooFinance documentation built on Feb. 9, 2022, 3:22 p.m.