← 一覧に戻る

investment-strategy-research

GitHub ↗ Python 最終push: 2026/10/9 17:18

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

(2026-10-09 17:18 時点)

  • 停止中(後片付け完了): 探索は止め、J-Quants は解約済み。R2 バケット・R2 トークン・GitHub Secrets・Artifact・手元のデータはすべて削除済みで、規約の削除義務は果たした。GitHub Actions の2つのワークフローは無効化してある
  • 残しているもの: 研究コード、仮説台帳 research/LEDGER.md、集計レポート reports/、.devnotes(いずれも元データは復元できない)
  • 探索の結論: 現物買い・当日手じまい・反射神経不要の条件では8ファミリー約90変種で有望ゼロ。日中は平均ゼロで上昇は夜間に集中
  • 次にやること: なし
  • 再開するとき: README 冒頭の手順(再契約 → R2・トークン・Secrets 再作成 → ワークフロー有効化 → backfill)。条件(保有時間・空売り・商品)を変えない限り同じ探索は繰り返さない

過去のWIPアーカイブ

(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)

2026-10-09 17:15 時点のスナップショット

(2026-10-09 17:15 時点)

  • 停止中: You の判断で探索をいったん止め、J-Quants は解約済み(2026-10-09)。GitHub Actions のワークフロー2つ(取り込み・研究)は無効化済み
  • 削除済み(規約の削除義務): 手元の data/(2.7GB)、作業用ファイル、GitHub の Artifact、GitHub Secrets、.env のキーの値
  • 後片付けは完了: R2 バケット jquants-data と R2 トークン2つの削除、J-Quants の解約まで済み(2026-10-09、ダッシュボードで確認済み)。規約の削除義務は果たした
  • 残しているもの: 研究コード、仮説台帳 research/LEDGER.md、集計レポート reports/、.devnotes(いずれも元データは復元できない)
  • 再開するとき: README 冒頭の「再開するとき」の手順どおり。条件(保有時間・空売り・商品)を変えない限り同じ探索を繰り返さない

2026-10-09 16:40 時点のスナップショット

(2026-10-09 16:40 時点)

  • 到達点: データ基盤(J-Quants → GitHub Actions → R2、毎日自動取り込み)は稼働中。分足・Tick 2年、日足・銘柄一覧・財務情報 5年が R2 にある
  • 探索の結論: 現物買い・当日手じまい・反射神経不要(開示後の時間差売買は可)の条件で、8ファミリー約90変種を事前登録して検証した結果、「有望」はゼロ。日中は良いニュースでも売られやすく、上昇はほぼ夜間に起きる。統計上の唯一の有望候補は夜間保有(N3)だが方針で除外
  • 次にやること: J-Quants の契約(月7,150円)を続けるか決める。解約なら README の手順で R2・手元データ(data/)と復元可能な派生物を削除
  • 再開するなら: 条件(保有時間・空売り・商品)を変える必要がある。研究の入口は research/LEDGER.md と reports/
  • 未決事項: なし(契約の判断のみ)

ROADMAP(計画)

ロードマップ

今週

  • J-Quants の契約を続けるか決める → 解約する(2026-10-09)
  • 手元の data/・作業用ファイル・Artifact・Secrets を削除(2026-10-09)
  • R2 バケット jquants-data を削除、R2 トークン2つを削除(You、2026-10-09 確認済み)
  • J-Quants の解約手続き(You、2026-10-09)

今月

  • データ基盤(J-Quants → GitHub Actions → R2)の構築と過去分の取り込み(分足・Tick 2年、日足・銘柄一覧・財務情報 5年)
  • 現物買い・当日手じまいの条件での戦略探索(8ファミリー、約90変種。有望ゼロ)

今四半期

(今四半期の目標)

いつか

  • 条件を変えて探索を再開する場合の候補(いずれも User の現在の方針では対象外)
    • 夜間保有(N3: 過去20日の夜間リターン上位の小型株、開発期間で費用後 +25bp/晩・t=12.7)。再開するなら 1日ずらした信号で口座シミュレーション → 温存期間で1回だけ評価
    • 空売り(日中に強く下がる側の信号: 前日に上げた小型株、上に窓を開けた小型株、開示後の失速)
    • 個別株以外(先物・ETF)。J-Quants Light では先物の分足がないので別のデータが必要
  • Dots / iPhone からの読み出し(第2段階: Cloudflare Worker の読み取り API と Access で保護した閲覧画面)

