株式の情報をあつめる[Web scraping for R]
注意
2020/09/25 現在, 多くの株式情報を取り扱うサイトでスクレイピング行為が禁止されています.(yahoo finance等)
参考にしたサイト株探ではサイトに負荷をかけないことを条件に認められていますが, スクレイピングを行う頻度に気を付けることを強く推奨します.
また, 本記事は金融商品の購入することを勧めるものではありません.金融商品の購入・売却に関する責任を一切負いかねますのでご理解宜しくお願いします.
やりたいこと
・上記サイトのストップ高のリストをRで出力したい
・ストップ高のリストと合致するかどうかを判断してくれる関数を書きたい
手段
①株探からhtml要素を収集し, Rにもってくる
②Rで条件を細かく指定してほしい情報を整理
③判断してくれる関数を書く
①ではRのパッケージrvestを利用してhtml要素をサイトから取り出します.
②では正規表現を操りながら欲しい情報を整理します.
③では簡単なif分を書くことでストップ高判別機を作成します.
実践
①株探からhtml要素を収集し, Rにもってくる
必要なパッケージは次の4つです. インストールしていないものがあればインストールしましょう.
library(rvest)
library(dplyr)
library(magrittr)
library(stringr)
次に欲しいhtml要素を決めるのですが, 今回は表が欲しいので, tableで探すことにしました.
stop.stock<-read_html("https://kabutan.jp/warning/?mode=3_1")
stop.table<-stop.stock %>% html_nodes("table")
②Rで条件を細かく指定してほしい情報を整理
欲しいhtml要素が取れたかを確認したら, html_table関数にかけます.
今回はうまくいかなかったので文字ベクトルとして保存します.
stop.stock.list <- stop.table[[3]] %>% html_text()
文字ベクトルで保存が出来たら後はひたすら正規表現でほしい情報を絞ります.(正規表現表は別記事のリンクを貼ります.)
code<-str_match_all(stop.stock.list,"\\d{4}")
ratio<-str_match_all(stop.stock.list,"[+|-]\\d{1,2}.\\d{2}[%]")
some<-str_match_all(stop.stock.list,"[+|-]\\d.\\d{0,3}[\r]")
some<-str_match_all(some,"[+|-]\\d.\\d{0,4}")
最後にデータフレームにまとめ出力します.
some<-some %>% as.data.frame()
colnames(some)<-"Price"
stop.stock.df<-data.frame(code,some,ratio)
colnames(stop.stock.df)<-c("Code","Price","Ratio")
stop.stock.df
③判断してくれる関数を書く
for文を使って判別するコードを書きます. 実際に使用するときは気になっている株をまとめて関数に入れたいので形を合わせます.
for (i in 1:length(x)) {
if(x[i] %in% stop.stock.df$Code){
print("この銘柄はストップ高です.")
}else{
print("違います.")
}
}
実際に判別してみる
コードがすべてかけました.ではさっそく判別してもらいましょう.
library(rvest)
library(dplyr)
library(magrittr)
library(stringr)
setwd("~/株情報")
limit<-function(x){
stop.stock<-read_html("https://kabutan.jp/warning/?mode=3_1")
stop.table<-stop.stock %>% html_nodes("table")
stop.stock.list <- stop.table[[3]] %>% html_text()
code<-str_match_all(stop.stock.list,"\\d{4}")
ratio<-str_match_all(stop.stock.list,"[+|-]\\d{1,2}.\\d{2}[%]")
some<-str_match_all(stop.stock.list,"[+|-]\\d.\\d{0,3}[\r]")
some<-str_match_all(some,"[+|-]\\d.\\d{0,4}")
some<-some %>% as.data.frame()
colnames(some)<-"Price"
stop.stock.df<-data.frame(code,some,ratio)
colnames(stop.stock.df)<-c("Code","Price","Ratio")
stop.stock.df
write.table(stop.stock.df, paste0(Sys.Date(),"ストップ高.txt"),quote = FALSE, row.names = TRUE)
for (i in 1:length(x)) {
if(x[i] %in% stop.stock.df$Code){
print("この銘柄はストップ高です.")
}else{
print("違います.")
}
}
}
#試しに入れてみる
x=c("3004","4008","2467")
limit(x)
#結果
[1] "違います."
[1] "違います."
[1] "違います."
[1] "違います."
#実際のストップ高した銘柄は
Code Price Ratio
1 4054 +305 +8.29%
2 4445 +700 +16.51%
3 4564 +46 +32.62%
4 4696 -11 -2.78%
5 4736 +100 +14.31%
6 4764 +25 +18.25%
7 5781 +150 +16.39%
8 6173 +150 +20.49%
9 6579 +1,500 +20.49%
10 6696 +150 +18.29%
11 9360 +500 +24.88%
まとめ
表を抜き出せなくて困っているときは正規表現を使うと解決できることがある(かなり乱暴な方法だが...)
思ったのはこれ最初に文章を保存するか\n \rを削除したらだいぶ仕事早かったかも.
参考文献というより参考になる文献
今回は参考文献が特にあるわけではないので関数を作る時に便利なページを載せます. 困ったら大体ここを見ます.