Pythonで決算報告書の分析をトライしてみた

2019年7月20日

 

はじめに

こんにちは、爆走ひつじです。

個別銘柄を購入する際、自分が買いの決心するための判断材料として、「みんかぶ」や「四季報」を見ていますが、もう少し自分でも決算書を分析できたらなぁと思っています。
ただ、いちいち決算書をダウンロードしてきて、エクセルに打ち込んで分析するのは面倒なので、今風に?Web上からデータを拾ってきて、自動的に分析できると良いなと思い、Pythonで少しトライしてみました。

決算書データのスクレイピング

ulletというサイトで、各上場企業の決算書を見ることができます。
スクライピングは禁止されていないようですので、今回は、このサイトで公開されている情報で試してみることにしました。

企業価値検索サービス Ullet
[http://www.ullet.com/:embed:cite]

題材として、ソニーの決算書を使ってみました。

http://www.ullet.com/%E3%82%BD%E3%83%8B%E3%83%BC/%E6%B1%BA%E7%AE%97%E6%9B%B8

このページには、「貸借対照表(B/S))、「損益計算書(P/L)」、「損益計算書(P/L)」が掲載されているのですが、今回は、「損益計算書(P/L)」から、収益性を評価するために、以下の2つの指標を算出してみました。

  • 売上総利益率(粗利率)(%)
    売り上げに占める、売上総利益の割合で、これが高いほど、高い付加価値をつけた商品を提供できていることになります。電機メーカーだと30%程度が目安です。

    計算式は、以下になります。
    売上総利益率(粗利率)(%) = 売上総利益 ÷ 売上高 x 100

  • 当期純利益率(%)
    売り上げに占める、当期純利益の割合で、その期における最終的な儲けの指標です。期によっては特別な事情が発生して、一時的に下がることがあるため、時系列で評価することが望ましいです。

    計算式は、以下になります。
    当期純利益率(%) = 当期純利益 ÷ 売上高 x 100

処理の概要

Pythonのデータ解析ライブラリであるPandasをメインに使用しています。
実行は、Jupyter notebookで行っており、Pythonコードの入力/実行、Matplotlibライブラリによるグラフ表示も、ブラウザ上で行っています。

  1. Pandasのread_html関数で決算データを、読み込み
  2. Pandasの機能を用いて、分析
  3. Matplotlibライブラリにより、時系列グラフを作成

 

実行結果

先に実行結果をお見せします。
file
2019年3月の 「売上総利益率(粗利率)(%)」(グラフ上は青い、Gross Mergin)が、100%なのは元のデータがおかしそうですが、年度を追うごとに40%近くまで上がっており、商品の高利益化が少しずつ進められていそうです。
当期純利益率は、2018年度になってようやく5%まで回復しています。
決算書の分析はまだ勉強中なので、今回おまけです...

 

実行コード

注釈をいろいろ書いているので、解説は不要だと思います。
Python,Pandasはまだ慣れていないため、日付の変換処理のコードは、以下のサイトの解説を参考にさせていただきました。

出典1 http://www.stockdog.work/entry/2016/08/28/180911
出典1 :[http://www.stockdog.work/entry/2016/08/28/180911:embed:cite]

import pandas as pd
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
%matplotlib inline

## スクライピング処理
url = 'http://www.ullet.com/%E3%82%BD%E3%83%8B%E3%83%BC/%E6%B1%BA%E7%AE%97%E6%9B%B8'
df = pd.read_html(url)

# 決算書の「損益計算書(P/L)」を参照
print(df[6])
# インデックス名が重複している一方の"当期純利益"をrename
df[6].loc[7,'決算年月日'] = "当期純利益(率)"

# 行と列変換用に、行のインデックスを名称にする 
# (行と列を入れ替え後に系列名が数字になるのを避けるため)
df_i = df[6].set_index('決算年月日')

# 行と列を変換
df_it=df_i.T
# インデックスをつけなおす
df_it = df_it.reset_index()

# 日付の修正  (この部分は出典1を参考にさせていただきました)
dates = []
for day in df_it['index']:
    day = day.replace("年", "-")
    day = day.replace("月", "-")
    day = day.replace("日", "")
    time = datetime.datetime.strptime(day, '%Y-%m-%d')
    dates.append(time)
df_it["Date"] = dates

## 「損益計算書(P/L)」の解析部分(今回はちょっとだけ)
# 粗利益率を計算
df_it['粗利率'] = df_it['売上総利益'].astype(float) / df_it['売上高'].astype(float) * 100

# 純利益率を計算
df_it['純利益率'] = df_it['当期純利益'].astype(float) / df_it['売上高'].astype(float) * 100

print(df_it)

## グラフ表示処理
# 粗利率のプロット
x = df_it['Date']
y1 = df_it['粗利率']
plt.plot(x, y1, color="blue", linewidth=1, linestyle="-",marker='.', label='Gross Mergin')

# 純利益率のプロット
y2 = df_it['純利益率']
plt.plot(x, y2, color="red", linewidth=1, linestyle="-",marker='+', label='Gross Profit Mergin')

# ラベルを追加
plt.xlabel('Date')
plt.ylabel('Profit Mergin(%)')

#グリッド線((お好みで)
plt.grid(True)
plt.grid(which='major',linestyle='dashed')
plt.grid(which='minor',linestyle='dashed')

# x軸の目盛ラベルを年単位で
locator = mdate.YearLocator()
plt.gca().xaxis.set_major_locator(locator)
plt.gcf().autofmt_xdate()

# 凡例を追加(お好みで)
plt.legend()

plt.show()

最後に

爆走ひつじは、Pythonは、初めてだったのでいろいろ戸惑うところもありましたが、数時間いろいろ試行錯誤しながら、何とか、決算書を自動で分析できそうな足がかりをつかむことができました。
といっても、まだまだ勉強は必要ですが...
初心者でも80行足らずのコードでここまでできるのは、Pythonとそのライブラリの設計の良さが相まってのものだと感じました。
ここからいろいろ発展させていきたいと思います。

またよろしくです!