Skip to content

Instantly share code, notes, and snippets.

@sawadyrr5
Created March 26, 2020 14:01
Show Gist options
  • Save sawadyrr5/a297dcc83704ce172e881540f243a07a to your computer and use it in GitHub Desktop.
Save sawadyrr5/a297dcc83704ce172e881540f243a07a to your computer and use it in GitHub Desktop.
XBRLを読み込んで業績の変化を簡単に可視化してみる

概要

MarketHackに掲載されているようなグラフ↓を簡単に作れたらいいなぁと思い, 別途作成した有価証券報告書XBRLパーサーを使ってXBRLを突っ込むだけで業績グラフを吐くスクリプトを書いてみました.

工業コモディティ価格堅調でテック・リソーシズが好調 - Market Hack MarketHack テック・リソーシズの株価

コード

パーサーとして以下の自作クラスを利用します.

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は設定が豊富なのでまだまだ憶えるところが多いです.

bokeh_plot.png

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment