-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.Rmd
227 lines (174 loc) · 6.71 KB
/
README.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
---
output: github_document
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "man/figures/README-",
out.width = "100%"
)
```
# YahooFinance: Yahoo!ファイナンスの株価データのウェブスクレイピング
<!-- badges: start -->
<!-- badges: end -->
このパッケージはYahoo!ファイナンスの株価データをウェブスクレイピングするときに便利な関数を提供する。
このパッケージの特徴は以下の通り。
1. JPXの公開データを用いて、企業名から銘柄コードを検索できる
1. 複数の銘柄コードもしくは企業名を指定することで、一つの関数で複数の企業の株価データを取得できる
ウェブスクレイピングの際に、[tidyverse/rvest](https://github.com/tidyverse/rvest)パッケージを使用する。
## インストール
このパッケージは[CRAN](https://CRAN.R-project.org)に登録していないので、
[GitHub](https://github.com/)からインストールする。
```r
# install.packages("devtools")
devtools::install_github("KatoPachi/YahooFinance")
```
## 使い方
このパッケージで主に使用する関数は三つ
1. `scrape_onefirm`: 1社分の株価データを取得する関数
1. `scrape_more2firm`: 1社以上の株価データを同時に取得する関数
1. `code_detect`: 企業名から銘柄コードを調べる関数
### 銘柄コードからスクレイピング
ソニーと任天堂の2014年上半期の月次単位の株価データを取得する例を示す。
取得したい株価データの期間は`start_date`・`end_date`引数を用いて"yyyymmdd"の形で指定する。
- `start_date`: 取得期間の開始日
- `end_date`: 取得期間の最終日
ここでは、`start_date = 20140101`と`end_date = 20140630`となる。
Yahoo!ファイナンスは日単位・週単位・月単位のデータを提供している。
データの種類は`datatype`引数で指定できる。
- `datatype = "d"`: 日次株価データを取得できる
- `datatype = "w"`: 週単位の株価データを取得できる
- `datatype = "m"`: 月次株価データを取得できる
ここでは、`datatype = "m"`となる。
ソニーの銘柄コードは6758、任天堂の銘柄コードは7974である。
ここでは、二社の株価データを取得することを試みるので、`scrape_more2firm`を使う。
```{r }
library(YahooFinance)
scrape_more2firm(
c(6758, 7974),
start_date = 20140101,
end_date = 20140630,
datatype = "m"
)
```
取得されたデータの詳細は以下の通り
- `date`: 日付
- `open_price`: 始値
- `high_price`: 高値
- `low_price`: 安値
- `close_price`: 終値
- `volume`: 出来高
- `split_up_adjust_close_price`: 調整後終値。詳細は[Yahoo!ファイナンスのヘルプセンター](https://support.yahoo-net.jp/PccFinance/s/article/H000006678)で確認すること。
- `brand`: 銘柄コード
`append = FALSE`を引数に加えると、銘柄別にデータを取得することもできる。
```{r }
sepdt <- scrape_more2firm(
c(6758, 7974),
start_date = 20140101,
end_date = 20140630,
datatype = "m",
append = FALSE
)
```
各銘柄のデータは`sepdt$b(銘柄コード)`で取り出せる。
たとえば、ソニーの銘柄コードは6758なので、`sepdt$b6758`でソニーの株価データを取り出せる
```{r}
sepdt$b6758
```
`scrape_more2firm`は`scrape_onefirm`をfor loop構文で繰り返し処理をしているだけなので、
1社だけの株価データもスクレピングできる。
```{r}
scrape_more2firm(
6758,
start_date = 20140101,
end_date = 20140630,
datatype = "m"
)
```
これは、`scrape_onefirm`と同じ結果となる。
```{r }
scrape_onefirm(
6758,
start_date = 20140101,
end_date = 20140630,
datatype = "m"
)
```
### 企業名からスクレイピング
`scrape_more2firm`は企業名を指定する`name`引数を備えている。
この引数を指定してスクレイピングする場合、`scrape_more2firm`は以下のようなプロセスを実行する。
1. `code_detect`関数を使って、銘柄コードを検索する
1. `scrape_onefirm`関数の繰り返し処理
`code_detect`関数は`name`引数で指定した企業名と部分的に一致する企業を
[JPXの公開データ](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)から探し、
部分マッチした企業の銘柄コードを返す関数である。
```{r}
find <- code_detect(c("ソニー", "任天堂"))
find$code
```
企業名から正しく銘柄コードを発見出来ていることがわかる。
また、`find$info`でマッチしたデータを確認できる。
さらに、JPXの公開データは`data(BrandCode)`で確認できる。
`name`引数を用いたスクレイピングは以下のコードで実行できる。
```{r}
scrape_more2firm(
name = c("ソニー", "任天堂"),
start_date = 20140101,
end_date = 20140630,
datatype = "m"
)
```
`name`引数を指定したとき、銘柄コードを指定する必要はない。
仮に企業名と銘柄コードを同時に指定したならば、**企業名が優先される**ことに注意されたい。
```{r}
scrape_more2firm(
c(6785, 7947),
name = c("ソニー", "任天堂"),
start_date = 20140101,
end_date = 20140630,
datatype = "m"
)
```
企業名が1つである場合、`scrape_more2firm`と`scrape_onefirm`の両方を使用できる。
```{r}
scrape_more2firm(
name = "ソニー",
start_date = 20140101,
end_date = 20140630,
datatype = "m"
)
```
### 使用例
日本空港ビルデングの2019年~2021年の日次株価データを取得し、始値の時系列データをプロットしてみる。
```{r}
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による繰り返し処理の時間がかかるからである。
例として、さきほどの例のスクレイピングの実行時間を記しておく。
経過という名前の時間がコマンドの起動から終了までに要した時間であり、
単位は秒。
```{r}
system.time(
dt <- scrape_more2firm(
name = "日本空港ビルデング",
start_date = 20190101,
end_date = 20211231,
datatype = "d"
)
)
```