このプロジェクトについて
EDINET(有価証券報告書等)の開示データをもとに、日本株の財務指標・投資判断スコアを日次で算出・公開しているサービスです。
公開サイトはこちら →
https://stocks.happy-life-design.net
前回の記事はこちら →
https://qiita.com/rightcross-ae86/items/5cc5c3f9cb48e7af93f5
今回やったこと
前回、自己資本の妥当性判定に使う新株予約権の集計処理で連結/個別の優先順位バグを修正しましたが、その時点でもまだ「要確認」のまま残っていた僅差の7社がありました。今回はこの7社を1社ずつ掘り下げて調査し、3種類の異なる原因を突き止めました。
原因1: 決算期変更企業特有の別のコードバグ
1社は、決算期を変更した企業でした。変更前・変更後で2つの決算書類が存在するにもかかわらず、非支配株主持分・新株予約権・評価換算差額等を取得する処理が年度ラベルだけで結合していたため、本来参照すべきでない書類の値を誤って拾ってしまっていました。
-- Before: 年度ラベルのみで結合(決算期変更で複数書類が同一ラベルになりうる)
JOIN documents d
ON f.company_id = d.company_id AND f.fiscal_year = d.fiscal_year
-- After: 対象期間の終了日そのもので結合
JOIN documents d
ON f.company_id = d.company_id AND f.period_end = d.period_end
修正前後で値が食い違う行は全体の中でごくわずかで、判定結果が変わったのはこの1社のみ、既存の一致データへの回帰はゼロと確認したうえで反映しました。
原因2: 指標の定義差を成分単位に分解して解決
2社は、既存の判定項目(評価換算差額等)をひとまとめのまま比較していたのが原因でした。この項目を「有価証券の評価差額」と「為替換算差額」の2つの成分に分解したところ、片方の成分だけを差し引くと一致することが判明しました。既存の判定をこの成分に置き換えると別の3社で不一致が新たに発生してしまうため、置き換えではなく独立した新しい候補として追加する形にしました。
原因3: 参照元サイトが後日の訂正後の数値を表示していた
3社は、比較先として使っている外部の参考サイトが、翌期の開示書類で訂正された後の数値を表示している一方、当社データベースは開示当初の原本値のまま保持していたことが原因でした。実は「翌期の訂正後数値を取り込む仕組み」自体は別の指標向けに既に存在していたのですが、自己資本の列だけがこの仕組みの対象から漏れていました。対象の3社に限定して列を追加・反映し、いずれも1.5%以内の差に収まることを確認しました。
残る1社は一次資料の確認で「対応不能」と確定
最後の1社は、決算短信のPDFを直接確認したところ、会社独自の注記欄にしか存在しない数値であり、開示データの構造化された項目にはそもそも含まれていないと判明しました。当社のデータ取得の仕組みでは原理的に取得できないデータのため、バグとしてではなく「対応不能」として記録し、区切りをつけました。
検証
今回は原因ごとに3回に分けて本番反映を行いましたが、それぞれ反映前にバックアップを取得し、既存のテストスイート(261件)が全件通過することを確認しました。最終的に反映前後のデータベースを全行突き合わせたところ、変化した行は今回の対象企業分のみで、それ以外のデータへの影響がないことも確認しています。
1つのテーマに残っていた課題でも、掘り下げてみると原因は一様ではないという点を実感した調査でした。
気になる点・ご質問があればコメントでお知らせください。