株式投資

バフェット・コード の API でデータを全取得する 2/3(取得編)


この記事について

前の記事、バフェット・コード の API でデータを全取得する 1/3(準備編)では、データを簡易に取得するためのプログラムコードを Python で作成しました。今回はその続きの記事になります。

前回のコードを利用して全銘柄分のデータを csv ファイルとして手元に落としてくることを試みます。

実行プログラム

今回は、前回定義した BCAPI クラスを使用して、期間・銘柄等を指定して実行する Python スクリプトを作成しました。
今回も GitHub Gist に上げましたので、貼っておきます。
(私の環境は OS が Ubuntu 18.04, Python はバージョン 3.6.7 です)

使い方

設定できるオプションは -h で見られます。

$ ./get_bc.py -h
usage: get_bc.py [-h] -o OUTDIR [--quarter] [--indicator]
                 [--ticker TICKER,TICKER,...] [--ticker-csv PATH]
                 [--resume TICKER] [--start YYYYQQ] [--end YYYYQQ]

optional arguments:
  -h, --help            show this help message and exit
  -o OUTDIR             output directory
  --quarter             fetch quarter data
  --indicator           fetch indicator data
  --ticker TICKER,TICKER,...
                        fetch specified tickers
  --ticker-csv PATH     fetch tickers listed in 'ticker' column of the CSV
                        file
  --resume TICKER       resume from a specific ticker
  --start YYYYQQ        starting quarter (ex. 2011Q1)
  --end YYYYQQ          ending quarter (ex. 2019Q4)

例えば、

$ ./get_bc.py -o output --ticker-csv tickers.csv --quarter --start 2011Q1 --end 2019Q4

と実行すると、tickers.csv の “ticker” 列の全銘柄コードに対して四半期データを 2011Q1-2019Q4 の期間分取得し、output/quarter/xxxx.csv (xxxx は銘柄コード) に保存します。

$ ./get_bc.py -o output --ticker-csv tickers.csv --indicator

と実行すると、tickers.csv の “ticker” 列の全銘柄コードに対して指標データを取得し、output/indicator/xxxx.csv (xxxx は 銘柄コード) に保存します。

quarter/indicator 共通オプション

-o OUTPUT

出力先を指定するオプションです。
--quarter を指定した場合は OUTPUT/quarter/xxxx.csv (xxxx は ticker)、--indicator を指定した場合は OUTPUT/incicator/xxxx.csv に csv ファイルが出力されます。

--ticker TICKER,TICKER,...
--ticker-csv CSV_PATH

取得する銘柄を指定するオプションです。--ticker--ticker-csv のどちらかを指定します。
--ticker は、カンマ区切りで取得したい ticker を直接指定します(ex. --ticker 3254,4755,6056,6620,7453)。
--ticker-csv は、ticker 列に取得したい銘柄コードを羅列した CSV を用意して指定します。今回の目的である、全銘柄分を取得するためには全銘柄のコードが羅列した CSV を用意する必要があります。全銘柄のコードは色々な所で公開されていると思いますが、指定するのは ticker 列に4桁の銘柄コードが書かれた CSV ファイルであれば余計な列があっても良いです。私は”カブサポ”さんの
http://kabusapo.com/stock-data/stock-list/
で CSV をダウンロードして、”銘柄コード” 列を “ticker” 列に名前を変えて使用させていただきました。

--resume TICKER

これはおまけオプションですが、実際に全銘柄・全期間取得しようと思うと、API のリクエスト数制限があるためかなり時間がかかります。
途中で端末が落ちるなどしてプログラムが終了した場合、最初からやるのはさすがに大変なので、途中から再開するためのオプションです。例えば、ticker が 3254 のデータから取得を再開したい場合は --resume 3254 と指定します(--ticker-csv または --ticker オプションで指定されている銘柄コードを指定する必要があります)。

quarter 関連オプション

--quarter

指定すると、四半期データを取得します。

--start YYYYQQ
--end YYYYQQ

取得する四半期データの開始と終わりを指定します。--start 2011Q1 --end 2019Q4 のような感じ。
開始については私が見たときには、バフェット・コード API で取得できる一番古いデータは 2011Q1 のようでした。
実際の API リクエストは 3 年ごとになるので、指定期間が 3 年の倍数になるように意識すると効率的だと思います。

indicator 関連オプション

--indicator

指定すると、指標データを取得します。

まとめ

