2018年1月1日月曜日

k-db から hesonogoma で大騒ぎ

 2017年末を持ってk-dbが閉鎖ということになりました。お世話になりました。代替サイトですが、hesonogomaさんの株価一覧表を使うこととしました。証券会社で一括データの提供くらいしてくれてもよさそうなものですが、調べた限りでは見つかりませんでした。で、いまだ、対応途上ですが、目鼻が付きましたので、それに伴う様々なトラブルをメモしておきます。

  1. データのダウンロード・・・k-dbではurlの指定でcsvがダウンロードできましたが、hesonogomaさんではフラッシュを使用しているようで、そのようなわけにはいかず、手作業でファイルをダウンロードすることとしました。
  2. データファイルが4つ必要・・・全銘柄・ETF等・REIT・ファンドと4種類のファイルが必要です。
  3. 文字コードの問題1・・・文字コードの問題は相当重症です。ダウンロードしたファイルの文字コードは「UTF-16LE BOM付き」でした。UTF-16をRで読み込むとファイルが途中で切れます。当初原因がわからず、試行錯誤しましたが、StackOverflowに中国人の方が、同じ現象に会って質問をしていました。特定のコード以降読み込まないという趣旨だろうと思います。回答はありませんでした。で、nkf.exeを使っていったんUTF-8に変換することにしました。
  4. 文字コードの問題2・・・最初「UTF-8 BOMなし」に変換したのですが、EXCELに読み込むと文字化けする。で、BOM付きに変換。そのせいか、そのファイルをRで読み込むと列数が多いといわれて読み込めない。

ということで現在のところの文字コード部分のコードは次の通り。

system(paste(nkf,"-w8 --overwrite",fnams[1]))
system(paste(nkf,"-w8 --overwrite",fnams[2]))
system(paste(nkf,"-w8 --overwrite",fnams[3]))
system(paste(nkf,"-w8 --overwrite",fnams[4]))
d1=read.csv(fnams[1],sep="\t",na.strings = "-",fileEncoding="UTF-8-BOM",stringsAsFactors=F)
d2=read.csv(fnams[2],sep="\t",na.strings = "-",fileEncoding="UTF-8-BOM",stringsAsFactors=F)
d3=read.csv(fnams[3],sep="\t",na.strings = "-",fileEncoding="UTF-8-BOM",stringsAsFactors=F)
d4=read.csv(fnams[4],sep="\t",na.strings = "-",fileEncoding="UTF-8-BOM",stringsAsFactors=F)

なお、「UTF-8 BOM付き」をEXCELで読み込むと、tabで区切ってくれないのでもうひと手間かかります。

また、fileEncodingに「UTF-8-BOM」はありますが「UTF-16-BOM」はありませんでした。「UTF-16」はありますが上記の問題に会います。

さらに、4つのファイルの項目名が違う。全銘柄ファイルでは業種、それ以外のファイルでは種別となっている。

その部分を乗り越え、一つのファイルにするのが次のコード

names(d2)[which(names(d2)=="種別")]="業種" #names(d2)=gsub("種別","業種",names(d2))のほうがおしゃれかな?
names(d3)[which(names(d3)=="種別")]="業種"
names(d4)[which(names(d4)=="種別")]="業種"
orinames=c("SC","名称","市場","業種","始値","高値","安値","株価","出来高","売買代金.千円.")
d=rbind(d1[,orinames],d2[,orinames],d3[,orinames],d4[,orinames])

とりあえず、一つのデータフレームにできました。次の問題は
  1. 銘柄名が長い。・・・新しい銘柄名に変えようか、迷っている。
  2. 市場名が違う。・・・これは古いものに統一しようと思っている。
  3. 銘柄コードが違う。・・・k-dbでは「1301-T」のような形式でしたが新しいほうは「1301」のような形式です。新しい形式にしたときに問題になりそうなことは、
    • データ参照の時にyt[["1301-T"]]という参照方法とyt[[1]]という参照方法がありましたが、「1301」形式では文字列として扱われるのか整数として扱われるのか、悩ましい。Rが勝手に変換してくれるのもよいのやら。
    • k-dbでは同一コード同一銘柄で別市場のものがありましたが、新しいほうでは同一コードが見当たりません。東証と別市場がある場合は東証のみになっているのでしょうか?

ということで、大晦日から元旦にかけての作業でした。