🐋

R|S&P500構成銘柄の株価を取得(quantmodパッケージ)

2022/12/23に公開

はじめに

R言語で株価の情報を取得したい場合に{quantmod}パッケージが便利です。
本記事ではこのパッケージを使った株価情報の取得方法について紹介します。

Overview

{quantmod}パッケージは株価情報の分析のためのRパッケージです。

https://cran.r-project.org/web/packages/quantmod/index.html

インストール

install
install.packages('quantmod')

Yahoo!ファイナンスから日経平均株価を取得

Yahoo!ファイナンスの株価情報はgetSymbols関数を使って取得できます。返されるデータには、
4本値(Open, High, Low, Close), 出来高(Volume), 調整済み株価(Adjusted)の情報が格納されています。

library(quantmod)
nikkei <- getSymbols(Symbols = "^N225", 
                     src="yahoo",
                     from="2022-12-01",
                     to = Sys.Date(),
                     auto.assign = FALSE)
nikkei
出力結果
           N225.Open N225.High N225.Low N225.Close N225.Volume N225.Adjusted
2022-12-01  28273.13  28423.46 28226.08   28226.08    71400000      28226.08
2022-12-02  27983.18  27983.18 27662.12   27777.90    79400000      27777.90
2022-12-05  27752.99  27854.11 27700.86   27820.40    63900000      27820.40
2022-12-06  27704.06  27934.07 27698.31   27885.87    60400000      27885.87
2022-12-07  27670.29  27786.25 27646.78   27686.40    63000000      27686.40
2022-12-08  27622.30  27643.64 27415.66   27574.43    64900000      27574.43
2022-12-09  27633.96  27952.80 27633.96   27901.01    70200000      27901.01
2022-12-12  27741.10  27865.72 27734.66   27842.33    49600000      27842.33
2022-12-13  28067.37  28116.56 27907.49   27954.85    51900000      27954.85
2022-12-14  28005.03  28195.69 27993.78   28156.21    54800000      28156.21
2022-12-15  27991.14  28163.17 27987.54   28051.70    51100000      28051.70
2022-12-16  27706.70  27713.04 27488.83   27527.12    83800000      27527.12
2022-12-19  27279.92  27349.58 27165.78   27237.64    58200000      27237.64
2022-12-20  27257.35  27339.49 26416.91   26568.03   118500000      26568.03
2022-12-21  26547.17  26616.28 26269.80   26387.72   119200000      26387.72
2022-12-22  26552.43  26585.28 26399.31   26507.87    73400000      26507.87
2022-12-23  26207.77  26276.52 26106.38   26247.89           0      26247.89

その他のオプションはこちらのマニュアルを参照すると良いでしょう。

株価情報をデータフレームに変換する

取得した株価情報は{zoo}パッケージのfortify.zoo関数を使ってデータフレームに変換できます。

library(zoo)
fortify.zoo(nikkei) # <xts>形式 -> <data.frame>

S&P500構成銘柄の株価情報を取得する

取得した株価情報をデータフレームに変換する関数を作っておくと、分析の際に便利です。

getStockPriceData <- function(code, startDate, endDate) {
  # 株価情報を取得します。
  # 
  # @Args:
  # code <chr>: 銘柄コード
  # startDate <Date>: 取得開始日
  # endDate <Date>: 取得終了日
  # 
  # @Returns:
  # 株価情報のデータフレームを返します。
  
  # <xts>形式の株価データを取得
  data <- try(quantmod::getSymbols(code,src="yahoo",
                                   from=startDate,
                                   to=endDate,
                                   auto.assign = FALSE),
              silent = TRUE)

  if (any(class(data) %in% "try-error")) {
    return(NULL)
  }
  
  # <data.frame>に変換
  data <- zoo::fortify.zoo(data)
  colnames(data) <- c("date", "Open", "High", "Low", "Close", "Volume", "Adjusted")
  # 終値の日次収益率列を追加する
  data <- data %>%
    dplyr::mutate(return = Close / dplyr::lag(Close, 1) - 1)
  
  # 銘柄コードのデータフレームを作成
  date_seq = seq(from = startDate, to = endDate, by = "day")
  symbol <- tidyr::tibble(date=date_seq, Symbol = rep(code, length(date_seq)))
  
  return(dplyr::left_join(data, symbol, by = "date"))
}

例えばGoogleの株価情報を次のようにデータフレームで取得できます。

startDate <- as.Date("2022-11-01")
endDate <- as.Date("2022-11-30")

getStockPriceData("GOOG", startDate, endDate)
出力結果
         date   Open    High    Low Close   Volume Adjusted       return Symbol
