ogp
企業分析サイト「バフェット・コード」開発者が語る、データ整形の「苦労」と「価値」
岡部 匡志
2020.05.05

企業分析に必要になるデータを、誰でも簡単に参照できるサイト「バフェット・コード

しかし、そのキレイなUIの背景には、開発者の様々な「苦労」が存在するとか…?

今回は、バフェット・コードの開発者に、データ整形の苦労や、「バフェット・コード」が達成したい「データ整形の価値」について伺いました!

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

岡部 匡志
バフェット・コード、便利ですよね。
僕も企業に関するデータを調べなきゃいけないことが結構あって、よく使っています。
経年でまとまっていて、かつ見やすいサイトっていうのがほとんどなくて。
バフェット・コードでは、企業の財務データや株価データを経年で参照できる。
バフェット・コード
ありがとうございます。
岡部 匡志
世の中の役に立っているサービスだと思います。
ただ、今回は開発、特にデータまわりのお話を聞きたくて。
想像するに、レガシーな分野だし、結構大変なところがあるんじゃないかな、と思っている訳ですが…。
バフェット・コード
大変なところね(笑)。
たくさんありますよ(笑)。

「XBRL」を「RDB」の世界に落とし込む

バフェット・コード
まず、こういった財務に関するデータって、どこから取ってくるかって分かります?
岡部 匡志
えっと…、EDINETですよね?
金融庁が運営するサイト「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というワークフロー管理ツールを使っています。
岡部 匡志
AirFlowは何が嬉しいんですか?
バフェット・コード
データ処理の依存関係をコードで記述できることですね。
あと、エラーが起こったとき、web UIからボタン1つで失敗した部分だけリトライできることや、日次処理の履歴(成功・失敗とか処理時間)が可視化されるのもメンテナンスに嬉しいです。

「人間が使いやすい財務データ」を整備する

岡部 匡志
財務データを取り扱う「苦労」について話してもらいましたが、ぶっちゃけ、ここまで大変なことを出来ているモチベーションって何なんでしょうか?
バフェット・コード
今って、残念ながら、人間が使いやすい、エンジニア/リサーチャーにフレンドリー「財務データ」が世の中にあるとは言い難いんですよね。
誰かがやらなきゃいけないのに、誰もやっていない。
そこを「自分たちが整備している」という意識はありますね。
なので、バフェット・コードのデータを参照できるWeb APIも公開しています。
バフェットコードのAPIドキュメント。Swaggerで作成されている。
岡部 匡志
自分も学部の頃経済学部だったので、株価に関する研究もやったことがあるんですが、めちゃくちゃ分かります…!
「xx年にIPOした企業の初値データの一覧」を集めるだけで死ぬほど大変だったりする…!
こういう財務データって、相場的に言うとかなり値段が高いと思うんですけど、どうですか?
学生でも使えそう?
バフェット・コード
現在、月額1万円で提供しております。
岡部 匡志
めっちゃ安いやん!
これなら経済学部の学生が卒論のために全然使える範疇ですね!
僕が学生のときにあってくれれば…!
バフェット・コード
非エンジニアの方にも使っていただきたいので、Google Spreadsheetから簡単に扱えるアドオンも開発しています。
岡部 匡志
至れり尽くせりやん…!
経済学部でも、学部だとRやPythonを扱える学生って少ないですもんね…。
ちょっと学生時代の苦労が思い起こされて、素で興奮してしまうわ…!
バフェット・コード
なので、経済学部の方には是非APIを使ってみていただきたいですね。
我々がデータを整備することで、研究者や学生のお役に立てれば、エンジニア冥利に尽きます(笑)。
岡部 匡志
東京大学経済学部卒業後、東京大学大学院情報理工学部で機械学習の研究に携わり、中退。「シゴトーク」シリーズや「アンドエンジニア」を手掛ける株式会社Tenxiaを創業。サウナが好き。ベンチャーなのでサーバもフロントもネイティブアプリも書きます。最近はFlutterに熱心でLTを喋ったりQiitaを書いたりしている。
岡部 匡志の記事一覧を見る
この記事をシェア