はじめに
リセッションが懸念される中、NISAやiDeCoなどで資金投入する銘柄はしっかりと調べたいものです。しかし、証券会社が提供しているサービスでは機能が制限されている部分もあり、やりたい計算をExcelなどに手入力して行う(または,紙と電卓を用いる)などひと手間が必要であったりします。株価情報の取得は、2015年にPandas-datareaderがリリースされて以降、容易に可能です。一方で、毎回pandas-datareaderを用いてデータにアクセスしていてはデータ取得に膨大な時間を要します。
そこで、本記事では株価情報分析のためのデータベースの設計例をご紹介します。これにより、毎回pandas-datareaderを用いたデータ取得が必要なくなり、移動平均線など株価だけではなく計算値も格納ができます。なお、今回はpandas-datareaderで取得可能な株価情報のみに焦点を絞ってデータベースの設計例を示します。
RDBテーブル設計
pandas-datareader(データの取得先は、米版のYahoo Finance)で取得可能な情報はDate(日付)、Open(始値)、High(高値)、Low(安値)、Close(終値)、Adj Close(調整後終値)、Volume(出来高)の7つのデータです。これらのデータは、1日ごとのデータとなっています(つまり,日足が描けるデータ)。今回は、この7つのデータを対象にRDBの設計例を示したいと思います。下記のコードが設計例のSQLです。DBは、MySQLとなっています。
まず、tickerですがこれは証券コードになります。証券コードは、現状、日本株では”1234”のように数字のみとなっており、米国株では”ABCD”のようにアルファベットの文字列となっています。なお、日本株では『上場会社等に付番する証券コード(「1300」から「9999」までの数字4けたの「株式固有名コード」のこと)の設定可能な残コード数が減少してきていることを踏まえ、設定可能なコードを増やすため、証券コードに英文字を組み入れることとしました』と証券コード協議会が発表しており、2024年1月より証券コードに英文字が入っています。
次に、typeですが、これはIND(個別株)なのか、ETFなのかを分けるために入れてあります。特に、気にせず分析をする場合は、入れる必要がない部分です。残りの部分については、全てpandas-datareader(データの取得先は、米版のYahoo Finance)で取得可能な情報と同じです。
テーブルの設計のポイントとしては、
- dateはdate型として予約語ですが、カラム名としても使えるのでdateとしています。
- open、high、low、close、adjcloseの5つは、小数をとる可能性があるのでint型は避け、固定小数点型であるdecimal型にしています。また、金融分野の一般論として価格をfloatで表すことも避けるべきと言われているようです(moykeen, 2021)。一方で、価格をfloat型としている例もありました(Kitahara, 2022, MERON, 2018)。過去の株価の分布およびデータ長を考慮してdecimal(10, 2)にしています。
- 出来高は、データ長のみ変えdecimal(12, 2)にしています。
- 証券コードと日付でレコードがユニークに定まるので、これらの組み合わせをプライマリーキーにしています。また、証券コードと日付それぞれ単独でのインデックスもあると便利なので作っています。
まとめ
本記事では、株価情報分析のためのデータベース設計例について解説しました。移動平均線などを含める場合、テーブルの構造は変わってきます。また、私の場合は、株価指数、日本株、米国株の3つでテーブルを作ってデータを蓄積しています。今回は、データを蓄積するところについて解説しましたが、pandas-datareaderで取得できる情報は時々誤りがあるようですので取得するデータには注意を払うことが必要だと思います。
参考文献やサイトなど
- moykeen. 2021. 株価DBのテーブル設計例. https://zenn.dev/myonie/articles/0612b5ec0f88b7, accessed on 2 Apr. 2024.
- Kitahara. 2022. 【データの集め方講座】Pythonで株式情報を収集しMySQLに保存. https://note.com/kitahara_note/n/nfa667a2d3dfa, accessed on 2 Apr. 2024.
- MERON. 2018. SQLで株価の分析環境をローカルに構築する. https://planet-meron.hatenablog.com/entry/2018/10/30/223041, accessed on 2 Apr. 2024.