DECISIONS(意思決定)

意思決定記録

このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。


2026-10-09: 探索を止めて J-Quants を解約し、取得データを削除する

背景: 現物買い・当日手じまいの条件で有望な戦略が見つからず、3か月以内にデータを使う具体的な予定もない。

決定: 探索を止め、J-Quants(月7,150円)を解約する。規約に従い、取得データと復元可能な派生物(R2・手元・Artifact)を削除し、研究コード・台帳・集計レポートは残す。

理由: 使わないデータに払い続ける理由がない。再契約すれば分足・Tick は直近2年、日足・財務は5年をまた取り直せ、取り込みの仕組みもそのまま使えるので、失うのは「その時点で2年より古くなった分足・Tick」だけ。

2026-10-09: 現物買い・当日手じまいの条件での探索を一区切りにする

背景: 8ファミリー約90変種を事前登録して開発期間で検証したが、「有望」の基準を満たす当日手じまいの買い戦略は出なかった。

決定: この条件での探索はいったん終える。データ基盤は動かしたまま、J-Quants の契約を続けるかは User が判断する。

理由: 日中は良いニュースでも売られやすく、強い信号は下落側か夜間に集中している。同じ条件で変種を増やすと偶然良く見えるものを拾う危険が増えるだけ。再開するなら条件そのものを変える。

2026-10-09: 売買スタイルの条件を固定(反射神経不要・現物買いのみ・当日手じまい)

背景: 決算反応や空売りの案を User が断り、理由を確認した。

決定: 反射神経のいる売買はしない(ただし開示後に時間をおいて売買するのは可)。空売りは手数料等がかかるのでしない。夜間保有もしない。

理由: 手動で無理なく回せることと、余計な費用を払わないことを重視するため。板寄せ(寄成・引成・後場寄り)どうしの売買はこの条件に最も合う。

2026-10-07: 夜間保有は統計上有望でもやらない

背景: ファミリー4 の N3(過去20日の夜間リターン上位の小型株を引成→翌寄成)が、費用後 +25bp/晩・t=12.7 で全基準を満たし、頑健性チェックも通った。

決定: User の判断で夜間保有は行わず、探索はその日のうちに手じまう戦略に限る。

理由: 引け後の決算や悪材料による急落リスクを負いたくないため。結果は台帳に「有望だが方針で除外」として残す。

2026-10-07: 温存期間の扱いと「有望」の判定基準を事前に固定する

背景: Dots の研究は1仮説ずつ厳密に棄却する設計で、探索としての検出力が低かった。GPT との三者議論で、温存期間と多重検定の扱いを詰めた。

決定: 2026-03〜08 は方式1(開発期間で候補と口座ルールを1つに固定してから1回だけ評価、判定は採用/不採用/情報不足)。「有望」は 費用後 t≥3・ストレス後プラス・隣接分位も同じ向き・前半後半とも同符号・採算規模 の5条件。全試行を research/LEDGER.md に記録する。

理由: 方式2(3〜5月で選択、6〜8月で最終)は1期間が短すぎて検出力が足りない。数百セルを見るので t≈2 は偶然でも多数出る。

2026-10-07: データ基盤を J-Quants → GitHub Actions → Cloudflare R2(不変オブジェクト+カタログ)にする

背景: Mac・Claude Code・Dots・iPhone のどこからでもデータを読みたい。Lightsail は 512MB RAM で他サービスと同居している。

決定: 書き込みは GitHub Actions の単一プロセスのみ。R2 に内容ハッシュ付きの不変オブジェクトで保存し、データセット別カタログ+スナップショット+CURRENT で現行版を管理。日足・銘柄一覧・財務情報は API、分足・Tick の過去分は Bulk CSV。Tick は全銘柄の原本を保存。読み出しは許可期間のみ(既定は開発期間)。

理由: R2 は egress 無料・S3 互換で DuckDB から直接読める。上書きしない形にして研究の再現性を確保。Bulk CSV は調整済み株価がないので日足は API。Tick 全保存の追加費用は月約35円。

2026-10-07: 戦略探索を Dots から Claude に移す

背景: Dots に日本株デイトレ戦略の探索を任せてきたが、有望な戦略が見つからず、探索の設計にも問題(検出力不足・高効率な大型株への限定・過大なコスト仮定・データの一部しか使わない)があった。

