8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マケデコAdvent Calendar 2023

Day 20

【J-Quants】指数四本値を取得できる新規のAPIについて

Posted at

【J-Quants】指数四本値を取得できる新規のAPIについて

J-Quants運営チーム
2023-12-20

この記事は、マケデコ Advent Calendar 2023の20日目の記事です。

はじめに

こんにちは!J-Quants運営チームです。

私達は、個人向けに金融データをAPIで配信するサブスクリプションサービスであるJ-Quantsを活用した、金融データの分析例などの技術記事を投稿しています。

本記事では、J-Quantsにおいて新しく提供を開始した各種指数の四本値データについて紹介します。

なお、本記事で使用するデータは、J-Quantsのスタンダードプランもしくはプレミアムプランをご購入いただく必要があります。

J-Quantsについては巻末のJ-Quantsとはをご参照ください。

株価指数とは

株式の相場全体の状況を示すために、個々の株価を一定の計算方法で総合し、数値化したものです。

その中でも、日本国内において代表的な株価指数としてTOPIXがありますが、こちらは昭和43年(1968年)1月4日の時価総額を100として、その後の時価総額を指数化したもので、日本経済の動向を示す代表的な経済指標として用いられるほか、ETFなどの金融商品のベンチマークとして利用されています。

指数四本値API

これまでJ-Quantsでは、TOPIX指数の四本値が取得可能なTOPIX四本値API(/indices/topix)を配信しておりましたが、当該APIの上位概念として指数四本値API(/indices)を新しくリリースいたしました。

詳細はこちらをご参照ください。

取得可能となった新しい指数一覧

指数四本値APIで取得可能な各種指数はそれぞれ以下のとおりです。

  • TOPIX Core30
  • TOPIX Large70
  • TOPIX Mid400
  • TOPIX Small
  • TOPIX 500
  • TOPIX 1000
  • 東証グロース市場250(旧 東証マザーズ指数)
  • 東証REIT

TOPIXインデックスシリーズの関係性については、以下の図(引用元)が参考となります。

TOPIXインデックスシリーズ

上記以外の株価指数についても、近日中に追加を予定しています。

J-Quantsで提供している指数四本値概要

ここからは、J-Quantsで提供している指数四本値のデータ項目を紹介します。

データ項目

データ項目名 データ概要 データ型
Date 各営業日 String
Code 指数コード String
Open 始値 Number
High 高値 Number
Low 安値 Number
Close 終値 Number

指数データの可視化

以下では、TOPIXインデックスシリーズについて指数の遷移等を描画していきます。

環境

記事執筆時の環境は以下のとおりです。

  • MacOS (Sonoma 14.0)
  • Python 3.11.5
  • numpy 1.26.2
  • pandas 2.1.
  • jquantsapi 1.5.0
  • plotly 5.18.0

利用するライブラリをimportしておきます。

from IPython.display import display
import numpy as np
import pandas as pd
import jquantsapi
import plotly.graph_objects as go

インストールされていなければ、先に以下のコマンド等でインストールしてください。

$ pip install numpy pandas jquants-api-client plotly

J-Quants API Client for Python

J-Quants APIのPython用Clientパッケージを利用してデータを取得します。

まずは、J-Quantsにご登録いただいているメールアドレス及びパスワードを利用し、約5年前にあたる2019年1月以降の各種株価指数の終値を取得します。

# python clientをインスタンス化
cli = jquantsapi.Client(mail_address=MAIL_ADDRESS, password=PASSWORD)

