ボートレースのデータは、独自フォーマットで分散しており、収集と整形に時間がかかります。 そこで、機械学習で利用しやすいように1レース1行のCSVファイルを作成しました。 httpsでダウンロードできるため、Agentからのアクセスにも利用しやすくなっています。 更新は1日1回です。 最新の情報が必要な場合、Boatrace OpenAPI などの別のソースをご利用ください。
毎日、以下のCSVファイルが自動生成されます。各ファイルはレースの異なる段階のデータを含みます。
ファイルパス: data/programs/title/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/programs/title/2026/05/03.csv
race.boatcast.jp の getHoldingList2_YYYYMMDD.json を起源とする、1レース1行の sidecar ファイルです。Programs と同じ「レース名」(予選 / 予選特別 / 準優勝戦 / 優勝戦 / ドラドキ目玉 等) を、開催24場すべてについてレースコードキーで提供します。
race_cards / recent_national / recent_local / motor_stats には レース名 列が無いため、Programs CSV (大きい) を全部ロードせずにレース名だけを取りたい場合に使えます。
レースコード,レース日,レース場コード,レース場,レース回,タイトル,日次,グレード,ナイター,レース名,電話投票締切予定,中止状態
202605020101,2026-05-02,01,桐生,1R,第53回上毛新聞社杯,2日目,IP,N,予選,確定,
レースコード(202605020101): 12桁識別子(他CSVと共通)レース日(2026-05-02)レース場コード(01): "01"-"24" の2桁ゼロ詰めレース場(桐生): 場名レース回(1R)タイトル(第53回上毛新聞社杯): 開催節タイトル日次(2日目): 開催期間中の何日目かグレード:IP(一般)/G3/G2/G1/SG/PG1等ナイター(N):Y/Nレース名(予選): per-race のレース名(最重要列)電話投票締切予定(確定): 投票締切時刻、または「確定」「中止」等のステータス文字列(boatcast の表記そのまま)中止状態: 中止 / 順延 / 途中中止 などの状態(通常は空)
スケジュール: daily-sync.yml から python scripts/race-title.py --date $TODAY_JST --force が毎日 JST 00:10 に実行され、当日分が再生成されます。boatcast は当日/直近のみを返すため、過去日の本格的バックフィルは不可。
用途: per-race レース名(優勝戦判定など)を Programs を読まずに取得。
レースコードで他CSVに JOIN。
scripts/preview-realtime.py が Cloud Run Jobs (boatrace-487212/asia-northeast1) で JST 08:00〜22:59 の 5 分毎 に動作し、各レースの締切5分前のスナップショットを データソース単位で別ファイル に追記します。データソースを分割することで当日の値の時間変化を保持でき(特に水面気象)、後段の特徴量計算 (scripts/boatrace/index_features.py) もこの per-source CSV を直接参照します。
ファイルパス:
data/previews/tkz/YYYY/MM/DD.csv— 体重・展示タイム・チルトdata/previews/stt/YYYY/MM/DD.csv— 進入コース・スタート展示data/previews/sui/YYYY/MM/DD.csv— 水面気象スナップショットdata/previews/original_exhibition/YYYY/MM/DD.csv— オリジナル展示データ
URL 例: https://boatracecsv.github.io/data/previews/tkz/2026/05/03.csv
共通カラム(4ファイル先頭6列):
レースコード(YYYYMMDDjjrr): Programs / Realtime Preview 等と JOIN 可能な12桁識別子レース日(YYYY-MM-DD)レース場(01〜24、2桁ゼロ詰め)レース回(01R〜12R)締切時刻(HH:MM、getHoldingList2由来)取得日時(ISO8601, JST、例2026-05-03T20:25:03+09:00)
ソース固有カラム:
tkz — 状態 (常に 1) + 6艇 × {体重(kg), 体重調整(kg), 展示タイム, チルト}。
stt — 6艇 × {コース, スタート展示}。F 付き行は負値の ST、L 付き行は空欄として格納。
sui — 気象観測時刻 (HHMM) + 風速(m) / 風向 / 波の高さ(cm) / 天候 / 気温(℃) / 水温(℃)。
original_exhibition — 計測数 / 計測項目1 / 計測項目2 / 計測項目3 + 6艇 × {選手名, 値1, 値2, 値3}。場ごとに項目が異なります(多くは「一周/まわり足/直線」、住之江・尼崎・徳山は2項目、桐生は「半周ラップ/まわり足/直線」)。
取得・スキップルール:
- 中止 / 順延 / 途中中止のレースはスキップ
- ソースファイルがまだ公開されていない、または計測中 (
status=0) / 計測不能 (status=2) の場合は 追記せずスキップ(次回実行で自動再試行) original_exhibitionはstatus=1のみ追記(旧data/original_exhibition/にあったステータスカラムは廃止)- 同一
レースコードは1日1行のみ(per-source dedup) - スケジュール実行のため、各レースについて取得は1回のみ
用途: 締切直前のコンディション把握、時系列での風・水温の変化分析、リアルタイム予想モデル特徴量。
レースコードで他の CSV と JOIN 可能
ファイルパス: data/results/realtime/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/results/realtime/2026/05/06.csv
preview-realtime.py が bc_rs1_2_{ymd}_{jo}_{rno}.txt (race.boatcast.jp) を [締切+3分, 締切+30分] の窓でポーリングし、レース確定直後のスナップショットを 1レース1行 で data/results/realtime/YYYY/MM/DD.csv に追記するファイルです。
K-file 由来の data/results/daily/YYYY/MM/DD.csv (翌日確定の正規結果) とは 別パス・別タイミングで、当日の締切〜数十分後にはレース結果(着順・決まり手・スタートタイミング・気象)が手に入る点が違います。両者は最終的にほぼ同じ結果になりますが、realtime の方は race.boatcast.jp 由来のため払戻金などの一部列は含まれません。
レースコード/レース日/レース場/レース回/締切時刻/取得日時(Realtime Preview と共通の先頭6列)結果記録時刻(HHMM): bc_rs1_2 の天候行 HHMM決まり手(逃げ / 差し / まくり 等)- 各着順 (1着 〜 6着) × 3列:
N着_艇番/N着_選手名/N着_レースタイム - 各コース (1コース 〜 6コース) × 3列:
Nコース_艇番/Nコース_スタートタイミング/Nコース_FNコース_艇番は実際の進入コース順。Nコース_Fは1=フライング/0=正常
- 気象6列:
天候/風向/風速(m)/波の高さ(cm)/気温(℃)/水温(℃)- コード値の体系は Realtime Preview の
suiと同一
- コード値の体系は Realtime Preview の
- 中止 / 順延 / 途中中止のレースはスキップ
- bc_rs1_2 がまだ未公開(404 / 403)のレースは追記せずスキップ(次回 cron 実行で自動再試行)
- 同一
レースコードは1日1行のみ - ポーリング窓は
--result-window-min(default 3) ~--result-window-max(default 30) 分。締切+3分より前は再現性が無いためチェックしない preview-realtime.py --skip-resultsで結果取得をスキップ可能
用途: 締切〜数十分後の 準リアルタイム結果 を当日中に取得。K-file 翌日反映を待たずに当日のうちに買い目検証や強さptの実績照合が可能。同じ
レースコードで realtime 系(preview/sui/stt/tkz/index/result) を時系列に並べられる
ファイルパス: data/results/daily/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/results/daily/2026/01/01.csv
レース終了後に公開されるレース結果です。順位、払戻金、詳細な走行情報を含みます。
201601152301,ウインターモーニングバトル,第5日,2016/01/15,唐津,01R,一般,1800,晴,南西,2,2,逃げ,1,190,1,110,2,100,1-2,390,2,1-2,330,2,1-2,130,2,1-3,130,1,2-3,150,3,1-2-3,780,3,1-2-3,250,1,1,1,3156,金 子 良 昭,26,51,6.67,1,0.09,108.2,2,2,3825,宮 嵜 隆太郎,63,80,6.73,2,0.15,111.4,3,3,2538,高 橋 二 朗,17,64,6.69,3,0.12,112.7,4,5,3889,須 藤 隆 雄,11,60,6.74,5,0.11,113.0,5,4,3609,泉 祥 史,35,45,6.78,4,0.12,114.0,6,6,4899,占 部 一 真,19,78,6.7,6,0.09,115.9
基本情報(レースの識別情報):
レースコード(201601152301): Programs と同じ形式のレース識別子タイトル(ウインターモーニングバトル): レースのタイトル日次(第5日): 開催期間中の何日目かレース日(2016/01/15): 開催日付レース場(唐津): 開催地レース回(01R): 当日の何レース目かレース名(一般): レースのグレード距離(m)(1800): 走行距離
当日気象情報:
天候(晴): 当日の天気風向(南西): 風の向き風速(m)(2): 風速(m/s)波の高さ(cm)(2): 波の高さ(cm)
決着情報:
決まり手(逃げ): レース結果の決着パターン(逃げ、差し、まくり等)
投票・払戻金情報:
単勝_艇番(1) /単勝_払戻金(190): 1着になった艇番と単勝の払戻金複勝_1着_艇番(1) /複勝_1着_払戻金(110): 複勝に入った各着数の艇番と払戻金2連単_組番(1-2) /2連単_払戻金(390): 2連単の組み合わせと払戻金2連単_人気(2): 2連単の人気度(1位が最高)2連複_組番(1-2) /2連複_払戻金(330) /2連複_人気(2)拡連複_1-2着_組番(1-2) /拡連複_1-2着_払戻金(130) /拡連複_1-2着_人気(2)拡連複_1-3着_組番(1-3) /拡連複_1-3着_払戻金(130) /拡連複_1-3着_人気(1)拡連複_2-3着_組番(2-3) /拡連複_2-3着_払戻金(150) /拡連複_2-3着_人気(3)3連単_組番(1-2-3) /3連単_払戻金(780) /3連単_人気(3)3連複_組番(1-2-3) /3連複_払戻金(250) /3連複_人気(2)
各着順の詳細情報(1着~6着。以下は1着の例):
1着_着順(1): 着順番号(常に1)1着_艇番(1): 入着した艇番1着_登録番号(3156): 選手の全国統一登録番号1着_選手名(金 子 良 昭): 選手の氏名1着_モーター番号(26): 使用したモーターの番号1着_ボート番号(51): 使用したボートの番号1着_展示タイム(6.67): 展示会での走行タイム1着_進入コース(1): 実際の進入コース(1~6)1着_スタートタイミング(0.09): スタート際での速度計測値1着_レースタイム(108.2): 実際のレース走行時間(秒)
用途: レース結果の統計分析、投票情報の記録、決着パターンの研究、選手やモーター・ボートの勝敗分析
ファイルパス: data/programs/race_cards/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/programs/race_cards/2026/04/25.csv
race.boatcast.jp の bc_j_str3 を起源とする出走表詳細データです。Programs と並行して提供される 追加情報 で、Programs にない項目(全国/当地3連対率、全国平均ST、賞除フラグ、F/L本数、モーター/ボート3連対率、節間14スロット成績)を含みます。学習特徴量の拡張として利用してください。Programs CSV はそのまま維持されます。
レースコード,レース日,レース場コード,レース回,
艇1_登録番号,艇1_選手名,艇1_期別,艇1_支部,艇1_出身地,艇1_年齢,艇1_級別,
艇1_賞除,艇1_F本数,艇1_L本数,
艇1_全国平均ST,艇1_全国勝率,艇1_全国2連対率,艇1_全国3連対率,
艇1_当地勝率,艇1_当地2連対率,艇1_当地3連対率,
艇1_モーターフラグ,艇1_モーター番号,艇1_モーター2連対率,艇1_モーター3連対率,
艇1_ボートフラグ,艇1_ボート番号,艇1_ボート2連対率,艇1_ボート3連対率,
艇1_早見,
艇1_節D1走1_R番号,艇1_節D1走1_進入,艇1_節D1走1_枠,艇1_節D1走1_ST,艇1_節D1走1_着順,
... (節D1走2 〜 節D7走2 まで14スロット × 5項目)
艇2_… (同形式) ...
... 艇6まで ...
202604251712,2026-04-25,17,12R,
3941,池田 浩二,81期,愛知,愛知,48,A1,
,0,0,
0.13,7.88,53.2,71.9,
0.0,0.0,0.0,
0,57,42.9,56.2,
0,35,34.2,52.1,
,
,,,,,12,1,1,0.1,1,5,6,6,0.07,4,11,3,3,0.2,1,...
基本情報:
レースコード(202604251712): Programs / Results と同じ12桁形式の識別子レース日(2026-04-25): 開催日付レース場コード(17): 場コード (1〜24)レース回(12R)
艇N 基本プロフィール (N=1..6, 各艇26列):
艇N_登録番号: 全国統一登録番号艇N_選手名: 選手名(全角スペースは半角1個に正規化)艇N_期別: 養成所期別(例 "81期")艇N_支部/艇N_出身地: 支部および出身地(bc_j_str3の支部:出身地を分割)艇N_年齢/艇N_級別艇N_賞除: 賞金除外フラグ(補欠出走など)。該当時"賞除"、なければ空。出現率 ~0.8%艇N_F本数/艇N_L本数: フライング・出遅れの累積本数(0〜N の整数。空白は0扱い)
全国/当地成績(Programs より粒度が高い):
艇N_全国平均ST: 全国期別の平均スタートタイミング艇N_全国勝率/艇N_全国2連対率/艇N_全国3連対率: 過去6ヶ月(今節除く)艇N_当地勝率/艇N_当地2連対率/艇N_当地3連対率: 過去3年(今節除く)
モーター/ボート:
艇N_モーターフラグ/艇N_ボートフラグ: 特殊状態フラグ("1"=該当)艇N_モーター番号/艇N_モーター2連対率/艇N_モーター3連対率: 使用開始から前節終了時点艇N_ボート番号/艇N_ボート2連対率/艇N_ボート3連対率: 同上
早見:
艇N_早見: 当日2レース出場時の他R番号(整数、bc_j_str3の"5R"表記からRを除去)、なければ空
節間14スロット成績 (各艇 14 × 5 = 70列):
- スロット順: 1日目1走 → 1日目2走 → 2日目1走 → … → 7日目2走(
bc_j_str3の col[25]..col[38] に対応) - 各スロット5項目:
艇N_節D{D}走{S}_R番号: そのスロットで出走したレース番号艇N_節D{D}走{S}_進入: 実際の進入コース (1-6)艇N_節D{D}走{S}_枠: 枠番 (1-6)艇N_節D{D}走{S}_ST: スタートタイミング(負値はフライング扱い)艇N_節D{D}走{S}_着順: 着順または特殊トークン。半角1〜6 /F(フライング) /L(出遅れ) /欠(欠場) /転(転覆) /妨(妨害失格) /落(落水) /エ(エンスト) /不(不完走)。ソースの全角FLは半角に正規化済み
- 未出走スロットは全列空欄
データソース: https://race.boatcast.jp/hp_txt/{jo}/bc_j_str3_{ymd}_{jo}_{race}.txt。利用可能なのは概ね 2025-05-02 以降。それ以前は Programs を参照してください。
用途: ML特徴量の強化(コース別なし/節間R番号・進入・枠・ST・着順の構造化/3連対率・全国平均ST)。Programs と
レースコードで JOIN して利用します。
ファイルパス: data/programs/recent_national/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/programs/recent_national/2026/04/25.csv
race.boatcast.jp の bc_zensou を起源とする、各艇の全国近況5節(直近の節間成績)を集約したファイルです。Programs にない「節グレード」「節期間(開始日〜終了日)」「着順時系列の生文字列」を含み、ML特徴量として強力です。
レースコード,レース日,レース場コード,レース回,
艇1_登録番号,艇1_選手名,
艇1_前1節_開始日,艇1_前1節_終了日,艇1_前1節_場コード,艇1_前1節_場名,艇1_前1節_グレード,艇1_前1節_着順列,
艇1_前2節_… (同形式) …
… 前5節まで5ブロック ×(艇2〜艇6 同形式)…
202604251712,2026-04-25,17,12R,
3941,池田 浩二,
2026-04-12,2026-04-17,01,桐生,GⅠ,641 216 4 56,
…
基本情報:
レースコード(202604251712)レース日(2026-04-25)レース場コード(17)レース回(12R)
艇N 識別 (N=1..6):
艇N_登録番号: 全国統一登録番号艇N_選手名: 選手名(全角スペース正規化済)
艇N 前K節成績 (K=1..5、K=1が最新):
艇N_前K節_開始日/艇N_前K節_終了日: 節期間(YYYY-MM-DD)艇N_前K節_場コード: 場コード ("01"-"24")艇N_前K節_場名: 場名(全角スペース除去済、例 "鳴門")艇N_前K節_グレード: "一般" / "GⅢ" / "GⅡ" / "GⅠ" / "SG" / "PG1" など艇N_前K節_着順列: 着順時系列の生文字列。トークン定義:1-6(全角): 着順 — ソースが全角のため、ML特徴量化時は半角への変換を検討F: フライング,L: 出遅れ — ソースは全角FLだが、CSV出力時に半角へ正規化欠: 欠場,転: 転覆,妨: 妨害失格,落: 落水エ: エンスト,不: 不完走,沈: 沈没,失: 失格(妨以外の失格)[N]: 優勝戦の着順 N (例[1]= 優勝,[4]= 4着)- 全角スペース (
): 日区切り(同一節内の日違い)
データソース: https://race.boatcast.jp/hp_txt/{jo}/bc_zensou_{ymd}_{jo}.txt。場×日×1ファイル(全選手の縦持ち)から、B-fileの艇番↔登録番号で逆引きして横持ちCSVに変換。新人選手で5節未満の場合は末尾セッションが空になります。
用途: 直近の調子・節グレード推移・休場頻度を時系列特徴量化。
艇N_前K節_着順列を文字単位で集計すれば「直近X日の連対率」「F発生数」などを派生できます。
ファイルパス: data/programs/recent_local/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/programs/recent_local/2026/04/25.csv
Recent National Form と同一スキーマで、ソースだけ bc_zensou_touchi に差し替わったファイルです(当該レース場での直近5節のみが収録される)。当地適性をML特徴量化するために利用してください。
データソース: https://race.boatcast.jp/hp_txt/{jo}/bc_zensou_touchi_{ymd}_{jo}.txt。スキーマ・列名は Recent National Form と完全一致しているため、両ファイルを (レースコード, 艇N_*) で同列名の prefix 違いとして取り扱えます(実装時は CSV ファイル分離のためそのまま JOIN 不可、必要なら pandas で suffix 付与)。
用途: 当地で過去どのような戦績だったか、当地特化の特徴量に。
ファイルパス: data/programs/motor_stats/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/programs/motor_stats/2026/04/26.csv
race.boatcast.jp の bc_mst (モーター期起算日) + bc_mdc (期内モーター詳細) を起源とする、1モーター1行のスナップショットファイルです。
収録範囲: 1日あたりの収録は 当日開催のある場のみ(B-fileから抽出)。24場のうち通常 14〜16 場 (~62%) しか含まれません。休場日のある場は当日のレコードが欠けるため、ML 時系列で利用する際は前回スナップショットからのフォワードフィルを推奨します。
重要な注意: race.boatcast.jp は現在のモーター期のみを返却するため、過去日のバックフィル不可。
記録日以降の日次スナップショットを継続蓄積する設計です。日次バッチ運用が始まった日から有効データが溜まり始めます。
記録日,モーター期起算日,場コード,モーター番号,
勝率,勝率順位,2連対率,2連対率順位,3連対率,3連対率順位,
1着回数,1着順位,2着回数,2着順位,3着回数,3着順位,
連対外回数,出走数,
優勝回数,優勝順位,優出回数,優出順位,
raw_col_21,raw_col_22,
平均ラップ秒,平均ラップ順位,期内初使用日,
整備種別1回数,整備種別2回数,整備種別3回数,整備種別4回数,整備種別5回数,整備種別6回数,
直近メンテ日
2026-04-25,2025-10-19,17,25,
8.1,1,80.0,1,90.0,1,
5,1,3,4,1,26,
1,10,
1,1,1,1,
677,8,
14.89,1,2025-10-22,
0,3,2,0,0,0,
2025-10-24
確度ラベル: ★★★ = JS実装またはデータ分布で確証あり/★★ = 強い状況証拠あり/★ = 仮説段階。
メタ情報:
- ★★★
記録日: スナップショット取得日(= スクリプトの--date引数、通常は前日JST) - ★★★
モーター期起算日: 当該モーター期の開始日 (bc_mstの値) - ★★★
場コード: "01"-"24" - ★★★
モーター番号: 物理モーター番号
勝率系(rate × 100 を /100 に変換し小数点表記、順位は1位が最高):
- ★★★
勝率/勝率順位 - ★★★
2連対率(%) /2連対率順位 - ★★★
3連対率(%) /3連対率順位
着順回数(順位は最大値が1位):
- ★★★
1着回数/1着順位 - ★★★
2着回数/2着順位 - ★★★
3着回数/3着順位 - ★★★
連対外回数: 4着以下+DNF(F・L・欠・転・落・妨など)の合計 - ★★★
出走数: 当該モーター期の総出走回数。1着+2着+3着+連対外 == 出走数が全データで成立
Raw 列(意味未確定):
- ★
raw_col_21/raw_col_22: 6.7-7.1 帯の不明指標 + 順位。場ごとに分布が異なる(場06=低め群 vs 場18=高め群、レンジ27以上)ため ML 特徴量化時は場ごとの正規化を推奨。要検証
優勝・優出(boatcast の MotorHistory.js で確認済み):
- ★★★
優勝回数/優勝順位 - ★★★
優出回数/優出順位
ラップタイム:
- ★★
平均ラップ秒(×100 を /100): 14.85前後が宮島の典型値。場ごとに分布が異なる(場06=15.00 / 場18=15.20 など) - ★★
平均ラップ順位: 値が小さい (=ラップが短い) ほど上位 - 空欄になる条件:
1着+2着+3着 == 0(連対実績ゼロ)のモーターは boatcast 側でラップタイムが算出されないため、平均ラップ秒/平均ラップ順位/期内初使用日の3列が連動して空になる(直近サンプルで 3.0% のモーターに該当)
日付・整備:
- ★★
期内初使用日: 当該モーターがその期に初出走した日(連対実績ゼロのモーターでは空) - ★★
整備種別1回数〜整備種別6回数: 6カテゴリ(典型: ピストン/リング/シリンダー/ロアー/キャブレター/その他)の整備実施回数。カテゴリ番号と項目名のマッピングは未確認 - ★★
直近メンテ日: 直近メンテ実施日(または次回予定日の可能性。要確認)
データソース:
https://race.boatcast.jp/hp_txt/{jo}/bc_mst_{jo}.txt— モーター期起算日https://race.boatcast.jp/hp_txt/{jo}/bc_mdc_{period_yyyymmdd}_{jo}.txt— 期内モーター詳細
用途: Programs の
モーター2連対率の上位互換。3連対率・優勝回数・整備履歴・平均ラップまで取れるため、モーター強さの強力な特徴量に。日次更新で時系列追跡可能。(記録日, 場コード, モーター番号)を主キーとし、programsの艇N_モーター番号と JOIN して使用。
ファイルパス: data/estimate/index/YYYY/MM/DD.csv
URL: https://boatracecsv.github.io/data/estimate/index/2026/05/03.csv
各レース 1 行で、6 枠分の「強さポイント」を 5 要素の偏差値で表現したファイルです。枠番・選手・モーター・展示・気象 の 5 要素を場別に学習した重みで線形結合し、平均 50・標準偏差 10 の偏差値スケールで出力します。
生成パイプライン:
- 日次バッチ (
scripts/build_index.py --mode daily、JST 00:10): 当日のレース全件について、変動が小さい 3 要素 (枠番・選手・モーター) を計算し、展示・気象は 50 (平均) で補完。状態 =daily、暫定の強さpt が入る。 - 直前バッチ (
scripts/preview-realtime.pyから内部呼び出し): 各レースの締切 5 分前に preview を取得した直後、対応する index 行の展示・気象を実値で再計算。状態 =realtime、強さpt が確定値に更新される。 - 月次重み学習 (
scripts/build_weights.py --month YYYY-MM、毎月 1 日 09:00 JST): 直近 6 ヶ月のデータから 24 場 × 5 要素の重みを学習し、data/estimate/stadium/index_weights/YYYY-MM.csvを生成。
レースコード,レース日,レース場コード,レース回,状態,
1枠_枠番pt,1枠_寄与_枠番pt,1枠_選手pt,1枠_寄与_選手pt,1枠_モーターpt,1枠_寄与_モーターpt,1枠_展示pt,1枠_寄与_展示pt,1枠_気象pt,1枠_寄与_気象pt,1枠_強さpt,
2枠_… (同形式 11 列) … 6枠 まで,
202605030101,2026-05-03,01,1R,realtime,
68.84,30.28,36.59,8.06,50.00,5.94,54.93,3.24,18.63,1.30,51.84,
…
基本情報:
レースコード/レース日/レース場コード/レース回: 他ファイルと同じ識別子状態:daily(日次バッチ完了、展示・気象は暫定50)/realtime(直前バッチで展示・気象を実値に更新済み)
艇 N の 11 列(N=1..6, 計 66 列):
N枠_枠番pt: 偏差値スケールの 枠番強度。data/estimate/stadium/win_rate.csvの場×季節×コース勝率を場別 (μ, σ) で標準化N枠_選手pt: 偏差値スケールの 選手能力指数。data/programs/recent_national/+data/programs/recent_local/の着順列をグレード別に得点化(算出基準点合計÷出走回数)し場別標準化。式は br-racers.jp の能力指数算出式に準拠N枠_モーターpt: 偏差値スケールの モーター強度。data/programs/motor_stats/の勝率を場別標準化(勝率0=データなしの場合は欠損として50で補完)N枠_展示pt: 偏差値スケールの 展示パフォーマンス。展示タイム + オリジナル展示の3項目をレース内偏差値化して平均、その後場別標準化N枠_気象pt: 偏差値スケールの 気象有利度。data/estimate/stadium/sui_params.csvで当日気象から各コースの有利pt変動を計算し場別標準化(コース固定有利は枠番ptに集約済み)N枠_寄与_{要素}pt: その要素の重み × 偏差値pt(= 強さptへの寄与の内訳)N枠_強さpt: 5 つの寄与の合計。Σ重み = 1 のため平均 50 ± 10 のスケールに収まる
- 元データが欠損した要素の偏差値ptは 50 で補完(平均扱い)
- 5 要素のうち 1 つでも欠損があっても 強さpt は計算される
- 重みファイル(
data/estimate/stadium/index_weights/YYYY-MM.csv)が見つからない月のデータは、すべて NaN を出力
用途: 単発レースの予想に直接使えるランキング指標。
強さpt順で買い目を組み立てたり、寄与列でなぜ強い/弱いかを分解できる。重みは 6 ヶ月ローリングで学習されるため、季節変動を反映。
data/estimate/stadium/ 配下に、index 計算で参照する場別の係数・統計量を保存しています。
場 × 季節 × コース別の長期勝率テーブル。枠番pt の生値ソース。
| 列 | 説明 |
|---|---|
場コード |
"01"〜"24" |
季節 |
春(3-5月)/ 夏(6-8月)/ 秋(9-11月)/ 冬(12-2月) |
1コース勝率 〜 6コース勝率 |
コース別の長期1着率(%) |
24 場分の気象線形回帰パラメータ。波・風(追い/向かい)・気温水温差・天候から各コースの有利pt変動を計算する係数。1 場 1 行、43 列(stadium + 切片6 + 6特徴量×6コース = 36)。
| 列グループ | 内容 |
|---|---|
base_c1 〜 base_c6 |
基準条件(凪・無風・晴・気温=水温)下の有利pt切片 ※index計算では切片は使わず変動分のみを 気象pt に反映 |
wave_cm_c1〜c6 |
波高 1cm あたりの有利pt変化 |
temp_diff_c1〜c6 |
気温-水温差 1℃ あたりの有利pt変化 |
wind_tail_ms_c1〜c6 |
追い風 1m/s あたりの有利pt変化 |
wind_head_ms_c1〜c6 |
向かい風 1m/s あたりの有利pt変化 |
is_cloudy_c1〜c6 |
曇り(vs 晴)による有利ptシフト |
is_rainy_c1〜c6 |
雨(vs 晴)による有利ptシフト |
風向は各場の facing_deg(スタンド方位)で正規化して 追い風/向かい風/横風 のカテゴリに分けます。場ごとの learned R² は概ね 0.05〜0.20。scripts/build_sui_params.py で実データから再学習可能。
毎月 1 日に再学習される 24 場 × 5 要素の重みファイル。学習窓は対象月の 6 ヶ月前〜前月末。各場 1 行、stadium, n_samples, 5 要素の mu_* / sigma_* / w_*, mu_y, sigma_y, mse, r2, fallback を含む。
| 列 | 説明 |
|---|---|
stadium |
場名(全角:桐生・戸田 等) |
n_samples |
SLSQP fit に使われた行数 |
mu_{key} / sigma_{key} |
その場の 5 要素生pt値の平均と標準偏差(偏差値変換に使用) |
w_{key} |
その要素の重み(非負・合計 1) |
r2 |
着順予測の決定係数 |
fallback |
1 = サンプル不足で均等重み(0.2 ずつ)に倒した |
build_index.py は実行時に 対象日の月以下で最新の重みファイル を自動選択するため、未来日(月)用に重みファイルを事前生成しておく運用も可能。
用途: index 計算の中間成果物。重みの場別比較をすると、たとえば桐生は気象pt の重みが大きい(波が立ちやすいレース場)、福岡は 枠番pt の重みが大きい(イン強度が高い)など、場の性格が数値で見える。
Programs → 選手情報・成績データ(事前情報)
⇅
Race Title → per-race レース名 sidecar(Programs と並行)
⇅
Race Cards → 出走表詳細(Programs と並行: 全国/当地3連率・節間14スロット成績)
⇅
Recent National Form → 全国近況5節(節期間・グレード・着順時系列)
⇅
Recent Local Form → 当地近況5節(同形式、当地ソースのみ)
⇅
Motor Stats → モーター期成績スナップショット(場×モーター 1日1行)
↓
Realtime Preview → 締切5分前の直前情報(tkz / stt / sui / original_exhibition の per-source 追記)
↓
Strength Index → 派生:5要素を場別重みで線形結合した強さポイント
↓
Realtime Results → 締切+3〜30分の準リアルタイム結果(bc_rs1_2 由来)
↓
Results → 翌日確定の本レース結果(K-file 由来、事後情報)
Stadium Parameters → win_rate.csv / sui_params.csv / index_weights/*.csv (Index 計算の参照テーブル)
基本的な追跡方法: 同じ レースコード で各ファイルを紐付けることで、レースの事前情報から当日の展示・直前情報、最終結果までを一貫して追跡できます。
例: レースコード「202602092301」で検索すると:
- Programs から → 参加選手のプロフィール・成績
- Race Title から → per-race レース名(予選 / 優勝戦 等)
- Race Cards から → 全国/当地3連率・節間14スロット成績
- Recent National Form / Recent Local Form から → 全国・当地の直近5節成績
- Motor Stats から → モーター期成績スナップショット
- Realtime Preview から → 締切5分前の直前スナップショット(時系列で複数ソース・展示タイム・気象等)
- Strength Index から → 6 枠分の強さポイント(偏差値)と要素別寄与の内訳
- Realtime Results から → 締切後5〜30分の準リアルタイム結果(着順・決まり手・ST・気象)
- Results から → 最終順位・払戻金・実際の進入コース・ST
これらを組み合わせることで、レースの準備段階から当日の直前情報・予測値・実結果までを一貫して追跡でき、特徴量設計や分析に活用できます。
- Python 3.8+
- git
- pip (included with Python)
# Clone repository
git clone https://github.com/your-org/boatrace-data.git
cd boatrace-data
# Create virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r scripts/requirements.txt# 当日 JST のデータを一通り取り込む (daily-sync.yml と同じ並び)
python scripts/result.py --force # K-file 由来 (前日確定結果)
python scripts/race-card.py --date "$(date +%Y-%m-%d)" --force # bc_j_str3 (race_cards)
python scripts/recent-form.py --date "$(date +%Y-%m-%d)" --force # bc_zensou (recent_form)
python scripts/motor-stats.py --date "$(date +%Y-%m-%d)" --force # bc_mst / bc_mdc (motor_stats)
python scripts/race-title.py --date "$(date +%Y-%m-%d)" --force # getHoldingList2 (title)
python scripts/build_index.py --date "$(date +%Y-%m-%d)" --mode daily # 強さ index バッチscripts/
├── preview-realtime.py # Realtime preview + realtime result scraper (also updates index)
├── race-title.py # Per-race レース名 sidecar (data/programs/title/)
├── motor-stats.py # Motor stats scraper (data/programs/motor_stats/)
├── race-card.py # Race-card detail scraper (data/programs/race_cards/)
├── recent-form.py # Recent national/local form scraper
├── build_index.py # Strength Index builder (--mode daily/realtime, --update-races)
├── build_weights.py # Monthly weight learner (per-stadium 5-feature weights)
├── build_sui_params.py # 24-stadium weather coefficient learner
├── boatrace/ # Python package
│ ├── __init__.py
│ ├── downloader.py # HTTP downloads with retry
│ ├── extractor.py # LZH decompression
│ ├── parser.py # Fixed-width text parsing
│ ├── converter.py # Text → CSV conversion
│ ├── storage.py # File I/O operations
│ ├── git_operations.py # Git commit/push operations
│ ├── index_features.py # Shared 5-feature computation (build_index/build_weights)
│ ├── preview_tsv_scraper.py # bc_j_tkz/stt/sui/oriten TSV scraper
│ ├── result_realtime.py # bc_rs1_2 TSV scraper (realtime results)
│ └── logger.py # Structured JSON logging
├── requirements.txt
└── tests/
├── unit/
└── integration/
.github/workflows/
├── daily-sync.yml # Daily data sync + daily index batch (07:30 JST)
├── preview-realtime.yml # Realtime preview — manual fallback only (production runs on Cloud Run Jobs, JST 08:00-22:59 every 5min)
└── monthly-weights.yml # Monthly weight rebuild (1st of month, 09:00 JST)
infra/ # Cloud Run Jobs deployment for preview-realtime
├── Dockerfile
├── run.sh
├── cloudbuild.yaml
└── README.md # Setup/update procedures for GCP
data/ # Published data (created at runtime)
├── programs/
│ ├── title/YYYY/MM/DD.csv # per-race レース名 sidecar (race-title.py)
│ ├── race_cards/YYYY/MM/DD.csv # bc_j_str3 由来の出走表詳細
│ ├── recent_national/YYYY/MM/DD.csv # 全国近況5節
│ ├── recent_local/YYYY/MM/DD.csv # 当地近況5節
│ └── motor_stats/YYYY/MM/DD.csv # モーター期成績スナップショット
├── previews/
│ ├── tkz/YYYY/MM/DD.csv # realtime: 体重・展示タイム・チルト
│ ├── stt/YYYY/MM/DD.csv # realtime: 進入コース・スタート展示
│ ├── sui/YYYY/MM/DD.csv # realtime: 水面気象スナップショット
│ └── original_exhibition/YYYY/MM/DD.csv # realtime: オリジナル展示
├── results/
│ ├── daily/YYYY/MM/DD.csv # K-file 由来の翌日確定結果
│ └── realtime/YYYY/MM/DD.csv # bc_rs1_2 由来の締切後5〜30分スナップショット
└── estimate/
├── index/YYYY/MM/DD.csv # 派生: 強さポイント (5要素偏差値+寄与+合計)
└── stadium/
├── win_rate.csv # 場×季節×コース勝率
├── sui_params.csv # 24場気象線形回帰パラメータ
└── index_weights/YYYY-MM.csv # 月次重み(直近6ヶ月で再学習)
.boatrace/
└── config.json # Configuration
logs/
└── boatrace-YYYY-MM-DD.json # Execution logs
毎日 JST 07:30 に daily-sync.yml が自動で同等の処理を実行しますが、特定日を再 fetch したい場合は対応するスクリプトを個別に呼び出します。
# Results (K-file, 前日確定結果)
python scripts/result.py --force
# boatcast 由来のサイドカー (引数 --date で対象日を指定)
python scripts/race-card.py --date 2026-05-12 --force
python scripts/recent-form.py --date 2026-05-12 --force
python scripts/motor-stats.py --date 2026-05-12 --force
python scripts/race-title.py --date 2026-05-12 --force展示会データ (Realtime Preview) は per-race 締切直前にしか取れないため、過去日の単発再 fetch は不可。詳細は次節 Realtime Preview Scraper を参照。
# Default: target today (JST), preview window = [now+1min, now+10min],
# result window = [now-30min, now-3min]
python scripts/preview-realtime.py
# Plan only — log eligible races but write nothing
python scripts/preview-realtime.py --dry-run
# Write CSVs but skip git commit & push
python scripts/preview-realtime.py --no-commit
# Override the reference time (HH:MM JST), useful for testing
python scripts/preview-realtime.py --now 12:30 --no-commit
# Wider preview window (override defaults)
python scripts/preview-realtime.py --window-min 2 --window-max 15
# Skip the realtime-result step (preview only)
python scripts/preview-realtime.py --skip-results
# Custom result polling window (minutes since deadline)
python scripts/preview-realtime.py --result-window-min 5 --result-window-max 45Designed to run every minute via .github/workflows/preview-realtime.yml. On each invocation it:
- Fetches
https://race.boatcast.jp/api_txt/getHoldingList2_{YYYYMMDD}.jsonto discover open venues + per-race deadline times (no caching, no persistence). - Preview pass — selects races whose deadline falls in
[now+window-min, now+window-max]AND that are not yet recorded in every per-source CSV. Scrapesbc_j_tkz/bc_j_stt/bc_sui/bc_oritenfor each eligible race and appends one row per source. After appending, also updates the corresponding rows indata/estimate/index/YYYY/MM/DD.csv(展示・気象 を実値で再計算 → 状態 =realtime). - Result pass — selects races whose deadline already passed by
[result-window-min, result-window-max]minutes and whoseレースコードis not yet indata/results/realtime/YYYY/MM/DD.csv. Scrapesbc_rs1_2for each candidate and appends one row to the realtime results CSV (skips silently when the file is not yet published). - Commits & pushes the changes in a single commit (preview + result + index updates batched). Nothing is committed when no rows were appended.
Idempotency is per-source: if tkz succeeds but stt is still missing for race X, the next minute's run only retries stt for X. Likewise, the result pass only retries races still missing from data/results/realtime/....
# Default: scrape today's race-title CSV (JST)
python scripts/race-title.py
# Specific date
python scripts/race-title.py --date 2026-05-03
# Dry run (no file written, no git push)
python scripts/race-title.py --date 2026-05-03 --dry-run
# Force overwrite existing CSV
python scripts/race-title.py --date 2026-05-03 --force
# Write CSV but skip git commit/push
python scripts/race-title.py --date 2026-05-03 --no-pushThe script fetches race.boatcast.jp/api_txt/getHoldingList2_YYYYMMDD.json once and writes one row per scheduled race per open stadium to data/programs/title/YYYY/MM/DD.csv. boatcast only exposes the current/upcoming day reliably — backfill of distant past dates may return empty payloads.
# Default: scrape yesterday's race-card data (JST)
python scripts/race-card.py
# Specific date
python scripts/race-card.py --date 2026-04-25
# Dry run (no file written, no git push)
python scripts/race-card.py --date 2026-04-25 --dry-run
# Force overwrite existing CSV
python scripts/race-card.py --date 2026-04-25 --forceData source: race.boatcast.jp の per-race TSV (/hp_txt/{jo}/bc_j_str3_*.txt). The script uses the same-day B-file from mbrace.or.jp to determine which races are scheduled (matching original-exhibition.py's flow). Available approximately from 2025-05-02 onwards.
# Default: scrape yesterday's recent-form data (JST)
python scripts/recent-form.py
# Specific date
python scripts/recent-form.py --date 2026-04-25
# Dry run (no files written, no git push)
python scripts/recent-form.py --date 2026-04-25 --dry-run
# Force overwrite both CSV files
python scripts/recent-form.py --date 2026-04-25 --forceA single run produces both data/programs/recent_national/YYYY/MM/DD.csv and data/programs/recent_local/YYYY/MM/DD.csv from bc_zensou and bc_zensou_touchi respectively. The B-file from mbrace.or.jp is used to look up which racer is in which boat at each race. Per-stadium fetch only — at most ~48 boatcast requests per day even on 24-stadium peak days.
# Default: scrape yesterday's motor stats (JST)
python scripts/motor-stats.py
# Specific date
python scripts/motor-stats.py --date 2026-04-25
# Dry run (no file written, no git push)
python scripts/motor-stats.py --date 2026-04-25 --dry-run
# Force overwrite existing CSV
python scripts/motor-stats.py --date 2026-04-25 --forceThe script fetches bc_mst (motor period start date) and bc_mdc (per-motor stats) from race.boatcast.jp for every stadium that has races on the given date (per the same-day B-file from mbrace.or.jp). All motors are written to a single CSV at data/programs/motor_stats/YYYY/MM/DD.csv.
Backfill is not possible — race.boatcast.jp only exposes the current motor period for each stadium, so historical periods are lost. Run this script daily going forward to accumulate time-series snapshots.
# 当日朝に走らせる日次バッチ:
# 枠番・選手・モーター + 暫定強さpt を埋める。展示・気象は 50 で補完。
python scripts/build_index.py --date 2026-05-03 --mode daily
# 過去日のバックフィル(全要素揃った状態で計算):
python scripts/build_index.py --date 2026-05-03 --mode realtime
# 一部レースだけ展示・気象を再計算して状態を realtime に更新
# (preview-realtime.py から内部呼び出しされる)
python scripts/build_index.py --date 2026-05-03 \
--update-races 202605030101,202605030102
# 過去月のバックフィル例(月毎に重みファイルが必要):
for d in $(seq -w 1 31); do
python scripts/build_index.py --date 2026-05-${d} --mode realtime
done# 対象月の重みを直近6ヶ月のデータから学習
python scripts/build_weights.py --month 2026-05
# 過去月の重みを生成(walk-forward 検証用)
python scripts/build_weights.py --month 2026-04
python scripts/build_weights.py --month 2026-03学習窓は [対象月 - 6ヶ月, 対象月 - 1日](対象月のデータは含まない=リーケージなし)。場ごとに非負・合計1の制約で SLSQP 最適化。motor_stats の収録履歴が短い場合、motor 重みは小さくなる傾向あり。
# 24場分の気象線形回帰パラメータを実データから再学習
python scripts/build_sui_params.py \
--start-date 2025-01-01 --end-date 2026-04-30 \
--out data/estimate/stadium/sui_params.csvpreviews + results を結合して場×コース別に線形回帰し、波・風(追い/向かい)・気温水温差・天候から有利pt変動を推定。
# Run all unit tests
pytest tests/unit/
# Run specific test file
pytest tests/unit/test_parser.py
# Run with coverage
pytest --cov=boatrace tests/unit/-
Repository secrets (configured in GitHub):
GITHUB_TOKEN(provided automatically)- Optional:
GIT_USER_EMAIL(defaults to "action@github.com") - Optional:
GIT_USER_NAME(defaults to "GitHub Action")
-
GitHub Pages configuration:
- Settings → Pages → Source: Deploy from a branch
- Branch:
main - Folder:
/ (root)
-
daily-sync.yml— Runs every day at 07:30 JST (= 22:30 UTC)。実測で 1 ラン ~22 分かかるため、Cloud Run Jobs のpreview-realtime(JST 08:00 起動) が当日 title CSV を参照する前に完了するよう 30 分の余裕を取って 07:30 起動としています。Processes Results, Programs, Race Cards, Recent Form, Motor Stats, and Race Title for the previous/current day. Then runs Build Daily Index Batch (build_index.py --mode daily) to populate today'sdata/estimate/index/YYYY/MM/DD.csvwith 枠番・選手・モーター + 暫定強さpt(状態 =daily、展示・気象は 50 で補完)。Each step usesif: always()(andcontinue-on-error: truefor third-party-source steps) so a single source outage does not break the rest of the pipeline. -
preview-realtime.yml—workflow_dispatchmanual fallback only. The production schedule (JST 08:00-22:59, every 5 minutes) has been migrated to Cloud Scheduler + Cloud Run Jobs because GitHub Actions cron was being throttled. Two passes per invocation:- Preview pass — scrapes per-source preview data (
tkz/stt/sui/original_exhibition) for races whose deadline falls in[now+1min, now+10min]and updatesdata/estimate/index/YYYY/MM/DD.csv(展示・気象 を実値で再計算 → 状態 =realtime). - Result pass — scrapes
bc_rs1_2for races whose deadline already passed by 3〜30 分 and appends one row todata/results/realtime/YYYY/MM/DD.csv.
All changes (preview + index + result) go in a single commit. Idempotent and resilient to cron drift; commits one batch per invocation only when rows are actually appended.
- Cloud Run Jobs 構成:
boatrace-487212/asia-northeast1の Cloud Schedulerpreview-realtime-daytime(*/5 8-22 * * *, Asia/Tokyo) が Cloud Run Jobpreview-realtimeを発火します。詳細はinfra/README.mdを参照。
- Preview pass — scrapes per-source preview data (
-
monthly-weights.yml— Runs on the 1st of each month at 09:00 JST. Re-learns 24-stadium × 5-feature weights from the prior 6 months of data and writesdata/estimate/stadium/index_weights/YYYY-MM.csv.build_index.pyautomatically picks up the latest weights ≤ the target month.
Edit .boatrace/config.json to customize:
{
"rate_limit_interval_seconds": 3,
"max_retries": 3,
"initial_backoff_seconds": 5,
"max_backoff_seconds": 30,
"request_timeout_seconds": 30,
"log_level": "INFO",
"log_file": "logs/boatrace-{DATE}.json"
}- Daily execution: ~10-15 seconds (typical)
- Historical backfill (3 years): ~60 minutes
- CSV file size: 100-500 KB per file
Official Boatrace Races Server: http://www1.mbrace.or.jp/od2/
MIT License