決定: Dots は使わず、Claude がこのリポジトリでデータ基盤から作り直して探索する。

理由: User が「Dots は今は考えなくてよい、とにかく戦略を発掘したい」と判断したため。

DEVLOG(作業ログ)

開発日誌

このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。


2026-10-09

17:18 - 後片付けの完了確認と締め

やったこと

  • Cloudflare ダッシュボード(Chrome で閲覧のみ)で、R2 バケット jquants-data と R2 トークン jquants-writer・jquants-reader が削除済みであることを確認。他プロジェクトのバケット・トークンには触れていない
  • J-Quants の解約完了を You から受け、README・WIP・ROADMAP・メモリに反映

次回やること

  • なし(停止中)。再開するときは README 冒頭の手順から

17:15 - J-Quants 解約に向けた後片付け

やったこと

  • GitHub Actions のワークフロー(J-Quants 取り込み・研究の実行)を無効化
  • 規約の削除義務に従い、手元の data/(2.7GB)・作業用ファイル(確認用の分足/Tick 原本など)・GitHub の Artifact(Tick 集計・レポート控え)を削除
  • GitHub Secrets 4つを削除し、.env のキーの値を空にした
  • README 冒頭に停止中の注記と再開手順を追記

決めたこと

  • 探索をいったん止め、J-Quants を解約する(You の判断)。研究コード・台帳・集計レポート・.devnotes は残す

その後

  • You が J-Quants を解約し、R2 バケット jquants-data と R2 トークン2つを削除。Cloudflare ダッシュボードで削除済みを確認した

16:40 - 条件を変えながらの戦略探索(ファミリー5〜8)と区切り

やったこと

  • Tick 2年分(24か月、19.9GB)を Bulk から R2 に取り込み、GitHub Actions 上で指値の約定判定用の集計(銘柄×日、135.5万行)を作成
  • ファミリー5(指値で費用を下げる): 保守的な約定判定で全セル費用後マイナス。指値は下がるときに約定し、上がるときに取り残される(逆選択が数十bp、予測力は約8bp)
  • ファミリー6(日中のクセ、寄成→引成): 日中リターンの持続性なし。夜間・前日に上げた小型株は日中に大きく下げる(−15〜−20bp、t=−6.6〜−9.0)が、買い側の優位性はなし
  • ファミリー7(カレンダー効果、ETF の寄成→引成): 月末最終営業日 +12〜15bp(t≈1.0〜1.4)などいずれも有意でない
  • ファミリー8(開示のあと時間をおいて買う。User の提案で条件を緩めて実施): 遅れ5/30/60分・反応・予想改定率・昼休み開示のどれも費用後マイナス。良いニュースでもその後の日中は売られる
  • 仮説台帳(research/LEDGER.md)に事前登録と結果をすべて記録。約90変種を検証し、現物買い・当日手じまいの条件で「有望」はゼロ
  • 定期取り込み(10/7・10/8 の schedule 実行)が成功し、分足が 10/8 まで入っていることを確認

決めたこと

  • 売買スタイルの条件: 反射神経不要・現物買いのみ(空売りなし、費用のため)・当日手じまい。開示後に時間をおいて売買するのは可
  • 現物買い・当日手じまいの条件での探索はここで一区切り

詰まったこと / 気づき

  • 日本株の日中は、良いニュースでも強い上昇でも、その後は売られやすい時間帯。上昇はほぼ夜間に起きる(2021-11〜2026-02 で日中は平均ゼロ、夜間は +6〜9bp/日)
  • 研究用ワークフローで分足を R2 から DuckDB で直接読むと極端に遅かった(2時間で終わらず中止)。Tick は boto3 で一時ファイルに落としてから集計する方式で 1か月約1分

次回やること

  • J-Quants の契約を続けるか決める(解約する場合は R2・手元データの削除が必要)

2026-10-07

12:30 - Dots の探索レビュー、データ基盤の構築、ファミリー1〜4 の検証

