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.500000 | 123 | 1:2 |
| 0.333333 | 68 | 1:3 |
| 0.200000 | 51 | 1:5 |
| 0.250000 | 34 | 1:4 |
| 0.100000 | 14 | 1:10 |
| 0.040000 | 3 | 1:25 |
1:25 の分割まであります。これをまたぐと、値段が 1/25 になります。
調整しないと、こう見える
実際の日足から、権利落ち日の前後を並べました。
| 銘柄 | 日付 | 調整係数 | 前日終値 | 当日終値 | 見かけの変化 |
|---|---|---|---|---|---|
| 21640 | 2026-08-07 | 0.66766 | 167 | 154 | −7.8% |
| 99000 | 2026-08-27 | 0.50000 | 2,165 | 1,080 | −50.1% |
| 68340 | 2026-08-28 | 0.20000 | 27,600 | 5,200 | −81.2% |
| 76490 | 2026-08-28 | 0.50000 | 2,678 | 1,321 | −50.7% |
| 80110 | 2026-08-28 | 0.33333 | 5,260 | 1,688 | −67.9% |
| 92790 | 2026-08-28 | 0.50000 | 5,120 | 2,475 | −51.7% |
68340 は −81.2%。こんな値動きをそのまま検証に入れたら、成績は何の意味も持ちません。
直し方
調整係数は日足の AdjFactor に入っています。ある日の値段を、いまの水準に合わせるには、その日より後に起きた調整を全部掛けます。
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を使うなら、調整は自分で計算することになります。
いちばん確実なのは「調整があったか先に見る」こと
全部を自動で調整するより、検証期間に調整があったかを先に確かめるほうが、事故に気づきやすくなります。
# 自分の検証期間に調整があったかを、先に確かめる
ev = daily[(daily["AdjFactor"] != 1.0) & daily["AdjFactor"].notna()]
if len(ev):
print("★この期間に調整があります:")
print(ev[["Date", "Code", "AdjFactor"]])
else:
print("この期間に調整はありません")これを検証の頭で回して、当たっていたら止まるようにしておけば、知らないうちに壊れた数字を見ることはなくなります。
チェックリスト
- 使っているのは調整前か調整済みか、言えるか。分足・ティックは調整前、日足の
AdjC系は調整済みです - 検証期間に調整があったか確かめているか
- 出来高も調整が要ります。値段が 1/2 になれば株数は 2倍です
- CSVで取っているなら、調整済みは入っていません
- 「一日で−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日
- 注意:掲載したのは集計結果です。取得したデータそのものは配布していません