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

# 【J-Quants】指数四本値を取得できる新規のAPIについて
J-Quants運営チーム
2023-12-20

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

## はじめに

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

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

本記事では、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)を新しくリリースいたしました。

詳細は[こちら](https://jpx.gitbook.io/j-quants-ja/api-reference/indices)をご参照ください。

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

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

- TOPIX Core30
- TOPIX Large70
- TOPIX Mid400
- TOPIX Small
- TOPIX 500
- TOPIX 1000
- 東証グロース市場250（旧 東証マザーズ指数）
- 東証REIT

TOPIXインデックスシリーズの関係性については、以下の図（[引用元](https://www.jpx.co.jp/markets/indices/line-up/files/fac_12_size.pdf)）が参考となります。

![TOPIXインデックスシリーズ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515935/a952c102-4376-d940-a21b-7dabea48099f.png)

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

## 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しておきます。

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

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

``` {bash}
$ pip install numpy pandas jquants-api-client plotly
```

### J-Quants API Client for Python

J-Quants APIの[Python用Client](https://github.com/J-Quants/jquants-api-client-python)パッケージを利用してデータを取得します。

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

``` python
# 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"])
```

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

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

|     | 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    |

</div>

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

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

``` python
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)
```
![各指数の遷移](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515935/54bd937e-8a3c-021c-1bdd-74eee11eeeb7.png)

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

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

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

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

``` python
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)
```
![各指数の変化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515935/bfeb86cb-2c4b-bef5-3bd3-98a46167be9a.png)

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

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

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

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

## おわりに

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

また、その他のデータについての取得例や分析例をColab Notebookを用いて作成しているものが、[こちらのリポジトリ](https://github.com/J-Quants/jquants-api-client-python/tree/main/examples)にございますので、お時間がございましたら是非覗いてみてください。

## JPX総研（フロンティア戦略部）について

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

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

- [JPX総研（フロンティア戦略部）採用ページ](https://jpx-mid-career-recruitment.com/)

## J-Quantsとは

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

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

## ディスクレーマー

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

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

## 参考リンク

- [J-Quants](https://jpx-jquants.com/)
- [jquants-api-client-python](https://github.com/J-Quants/jquants-api-client-python)