# 各指数の終値をそれぞれ取得する
df_topix = cli.get_indices(code="0000", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_core_30 = cli.get_indices(code="0028", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_large_70 = cli.get_indices(code="0029", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_topix_100 = cli.get_indices(code="002A", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_mid_400 = cli.get_indices(code="002B", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_topix_500 = cli.get_indices(code="002C", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_topix_small = cli.get_indices(code="002D", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_topix_1000 = cli.get_indices(code="002E", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_growth_250 = cli.get_indices(code="0070", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]
df_reit = cli.get_indices(code="0075", from_yyyymmdd=20190101, to_yyyymmdd=20231130)[["Date", "Close"]]

# データフレームをmerge
df = pd.merge(df_topix, df_core_30, how="inner", on="Date", suffixes=["", "_core30"])
df = pd.merge(df, df_large_70, how="inner", on="Date", suffixes=["", "_large70"])
df = pd.merge(df, df_topix_100, how="inner", on="Date", suffixes=["", "_topix100"])
df = pd.merge(df, df_mid_400, how="inner", on="Date", suffixes=["", "_mid400"])
df = pd.merge(df, df_topix_500, how="inner", on="Date", suffixes=["", "_topix500"])
df = pd.merge(df, df_topix_small, how="inner", on="Date", suffixes=["", "_topix_small"])
df = pd.merge(df, df_topix_1000, how="inner", on="Date", suffixes=["", "_topix1000"])
df = pd.merge(df, df_growth_250, how="inner", on="Date", suffixes=["", "_growth250"])
df = pd.merge(df, df_reit, how="inner", on="Date", suffixes=["", "_reit"])

最終的に以下のようなデータフレームになりました。

Date Close Close_core30 Close_large70 Close_topix100 Close_mid400 Close_topix500 Close_topix_small Close_topix1000 Close_growth250 Close_reit
0 2019-01-04 1471.16 661.94 1514.71 935.88 1678.72 1137.10 1859.06 1386.56 827.33 1750.87
1 2019-01-07 1512.53 681.95 1555.04 962.60 1725.04 1169.18 1909.94 1425.69 859.48 1772.75

2019年以降の株価指数の可視化

まずはそれぞれの指数について、グラフ化してみます。

fig = go.Figure()

fig.add_trace(go.Scatter(y=df["Close"], x=df["Date"] , name="TOPIX"))
fig.add_trace(go.Scatter(y=df["Close_core30"], x=df["Date"] , name="TOPIX Core30"))
fig.add_trace(go.Scatter(y=df["Close_large70"], x=df["Date"] , name="TOPIX Large70"))
fig.add_trace(go.Scatter(y=df["Close_topix100"], x=df["Date"] , name="TOPIX 100"))
fig.add_trace(go.Scatter(y=df["Close_mid400"], x=df["Date"] , name="TOPIX Mid400"))
fig.add_trace(go.Scatter(y=df["Close_topix500"], x=df["Date"] , name="TOPIX 500"))
fig.add_trace(go.Scatter(y=df["Close_topix_small"], x=df["Date"] , name="TOPIX Small"))
fig.add_trace(go.Scatter(y=df["Close_topix1000"], x=df["Date"] , name="TOPIX 1000"))
fig.update_layout(xaxis=dict(title="Date"),yaxis=dict(title="Close"),margin=dict(t=40, b=40, l=30, r=30), width=1200, height=400)

各指数の遷移

時系列における指数の遷移が描画されています。

2019年頃と直近とを比較すると、どの指数においても上昇していることがわかります。

また、2020年3月頃に全ての指数において大きな下落があることも読み取れます。

ここで、指数毎の上昇率の比較を容易にするため、各株価指数の2019年1月初の終値を100とした際の直近(2023年11月末)までの株価指数の動きをそれぞれ描画してみます。

fig = go.Figure()

fig.add_trace(go.Scatter(y=(df["Close"] / df["Close"][0] * 100), x=df["Date"] , name="TOPIX"))
fig.add_trace(go.Scatter(y=df["Close_core30"] / df["Close_core30"][0] * 100, x=df["Date"] , name="TOPIX Core30"))
fig.add_trace(go.Scatter(y=df["Close_large70"] / df["Close_large70"][0] * 100, x=df["Date"] , name="TOPIX Large70"))
fig.add_trace(go.Scatter(y=df["Close_topix100"] / df["Close_topix100"][0] * 100, x=df["Date"] , name="TOPIX 100"))
fig.add_trace(go.Scatter(y=df["Close_mid400"] / df["Close_mid400"][0] * 100, x=df["Date"] , name="TOPIX Mid400"))
fig.add_trace(go.Scatter(y=df["Close_topix500"] / df["Close_topix500"][0] * 100, x=df["Date"] , name="TOPIX 500"))
fig.add_trace(go.Scatter(y=df["Close_topix_small"] / df["Close_topix_small"][0] * 100, x=df["Date"] , name="TOPIX Small"))
fig.add_trace(go.Scatter(y=df["Close_topix1000"] / df["Close_topix1000"][0] * 100, x=df["Date"] , name="TOPIX 1000"))
fig.update_layout(xaxis=dict(title="Date"),yaxis=dict(title="Close"),margin=dict(t=40, b=40, l=30, r=30), width=1200, height=400)

各指数の変化

上図より、2019年1月初と比較した際にはTOPIX Core30指数が一番上昇率が大きく、TOPIX Mid400若しくはTOPIX Smallの指数が上昇率が小さいことがわかります。

100とする始点をいつにするかによってもちろんこの結果は変わります。J-QuantsのStandardプランであれば、直近から10年前、Premiumプランであれば2008年5月以降のデータが取得可能ですので、より長期の分析が可能となります。

指数は自身で構築するポートフォリオのベンチマークとしても利用することや、指数と連動することを目指して運用されている各種ETFへの投資を検討する際にも利用することができます。

これらのデータを財務データやその他の金融データと組み合わせることでより深い分析も可能になると思われます。

おわりに

この記事ではJ-Quantsで新たに提供を開始した指数四本値データの紹介及びその可視化について取り扱いました。

また、その他のデータについての取得例や分析例をColab Notebookを用いて作成しているものが、こちらのリポジトリにございますので、お時間がございましたら是非覗いてみてください。

JPX総研(フロンティア戦略部)について

JPX総研のフロンティア戦略部ではJ-Quantsなどの新しいプロダクトを内製開発しています!

キャリア採用も通年で行なっておりますので、ご興味がある方は以下のリンクをお確かめください!

J-Quantsとは

J-Quantsとは、ヒストリカル株価データ・財務データなどの金融データを取得できる、個人投資家向けのAPIデータ配信サービスです。投資にまつわるデータを分析しやすい形式で提供し、個人投資家の皆様がデータを活用しやすくなることを目的としております。

個人投資家が投資などのために金融データを分析する際の大きな障壁は、整形された金融データの取得が難しいことであるという理由から、2022年7月にベータ版をリリースいたしました。ご好評の声を頂いたこともあり、2023年4月より正式にリリースしております。

ディスクレーマー

当記事は、J-Quantsを利用した金融データ分析に関する技術的事項の共有を目的としたものであり、株式などの投資商品への投資の推奨を目的とするものではありません。

また、本記事の内容をもとに投資等を行った結果損害等が生じた場合においても、一切の責任を負わないものとします。

参考リンク

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?