今回の記事では、前回作成したコードを利用して、バフェット・コード API からデータを CSV ファイルとして全取得するための実行スクリプトを作成しました。
コードに随時アップデートを加えつつデータを取得していたので、実はまだ上記コードを一通り実行して取得したことはないんですが・・・まあたぶん大体動くと思います(笑)。
これからはこのスクリプトを使ってデータ取得していくつもりなのでバグを見つけたら更新します。

ちなみにですが、前回の記事に載せたように、APIは一日の 500 リクエストの上限があるので、上記コードで全銘柄、全期間(9年分)を取得しようとすると四半期データで8日、財務データで3日くらいかかるはずです(!)。結構大変ですね。
キャンプファイヤーの活動報告ページを見ると、

また、リクエスト上限に関しては実際のアクセス具合を見ながら調整していくことになりますが、個人用途に限れば現状の仕様で十分使用に耐えうると考えています。
「いやいや、毎日全社分のデータを取得したいよ!」というご要望に関しましては、今後リリースされる(であろう)法人利用向けのPro版の続報をお待ちください!

という記述があります。まあ個人的にはそんなに頻繁にデータを更新したいとは今のところ思わない(し、さすがに一万円/月以上となると値段的に厳しそう)ので現状のリクエスト数制限でも許容範囲内かなあ、とは思っています。

今回手元にデータを落として来られたので、いよいよ取得したデータを使って何をするか、というところでこれからがお楽しみなんですが、その前に取得したデータに少し後処理を加える記事を書きたいと考えています。

つづき → バフェット・コード の API でデータを全取得する 3/3(後処理編)

