05.1.9
企業の財務情報をパース
DataFrame に整える前処理です。このページでは Morningstar から保存した損益計算書(Income Statement)と主要指標(Key Ratios)の CSV を、en_US_ja_JP_table の対訳辞書で科目名を日本語に置き換えつつ、桁区切りのカンマを正規表現で除き、年月をヘッダーとして転置する関数 get_preprocessed_df() で読み込みます。海運業の Golden Ocean(GOGL)、ZIM、Star Bulk(SBLK)の 3 社を pd.concat で縦に積み、ticker 列を hue にした seaborn.barplot で期ごとの売上と当期純利益を横並びにします。読み終えると、別の企業の CSV を同じフォルダに置くだけで同じ比較図が作れるようになります。直感 #
Morningstar の財務ページから保存した CSV は、1 行目にタイトル、途中に「Revenue」のような科目名だけの行、数値は "1,234" のように引用符とカンマ付き、列の見出しは 2017-12 のような年月に TTM(直近 12 か月)が混ざる、という人が読むための形になっています。pd.read_csv にそのまま渡すと列数が行ごとに違ってエラーになるので、1 行ずつ読んで「科目名の行か、数値の行か、年月の見出し行か」を見分けながら組み立て直します。整えた後は「行 = 期(月)、列 = 科目、ticker 列 = 会社」という縦長の表になり、seaborn に渡せば 3 社の棒が期ごとに並びます。
近い業界にある海運 3 社の、期ごとの売上と当期純利益の推移を確認します。
このページの日英訳は以下のサイトのものを参考しつつ作成していますが、正確性に欠ける可能性があるのであくまで参考程度にお願い致します。 TOMAコンサルタンツグループ株式会社 海外決算書の科目 英語→日本語簡易対訳 損益計算書編
| |
| |
データを読み込む #
以下の例では Morningstar, Inc 社から提供されているデータを一部引用して使用しています。各企業のページから損益計算書(Income Statement)と Key Ratios を CSV で保存し、data/ フォルダに GOGL Income Statement.csv のようにティッカーで始まる名前で置いておきます。ここでは Golden Ocean Group Ltd(GOGL)、ZIM、Star Bulk(SBLK)の 3 社です。
※あくまで表示例であり正確性は保証しません。万一この情報に基づいて被ったいかなる損害についても一切責任を負い兼ねます。
| |
| 月 | 売上 | 収益コスト | 粗利益 | Operating expenses/販売費及び一般管理費 | Operating expenses/その他営業費用 | Operating expenses/営業費用 | Operating expenses/営業利益 | Operating expenses/支払利息 | Operating expenses/Other income (expense) | ... | Operating expenses/当期純利益 from continuing operations | Operating expenses/当期純利益 | Operating expenses/普通株式に係る当期純利益 | Earnings per share/Basic | Earnings per share/Diluted | Weighted average shares outstanding/Basic | Weighted average shares outstanding/Diluted | Weighted average shares outstanding/EBITDA | ticker | Operating expenses/Other | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2016-12-01 | 258 | 313 | -55 | 13 | 2 | 15 | -70 | 42 | -16 | ... | -128 | -128 | -128 | -1.34 | -1.34 | 95 | 95 | -22 | GOGL | NaN |
| 2 | 2017-12-01 | 460 | 400 | 60 | 13 | -4 | 9 | 51 | 57 | 3 | ... | -2 | -2 | -2 | -0.02 | -0.02 | 125 | 125 | 133 | GOGL | NaN |
| 3 | 2018-12-01 | 656 | 499 | 158 | 15 | -3 | 12 | 146 | 73 | 12 | ... | 85 | 85 | 85 | 0.59 | 0.59 | 144 | 144 | 250 | GOGL | NaN |
| 4 | 2019-12-01 | 706 | 590 | 116 | 14 | 1 | 15 | 101 | 57 | -6 | ... | 37 | 37 | 37 | 0.26 | 0.26 | 144 | 144 | 188 | GOGL | NaN |
| 5 | 2020-12-01 | 608 | 564 | 44 | 14 | -3 | 11 | 33 | 45 | -126 | ... | -138 | -138 | -138 | -0.96 | -0.96 | 143 | 143 | 18 | GOGL | NaN |
5 rows × 22 columns
| 月 | Financials/売上 (USD Mil) | Financials/\t売上総利益率 | Financials/営業利益(USD Mil) | Financials/営業利益率 | Financials/純利益(USD Mil) | Financials/EPS (USD) | Financials/配当 (USD) | Financials/配当性向 | Financials/株数 (Mil) | ... | Key Ratios -> Financial Health/負債比率 | Key Ratios -> Efficiency Ratios/Days Sales Outstanding | Key Ratios -> Efficiency Ratios/Days Inventory | Key Ratios -> Efficiency Ratios/Payables Period | Key Ratios -> Efficiency Ratios/Cash Conversion Cycle | Key Ratios -> Efficiency Ratios/売上債権回転率 | Key Ratios -> Efficiency Ratios/棚卸資産回転率 | Key Ratios -> Efficiency Ratios/固定資産回転率 | Key Ratios -> Efficiency Ratios/総資産回転率 | ticker | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2011-12-01 | 95.0 | 68.2 | 38.0 | 40.4 | 33.0 | 6.12 | 9.00 | NaN | 5.0 | ... | 0.42 | 18.79 | 32.12 | 36.01 | 14.89 | 19.43 | 11.36 | 0.21 | 0.18 | GOGL |
| 2 | 2012-12-01 | 37.0 | 38.2 | 10.0 | 26.8 | -53.0 | -10.08 | 5.40 | 488.7 | 5.0 | ... | 0.39 | 48.04 | 39.37 | 26.39 | 61.02 | 7.60 | 9.27 | 0.11 | 0.08 | GOGL |
| 3 | 2013-12-01 | 38.0 | 31.3 | 7.0 | 18.2 | -4.0 | -0.69 | 3.15 | NaN | 6.0 | ... | 0.30 | 26.25 | 20.60 | 19.16 | 27.68 | 13.91 | 17.72 | 0.13 | 0.09 | GOGL |
| 4 | 2014-12-01 | 97.0 | 25.4 | 19.0 | 20.1 | 16.0 | 1.38 | 2.81 | 184.2 | 11.0 | ... | 0.39 | 11.45 | 37.85 | 16.10 | 33.20 | 31.88 | 9.64 | 0.13 | 0.12 | GOGL |
| 5 | 2015-12-01 | 190.0 | -28.6 | -72.0 | -37.6 | -221.0 | -7.30 | NaN | NaN | 30.0 | ... | 0.80 | 11.90 | 21.19 | 5.57 | 27.51 | 30.68 | 17.22 | 0.13 | 0.11 | GOGL |
5 rows × 87 columns
変化を可視化する #
縦に積んだ 3 社の表を seaborn.barplot に渡し、期ごとに 3 本の棒が並ぶ図を作る関数を用意します。
| |
| |


