第1章 めざせ!不労所得!株取引を自動化する方法 〜株価データ取得・自動更新編〜
第2章 暗号通貨のトレンド
第3章 日本円ステーブルコインJPYCでお得にお買い物をしてみよう!
第4章 ERC721 NFT 発行技術
・本書の内容は、著者個人が趣味の時間に自発的に行ったものです。著者が所属する会社または団体の監督指導の下に行ったものではありません。所属する会社または団体の発表のように見えることがあるかもしれませんが、その会社または団体は本書の内容について、一切関知しておらず、なんら責任や関連はありません。
・本書の内容は、著者個人による見解であり、所属する団体、組織、会社、その他一切の枠組みによる公式見解ではありません。また、内容が正しいことも一切保証しません。
・本書の内容は、著者個人の成果物に関する情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。
・本書の内容または本書の内容を元にして作成された成果物あるいはそれを元にした二次成果物(株価の予測投資情報の生成等を含む。以下、その成果物が生成する情報と呼称する)のみを参考にして、投資の判断を行わないでください。また、本書の内容またはその成果物が生成する情報が正確であることを、著者は一切保証しません。未来の出来事に対する予想も、あくまで予想であり、その時々の状況によって変わりうることにご注意ください。
・投資を行う際には、投資を行う本人のみの判断と責任において行ってください。
・仮に投資に失敗し、投資を行った者の資産が減ったり債務を負ったりしても、著者はなんら責任を負いません。
・その他、本書を参考にしたかどうかに関わらず、投資の失敗や機会、利益の逸失等を含むいかなる不利益が何人に生じたとしても、著者はなんら責任を負いません。
自然言語処理ならWikipedia、FXならhistdata.comといったように、近年は無料あるいは安価にてビッグデータにアクセスできるようになってきた。これにより、個人によるデータ分析や機械学習を用いた人工知能の開発が、以前より低いハードルで算入できるようになった。
しかし、日本株については、まだまだ発展途上といわざるを得ない。本家本元の東京証券取引所が提供する株価データの取得には、過去データはそこまでではないが、リアルタイムデータは個人では難易度が高い金額の月額使用料が必要である。また、Yahoo!ファイナンスやKABU+ (ZEROBYTE社)も、それぞれ専用のAPIは用意されておらず、特定のCookieの設定やWebDAVのマウントが必要等、やや癖がある。
これらにより、本来はデータ分析や統計処理を行いたいのに、その前段の面倒なことに多くの時間を割かねばならない状況になっている。すなわち、日本株の過去の値動きデータ(ヒストリカルデータ)の作成のみならず、保守運用まで含めると、それだけで考えることが多くなってしまうのである。
この本では、その問題を整理し、プログラムから使いやすいCSVデータを生成と保守する方法の紹介を目的とする。データサイエンティストが本来集中すべきデータ分析に集中できる一助となれば、幸いである。
ある程度のコンピューターリテラシーを持つ読者を対象とする。過去の値動きが記載されたCSVを取得した後、どのように解析すべきか、といったことは本書では触れない。
この本は、株のシステムトレードをしよう - 1から始める株自動取引システムの作り方 に加筆修正されたものである。ゆくゆくは株式の自動取引を行って利益を出すことを最終的な目標としている。
なお、記載内容の著作権は著者であるdogwood008(GitHub, Twitter)が有しており、法に定めがある場合を除き、著者への断りなく内容の一部または全てを転載することを禁ずる。
公式中の公式。過去データ(ヒストリカルデータ)であれば、他社よりやや高いが、個人利用で銘柄や期間を絞れば十分手が届く料金である1。
しかし、リアルタイムデータの販売価格は桁違いに高い。ユースケースによって具体的な値段が変わるため、明示は避けるが、おそらく試しに使ってみようとした個人は大抵が諦めるレベルの価格であろう。取得代金の他にも、取得のための回線やマシンなどを別途用意しなければならないようだが、ひっくるめて1か月あたり数十万〜百数十万円の費用がかかる。個人レベルではよほど利益を見込めるような仕組みを作った人でないと、手が届かないのではないかと思われる。
https://info.finance.yahoo.co.jp/vip/pr/
「Yahoo!ファイナンスVIP倶楽部」というサービス名で、日本市場に上場しているすべての株式について、株価のヒストリカルデータを毎月2,178円(税込み、執筆時点)で販売している。
「株価データはVIP倶楽部でダウンロードしろ」とヤフーファイナンスは案内2しているので、これを利用させてもらおう。なお、VIP倶楽部に加入すると、テレビ東京のWBS(ワールドビジネスサテライト)の見逃し放送を視聴する権利(月額550円税込み、執筆時点)3もあわせて得られるので、その料金を加味するとかなりお得感があるといえる。
合同会社ZEROBYTEが提供する情報サービス。株価のヒストリカルデータのほか、商標登録出願データや銘柄の基本情報データ、日証金融資・貸株残高データ、決算・財務・業績データ、投資指標データなど、多岐にわたる情報が提供されている。
Yahoo!ファイナンスとは異なり、自分でデータ分析した結果をSNSやブログで発信する権利が明示されている。料金は複数プランあり、月額1650円(税込)から4。
WebDAVにて提供されるため、cURLでアクセスすることも可能ではある。しかし、共有フォルダ一括同期ツール(マウント)を使用すると、データを取得するときにアクセス回数の上限が課されない。ツールを使わない場合には、アクセス上限は1時間あたり6回から12回(プランによって異なる)である。
Yahoo!ファイナンスでは、ここで紹介する通りの手法で株価の四本値を取得できた(技術書典版執筆時)。ただし、後述するコラムにも記した通り、本稿で紹介する手法がスクレイピングに合致するかどうかは各自の判断に委ねたい。
Yahoo!ファイナンスVIP倶楽部では、下記の情報をCSVで取得できる。
・日付
・始値
・高値
・安値
・終値
・出来高
・調整後終値
なお、取得できるデータはhttps://info.finance.yahoo.co.jp/history/?code=7974.Tで表示されるようなデータと変わらない。さかのぼって昔の価格をCSV取得できるというのが、VIP倶楽部のサービスである。
なお、取得できるCSVデータは、文字コードがShiftJISなので注意。
また、取得できる値には、「調整後終値5」が含まれる。調整後終値とは、過去に「株式併合」「株式分割」が発生していたとしても、1株あたりの価値を過去と今で比較できるように、「当時併合・分割していたら、現在の価値に換算するといくら」を計算した終値のことである。
これがあると、過去の値動きを統計処理する際に、「YYYY年MM月DD日の終値500円は、『分割』『併合』を加味して換算すると5000円である」といった感じで、分割・併合による影響を考えずに単純比較することができる。
ここで、「分割」「併合」というワードが登場したので説明する。株式は、「株式併合」「株式分割」により、ある日を境にそれまで持っていた株数が一定の割合数分に変化する。たとえば1株を2株に分割する場合は、100株持っていたら、ある日を境に200株持っていることになる。反対に2株を1株へ併合する場合は、200株が100株の扱いになる。
なお、株数が変わっても、1株あたりの価値もその株数の逆数倍になるので、「単価*株数=評価額」は、分割/併合の前後で理論上は変わらない(実際には、需要と供給のバランスによって、分割併合前より安くなったり高くなったりする)。
Yahoo!ファイナンスでCSVデータをダウンロードするには、まず、VIP倶楽部に登録(有料)が必要である。
https://info.finance.yahoo.co.jp/vip/pr/
2020年12月12日時点で、料金は1980円(税別)である。初月無料6(執筆時点)で解約するまで自動継続である。月途中での解約は、日割計算なし。クレジットカードまたは銀行口座で支払う。
VIP倶楽部に登録したYahoo!IDでログインした状態で下記のURLにダウンロードすると、CSVでのダウンロードが始まる。ダウンロード用URLの生成ロジックをRubyで書くと、下記のようになる。
stock_code = 7974 # 証券コード。7974は任天堂。
market_code = 'T' # 市場コード。Tは東証。
dl_url = 'https://download.finance.yahoo.co.jp/' +
"common/history/#{stock_code}.#{market_code}.csv"
ここで、市場コードは各市場名のローマ字先頭字である。詳細は、各市場の拡張子一覧を参照のこと。東証では取引できない[2928] RIZAPグループ(株)等、一部注意が必要な株もある。
さて、ダウンロード用URLは生成できても、これをそのままcURLでアクセスしたり、作ったクローラにアクセスさせても、CSVはダウンロードできない。これはアクセス元が何者であるかの認証を通過していないからである。
要するに、あなたがVIP倶楽部に加入している正規の利用者であることをYahoo!ファイナンス側が認識できないと、CSVはダウンロードさせてもらえないということである。
インターネット上で記事を探すと、seleniumやpuppeteerでブラウザーの動作をコントロールしているものも見られる。しかし、筆者としてはそちらより今回紹介する「取り出したCookieを使ってcURLでダウンロードする」方法をおすすめする。
これらの記事で紹介されているものでは、ステップ中にCSVのダウンロード以外にログインページを経由する方法が紹介されているものが多い7。
これでもいいが、ブラウザーを起動させる分、マシンのメモリーと時間を消費してしまう。また、多要素認証を有効にしているアカウントの場合、自動化がやや難しくなる。
一方、Cookie付きでcURLを使用するのであれば、コマンドを叩くだけなので、多要素認証関連の実装と保守が不要である。
では実際に見ていこう。予めブラウザーでログインしておき、ブラウザーに保存されたCookieを使用することである。ログインするとたくさんのCookieが保存されるが、そのうち必要なのはYとTのみ8である。
では実際に、そのCookieを取り出してみよう。
まず、Google Chrome9でhttps://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)]と表示されるので、それぞれ横の▶をクリックすると、YとTの値を表示することができる。
あとはこれらのCookieをセットした状態で、cURLで件のURLへアクセスすれば、CSVをダウンロードすることができる。
1点注意があり、複数のCSVをダウンロードする場合、間隔を最低でも1秒、できれば5秒以上は開けたい。理由は「岡崎市立中央図書館事件(通称Librahack事件)の例10」が参考になるが、相手先サーバーへの負担を軽減する目的があるためである。さらに、可能ならUser-Agentに自分のメールアドレスやWebページのURL等、連絡先を入れておきたい。
※CookieをセットしてcURLでCSVを保存する方法は、後で追記する。
Yahoo!ファイナンスのWebページをスクレイピングすることは、規約により禁じられている。Yahoo!ファイナンスは、スクレイピングを具体的に「Yahoo!ファイナンスに掲載している株価やその他のデータを、プログラム等を用いて機械的に取得する行為」11と定義している。
なお、前述の通り、株価データのダウンロードについては、公式が「VIP倶楽部を使用せよ」とアナウンスしているが、ここで紹介した手法が「機械的に取得」に該当するか否かは自己責任で判断してほしい。本書は手法を紹介したが、負荷をかけて取得することを推奨するものではない。