コメント

  1. ichi より:

    さるべえさん

    初めまして、記事とPythonプログラムを参考にさせていただき、
    バフェットコードからquater/indicatorのデータ取得することができました、
    分析に使用できそうでワクワクしております、ありがとうございました。

    さて一点ご報告なのですが、
    記事中にあるticker.csvの準備のところで自分の環境では、
    銘柄コードをticker列ではなくcode列に名前変更しないと使用できなかったことを
    報告させていただきます。

    といってもPythonなどプログラム全般不慣れなため、
    自分の変更の仕方が合っていたのかも自身なく、
    データ取得できてるからいいかーという感じではあるのですが・・・

    今後もスクリーニングの記事など参考にさせていただき、
    自分でも分析できるようになりたいと思います、ありがとうございました。

    • さるべえ より:

      ichi さん

      はじめまして。コメントありがとうございます!

      参考にしていただいてデータの取得に成功したとのこと、大変嬉しく思います。
      それだけでも頑張って記事を書いた甲斐がありました(笑)

      また、ご指摘もありがとうございます。
      おっしゃるとおり、記事中の記述とは異なり、ticker.csv で銘柄コードはticker列ではなくcode列にしないと使用できなくなっておりました。

      ticker 列のままで動くよう、プログラムのほうを改良して更新しました。
      (修正前のプログラムで、列名を code 列にしていただいても特に問題なく同様に動作するはずです)

      今後もお気づきの点がありましたら、ぜひぜひお気軽にコメントお願いいたします m(_ _)m

  2. iguacu より:

    さるべえさん

    はじめまして。
    わたくしは現在、python勉強中の初心者で、バフェットコードを使って株式の分析したいと思っていたところ、さるべえさんの記事に行きつき、すごく勉強させていただいております。
    記事を作成いただき、ありがとうございます。

    さて、初心者な質問で申し訳ないのですが、1つ教えて頂けないでしょうか。

    前回の記事では、jupyter notebookで実行するためのコードがあったので、記載されたコードの使い方がわかったのですが、今回は
    ”$ ./get_bc.py -o output –ticker-csv tickers.csv –quarter –start 2011Q1 –end 2019Q”
    の部分をどのように使えばプログラムを動かすことができるのかわからずにおります。

    おそらくすごく初心者の質問なので恐縮なのですが、ネット上で調べようにも調べ方がわからず、困っており直接質問させていただきました。

    もし、ご回答いただけますと、幸いです。

    以上、よろしくお願いします。

    • さるべえ より:

      iguacu さん

      はじめまして!
      コメントいただきありがとうございます。とてもうれしいです。

      python スクリプトは用途によって
      * メインの実行スクリプト
      * 他のスクリプトから参照し、クラスや関数などを利用するスクリプト
      の二種類があると考えると良いと思います。

      今回の get_bc.py は前者で、前回の bc_api.py は後者です。
      前者はターミナル等から

      $ python get_bc.py (オプション)

      のように直接コマンド実行します。
      質問に対する回答としては、jupyter notebook の実行方法も書かれているので https://qiita.com/kngsym2018/items/21b6efe4547a78661951 あたりが参考になりそうです。

      後者は他のスクリプトから

      import bc_api

      などのように読み込まれて、クラスや関数が他のスクリプトで利用されます。
      実際、get_bc.py の21行目で、bc_api.py を読み込んで利用しています。

      補足しておくと、スクリプトごとに、絶対この2種類どちらかの用途が決まっている、というものではありません。
      http://azuuun-memorandum.hatenablog.com/entry/2015/05/09/002549
      辺りも読むと知識が深まるかと思います。

      以上、拙い説明で申し訳ありませんが参考になれば幸いです。
      よくわからないところがあったらおっしゃってください。

      • iguacu より:

        さるべえ様

        ご回答ありがとうございます!
        正直、こんなにも早く、親切に丁寧に、また参考のURLまで頂けて感激しております。

        頂いたサイトの内容も拝見させていただき理解が深まりました。ありがとうございます。
        (_main_ などは、おまじないで使っていました)

        なお、念のため下記理解でよいか、確認させてください。

        $→ ターミナルで起動するという意味(その際は、 python をコマンドとして、入力することも含まれている)

        ./ →絶対パスの記載は省略しているという意味。

        • さるべえ より:

          iguacu さん

          参考になったようでよかったです(^ ^)

          ドルマークはターミナルから打ち込むコマンドを示しています。
          $ python get_bc.py …(オプション)
          とターミナルに打ち込むと、カレントディレクトリ(現在いるフォルダ)にある get_bc.py をオプションを指定して python で実行します。

          ./ は絶対パスの記載を省略しているというのは間違っていないですが、もう少し詳しく説明すると、ドットはカレントディレクトリを表しています。スラッシュはディレクトリの区切りです。
          ですので、
          $ python ./get_bc.py …(オプション)
          と書いても同じです。

          記事で
          $ ./get_bc.py …(オプション)
          と python を書いていなかったのは、スクリプトの一行目に shebang と言われる記述をしているためです。以下が参考になりそうです。
          http://azsky2.html.xdomain.jp/python/run.html

  3. iguacu より:

    さるべえ様

    返信遅くなり申し訳ありませんでした。
    いつも親切にご回答いただき、本当にありがとうございます。

    頂いた情報、サイトも色々調べ、勉強させていただきました。
    コマンドプロンプトで、pythonあり無しで実行し、動作も確認でき、理解に至ったと考えています。

    また初心者でしたので、冒頭の#の部分はコメントアウトされているのだから不要だと勝手に思い削除していましたが、今回勉強したおかげでpythonが3.7で動作しなかったときにすぐに対応でき(プログラムはさるべえ様の環境に合わせて、3.6で作成されているのでこの部分を変更)、コマンドプロンプトの意味だけでなく、シバンの意味も分かり副次的な効果もありました。
    本当にありがとうございます。

    おかげさまでようやく、get_bc.pyの動作を実行できました。

    なお、これは私だけなのかもしれませんが、csvファイルに吐き出すとき、日本語の部分が文字化けしておりました。

    調べた結果、encoding=”utf_8_sig” をto_csvの引数に追加することで解消されるみたいです。すでにご存じかもしれませんが、ご連絡させていただきます。

    以上、よろしくお願いします。

    • さるべえ より:

      iguacu さま

      丁重なコメント恐縮です。ありがとうございます。
      お役に立てたようでうれしいです!

      CSV の件についてもコメントありがとうございます。
      文字コードの問題で、保存した CSV ファイルをエクセルで開くと文字化けが発生していたようです。
      私はエクセルで確認したりはしていなかったので気づきませんでした。このようなご指摘をいただけるのは大変助かります m(_ _)m

      対応としては、ご教示いただいたように、encoding=”utf_8_sig” を指定しておくのが良さそうですね。エクセル使う人は多そうですし。
      プログラムコードも修正しました。

      また何かありましたらお気軽にコメントいただければ幸いです。
      蛇足ですが、最近2つほど関連した記事もアップしているので、もしご覧になっていなければそれらも是非どうぞ。
      https://fire50.net/tag/%e3%83%90%e3%83%95%e3%82%a7%e3%83%83%e3%83%88%e3%83%bb%e3%82%b3%e3%83%bc%e3%83%89

タイトルとURLをコピーしました