無料でAPIキー取得

学ぶ

先読みしないデータ(point-in-time)の作り方

バックテストで、その日にはまだ公表されていなかった決算を使うと、成績が実際より良く見えます。このページでは、ZENITH Code の時系列が各決算を開示日から使う仕組みと、できること・できないことを説明します。

event実例の数値は 2026 年 10 月 23 日 時点の API の応答から取っています。財務・配当のデータは毎日 16:30(TDnet)と 19:00(EDINET)を基準に更新します(日本時間)。

このページで分かること

  • check_circlemarket-cap-history と valuation-history は、各決算を開示日から使います。開示日より前の日には、前の決算のままです。
  • check_circleどの決算を使ったかは、応答の epsPeriod・bpsPeriod・dividendPeriod・sharesPeriod で確かめられます。
  • check_circle守っているのは「いつから使えたか」です。値は後の有報や訂正を反映した最新の値で、公表当時の版は保存していません。

先読みバイアスとは

先読みバイアスは、過去のある日の判断に、その日より後に分かった情報を使ってしまう誤りです。

たとえば 3 月期の決算は、3 月 31 日の時点ではまだ公表されていません。決算期末の日付で決算をつなぐと、5 月の発表までの約 1〜2 か月、未来の数字で銘柄を選ぶことになります。

PER や PBR のように、株価と決算を掛け合わせる指標で特に起きやすい誤りです。

ZENITH Code はこう扱う: 決算は開示日から

時価総額とバリュエーションの時系列では、日ごとに「その日までに開示済みで、期末が最も新しい決算」を使います。

  • 開示日: 決算の出典情報に記録された公表日時のうち、期末以降で最も早い日です。通常は決算短信の日です。
  • 開示日が分からない決算: 期末から 45 日後(決算短信の開示の目安)から使います。
  • 株価の日付が開示日より前: 前の決算のままです。開示日になって初めて新しい決算に切り替わります。
  • 分割調整: 株価・1 株当たりの値・株数は、すべて今の株数の基準にそろえます。分割の日に指標が飛びません。
  1. 01

    決算期末

    この時点では、まだ前の決算を使う

  2. 02

    開示日(最初の公表)

    この日から新しい決算の EPS・BPS・株数を使う

  3. 03

    開示日が分からない場合

    期末から 45 日後から使う

  4. 04

    次の決算の開示日

    その日に次の決算へ切り替わる

日ごとに「その日までに開示済みで、期末が最も新しい決算」を使います(数値は含みません)。

計算の定義

各指標は、その日の分割調整後の終値と、その日に使える決算から計算します。

指標ZENITH Code の計算null・例外
時価総額分割調整後の終値 × 株数(自己株式を除く)株数が取れない決算は発行済株式数で代用(sharesBasis が issued)
PER分割調整後の終値 ÷ EPSEPS が 0 以下(赤字)や未開示は null
PBR分割調整後の終値 ÷ BPSBPS が 0 以下や未開示は null
配当利回り1 株配当 ÷ 分割調整後の終値(0〜1 の小数)無配は 0
basis=fy(既定)通期の EPS・BPS・配当を使うPER はスクリーナーと同じ(最新の通期 EPS)。PBR は通期の BPS(スクリーナーは最新の四半期の BPS)
basis=ttm直近 12 か月の EPS と最新四半期の BPS を使う配当は通期のまま。四半期ごとに切り替わる

株価は 2010 年 1 月からです。1 回のリクエストは最大 10 年です。

実例: トヨタ自動車(7203)の株数の切り替わり

トヨタ自動車の時価総額の時系列(週ごと)では、株数の出典(sharesPeriod)が 2026 年 8 月 7 日の行で切り替わります。2027 年 3 月期 第 1 四半期の短信(2026 年 8 月 4 日公表)が出たあとの最初の週末だからです。

それまでは 2026 年 3 月期の通期の株数(130 億 3,338 万株)を使い、切り替え後は第 1 四半期末の株数(118 億 4,183 万株)を使っています。

同じ期間の PER(basis=fy)は、通期の決算だけを使うため、epsPeriod は 2026-03/FY のままです。四半期ごとに切り替えたいときは basis=ttm を使います。

