🐋
R|S&P500構成銘柄の株価を取得(quantmodパッケージ)
はじめに
R言語で株価の情報を取得したい場合に{quantmod}
パッケージが便利です。
本記事ではこのパッケージを使った株価情報の取得方法について紹介します。
Overview
{quantmod}
パッケージは株価情報の分析のためのRパッケージです。
インストール
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