やったこと

  • Dots の成果まとめ(~/Downloads/stock_strategy_review_2026-10-07.md)をレビューし、検出力不足・ユニバース選定・コスト仮定・データ未使用などを指摘
  • GPT(GPT-6 Astra)と三者議論(.devnotes/discussions/2026-10-07-strategy-research-review.md)。データ基盤と研究計画を修正して結論化
  • J-Quants → GitHub Actions → Cloudflare R2 のデータ基盤(src/jqdata)を実装。不変オブジェクト+カタログ+スナップショット、許可期間の読み出し(温存期間ガード)、応答・内容の検証、Bulk CSV 対応、毎日・週次の定期実行
  • R2 バケット・トークン(書き込み用/読み取り専用)と GitHub Secrets を設定し、分足2年・日足/銘柄一覧/財務情報5年を取り込み
  • 研究コード(research/)と仮説台帳を作成。基礎診断・ファミリー1(決算翌日)・2(日中モメンタム)・3(寄りギャップ)・4(夜間保有)を検証

決めたこと

  • Dots をやめ、Claude がこのリポジトリで探索する
  • 温存期間 2026-03〜08 は方式1(候補を1つに固定してから1回だけ評価)。「有望」の基準5つを事前に固定
  • 夜間保有は統計上有望(N3: 費用後 +25bp/晩、t=12.7)でもやらない(User の判断)

詰まったこと / 気づき

  • 再編前(2022-04-04 より前)の旧市場区分を落として診断の日数が欠けていた → 修正
  • GitHub Actions(Linux)で並列取得後に Python の終了処理が abort(134)→ 即時終了で対処
  • 手元の回線が遅いと R2 からのコピーが極端に遅い・タイムアウトする → 再試行設定と並列化、重い処理は Actions へ

最近のコミット

README

investment-strategy-research(投資戦略研究)

停止中(2026-10-09〜): J-Quants を解約するため探索とデータ取り込みを止め、規約に従って取得データを削除した(手元の data/、作業用ファイル、GitHub の Artifact と Secrets)。R2 バケット・R2 トークンの削除と J-Quants の解約も完了(2026-10-09)。研究コード・仮説台帳(research/LEDGER.md)・集計レポート(reports/)・.devnotes は残している。

再開するとき: ① J-Quants を再契約(Light + 分足・ティック)→ ② R2 バケットと書き込み用・読み取り専用トークンを作り直し、GitHub Secrets と .env を設定(下の「セットアップ」)→ ③ gh workflow enable ingest.yml と gh workflow enable research.yml → ④ Actions で backfill(all、続けて trades)→ ⑤ jqdata pull で手元にコピーして研究を再開。分足・Tick は再契約の時点から2年前までしか取れない。

概要

日本株の短期売買戦略を探すための研究基盤。J-Quants(Light + 株価分足・ティックアドオン)のデータを Cloudflare R2 に蓄積し、Mac や Claude Code(Web)から DuckDB で読む。方針の経緯は .devnotes/discussions/2026-10-07-strategy-research-review.md。

J-Quants API / Bulk CSV ──> GitHub Actions(書き込みはここだけ)──> Cloudflare R2(非公開バケット)
                                                                       ↑
                                          Mac / Claude Code から DuckDB で読む(読み取り専用キー)

保存するデータ

データセット 取得経路 取得可能期間 単位
minute(分足・全銘柄) 過去分は Bulk CSV、毎日は API 直近2年(ローリング) 1営業日1ファイル
daily(日足・全銘柄、調整係数つき) API Light で5年 1営業日1ファイル
master(銘柄一覧の日次スナップショット) API Light で5年 1営業日1ファイル
statements(財務情報、開示日時つき) API Light で5年 1暦日1ファイル(開示日)
trades(Tick) Bulk CSV のみ(月次ファイルだけ。当月分は翌月初めに入る) 直近2年 原本の CSV.gz をそのまま保存
calendar(営業日) API - 1ファイル(日付でマージ)

保存の仕組み

objects/{dataset}/{trade_date|disc_date}={日付}/{sha256先頭16桁}.parquet   データ本体(上書きしない)
raw/{Bulk のキー}(ハッシュつき)                                            Tick などの原本
catalog/{dataset}/{id}.parquet                                               データセットの現行版一覧
snapshots/{id}.json                                                          全データセットのカタログの組
CURRENT                                                                      現行スナップショット ID
  • データは上書きせず、内容が変わったら別のファイルとして増やす。カタログとスナップショットで「どれが現行か」を管理する
  • 研究では使ったスナップショット ID を記録する。後から同じ ID を指定すれば、同じデータで再現できる
  • 取得時に必須列・日付の一致・キーの重複を検証し、分足は日足と銘柄数を照合する。2営業日以上未配信なら Actions が失敗して通知が来る
  • 財務情報は暦日で取りに行き(休日の開示も拾う)、直近7日は毎回取り直す(速報→確報)。値は生の文字列のまま

