[開発進捗1]決算短信XBRLをデータベース化する
[開発進捗2]XBRLファイルを決算データ化する
[開発進捗3]XBRLファイルをBeautifulSoupで解析する
四半期決算を分析するアプリをWordPressで作るの開発進捗の四回目です。
全体図をまた描きます。四半期決算データのデータベース化が完了した状況です。
前回は、データベース設計について御託を並べた後、BeautifulSoupでXBRLをパースしてデータベース化しました。
XBRLデータはとりあえずデータベースに入ったので、ここから1つのXBRLファイルが基本的には1行の決算データになるようにストアドプロシージャを組んでいきます。
以下の図のSTEP2です。
ところが、結局やる事はカーソルループの処理の繰り返しで、サンプルコードを上げにくい泥くさい作業です。
なので、mysqlのカーソルループのストアドのサンプルコードと、XBRLの決算データに関わる項目の一覧を挙げます。
MySqlのストアドのサンプル
mysqlは今回初挑戦です。Oracle, Postgresと学んできたのですが、MySqlのストアドプロシージャはかなり苦戦しました。癖がありすぎますね。
あんまり使われていないのか、ネット上にもまともな記事が存在しないんですよね。というか世の中のMySQLのカーソルループを説明するブログの大半が間違いを書いています。
意味のないサンプルテーブルとか作るのもタルいので、ストアド作成時のテンプレとして記します。特に注意するところを強調してコメントで記述しました。
delimiter // | |
-- 1行目 delimiter によってクエリの実行区切り文字を;から//に変える | |
-- 2,3行目 残念ながらMysqlにcreate or replaceはないよ! | |
drop procedure dev.sample_procedure// | |
create procedure dev.sample_procedure( | |
IN in_text1 text, | |
IN in_text2 text | |
) | |
begin | |
-- 宣言は、変数、カーソル、ハンドラの順に行わないとエラーが発生する | |
-- サンプル用変数 | |
declare samp_text text; | |
-- カーソルフェッチ用の変数 | |
declare c_text text; | |
-- カーソルハンドラ様の変数 | |
declare fetch_state INT default 0; | |
-- カーソル | |
declare c_cur1 cursor for | |
select in_text1 | |
from dual | |
union all | |
select in_text2 | |
from dual; | |
-- カーソル用のハンドラとやら。'02000'はデータなし(no_data_found)を示す。ループの処理終了に使う | |
declare continue handler for sqlstate '02000' set fetch_state = 1; | |
-- カーソルループ | |
open c_cur1; | |
label_cur1: repeat | |
-- カーソルデータをフェッチして変数に入れる | |
fetch c_cur1 into c_text; | |
-- !超注意!以下はとても重要!世の中のほとんどの情報が誤っている! | |
if fetch_state != 0 then | |
-- フェッチによってfetch_stateがno_data_foundを示した時にrepeatを抜けるようにしないといけない | |
-- この処理が無いと、fetchが失敗したのにループが実行される⇒カーソル最終行だけ2回実行される事になる | |
leave label_str; | |
end if; | |
-- 値のセットは接頭に set を記述 | |
set samp_text := c_text; | |
until fetch_state | |
end repeat label_cur1; | |
close c_cur1; | |
end | |
// | |
-- デリミタは戻す | |
delimiter ; |
決算短信XBRLの決算データ要素
一覧でどさーっと出してしまいます。今回の話に限らず、xbrlを分析する時に使える情報です。
ポイントは、売上高には多くの表現があるが、基本的には1つの項目として集約可能である事、会計基準によって項目が結構変わるという事です。(特にIFRS)
IFRSはこの後学んでいかなければならなそうです。
ストアドは、nameがSecuritiesCodeの時、valueは証券コード…という分岐を泥臭くカーソルの中に書きまくっているだけなので割愛します。
項目 | タグ名 | 要素(name) |
証券コード | ix:nonnumeric | SecuritiesCode |
企業名 | ix:nonnumeric | CompanyName, NameREIT |
売上高(※) | ix:nonfraction | NetSales(売上高) OperatingRevenues(営業収益) OperatingRevenuesSE(営業収益、証券) OrdinaryRevenuesBK(経常収益、銀行) OrdinaryRevenuesIN(経常収益、保険) NetSalesOfCompletedConstructionContracts(完成工事高) OperatingRevenuesSpecific(営業収入) NetPremiumsWrittenIN(正味収入保険料、保険) NetOperatingRevenuesSE(純営業収益、証券) NetSalesAndOperatingRevenues(売上高及び営業収入) GrossOperatingRevenues(営業総収入) NetSalesUS(売上高、米国基準) OperatingRevenuesUS(営業収益、米国基準) OperatingRevenuesSpecificUS(営業収入、米国基準) TotalRevenuesUS(収益合計、米国基準) GrossRevenuesUS(総収益、米国基準) TotalRevenuesAfterDeductingFinancialExpenseUS(収益合計(金融費用控除後)、米国基準) NetSalesAndOperatingRevenuesUS(売上高及び営業収入、米国基準) RevenuesUS(収益、米国基準) NetSalesIFRS(売上高、IFRS) SalesIFRS(売上収益、IFRS) RevenueIFRS(収益、IFRS) |
営業利益 | ix:nonfraction | OperatingIncome |
(日本)経常利益 (米国)税引前当期純利益 (国際)税引前利益 |
ix:nonfraction | OrdinaryIncome, IncomeBeforeIncomeTaxesUS, ProfitBeforeTaxIFRS |
(日本)当期純利益 (米国)当社株主に帰属する当期純利益 (国際)当期利益 |
ix:nonfraction | NetIncome, NetIncomeUS, ProfitIFRS |
(日本)親会社株主に帰属する当期純利益 (国際)親会社の所有者に帰属する当期利益 |
ix:nonfraction | ProfitAttributableToOwnersOfParent, ProfitAttributableToOwnersOfParentIFRS |
一株当り純利益 | ix:nonfraction | NetIncomePerShare |
希薄化後一株当り純利益 | ix:nonfraction | DilutedNetIncomePerShare |
純資産又は株主資本 | ix:nonfraction | NetAssets |
総資産 | ix:nonfraction | TotalAssets |
一株当り純資産 | ix:nonfraction | NetAssetsPerShare |
自己資本比率 | ix:nonfraction | CapitalAdequacyRatio |
営業キャッシュフロー | ix:nonfraction | CashFlowsFromOperatingActivities |
投資キャッシュフロー | ix:nonfraction | CashFlowsFromInvestingActivities |
財務キャッシュフロー | ix:nonfraction | CashFlowsFromFinancingActivities |
現金及び現金同等物期末残高 | ix:nonfraction | CashAndEquivalentsEndOfPeriod |
次回
現在は上記ストアドのテスト中です。直近100件程度で実行して、決算プロさんのデータと比較して一致を確認。というテストをクリアしました。
ちょっと母数足りない感じがするので、直近1年の決算短信データでまたテストを回して確認出来たら終わりにします。(決算プロさん、いつもありがとうございます!)
テストが終わったらいったん開発は止めて、サーバ上にこの実装を行います。(今、自分のPCのローカル上で開発しています)
WordPressに自前のテーブルやプロシージャを作成することや、Pythonを定期実行するなど、レンタルサーバの制限下でどこまで出来るか正直不安です。
一応カタログスペック上可能である事を確認してから行っていますが、、、熱い戦いが予想されます。
コメント