企業分析に必要になるデータを、誰でも簡単に参照できるサイト「バフェット・コード」。
しかし、そのキレイなUIの背景には、開発者の様々な「苦労」が存在するとか…?
今回は、バフェット・コードの開発者に、データ整形の苦労や、「バフェット・コード」が達成したい「データ整形の価値」について伺いました!

便利な「バフェット・コード」とその裏

岡部 匡志
バフェット・コード、便利ですよね。
僕も企業に関するデータを調べなきゃいけないことが結構あって、よく使っています。
経年でまとまっていて、かつ見やすいサイトっていうのがほとんどなくて。

バフェット・コードでは、企業の財務データや株価データを経年で参照できる。

岡部 匡志
世の中の役に立っているサービスだと思います。
ただ、今回は開発、特にデータまわりのお話を聞きたくて。
想像するに、レガシーな分野だし、結構大変なところがあるんじゃないかな、と思っている訳ですが…。

バフェット・コード
大変なところね(笑)。
たくさんありますよ(笑)。
「XBRL」を「RDB」の世界に落とし込む

バフェット・コード
まず、こういった財務に関するデータって、どこから取ってくるかって分かります?

金融庁が運営するサイト「EDINET」。

バフェット・コード
そうです。
EDINETが公開しているAPIがあって、有報(有価証券報告書)やIPO、株式分割などのリリースはここから取ってきています。
ただ、データが、ウェブサービスが期待するデータ構造をしていないんですよね。

バフェット・コード
EDINETでのファイルは、「XBRL」という財務諸表を表現するための「XML」で来るんです。

XBRLファイルの例。

岡部 匡志
本当だ。
よく見ると <?xml version="1.0" encoding="UTF-8"?>と書かれていますね。

バフェット・コード
XBRLはただのファイルなので、このままだとウェブサービスにとって嬉しくないですよね。
ウェブアプリケーションから扱いやすいのは、「RDB(リレーショナル・データベース)」や「KVS(キーバリューストア)」ですが、元データはネストしたデータ構造を表現しやすいXMLなので、それぞれのストレージやウェブアプリケーションからのユースケースに応じて、適切にデータを加工して保存する必要があります。
ここのtransform、変換の作業がそもそも大変です。
「データが確定しない」ことの難しさ

バフェット・コード
あと、「不定期に出るデータ」をマージするのが難しくて…。
例えば「株式分割」ってあるじゃないですか。

岡部 匡志
1株を100株に分割するやつですね。
その場合、株数が100倍になるという。

バフェット・コード
はい。
その株数の変化があった場合、過去の1株あたりのデータ…、例えば「配当」が使い物にならなくなってしまいます。
こういった数値を再計算しないといけない。


岡部 匡志
確かに、そのままだと「配当」のグラフはぶっ壊れてしまいますね。
100分割だと、過去の配当が実際より100倍高いように見えてしまうのか…。
それに「PER」も「株価×株数/当期純利益」なので、同じく壊れてしまいますね…。

バフェット・コード
そう、「1株あたり」の指標って結構多くて、再計算処理はたくさん走っています。
過去のデータでも本質的に「データが確定しないこと」がある。
一方で、業績や配当の予想値も、「業績予想の修正」や「配当予想の修正」などで不定期で修正が入るので、大変ですね。
どうしても残ってしまう「手オペ」

バフェット・コード
どうしても例外的な処理が残ってしまう、ということもあって。
例えば、「IPO(新規上場)」や「上場廃止」とかですよね。

バフェット・コード
IPOだと、まず「有価証券届出書」(有価証券「報告書」ではない!)がEDINETに掲載されます。
ただ、「届出書」に載っている情報というのが、有報などの定期・定型な報告書とは違って、会社ごとにまちまちな部分があるんですよ…。
数値が足りなかったりするので、手打ちが必要になるケースも出てくる。

バフェット・コード
開発コストを沢山かければ、自動化できなくもないでしょうが…。
現状は数が少ないこともあって、ある程度は「手オペ(手動オペレーション)」でやってますね。
複雑なデータ処理のジョブ管理

バフェット・コード
日々走らせているジョブの管理も大変です。
これがバフェット・コードの日次batch処理の「DAG(有向非巡回グラフ)」になるんですが。

バフェットコードで使っているジョブのワークフロー図(一部モザイク処理)。

バフェット・コード
データ処理の依存関係が複雑で、扱っているデータ量が多いということに加えて…。
新しい有報が提出されたときや、特定のデータのパースにバグがあったときなどに、
それらのデータソースの変更が影響するデータを、すべて再計算して更新する必要があるんですよ。
弊社では、
Apache AirFlowというワークフロー管理ツールを使っています。

バフェット・コード
データ処理の依存関係をコードで記述できることですね。
あと、エラーが起こったとき、web UIからボタン1つで失敗した部分だけリトライできることや、日次処理の履歴(成功・失敗とか処理時間)が可視化されるのもメンテナンスに嬉しいです。
「人間が使いやすい財務データ」を整備する

岡部 匡志
財務データを取り扱う「苦労」について話してもらいましたが、ぶっちゃけ、ここまで大変なことを出来ているモチベーションって何なんでしょうか?

バフェット・コード
今って、残念ながら、人間が使いやすい、エンジニア/リサーチャーにフレンドリー「財務データ」が世の中にあるとは言い難いんですよね。
誰かがやらなきゃいけないのに、誰もやっていない。
そこを「自分たちが整備している」という意識はありますね。
なので、バフェット・コードのデータを参照できるWeb APIも公開しています。


岡部 匡志
自分も学部の頃経済学部だったので、株価に関する研究もやったことがあるんですが、めちゃくちゃ分かります…!
「xx年にIPOした企業の初値データの一覧」を集めるだけで死ぬほど大変だったりする…!
こういう財務データって、相場的に言うとかなり値段が高いと思うんですけど、どうですか?
学生でも使えそう?

バフェット・コード
現在、月額1万円で提供しております。

岡部 匡志
めっちゃ安いやん!
これなら経済学部の学生が卒論のために全然使える範疇ですね!
僕が学生のときにあってくれれば…!

バフェット・コード
非エンジニアの方にも使っていただきたいので、Google Spreadsheetから簡単に扱えるアドオンも開発しています。


岡部 匡志
至れり尽くせりやん…!
経済学部でも、学部だとRやPythonを扱える学生って少ないですもんね…。
ちょっと学生時代の苦労が思い起こされて、素で興奮してしまうわ…!

バフェット・コード
なので、経済学部の方には是非APIを使ってみていただきたいですね。
我々がデータを整備することで、研究者や学生のお役に立てれば、エンジニア冥利に尽きます(笑)。