MarketHackに掲載されているようなグラフ↓を簡単に作れたらいいなぁと思い, 別途作成した有価証券報告書XBRLパーサーを使ってXBRLを突っ込むだけで業績グラフを吐くスクリプトを書いてみました.
工業コモディティ価格堅調でテック・リソーシズが好調 - Market Hack
パーサーとして以下の自作クラスを利用します.
UFOキャッチャーからXBRLをダウンロード&パースするクラスを作った - Qiita
例として4686:ジャストシステムの2017年3月期有価証券報告書を使ってみます.
import numpy as np
import pandas as pd
from UfoDataReader.util.parser import UfoXBRLParser
from bokeh.io import show
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.palettes import Spectral5
from bokeh.plotting import figure
from bokeh.transform import factor_cmap
ufoparser = UfoXBRLParser()
# target XBRL file
file = 'jpcrp030000-asr-001_E04996-000_2017-03-31_01_2017-06-23.xbrl'
xbrl = ufoparser.parse(file)
dei = ufoparser.parseDEI(xbrl)
# getting each years GAAP objects
contexts = ['Prior4', 'Prior3', 'Prior2', 'Prior1', 'Current']
gaaps = [ufoparser.parseGAAP(xbrl, context=context) for context in contexts]
# getting factors
share = np.array([float(gaap.shares_outstanding) for gaap in gaaps])
sale = np.array([float(gaap.netsales) for gaap in gaaps])
cf = np.array([float(gaap.cf_from_operating) +
float(gaap.cf_from_financing) +
float(gaap.cf_from_financing) for gaap in gaaps])
df = pd.DataFrame(
dict(
year=contexts,
dps=np.array([float(gaap.dps) for gaap in gaaps]),
eps=np.array([float(gaap.basic_eps) for gaap in gaaps]),
cfps=cf / share,
sps=sale / share
)
)
# bokeh setting
years = contexts
factors = ['dps', 'eps', 'cfps', 'sps']
x = [(year, factor) for year in years for factor in factors]
amounts = sum(zip(df['dps'], df['eps'], df['cfps'], df['sps']), ())
source = ColumnDataSource(data=dict(x=x, counts=amounts))
p = figure(x_range=FactorRange(*x), plot_height=300, title=dei.company_name)
p.vbar(x='x', top='counts', width=1.0, source=source,
fill_color=factor_cmap('x', palette=Spectral5, factors=factors, start=1, end=2))
p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None
# open browser
show(p)
こんな感じで出力されます. Hoverを使ってtooltipなど付けると, よりよいかもしれません. bokehは設定が豊富なのでまだまだ憶えるところが多いです.