株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

国内株式のヒストリカルデータをCSV形式で配付しているサービス

データの取得・保存 > 国内株式のヒストリカルデータをCSV形式で配付しているサービス


f:id:dogwood008:20201001004903j:plain

東京証券取引所 JPXデータクラウド

db-ec.jpx.co.jp

公式中の公式。しかしあなたが想像しているよりも、販売価格は桁違いに高い1。ユースケースによって具体的な値段が変わるため、明示は避けるが、おそらく試しに使ってみようとした個人は大抵が諦めるレベルの価格であろう。

また、お金を積めるような人(個人というより、法人)はリアルタイム情報2を受信することもできる。取得代金の他にも、取得のための回線やマシンなどを別途用意しなければならないようだが、ひっくるめて1か月あたり数万〜百何十万円の費用がかかる。個人レベルでは料金がおそらく妥当感がなく、お世話になることはないであろう。

Yahoo ファイナンス

info.finance.yahoo.co.jp

「Yahoo!ファイナンスVIP倶楽部」というサービス名で、日本市場に上場しているすべての株式について、株価のヒストリカルデータを毎月1980円(税別)で販売している。「株価データはVIP倶楽部でダウンロードしろ」とヤフーファイナンスは案内3しているので、これを利用させてもらおう。なお、VIP倶楽部に加入すると、テレビ東京のWBS(ワールドビジネスサテライト)の見逃し放送を視聴する権利(月額500円税別)4もあわせて得られるので、その料金を加味するとかなりお得感があると言える。

機械的にCSVデータをダウンロードする

まず、VIP倶楽部に登録が必要である。登録すると、Yahoo!ファイナンスへログインした状態で下記のURLにダウンロードすると、 CSV でのダウンロードが開始する。ダウンロード用URLの生成ロジックを Ruby で書くと、下記のようになる。

stock_code = 7974  # 証券コード。7974は任天堂。
market_code = 'T'    # 市場コード。Tは東証。
dl_url = "https://download.finance.yahoo.co.jp/common/history/#{stockCode}.T.csv"

ここで、市場コードは各市場名のローマ字先頭字である。詳細は、 Yahoo!ファイナンスヘルプ を参照のこと。東証では取引できない [2928] RIZAPグループ(株) 等、一部注意が必要な株もある。

さて、ダウンロード用URLは生成できても、これをそのまま cURL でアクセスしたり、作ったクローラにアクセスさせても、CSVはダウンロードできない。これは(当たり前であるが)認証を突破していないからである。要するに、あなたがVIP倶楽部に加入している正規の利用者である事をYahoo!ファイナンス側が認識できないと、CSVはダウンロードさせてもらえないということである。

インターネット上で記事を探すと、 selenium や puppeteer でブラウザの動作をコントロールしているものも見られるが、筆者としてはおすすめしない。なぜなら、これらの記事で紹介されているものでは、ステップ中にCSVのダウンロード以外にログインページを経由する方法が紹介されているものがほとんどだから5である。マシンのメモリと時間を節約する方法が他にあるので、これを紹介する。

その方法とは、予めブラウザでログインしておき、ブラウザに保存された Cookie を使用することである。ログインするとたくさんの Cookie が保存されるが、そのうち必要なのは YT のみ6である。

では実際にその Cookie を取り出してみよう。※後で画像を付ける。

まず、Google Chrome7https://finance.yahoo.co.jp/ にアクセスする。このとき、ログインされていなければ、ログインしておく。

次に mac の人は Ctl + Opt + I を、 Win/Linux の人は、Ctl + Shift + I or F12押す。次に Console タブをクリックする。これで JavaScript をページに対し実行できる状態になる。

続いて、画面下のプロンプト部分( > の表示がある部分)に、下記を入力する。

document.cookie.split('; ').map(e => [e[0], e.slice(2, e.length)]).filter(e => ['Y', 'T'].includes(e[0]))

