ことばにならないなにか

「ことばにならないなにか」を言葉で近似するそんな試み

R言語を使って株価データを取得(スクレイピング)する方法

時系列分析の勉強をしていると、ふと株価を時系列分析にかけてみたくなる時があると思います。

「株価データ」と考えて、まず思いつくのは「Yahoo!ファイナンス」ですが、
実はYahoo!ファイナンスは、スクレイピング(プログラムを組んでWeb上からデータを収集すること)による株価の自動取得を禁止しています。

Yahoo!ファイナンスでは、Yahoo!ファイナンスに掲載している株価やその他のデータを、プログラム等を用いて機械的に取得する行為(スクレイピング等)について、システムに過度の負荷がかかり、安定したサービス提供に支障をきたす恐れがあることから禁止しています。

Yahoo!ファイナンスヘルプ - Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止していますより引用。


ということで、今回は以下の「株価データダウンロードサイト」というWebサイトから、R言語を使って株価をスクレイピングしてみます。

株価データダウンロードサイト
http://k-db.com/

このサイトの管理者はブログで、スクレイピングするときには高負荷をかけないように気をつけてね、と言っています。
気をつければ、取得しても大丈夫っぽいです。

高頻度アクセスによって、転送量が異常に多い状況が続いたことと、障害が多発するようになったため、制限をかけています。
スクリプト等でデータ取得される方はお気を付けください。(特に同一ページに対しての大量リクエストなど)

k-db.com: 2016/01/20より引用。

株価を取得してみる

ということで、R言語を使って、日経平均株価を構成する225銘柄の2015年の株価日次データを取得するには、以下のようにします。

code <- c(4151,4502,4503,4506,4507,4519,4523,4568,6479,6501,6502,6503,6504,6506,6508,6674,6701,6702,6703,6752,6753,6758,6762,6767,6770,6773,6841,6857,6902,6952,6954,6971,6976,7735,7751,7752,8035,7201,7202,7203,7205,7211,7261,7267,7269,7270,4543,4902,7731,7733,7762,9412,9432,9433,9437,9613,9984,8303,8304,8306,8308,8309,8316,8331,8332,8354,8355,8411,8253,8601,8604,8628,8630,8725,8729,8750,8766,8795,1332,1333,2002,2269,2282,2501,2502,2503,2531,2801,2802,2871,2914,3086,3099,3382,8233,8252,8267,8270,9983,2432,4324,4689,4704,9602,9681,9735,9766,1605,3101,3103,3105,3401,3402,3861,3863,3865,3405,3407,4004,4005,4021,4041,4042,4043,4061,4063,4183,4188,4208,4272,4452,4901,4911,6988,5002,5020,5101,5108,5201,5202,5214,5232,5233,5301,5332,5333,5401,5406,5411,5413,5541,3436,5703,5706,5707,5711,5713,5714,5715,5801,5802,5803,5901,2768,8001,8002,8015,8031,8053,8058,1721,1801,1802,1803,1808,1812,1925,1928,1963,5631,6103,6113,6301,6302,6305,6326,6361,6366,6367,6471,6472,6473,7004,7011,7013,7003,7012,7911,7912,7951,3289,8801,8802,8804,8830,9001,9005,9007,9008,9009,9020,9021,9022,9062,9064,9101,9104,9107,9202,9301,9501,9502,9503,9531,9532)

for(i in 1:length(code)){
  url <- paste("http://k-db.com/stocks/",code[i],"-T?year=2015&download=csv",sep="")
  stock <- read.table(url,sep=",", skip=2)
  #適当な処理
  print(i)
  Sys.sleep(1)
}

軽く解説すると、
codeで、取得する株価の証券コードを指定します。今回は225銘柄全部取ってくるので、225個の証券コードを記載しています。
証券コードは、以下のサイトから持ってきました。
indexes.nikkei.co.jp

urlに、取得元のURLを生成し、URL先のデータを取得します。形式はCSVっぽいので、カンマでデータを区切って、余分なヘッダーを2行取り除いて、stockに代入しています。それ以降は、Rのdata.frameに突っ込むなり、グラフを書くなり、焼くなり煮るなり、お好きな方法で処理して下さい。

Sys.sleep(1)で、システムを1秒間眠らせています。サーバーに負荷をかけないための対策です。これしないとサーバーにアクセス拒否されて、しばらく取得できなくなります。1秒もバッファを取れば十分です。(0.5くらいでも行ける気がします...)

ちなみに、stockの中身はこんな感じです。

> head(stock)
          V1   V2   V3   V4   V5      V6          V7
1 2015-12-30 6071 6100 6032 6065 1555300  9443146800
2 2015-12-29 5940 6098 5933 6093 2152000 13014105600
3 2015-12-28 5898 5943 5858 5929 1105900  6529141700
4 2015-12-25 5908 5947 5884 5895 1034100  6110926700
5 2015-12-24 6012 6047 5846 5860 1664000  9826514000
6 2015-12-22 5957 5986 5943 5955 1297500  7740294100

URL元にアクセスすれば分かるのですが、左から順に、日付(V1)、始値(V2)、高値(V3)、安値(V4)、終値(V5)、出来高(V6)、売買代金(V7)です。

終値だけを取り出すには

例えば、終値だけを取り出したければ以下のようにします。

> closePrice <- rev(stock[["V5"]])
> head(closePrice)
[1] 5000.0 4911.0 4913.5 5097.0 5107.0 5158.0

取得元のデータが日付の降順に並んでいるので、revで反転させています。