日付(週の最終営業日)株数の出典 `sharesPeriod`株数(株)PER の EPS の出典 `epsPeriod`
2026-07-242026-03/FY13,033,384,4742026-03/FY
2026-07-312026-03/FY13,033,384,4742026-03/FY
2026-08-072026-06/Q111,841,833,6602026-03/FY

株数は自己株式を除いた数です。出典: /stable/market-cap-history と /stable/valuation-history(symbol=7203、interval=weekly、2026 年 10 月 23 日 時点)。株価に関する値は載せていません。

API での使い方

日付の範囲と間引き(interval = daily・weekly・monthly)を指定して取ります。バックテストでは、売買を判断する日付に対して「その日以前で最も新しい行」を結び付けます。

コード例
curl -sG "https://api.zenithcode.net/stable/valuation-history" \
  --data-urlencode "symbol=7203" \
  --data-urlencode "from=2025-01-01" \
  --data-urlencode "to=2025-12-31" \
  --data-urlencode "interval=monthly" \
  --data-urlencode "basis=ttm" \
  -H "x-api-key: YOUR_API_KEY"

Python: 月末の判断日に、その日までの値だけを結び付ける

import requests
import pandas as pd

BASE = "https://api.zenithcode.net/stable"
HEADERS = {"x-api-key": "YOUR_API_KEY"}

def get(path, **params):
    r = requests.get(f"{BASE}{path}", params=params, headers=HEADERS, timeout=30)
    r.raise_for_status()
    return r.json()

# Daily PER / PBR built only from results disclosed on or before each date
val = pd.DataFrame(get("/valuation-history", symbol="7203", basis="ttm",
                       **{"from": "2021-01-01", "to": "2025-12-31"}))
val["date"] = pd.to_datetime(val["date"])

# Your decision dates (e.g. month-end rebalancing)
signals = pd.DataFrame({"date": pd.date_range("2021-01-31", "2025-12-31", freq="ME")})

# merge_asof attaches the latest row on or before each date: no look-ahead
panel = pd.merge_asof(signals, val.sort_values("date"), on="date", direction="backward")
print(panel[["date", "per", "pbr", "epsPeriod", "bpsPeriod"]].tail())

できないこと(限界)

ZENITH Code が守っているのは「どの決算を、いつから使うか」です。次の点は、利用者の側で考慮してください。

  • 値の版は保存していません。 有報や訂正で値が置き換わると、過去の日付にも置き換わった値が使われます。公表当時に見えていた数字そのものではありません。
  • 開示日は最初の公表日です。 短信の日から有報で確定した値を使うため、短信と有報で数字が違う会社では、短信の公表から有報の提出までの期間に差が出ます。
  • 財務のエンドポイントは最新の値を返します。 income-statement などを自分でつなぐ場合、provenance.announcedAt 以降に使うと保守的(遅め)になります。announcedAt は今の出典の公表日時なので、有報に置き換わった期は有報の日付です。
  • 株価は 2010 年 1 月からです。 それより前の時価総額・PER の時系列は作れません。

よくある質問

投資家・開発者向け

決算発表の前日の PER は、どの決算で計算されていますか?
前の決算です。新しい決算は開示日から使うので、発表の前日までは 1 つ前の決算の EPS で計算されます。応答の epsPeriod で確かめられます。
赤字の期の PER はどうなりますか?
null です。その日に使える決算の EPS が 0 以下のときは、PER を計算しません。
自社株買いは時価総額に反映されますか?
はい。株数は開示済みの直近の決算の自己株式を除いた株数なので、次の決算が開示された日から反映されます。

AI・研究者向け

これは厳密な point-in-time データですか?
「いつから使うか」は開示日基準で守っていますが、値は最新の版です。公表当時の数字の版(ヴィンテージ)は保存していないため、後の訂正や有報での置き換えは過去の日付にも反映されます。
どの決算が使われたかを機械的に確かめられますか?
はい。valuation-history の各行に epsPeriod・bpsPeriod・dividendPeriod、market-cap-history に sharesPeriod が 2026-03/FY の形で入ります。
開示日の記録が無い決算はどう扱われますか?
期末から 45 日後から使います。決算短信の開示の目安に合わせた、保守的な置き方です。
gavel

免責事項

この記事は、データの仕組みと API の使い方を説明するものです。特定の銘柄の売買を勧めるものではなく、投資助言ではありません。実例の数値は記事の作成時点の応答で、その後の開示や訂正で変わることがあります。投資の判断はご自身の責任で行ってください。