実行結果の読み方 #
1 枚目の売上では、2021 年の期に 3 社の棒がそろって前年の 2〜3 倍に伸びています。2 枚目の当期純利益では、2016〜2018 年に赤字(負の棒)だった期がある会社と、黒字を保った会社の違いが見え、売上の順位と利益の順位が一致しない期もあります。横軸は各社の決算期をまとめた月なので、決算月が違う会社を比べるときは同じ月の棒が「同じ時期」ではない点に注意してください。
使いどころと落とし穴 #
get_preprocessed_df は Morningstar の CSV の書式(1 行目がタイトル、TTM を含む見出し行、科目グループ名だけの行)に依存しているので、書式が変わると df_header が空のまま columns = df_header で失敗します。対訳辞書は「含まれていれば置換」なので、"Revenue" と "Revenue " のように似たキーが複数あると置換が二重に掛かることがあり、列名が想定と違うときは辞書の順番を疑います。TTM を捨てる既定(drop_ttm_lastqrt=True)は期を揃えて比較するためで、直近 12 か月も見たいときは ttm_datetime を決算月に合わせて False にします。
まとめ #
Morningstar の CSV は人が読む形なので、get_preprocessed_df() で 1 行ずつ「見出し・科目グループ・数値」を見分け、カンマ除去と対訳辞書の置換を経て「行 = 月、列 = 科目、ticker 列 = 会社」の表に組み直しました。3 社を pd.concat で積めば show_barchart(df, y="売上", hue="ticker") の 1 行で期ごとの比較図になり、y を "Operating expenses/当期純利益" に替えれば利益の比較に切り替わります。前処理関数を 1 つ用意しておくことで、CSV を追加するだけで比較対象の会社を増やせるのがこの構成の利点です。