1  2022-11-01 95.590  96.165 90.430 90.50 43220600    90.50           NA   GOOG
2  2022-11-02 90.910  91.300 87.010 87.07 43553600    87.07 -0.037900552   GOOG
3  2022-11-03 86.345  86.550 83.450 83.49 48510400    83.49 -0.041116366   GOOG
4  2022-11-04 85.510  86.730 83.880 86.70 40173300    86.70  0.038447707   GOOG
5  2022-11-07 87.340  88.940 86.960 88.65 26899900    88.65  0.022491408   GOOG
6  2022-11-08 89.160  90.405 87.650 88.91 30172000    88.91  0.002932905   GOOG
7  2022-11-09 88.545  89.490 87.360 87.40 26743900    87.40 -0.016983488   GOOG
8  2022-11-10 92.340  94.550 91.650 94.17 42371200    94.17  0.077459907   GOOG
9  2022-11-11 94.710  97.360 94.160 96.73 30569100    96.73  0.027184932   GOOG
10 2022-11-14 95.500  97.180 95.113 96.03 24170100    96.03 -0.007236679   GOOG
11 2022-11-15 98.670 100.420 97.020 98.72 31831000    98.72  0.028012101   GOOG
12 2022-11-16 98.020  99.850 97.902 98.99 24660200    98.99  0.002734978   GOOG
13 2022-11-17 97.180  99.480 97.100 98.50 21818700    98.50 -0.004949975   GOOG
14 2022-11-18 99.010  99.160 96.740 97.80 24969900    97.80 -0.007106569   GOOG
15 2022-11-21 97.560  98.720 95.670 95.83 18696900    95.83 -0.020143159   GOOG
16 2022-11-22 96.160  97.548 94.410 97.33 18868900    97.33  0.015652718   GOOG
17 2022-11-23 97.340  99.069 97.340 98.82 17568900    98.82  0.015308723   GOOG
18 2022-11-25 98.465  98.940 97.530 97.60  8567800    97.60 -0.012345699   GOOG
19 2022-11-28 97.200  97.830 95.890 96.25 19974500    96.25 -0.013831947   GOOG
20 2022-11-29 96.000  96.390 94.390 95.44 20220000    95.44 -0.008415564   GOOG

ここで、return列は日次収益率:={(当日の終値) - (前日の終値)}/(前日の終値)を表しています。

次のコードはS&P500構成銘柄の株価情報を取得します。

# 株価情報の取得---------------------------------------------------------------
# S&P500構成銘柄の2022/11/1~2022/11/30の期間の株価情報をYahoo!ファイナンスから取得
# 
# wikipediaからS&P500構成銘柄を取得
# https://en.wikipedia.org/wiki/List_of_S%26P_500_companies
library(tidyverse)
library(rvest)
SandP500 <- read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies') %>% 
  html_node('#constituents') %>% # テーブルのCSSセレクタ
  html_table()
 
stock_data <- SandP500$Symbol %>%
  purrr::map(~{getStockPriceData(.x, startDate, endDate)})

stock_price_df <- bind_rows(stock_data) # 一つのdataframeにまとめる
write_csv(stock_price_df, "./stock_price_s&p500_202211.csv") # 保存しておく

取得した株価情報をもとに、各銘柄の日次収益率の平均・分散を求めることができます。

stock_price_summary <- stock_price_df %>%
  group_by(Symbol) %>%
  summarise(
    mu = mean(return, na.rm = TRUE), 
    sigma2 =var(return, na.rm = TRUE))

stock_price_summary%>%
  arrange(desc(mu)) # 日次収益率の平均値の降順
出力結果
# A tibble: 500 × 3
   Symbol     mu   sigma2
   <chr>   <dbl>    <dbl>
 1 ETSY   0.0167 0.00333 
 2 SEDG   0.0150 0.00334 
 3 AMD    0.0118 0.00191 
 4 ROST   0.0115 0.000936
 5 BBY    0.0115 0.00187 
 6 IVZ    0.0111 0.00230 
 7 BA     0.0109 0.000597
 8 BBWI   0.0105 0.00558 
 9 RL     0.0105 0.00138 
10 EQIX   0.0105 0.000866
# … with 490 more rows
# ℹ Use `print(n = ...)` to see more rows

S&P500構成銘柄中、2022年11月の平均日次収益率が最も高かったのはEtsyであったことがわかります。

おわりに

以上、{quantmod}パッケージを用いた株価情報の取得方法について紹介しました。
Rではデータフレームを柔軟に扱えため、株価の分析におすすめです。
それでは楽しいRライフを👋

Discussion