日本株の検証を、実測で。

J-Quantsの分足・ティックは調整前|株式分割をまたぐと検証が壊れます

  • 2026年9月21日
  • 2026年9月21日
  • データ

J-Quants の分足とティックは、調整前の値段で配られています。株式分割をまたぐと、その日を境に値段が飛びます。1:5 の分割なら、前日比 −80% の暴落として検証に入ります。

  • 1年で 4,623銘柄のうち 311銘柄(6.7%)が分割・併合を経験していました
  • 実例:1:5 の分割で、前日比 −81.2% の見かけの変化
  • 調整係数は日足の AdjFactor にあります
  • bulk の CSV には調整済み株価が入っていません(APIにはあります)
  • 直し方(後ろから累積して掛ける)は、公式の調整済みと 2,131/2,136 で一致しました

何が起きるか

公式の記述はこうです。

「四本値(O/H/L/C)は調整前の価格です(株式分割・株式併合等の調整は行っていません。調整済みの株価は株価四本値(日足)でご確認ください)」

つまり、分足もティックもその日に実際についた値段そのままです。株式分割があると、権利落ち日に値段が機械的に下がります。1株を2株にする分割なら、値段は半分になります。

これを調整しないまま検証すると、暴落が起きたことになります。逆張りの戦略なら大喜びで買いに行き、順張りなら投げます。どちらも、実際には起きていない値動きに反応しています。

どのくらいの頻度で起きるか

直近1年ぶんの日足(1,165,980行・4,623銘柄)で、調整係数が 1 でない行を数えました。

実測
調整係数が 1 でない行314(全体の 0.0269%)
対象になった銘柄311 / 4,623(6.7%)
対象になった日38 日

行で見れば 0.03%。でも銘柄で見れば 6.7% です。
100銘柄のポートフォリオを1年検証すれば、だいたい7銘柄がこれに当たります。「めったに無い」と切り捨てられる数字ではありません。

内訳

調整係数件数相当する分割
0.5000001231:2
0.333333681:3
0.200000511:5
0.250000341:4
0.100000141:10
0.04000031:25

1:25 の分割まであります。これをまたぐと、値段が 1/25 になります。

調整しないと、こう見える

実際の日足から、権利落ち日の前後を並べました。

銘柄日付調整係数前日終値当日終値見かけの変化
216402026-08-070.66766167154−7.8%
990002026-08-270.500002,1651,080−50.1%
683402026-08-280.2000027,6005,200−81.2%
764902026-08-280.500002,6781,321−50.7%
801102026-08-280.333335,2601,688−67.9%
927902026-08-280.500005,1202,475−51.7%

68340 は −81.2%。こんな値動きをそのまま検証に入れたら、成績は何の意味も持ちません。

直し方

調整係数は日足の AdjFactor に入っています。ある日の値段を、いまの水準に合わせるには、その日より後に起きた調整を全部掛けます

adjust.py
import numpy as np
import pandas as pd

# 日足(AdjFactor が入っている)を日付順に
d = daily.sort_values("Date").reset_index(drop=True)
fac = pd.to_numeric(d["AdjFactor"], errors="coerce").fillna(1.0).to_numpy(float)

# その日「より後」に起きた調整を、後ろから累積して掛ける
cum = np.cumprod(fac[::-1])[::-1]
cum = np.concatenate([cum[1:], [1.0]])   # 自分の日の分は含めない

adjusted_close = d["C"].to_numpy(float) * cum

この式が正しいことの確認

J-Quants の API は調整済み終値(AdjC)も返します。上の式で自分で計算した値と突き合わせました。

結果
突き合わせた本数2,136
一致2,131(99.77%)
ずれ5(最大の相対差 5.87e-05=0.006%)

ずれた5本は、調整係数が割り切れない銘柄(0.909091 や 0.952381 など)で、端数の丸め方の違いによるものです。実用上は問題ない精度です。

bulk(CSV)のダウンロードには、調整済み株価が入っていません。
CSVの列は Date, Code, O, H, L, C, UL, LL, Vo, Va, AdjFactor, MktCap, ExRT で、AdjC などはありません。公式も「CSVファイルでは、株式分割・併合などによる調整済み株価は提供されません」と明記しています。大量取得でCSVを使うなら、調整は自分で計算することになります。

いちばん確実なのは「調整があったか先に見る」こと

全部を自動で調整するより、検証期間に調整があったかを先に確かめるほうが、事故に気づきやすくなります。

check.py
# 自分の検証期間に調整があったかを、先に確かめる
ev = daily[(daily["AdjFactor"] != 1.0) & daily["AdjFactor"].notna()]
if len(ev):
    print("★この期間に調整があります:")
    print(ev[["Date", "Code", "AdjFactor"]])
else:
    print("この期間に調整はありません")

これを検証の頭で回して、当たっていたら止まるようにしておけば、知らないうちに壊れた数字を見ることはなくなります。

チェックリスト

  1. 使っているのは調整前か調整済みか、言えるか。分足・ティックは調整前、日足の AdjC 系は調整済みです
  2. 検証期間に調整があったか確かめているか
  3. 出来高も調整が要ります。値段が 1/2 になれば株数は 2倍です
  4. CSVで取っているなら、調整済みは入っていません
  5. 「一日で−50%」のような値動きを見たら、まず分割を疑う

まとめ

分割・併合は、行で見れば全体の 0.03% しかありません。それでも1年で6.7%の銘柄が当たり、当たった銘柄では−80%の偽の暴落が検証に入ります。

頻度が低いものほど、起きたときに気づけません。先に確かめる仕組みを入れておくのが、いちばん安い保険です。

この記事の出どころ

  • データ:J-Quants API の日足(bulk CSV および API)。ベースは Light プラン+分足・ティックアドオン
  • 対象:直近約1年 / 1,165,980行 / 4,623銘柄
  • 式の検証:調整係数が1でなかった銘柄8つについて、自前の計算と公式の AdjC を2,136本突き合わせ
  • 環境:Windows 11 / Python 3.12 / pandas 3.0 / numpy 2.5
  • 測定日:2026年9月21日
  • 注意:掲載したのは集計結果です。取得したデータそのものは配布していません