株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

J-Quants API のサンプルを実行して年間配当額の推移を見る

今日は時間が無いので、サンプルを一部のみ変更して実行してみる。

github.com

先に結果として表示されるグラフを見てみる。2017年、2020年の配当額がやや少なく見えるが、配当性向が他の年と比べ特に低い、といったことがわかる。

JPX(86970) の年間配当推移
JPX(86970) の年間配当推移

株価の推移
株価の推移

下記はサンプルのソースコードを一部編集したもの。主にトークンの取得周りを簡略化している。

pip install jquants-api-client japanize-matplotlib mplfinance
# 年間配当額の推移を表示する銘柄コードを指定します (e.g. 8697)
TARGET_SYMBOL = "8697"  # 日本取引所グループ
# 必要なモジュールをインストールします。

import os
from datetime import datetime

import japanize_matplotlib
import jquantsapi
import mplfinance as mpf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
# pandas の表示制限を調整します
pd.set_option("display.max_rows", 1000)
pd.set_option("display.max_columns", 1000)
pd.set_option("display.width", 2000)
# プロット用の設定をします
sns.set(rc={'figure.figsize': (15, 10)})
sns.set(font_scale=1.5)
sns.set_style('whitegrid')

japanize_matplotlib.japanize()
# 銘柄コードが4桁で指定されていた場合は末尾に0を付与します
if len(TARGET_SYMBOL) == 4:
    TARGET_SYMBOL += "0"
# ファイルからリフレッシュトークンを読み込みます
refresh_token = '(token)'
# J-Quants APIクライアントを初期化します
jqapi = jquantsapi.Client(refresh_token=refresh_token)
# 銘柄情報を取得します
df_list = jqapi.get_list()
# 対象銘柄の株価情報を取得します
df_p_org = jqapi.get_prices_daily_quotes(code=TARGET_SYMBOL)
# 作業用にコピーします
df_p = df_p_org.copy()

# 各列のデータ型を調整します
df_p.loc[:, "Date"] = pd.to_datetime(df_p["Date"], format="%Y-%m-%d")
df_p.loc[:, "Open"] = df_p["Open"].astype(np.float64)
df_p.loc[:, "High"] = df_p["High"].astype(np.float64)
df_p.loc[:, "Low"] = df_p["Low"].astype(np.float64)
df_p.loc[:, "Close"] = df_p["Close"].astype(np.float64)
df_p.loc[:, "Volume"] = df_p["Volume"].astype(np.float64)
df_p.loc[:, "TurnoverValue"] = df_p["TurnoverValue"].astype(np.float64)
df_p.loc[:, "AdjustmentFactor"] = df_p["AdjustmentFactor"].astype(np.float64)
df_p.loc[:, "AdjustmentOpen"] = df_p["AdjustmentOpen"].astype(np.float64)
df_p.loc[:, "AdjustmentHigh"] = df_p["AdjustmentHigh"].astype(np.float64)
df_p.loc[:, "AdjustmentLow"] = df_p["AdjustmentLow"].astype(np.float64)
df_p.loc[:, "AdjustmentClose"] = df_p["AdjustmentClose"].astype(np.float64)
df_p.loc[:, "AdjustmentVolume"] = df_p["AdjustmentVolume"].astype(np.float64)
# 株価が0のレコードを除外します
df_p = df_p.replace({0.0: np.nan}).dropna()
# 月足のOHLCVを作成します
df_p_m_ohlc = df_p.set_index("Date")[[
    "AdjustmentOpen",
    "AdjustmentHigh",
    "AdjustmentLow",
    "AdjustmentClose",
    "AdjustmentVolume"
]].rename(columns={
    "AdjustmentOpen": "Open",
    "AdjustmentHigh": "High",
    "AdjustmentLow": "Low",
    "AdjustmentClose": "Close",
    "AdjustmentVolume": "Volume",
}).resample("M").agg({"Open": "first", "High": "max", "Low": "min", "Close": "last", "Volume": "sum"})
# 対象銘柄の財務情報を取得します
df_s_org = jqapi.get_fins_statements(code=TARGET_SYMBOL)
# 作業用にコピーします
df_s = df_s_org.copy()

# 年度末情報に絞り込みます
df_s = df_s.loc[df_s["TypeOfCurrentPeriod"] == "FY"]
# float64にするために"-"および""をnp.nanに置き換えます
df_s.replace({"-": np.nan, "": np.nan}, inplace=True)
df_s.loc[:, "ResultDividendPerShareAnnual"] = df_s["ResultDividendPerShareAnnual"].astype(np.float64)
df_s.loc[:, "ForecastDividendPerShareAnnual"] = df_s["ForecastDividendPerShareAnnual"].astype(np.float64)
df_s.loc[:, "EarningsPerShare"] = df_s["EarningsPerShare"].astype(np.float64)

# 日付型に変換します
df_s.loc[:, "DisclosedDate"] = pd.to_datetime(
    df_s["DisclosedDate"], format="%Y-%m-%d"
)
df_s.loc[:, "CurrentPeriodEndDate"] = pd.to_datetime(
    df_s["CurrentPeriodEndDate"], format="%Y-%m-%d"
)
df_s.loc[:, "CurrentFiscalYearStartDate"] = pd.to_datetime(
    df_s["CurrentFiscalYearStartDate"], format="%Y-%m-%d"
)
df_s.loc[:, "CurrentFiscalYearEndDate"] = pd.to_datetime(
    df_s["CurrentFiscalYearEndDate"], format="%Y-%m-%d"
)
# 開示順に並べ替えます
df_s.sort_values("DisclosedUnixTime", inplace=True)

# 配当性向を算出します
df_s["配当性向"] = df_s["ResultDividendPerShareAnnual"] / df_s["EarningsPerShare"]
# プロット用に配当額が存在するレコードのみに絞り込みます
df_plot = df_s.loc[df_s["ResultDividendPerShareAnnual"].notna()].set_index("DisclosedDate")
# インデックスの表記を変更します
df_plot.index = df_plot.index.strftime("%Y-%m-%d")

# 項目名を日本語にします
df_plot.index.name = "開示日"
df_plot.rename(columns={
    "ResultDividendPerShareAnnual": "配当実績_合計",
    "EarningsPerShare": "1株当たり当期純利益",
}, inplace=True)

# 配当額と1株あたり利益をプロットします
ax = df_plot[["配当実績_合計", "1株当たり当期純利益"]].plot(kind="bar")
# 配当性向をプロットします
bx = df_plot[["配当性向"]].plot(linestyle='-', marker='o', ax=ax, use_index=False, secondary_y=True, color="black")

# 棒グラフに数字を表記します
for p in ax.patches:
    ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))

# 銘柄名を取得します
name = df_list.loc[df_list["Code"] == TARGET_SYMBOL, "CompanyName"].iat[0]

# タイトルを設定します
ax.set_title(f"{name}({TARGET_SYMBOL}) の年間配当推移")
# 株価の推移を月足で表示します
mpf.plot(df_p_m_ohlc, type="candle", volume=True, figsize=(20, 8), vlines={"vlines": df_plot.index.tolist(), "colors": "r"})

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.