決算情報をデータベース化する方法

ブログ

株式投資を始めて、私が真っ先に感じたのは証券取引会社や四季報CD-ROMのスクリーニング機能の物足りなさです。

みんな本当にこんなんで銘柄選んでるんかっていう・・・(失礼)。

また、四半期決算の分析方法(株の公式より)で照会した通り、四半期決算は累積なので、前四半期の業績分(売上、営業利益、経常利益)を差し引かないと正確なファンダメンタルズ分析ができません。

ところが、その様な情報はどこにも一覧として提供しているものは存在しません。

気になる銘柄を見つけたら四半期決算を集めて計算し、業績上合致しなかったらまた次の銘柄で・・・、というのは非常に手間です。

その日、気になった銘柄の累積ではない四半期決算の一覧や各四半期の前年度対比が一発で出たら楽ですよね。

また、銘柄の選定方法として、チャートは銘柄一つ一つを確認しないといけないのに対し、決算情報の分析は条件で銘柄を機械的に選択出来るので、より効率的です。

ダメ業績会社のチャートを見る無駄な時間は可能な限り少ない方が良いでしょう。

これらの問題を解決するために決算情報(四半期、通期)のデータはすべて自作データベース化し、行いたいスクリーニングはすべてSQLを発行した方が良い!

と思って私は自前のデータベースに決算情報と前述の累積ではない四半期決算の情報を入れて常に更新しています。

SQLの知識がある方はこの方法は効果的かと思いますので、以下でその手順を説明します。

データベースのインストール

使用するデータベースはなんでも良いです。私は仕事ではOracleを使っていますが、個人的にはPostgreSQLを利用しています。

PostgresはOracleに比べて、端末のリソースをあまり占有せずに動いている気がするので軽くて良い感じです。インストールが簡単なのも良いですね。

プロシージャの機能が無い事と分析関数がヘボいのが不満点です。(こう言うとPostgres信者はキレるのでしょうが)

Postgresで説明していきますが、他のデータベースでも手順にほぼ変わりは無いです。

テーブルの作成

決算プロさんから頂いてきた決算Excelをデータベースに入れたいと思いますので、そのままこれをテーブル化します。

四季報の会社情報(従業員規模、創業年、業種とか)をマスタ化しても便利そうなのですが、今のところ用途が無いのでやってません。

決算用のCREATE TABLE分は以下のようになりました。

CREATE TABLE 決算F (
証券コード serial,
会社名 text,
会計基準 text,
連結個別 text,
決算期 text,
決算期間 text,
期首 date,
期末 date,
売上高 numeric(50),
営業利益 numeric(50),
経常利益 numeric(50),
当期純利益 numeric(50),
Q売上高 numeric(50),
Q営業利益 numeric(50),
Q経常利益 numeric(50),
Q当期純利益 numeric(50),
一株当り純利益 numeric(50),
希薄化後一株当り純利益 numeric(50),
純資産又は株主資本 numeric(50),
総資産 numeric(50),
一株当り純資産 numeric(50,2),
株主資本利益率 numeric(50,2),
営業キャッシュフロー numeric(50),
投資キャッシュフロー numeric(50),
財務キャッシュフロー numeric(50),
情報公開日 date,
更新日 date,
PRIMARY KEY(証券コード, 会計基準, 連結個別, 決算期間, 決算期, 期首, 期末));

いくつかポイントがあります。

テーブル名やカラム名は日本語で書く

SQLを少しでもやっている方は、「え!?全角文字使うの?」ってなると思います。

データベースはUTF-8で構築し、定義名は半角英数で表現するのが常識です。

しかし、仕事でもデータベースを一から設計する立場にある人は、定義名は日本語で表現する事をお勧めします(海外展開が無い場合に限る)

こうすることでテーブルの論理設計と物理設計を分ける必要が無くなり、何より日本語なんで、いちいちテーブル定義を確認しながら書く必要がなくなり、SQLを作成するスピードが圧倒的に早くなります。

因みに日本語の格納効率はUTF-8(3バイト)よりShift-Jis(2バイト)の方が上です。つまり、

データベースはShift-Jisで構築し、定義名は日本語で表現するのがより効率的な選択です。

普通に頭で考えれば当然なんですが、世の中の常識とは真逆です。

仕事では常識的な選択しか出来ないかもしれませんが、自分個人のやる事くらいは非常識でも効率的な選択をしたいです。

MONEY型は日本円では使えない

PostgresにはMONEY型という数値型があります。

単純に$(ドル)と¢(セント)を良い感じに表現してくれるだけですので、日本円を扱う場合は普通にNUMERICでいいです。

Q売上高、Q営業利益、Q経常利益 、Q当期純利益というカラム

後で累積ではない四半期決算の情報を格納する場所に使います。

Qはクォーターの意です。10秒悩んだ挙句、適当に名付けました。自分が解りやすい名前ならばなんでも良いと思います。

これ何か良い呼称無いですかね。「株の公式」に唯一の不満点があるとすれば、この情報に呼称を付けてくれなかった点です。

INSERT文を作る

決算プロさんからExcelをダウンロードしてきます。

このExcelをデータベースに突っ込む方法は色々考えられると思います。

決算プロは毎日データの更新があって、決算情報が追加されていきます。合わせてデータベースも定期的に更新することになるので、再利用性を考えてExcelの式で書きました。

以下の手順で決算プロさんのExcelの最後の列(W列)にINSERT文を書いていきます。

セルのW1に以下をコピペします。

insert into 決算F2(証券コード,会社名,会計基準,連結個別,決算期,決算期間,期首,期末,売上高,営業利益,経常利益,当期純利益,一株当り純利益,希薄化後一株当り純利益,純資産又は株主資本,総資産,一株当り純資産,営業キャッシュフロー,投資キャッシュフロー,財務キャッシュフロー,情報公開日,更新日) values

セルのW2に以下をコピペします。

=”(‘” & A2 & “‘,'” & B2 & “‘,'” & C2 & “‘,'” & D2 & “‘,'” & E2 & “‘,'” & F2 & “‘,'” & TEXT(G2,”yyyy/mm/dd”) & “‘,'” & TEXT(H2,”yyyy/mm/dd”) & “‘,” & IF(ISBLANK(J2),”null”,J2) & “,” & IF(ISBLANK(K2),”null”,K2) & “,” & IF(ISBLANK(L2),”null”,L2) & “,” & IF(ISBLANK(M2),”null”,M2) & “,” & IF(ISBLANK(N2),”null”,N2) & “,” & IF(ISBLANK(O2),”null”,O2) & “,” & IF(ISBLANK(P2),”null”,P2) & “,” & IF(ISBLANK(Q2),”null”,Q2) & “,” & IF(ISBLANK(R2),”null”,R2) & “,” & IF(ISBLANK(S2),”null”,S2) & “,” & IF(ISBLANK(T2),”null”,T2) & “,” & IF(ISBLANK(U2),”null”,U2) & “,” & IF(ISBLANK(V2),”null”,”‘” & TEXT(V2,”yyyy/mm/dd”) & “‘”) & “, now()),”

こんな感じに仕上がります。

次は一番下のWのセルからW2までを選択し、フィルで下方向にコピーします。

一番下までコピーされて、W列がinsert文に仕上がりました。

書き込んだW列を一番下までコピーしてテキスト保存して実行すれば良いのですが、作成したinsert文のお尻のカンマはセミコロンに書き換えてあげてください。例ではinsert_kessan.sqlという名前で保存しました。

作成したINSERT文を実行する

もう後は実行するだけです。

postgresではsqlが置いてあるフォルダまで移動してsqlツールを実行、

\i ファイル名

で実行されるみたいです。

データのインサートが出来ました。

手順にすると手間っぽいんですが、慣れると一分以内で終わります。コピペしかしてないし。

決算情報をデータベース化するだけでもかなり使えると思います。

次回は累積でない四半期決算データの算出方法を照会します。

コメント

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