セルフホスト型A株クオンツ基盤の仕組みと確認点
自分のマシンでスクリーニングやバックテストを行うA株クオンツ基盤について、実際の依存関係と最初に確認すべき四つの点を解説します。
セルフホスト型のA株クオンツ・ワークベンチとは、証券会社の端末ではなく自分で管理するマシン上で、市場のスクリーニング、銘柄リストの監視、バックテスト、引け後のレビュー作成を一つのWebページで行う仕組みである。MITライセンスのプロジェクトであるtickflow-stock-panelは、これらの機能を単一ポートの背後にまとめている。2026年8月時点で、GitHubのスターはおよそ2,800件に達していた。機能一覧は簡単に読める。だが、その下にあるレイヤーが、来四半期にも機能し続けるかどうかを左右する。
自前運用のA株クオンツ・ワークベンチの構成
アーキテクチャは、頭の中で把握できるほど簡潔だ。2026年8月のコミット時点のコードとドキュメントを読むと、次の構成になっている。
- ReactとTypeScriptで構築したWebページ。
- FastAPIによるPythonサービス。タイマーでデータを更新するスケジューラーを備える。
- ローカルストア。ディスク上のParquetファイルをDuckDBでクエリし、Polarsで計算する。
- これらのファイルを参照するバックテストエンジン、vectorbt。
- パネルに表示するすべての価格を取得するベンダーSDK。
欠けているものにも注目したい。この構成のどこにも、取引所へ接続する機能はない。パネルが計算し、ベンダーがデータを供給する。「自前運用」とはコードを実行する場所を示す言葉であり、数値の出所を示すものではない。生のバーを保有する役割を担うのは、その下層にあるローカルA株マーケットデータレイクである。これがあるからこそ、その上の各コンポーネントを置き換えられる。
データソースの無料プランで利用できる範囲
パネルが参照できるデータは、1つの環境変数で決まります。ベンダーキーを空欄にすると、ドキュメントでいうNoneモードでプロジェクトが動作します。無料エンドポイントから過去の日足データを取得できますが、当日のセッションのデータが反映されるのは大引けから1〜2時間後です。キーを入力すると、有料プランに応じてアクセス範囲が広がります。これは日次の作業には使える無料プランですが、日中取引には明確な制約となります。しかも、その条件はベンダーが更新時に変更する可能性があります。
メンテナーは、この関係を明確に説明しています。
本プロジェクトは学習およびクオンツ研究のみを目的としており、投資助言を構成するものではありません。バックテストの結果は将来の収益を示すものではありません。
本プロジェクトは個人によるオープンソースプロジェクトであり、TickFlowのデータソースを利用していますが、TickFlowの公式プロジェクトではありません。
README、shy3130/tickflow-stock-panel、2026年8月13日閲覧
つまり、このプロジェクトは学習とクオンツ研究を目的とし、「投資助言を構成するものではない」と明記しています。バックテストの結果は将来の収益を示さず、「TickFlowの公式プロダクトではない個人のオープンソースプロジェクト」です。この種の仕組み全体から得られる重要な教訓は、ここにあります。Zero-opsにより、運用作業を手元から減らすことはできます。しかし依存関係は変わりません。このパネルのサポートを約束していない企業から、データを借りている状態が続きます。READMEは利用目的を学習と研究に限定しています。一方、ライセンスファイルはMITライセンスです。
バージョン番号ではなくコミットSHAを固定する理由
コミットSHAは、保存された変更ごとにgitが割り当てる40文字のフィンガープリントである。コードの特定の状態を一つだけ、恒久的に示す。
2026年8月13日に確認した時点で、このリポジトリのGitHub Releasesページには何もなかった。一方、v0.1.31からv0.1.88まで、31個のバージョンタグが付いている。ただし番号には欠落があり、ノートも添付されていない。最新のタグが指していたのは2026年7月31日付のコミットだった。デフォルトブランチは、すでに2026年8月6日付の作業へ進んでいた。ブランチより古く、ノートもないタグでは、何を取得するのか判断できない。
そのため、SHAを記録しておく必要がある。2026年8月6日時点のデフォルトブランチの先頭はecfddb451e97f6fc9a7e43ac33e4ef0e69933b33だった。そのコミットをチェックアウトし、バックテストから導いた結論の横に記録しておくべきである。六週間後に「最新版を実行した」と言っても、何を指すのか分からない。
文書に記載された開始手順は二行である。サンプル環境ファイルを.envへコピーし、次にdocker compose up --buildを実行する。これにより、ポート3018でパネルが起動する。これは、そのコミット時点でのメンテナーの指示であり、検証済みの手順ではない。ビルドではイメージを取得するため、このページではネットワーク接続を確認していない。開発環境の手順(./dev.sh、Windowsでは.\dev.ps1)では、Python 3.11以降、Node 20以降、およびuvとpnpmのパッケージマネージャーが必要になる。
LLM戦略機能が送信する内容と送信先
戦略の生成、個別銘柄のコメント、レビュー記事の作成は任意です。AI_API_KEYを空欄にすると、機能全体が停止します。入力すると、AI_PROVIDER(OpenAI互換エンドポイントまたはOllama)、AI_BASE_URL、AI_MODEL、AI_DAILY_TOKEN_BUDGETも設定されます。AI_DAILY_TOKEN_BUDGETは、その日のトークン使用枠を使い切ると呼び出しを停止します。
送信先は重要です。プロンプトと、パネルが付加する関連情報は、設定したエンドポイントへ端末外に送信されます。ベースURLをホステッドAPIに指定すると、リクエストはその提供会社に送られます。自ネットワーク上のランタイムを指定すれば、データは外部に出ません。パネルを自前でホスティングしても、モデルまで自前運用になるわけではありません。APIキーはプロジェクトルートの平文ファイル.envに保存され、ダッシュボードのパスワードで保護された設定ページからも編集できます。パスワードは最低六文字です。LLM生成アルファファクターに関する解説では、機械生成の戦略が機能しなくなりやすい場面を説明しています。
バックテスターは取引コストをモデル化しているか
このバックテスターは、T+1処理、手数料、スリッページ、損切りに対応すると謳っています。これらのスイッチが存在することと、実際に設定されていることは同じではありません。約定価格を表示された終値とし、コストをゼロにしたバックテストは、取引が無料だと仮定しているのと同じです。実際には無料ではありません。ベーシスポイントは1%の100分の1です。下のパネルは、2026年6月17日の昼間の1時間について、米国上場銘柄六銘柄の最良買い気配と最良売り気配の平均差をベーシスポイントで示しています。
各数値の背後にある正確なSQL
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price) - toFloat64(bid_price))
/ avg((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, 2) AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
AND sip_timestamp >= toDateTime('2026-06-17 15:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-17 16:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bpsパネル内でスプレッドが最も狭かった銘柄はSPYで、この1時間の平均は0.29bpsでした。最も広かったFは、6.98bpsでした。この差を、買い付け時と売却時の二度またぐことになります。したがって、手数料を除いても往復取引のコストは、表示された数値のおよそ二倍です。
銘柄の選択と同じく、タイミングもコストを左右します。次のパネルでは、これらの銘柄の一つを取り上げ、同じ日の値動きを30分単位に集計し、1分間に価格がどれだけ動いたかを測定しています。
各数値の背後にある正確なSQL
SELECT
formatDateTime(
toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
'%H:%i') AS et_time,
round(avg((toFloat64(high) - toFloat64(low)) / toFloat64(close)) * 10000, 1) AS range_bps
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= toDateTime('2026-06-17 12:00:00', 'UTC')
AND window_start < toDateTime('2026-06-17 21:00:00', 'UTC')
AND volume > 0
AND close > 0
GROUP BY et_time
ORDER BY et_timeパネルは、通常取引開始前の08:00から始まります。この時間帯の1分足の平均的な値幅は0bpsでした。取引が成立した分足は、すべて単一の価格にとどまっていました。最後の時間帯である16:30は取引終了後に位置し、平均は4.2bpsでした。バックテストでは、これらの値幅の中から一点を選び、それを約定価格とみなします。両端の数値ではなく、曲線全体を確認してください。同じ仮定でも、時間帯によって有利にも不利にもなります。A株のルールも影響します。T+1により、当日購入した株式は翌取引セッションまで売却できません。また、日々の値幅制限によって、モデル上の売却機会が完全に失われることもあります。実行可能な再現可能なバックテストの設定で記録すべき項目については、当社の解説で確認できます。見た目のきれいな曲線が別の形で崩れる原因については、先読みバイアスをご覧ください。
調整済みか未調整か:データの出所を確認する
企業アクションは、スクリーナーが気付かれないまま誤解を招く箇所です。一対十の株式分割を実施した銘柄は、誰も一セントも失っていないのに、その日に九〇%下落したように表示されます。下表は、2026年1月1日から8月13日までに米国市場へ上場する銘柄で実施された、規模の大きい先行株式分割十二件を示しています。
各数値の背後にある正確なSQL
SELECT
ticker AS symbol,
formatDateTime(execution_date, '%b %e, %Y') AS effective_on,
round(any(toFloat64(split_to)) / any(toFloat64(split_from)), 2) AS shares_after_per_share
FROM global_markets.stocks_splits
WHERE execution_date >= toDate('2026-01-01')
AND execution_date <= toDate('2026-08-13')
AND split_from > 0
AND split_to > split_from
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
ORDER BY shares_after_per_share DESC, execution_date DESC
LIMIT 12最大の分割では、一株が10000株になります。効力発生日はFeb 10, 2026です。この規模の分割は、一般的な四対一の分割ではありません。コーポレートアクションのフィードでは、分割比率の全範囲が一つの列に格納されます。十二件のうち最小の分割でも、一株を20株に変えるため、未調整チャートでは暴落のように見えます。未加工の価格を使うモメンタム・スクリーナーでは、これらすべてが暴落銘柄として検出されます。中国向けのフィードでも同じ問題があり、各系列を未調整、先行調整、遡及調整の三種類で配信しています。パネルに読み込まれているデータがどれかを確認してください。株式分割調整済み価格履歴では、計算方法を説明しています。
このようなシステムを自前運用する前に確認すべき点
- データの出所。どのベンダーのデータか、どのライセンスに基づくか、無料プランが想定する用途をカバーしているかを確認する。
- APIキーの管理。キーがディスク上のどこに保存されるか、設定ページにアクセスできるのは誰か、マシンが自分のネットワーク外に公開されていないかを確認する。
- コストのモデル化。バックテスターが手数料、スリッページ、市場固有のルールを織り込んでいるか、それらを指定しない場合に各項目へどの値が入るかを確認する。
- 更新経路。デプロイした正確なコミットを結果と併記し、数カ月後でも再現できるようにする。
よくある質問
A株向けのセルフホスト型クオンツ・ワークベンチは無料で運用できますか?
コードはMITライセンスで、無料です。データは別の問題です。ベンダーキーを空欄にすると、このプロジェクトは無料の過去日足データに切り替わります。当日の取引セッションのデータが届くのは、引けの一〜二時間後です。これより速いデータや、より詳細なデータは、ベンダーの有料プランを利用します。
ここでいうセルフホストとは、実際には何を意味しますか?
Webページ、スケジューラー、保存ファイル、バックテスターがすべて自分のマシンまたはサーバー上で動き、他社のプラットフォームにアカウントを作成する必要がないという意味です。データの所有権まで自分に移るという意味ではありません。また、オプションのAI機能は、自分のネットワーク上のモデルを指定しない限り、リモートで動作します。
LLM機能はデータを第三者へ送信しますか?
有効にした場合は送信します。送信先は、設定したOpenAI互換エンドポイントです。この機能は初期状態では無効です。AIキーを空欄にしておけば、データがマシンの外へ出ることはありません。
バージョンタグではなく、コミットSHAを固定するのはなぜですか?
2026年8月13日時点で、このリポジトリには公開リリースもリリースノートもありませんでした。最新のタグが指していたコードも、デフォルトブランチより古いものでした。その場合、「Latest」はクローンした日にブランチに存在した内容を意味します。一方、コミットSHAは対象を正確に指定できます。同じ考え方は、オープンソースのクオンツ取引資料全般にも当てはまります。実行したものを固定してください。
検証メモ
上記のアーキテクチャと設定に関する詳細は、2026年8月13日に公開リポジトリから確認しました。対象はコミットecfddb451e97f6fc9a7e43ac33e4ef0e69933b33で、デフォルトブランチの先端にあり、日付は2026年8月6日です。Releasesページには何も掲載されていませんでした。タグ一覧にはv0.1.31からv0.1.88まで31個のバージョンタグがあり、最新タグは2026年7月31日付のコミットを指していました。引用部分はメンテナー自身の記述で、要約ではなくREADMEからそのまま転載しています。コンテナの起動コマンドもREADMEからの引用であり、ここでは実行していません。
市場パネルは米国上場銘柄を対象とし、数値を固定するため、過去の特定日を指定しています。目的は中国市場の説明ではありません。どの市場にも適用できる二つの確認事項、すなわち執行コストとコーポレートアクション調整を示すためのものです。
このページの各パネルには、結果を生成したSQLが付属しており、下に展開できます。スクリーナーに組み込む前に、自分の銘柄リスト全体で同じスプレッド検証を実行する場合は、Strasmoreターミナルで平易な英語にして依頼してください。