そうすると、 [Array(2), Array(2)] と表示されるので、それぞれ横の▶をクリックすると、 YT の値を表示することができる。

あとはこれらの Cookie をセットした状態で、 cURL で件のURLへアクセスすれば、CSVをダウンロードすることができる。

1点注意があり、複数のCSVをダウンロードする場合、感覚を最低でも1秒、できれば5秒以上は開けたい。理由は別の記事「コラム:利用規約と過負荷、岡崎市立中央図書館事件の例」でも述べるが、相手先サーバへの負担を軽減する目的があるためである。

※Cookie をセットして cURL でCSVを保存する方法は、後で追記する。

コラム:スクレイピングの禁止

Yahoo ファイナンスの Web ページをスクレイピングすることは規約により禁じられている8。スクレイピングとは主に API が用意されていない Web サービスに対して用いられる手法であり、人間の代わりに機械がウェブページにアクセスをして、その内容を解析する目的で使用される。

Qiitaやブログの記事などを見ると、Yahoo!ファイナンスでスクレイピングする方法を説明したものがいくつかヒットするが、規約に違反している可能性がある9。各自で注意されたい。

なお、前述の通り、株価データのダウンロードについては、公式が「VIP 倶楽部を使用せよ」とアナウンスしているため、安心して使用することができる。

KABU+(株プラス)

kabu.plus

合同会社ZEROBYTE が提供する情報サービス。株価のヒストリカルデータのほか、商標登録出願データや 銘柄の基本情報データ、日証金融資・貸株残高データ、決算・財務・業績データ、投資指標データなど多岐にわたる情報が提供されている。

Yahoo! ファイナンスとは異なり、自分でデータ分析した結果を SNS やブログで発信する権利が明示されている。料金は複数プランあり、月額1650円(税込)から10

WebDAVにて提供されるため、cURLでアクセスすることも可能ではある。しかし、共有フォルダ一括同期ツール(マウント)を使用すると、データを取得するときにアクセス回数の上限が課されない。ツールを使わない場合にはアクセス上限は1時間あたり6回から12回(プランによって異なる)である。


  1. 定額制APIJPXデータクラウドサービス 料金表

  2. リアルタイム情報 | 日本取引所グループ

  3. 「株価データのダウンロードを利用したい場合は、「VIP倶楽部」の「時系列データダウンロード」をご利用ください。」Yahoo!ファイナンス, “Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています”, Yahoo!ファイナンス, アクセス日:2020年10月5日 https://support.yahoo-net.jp/PccFinance/s/article/H000011276

  4. テレビ東京ビジネスオンデマンド- BOD

  5. 筆者が探した限りでは、予め保存したCookieを使用して認証をスキップしつつ、selenium や puppeteer 等のブラウザをコントロールして、VIP倶楽部で提供されるCSVをダウンロードしている例は見つけられなかった。

  6. 筆者が動作を確認した時点ではそうだったが、今現在もそうであるかの保証はできない。なぜなら、サービス提供側は使用する Cookie の名前や、保存値を普遍にすることを保証しないからである(役務の提供としてそれを謳っていないので、当然である)。

  7. 別に強制はしないが、揃えておいた方が本質でない部分での躓きが無くて良いと思う。

  8. 「Yahoo!ファイナンスでは、Yahoo!ファイナンスに掲載している株価やその他のデータを、プログラム等を用いて機械的に取得する行為(スクレイピング等)について、システムに過度の負荷がかかり、安定したサービス提供に支障をきたす恐れがあることから禁止しています。」
    引用:Yahoo!ファイナンス, “Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています”, Yahoo!ファイナンス, アクセス日:2020年10月1日
    https://support.yahoo-net.jp/PccFinance/s/article/H000011276

  9. 筆者はYahoo!ファイナンスともスクレイピングの紹介記事を書いている人とも一切関わりがないため、契約的、法律的な判断は避ける。

  10. https://kabu.plus/document/membership.pdf

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.