Pythonで企業価値評価に欠かせない、FCF(フリーキャッシュフロー )のランキングを作成する!
注: この記事は筆者の運用しているWebサービスのプロモーションを含みます。
今回の記事では、企業価値評価に欠かせないFCF(フリーキャッシュフロー )をWebAPIでデータを取得してランキングを作っていきます。
筆者について:
・証券アナリストCMA(一次・二次試験共に合格済み)=>取材記事のリンク
・東工大の企業価値評価の授業では、レポート最優秀賞受賞
・Djangoを使ってJP Funda APIという有価証券報告書を取得できるwebAPIを運用しています。
コードを書いていく前に、用語の簡単な紹介します。
フリーキャシュフローについて
フリーキャッシュフロー は、式としては、
「営業活動によるキャッシュフロー + 投資活動によるキャッシュフロー」
として得ることができます。(簡易バージョンですが、)
FCFは営業活動によって得られる現金収入と投資活動によって得られる現金収入の和であり、企業が自由に使うことができるお金をどれだけ稼ぐことができたのかを表す数値です。
このフリーキャッシュフロー は、DCFというメジャーな企業価値評価手法をとる際に必要となってきます。株式投資にファンダメンタル分析を取り入れたい場合は、DCFを使うのがややおすすめです。(この記事ではDCFの説明はしません)
注:この記事は、JP Fanda API(有価証券報告書データを取得できるAPI)を使用します。ローカル環境で同じコードを実行したい場合は、JP Fundaの使い方をまとめたこちらの記事をご参考にしていただければと思います。
以上で用語等の説明は終わりにします。以下でPythonを用いて日本企業のFCFランキングを作成していきます。使用したコードについては、GitHubの方にアップしておきます。
参考までに、今回使用するフォルダの構造は以下のようになります
1. 証券コードのリストを作成
まず、データを取得する企業全ての証券コードのリストを作成します。
日本証券取引所グループのサイトにアクセスして、上場銘柄一覧というエクセルファイルを取得します。
このエクセルファイルを開くと、証券コードの列があるのでそれをコピーします。
次に、エディタの方でconstants.pyというのを作ってその中にsecurities_code_listというものを作ります。
(list.py)
securities_code_list = []
そしたら、このリストの中に先ほどの証券コードの列をコピペして下のコードのように整形します。めんどくさい人は、GitHubからコピペ等してください。
securities_code_list = [
1301, 1305, 1306, 1308, 1309, 1311, 1312, 1313, 1319, 1320, 1321, 1322,
1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1332, 1333, 1343, 1344,
1345, 1346, 1348, 1349, 1352, 1356, 1357, 1358, 1360, 1364, 1365, 1366,
1367, 1368, 1369, 1375, 1376, 1377, 1379, 1380, 1381, 1382, 1383, 1384,
1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1397, 1398,
1399, 1400, 1401, 1407, 1413, 1414, 1417, 1418, 1419, 1420, 1429, 1430,
1431, 1432, 1433, 1434, 1435,...]
ちなみに、このリストの中には企業以外のETFなどの証券コードも含まれていますが、問題ありません。
2. JP Funda APIにアクセスしデータを取得
証券コードのリストを作ったらJP Funda APIにアクセスしていきます。(JP Funda APIが無料で使えるのは100回のアクセスまでなので、有料にしたくない場合は証券コードの数を減らしてください)
*この記事では以下、短縮した証券コードリストを使います。使っているリストが見たい場合は、GitHubのconstants.pyを見ていただければと思います。
まず、JP Funda APIにアクセスするためのAPIキーを取得します。JP Funda APIのサイトに行きAPIキーを取得してください。(Sign Upすると取得できます。)
次に、APIにアクセスするために必要なライブラリをインストールします。
pip install requests
インストールが終わったら、メインのコードを書いていくためのmain.pyというpythonファイルを作ります。
そしたら、JP Funda APIにアクセスするためのコードを書いていきましょう!
import requests
# ご自身のAPIキーを入力してください。
API_KEY = '8888888888888888888888888888888'
def retrieve_json_by_securities_code(securities_code: int):
"""
JP Funda APIにアクセスして、引数の証券コードに対応するJson形式のデータを取得する関数
"""
url = 'https://www.jp-funda.com/api/jp/securities_code/' + securities_code
headers = headers = {'Authorization': f'Token {API_KEY}'}
res = requests.get(url, headers=headers)
return res.json()
if __name__ == '__main__':
json = retrieve_json_by_securities_code(7203)
print(json)
retrieve_json_by_securites_codeは、証券コード(int)を引数に渡すと、Pythonの辞書形式で証券コードで指定した企業の最新の有価証券報告書データを返ます。
このpythonファイルを実行すると、以下のようなレスポンスがprintされます。
青くなっているところを見てみると、営業活動によるキャシュフローと投資活動によるキャシュフローが取得できることがわかります。次のコードでは、「フリーキャシュフロー」つまり、営業活動によるキャッシュフローと投資活動によるキャッシュフローの2つを足した値を計算する関数を追加していきます。
import requests
from constants import securities_code_list
# ご自身のAPIキーを入力してください。
API_KEY = '8888888888888888888888888888'
def retrieve_json_by_securities_code(securities_code: int):
"""
JP Funda APIにアクセスして、引数の証券コードに対応するJson形式のデータを取得する関数
"""
url = 'https://www.jp-funda.com/api/jp/securities_code/' + \
str(securities_code)
headers = headers = {'Authorization': f'Token {API_KEY}'}
res = requests.get(url, headers=headers)
return res.json()
# => new
def calcurate_fcf_from_api_res(res_dict: dict):
"""
上の関数の返り値からフリーキャッシュフローを取得する関数
"""
# 必要なデータを取得できない時は、0をいれる
if res_dict.get('連結経営指標') is None:
return 0
if res_dict.get('連結経営指標').get('営業活動によるキャッシュフロー') is None:
return 0
if res_dict.get('連結経営指標').get('投資活動によるキャッシュフロー') is None:
return 0
cash_ope = res_dict.get('連結経営指標').get('営業活動によるキャッシュフロー')
cash_inv = res_dict.get('連結経営指標').get('投資活動によるキャッシュフロー')
# 簡易版のFCFの計算式
fcf = cash_ope + cash_inv
return fcf
if __name__ == '__main__':
res_json = retrieve_json_by_securities_code(7203)
fcf = calcurate_fcf_from_api_res(res_json)
print(fcf)
calcurate_fcf_from_api_resという関数を追加しました。
これを実行すると、以下のようにprintされます。
FCF: 439782000000
ここまでで、1つの企業のフリーキャッシュフロー を取得するところまでできたので、あとはフリーキャッシュフロー を上場企業全社分取得して、ランキングにするのみです。
3. ランキング作成
まず、先ほど作ったcalcurate_fcf_from_api_resを会社名を取得できるように少し修正します。
def calcurate_fcf_from_api_res(res_dict: dict):
"""
上の関数の返り値からフリーキャッシュフローを取得する関数
"""
# 必要なデータを取得できない時は、0をいれる
if res_dict.get('会社名') is None:
return 0
if res_dict.get('連結経営指標') is None:
return 0
if res_dict.get('連結経営指標').get('営業活動によるキャッシュフロー') is None:
return 0
if res_dict.get('連結経営指標').get('投資活動によるキャッシュフロー') is None:
return 0
company_name = res_dict.get('会社名')
cash_ope = res_dict.get('連結経営指標').get('営業活動によるキャッシュフロー')
cash_inv = res_dict.get('連結経営指標').get('投資活動によるキャッシュフロー')
# 簡易版のFCFの計算式
fcf = cash_ope + cash_inv
return {company_name: fcf}
あと、コードの実行部分(if __name__ == '__main__'以下)を少しいじります。全体のコードとしては、下のようになります。
import requests
from constants import securities_code_list
# ご自身のAPIキーを入力してください。
API_KEY = '8888888888888888888888888888888'
def retrieve_json_by_securities_code(securities_code: int):
"""
JP Funda APIにアクセスして、引数の証券コードに対応するJson形式のデータを取得する関数
"""
url = 'https://www.jp-funda.com/api/jp/securities_code/' + \
str(securities_code)
headers = headers = {'Authorization': f'Token {API_KEY}'}
res = requests.get(url, headers=headers)
return res.json()
def calcurate_fcf_from_api_res(res_dict: dict):
"""
上の関数の返り値からフリーキャッシュフローを取得する関数
"""
# 必要なデータを取得できない時は、0をいれる
if res_dict.get('会社名') is None:
return {'no_data': 0}
if res_dict.get('連結経営指標') is None:
return {'no_data': 0}
if res_dict.get('連結経営指標').get('営業活動によるキャッシュフロー') is None:
return {'no_data': 0}
if res_dict.get('連結経営指標').get('投資活動によるキャッシュフロー') is None:
return {'no_data': 0}
company_name = res_dict.get('会社名')
cash_ope = res_dict.get('連結経営指標').get('営業活動によるキャッシュフロー')
cash_inv = res_dict.get('連結経営指標').get('投資活動によるキャッシュフロー')
# 簡易版のFCFの計算式
fcf = cash_ope + cash_inv
return {company_name: fcf}
if __name__ == '__main__':
# まず、全社分のデータを辞書(all_dict)に格納=> 会社名: FCF
all_dict = {}
i = 1
for securities_code in securities_code_list:
print(i, '社目のデータ取得')
i += 1
res_dict = retrieve_json_by_securities_code(securities_code)
all_dict.update(calcurate_fcf_from_api_res(res_dict))
# ソート
fcf_sorted = sorted(all_dict.items(), key=lambda x:x[1], reverse=True)
i = 0
for result in fcf_sorted:
i += 1
print(f'{i}位: ', result)
これで完成です!
実行結果はこちら↓(注: 証券コードリストは短縮版を使用しているので、72社程度のランキングです。)
1位: ('株式会社ゆうちょ銀行', 1148607000000)
2位: ('株式会社かんぽ生命保険', 657995000000)
3位: ('日産自動車株式会社', 477167000000)
4位: ('トヨタ自動車株式会社', 439782000000)
5位: ('本田技研工業株式会社', 359934000000)
6位: ('株式会社西日本フィナンシャルホールディングス', 246276000000)
7位: ('株式会社SUBARU', 146453000000)
8位: ('アイシン精機株式会社', 53676000000)
9位: ('株式会社小糸製作所', 40244000000)
10位: ('いすゞ自動車株式会社', 31042000000)
....省略...
ぼくは、トヨタが一番フリーキャッシュフロー 多いだろうと思っていたんですが、意外と違うみたいで、ゆうちょ銀行が一位でした。
以上で終了です。ありがとうございます。
良かったら、JP Fundaをこれからもよろしくお願いします。
全体のコードやライブラリなどは、ぼくのGitHubを確認ください。
この記事が気に入ったらサポートをしてみませんか?