読める期間(温存期間の保護)

  • 既定で読めるのは 2026-02-28 以前(開発期間)だけ
  • 2026-03-01〜2026-08-31 は最終評価用に温存しており、allow_holdout を明示しない限り読めない
  • 2026-09 以降は一部を既に見ているので、自動的には含めない。使うときは期間を明示する

J-Quants の利用条件(公式 FAQ より)

  • 本人だけが閲覧できる自己管理クラウド(この R2)への保存は可。バケットは公開しない
  • 生成AI(Claude Code 等)への入力は、本人の分析目的・学習に使われない設定・第三者が閲覧不可・結果を公開しない、の全条件を満たすこと
  • 解約・ダウングレードしたら、取得データとその複製、元データを復元できる派生物を削除する義務がある。R2 に貯めても永久には使えない

解約時の削除手順

  1. R2: バケット jquants-data の中身を全削除(Cloudflare ダッシュボード、または aws s3 rm --recursive を R2 のエンドポイントに対して実行)
  2. Mac: JQDATA_LOCAL_DIR(既定は ./data)を削除
  3. Claude Code(Web)等のクラウド環境に pull したデータがあれば削除
  4. 研究結果のうち、元データを復元できる細かさのもの(銘柄×分単位の表など)も削除する

セットアップ

1. Cloudflare R2

  1. Cloudflare ダッシュボード → R2 Object Storage を有効化(無料枠でも支払い方法の登録が必要)
  2. バケット jquants-data を作成(ロケーションは Asia-Pacific、公開アクセスは無効のまま)
  3. R2 → API トークンの管理で、バケット jquants-data に限定したトークンを2つ作る
    • 書き込み用: 「オブジェクトの読み取りと書き込み」→ GitHub Actions 用
    • 読み取り専用: 「オブジェクトの読み取り専用」→ Mac・Claude Code 用

2. GitHub Secrets(書き込み用トークン)

gh secret set JQUANTS_API_KEY
gh secret set R2_ACCOUNT_ID
gh secret set R2_ACCESS_KEY_ID
gh secret set R2_SECRET_ACCESS_KEY

それぞれ実行すると値の入力を求められる。

3. 手元の .env(読み取り専用トークン)

cp .env.example .env

.env に J-Quants の API キーと R2 の読み取り専用トークンを書く。.env は git 管理外。

使い方

uv run jqdata status                                   # 取り込み状況(現行スナップショット)
uv run jqdata probe minute --date 2026-10-06           # API の生レスポンスの形を確認(保存しない)
uv run jqdata bulk-list minute --from 2026-09-01       # Bulk CSV のファイル一覧とサイズ
uv run jqdata sql "SELECT count(*) FROM minute_bars WHERE Date = '2025-10-06'"
uv run jqdata pull --datasets minute daily             # R2 → ./data に開発期間分をコピー
uv run jqdata --store local sql "..."                  # コピー済みのローカルを読む

Python からは:

from jqdata.query import connect

con = connect()  # 開発期間のみ・現行スナップショット
df = con.sql("""
    SELECT * FROM minute_bars
    WHERE Date BETWEEN '2025-09-01' AND '2025-09-30' AND Code = '72030'
""").df()
con.sql("SELECT * FROM _meta").fetchall()  # 使ったスナップショット ID と期間を研究記録に残す

ビューは minute_bars / daily_bars / master / statements / calendar / _meta。

取り込み(GitHub Actions)

  • 毎日: 平日 17:45 JST(株価系)と 01:45 JST(財務情報の確報・取りこぼし補完)に jqdata daily。直近45日の欠けを埋めるので、1回失敗しても次で回復する
  • 毎週: 日曜 03:30 JST に jqdata recheck。Bulk の最終更新日時が変わったファイルを取り直し、中身が同じなら記録だけ更新する
  • 過去分: Actions タブ → 「J-Quants 取り込み」→ Run workflow で backfill とデータセットを選ぶ。済みの日は飛ばすので、時間切れで止まっても再実行で続きから進む
  • レート制限は分足アドオン・通常・財務情報がそれぞれ 60回/分。各 55回/分に抑えている

テスト

uv run pytest