オープンソースの本で学ぶクオンツ取引
オープンソースのクオンツ取引書が示す全九章の学習順序を解説します。初心者がつまずく段階と、米国株にも応用できる知識を紹介します。
オープンソースのクオンツ取引書は、無料で公開された学習シラバスです。生データから実際の発注まで、初心者が学ぶ順序に沿って一連の流れを記しています。xingwudaoがGitHubで公開している『XQuant: Everyone Can Be a Quantitative Trader』の原稿は、2026年8月時点で686スターを獲得した、明快な実例です。全九章で構成され、ほぼすべてのクオンツ教育課程がたどる道筋を示しています。本稿では、その道筋を段階ごとに追い、各段階に潜む具体的な失敗要因を示します。さらに、中国A株から米国株へ移行しても通用する部分を確認します。
オープンソースのクオンツ取引書には何が書かれているのか
初心者向けのシラバスからブランド名を外すと、次の五段階がこの順番で残ります。データを取得してクリーニングする。そこからシグナルを構築する。そのシグナルを過去データで検証する。投資額を決める。最後に注文を出し、コストを支払う。2026年7月14日のコミット 016b66e 時点で、XQuantの目次はこの内容を九章で扱っています。
- 準備、続いて第一章:戦略を一つ、最初から最後まで実行する。
- 第二章、何を買うか:三つのETFから始める。
- 第三章、いくら買うか:三つの配分手法を相互に比較する。
- 第四章、いつ取引するか:リバランス、ストップロス、テイクプロフィット。
- 第五章、戦略の良し悪しをどう判断するか:四つの視点。
- 第六章、早く喜んではいけない:過剰適合を防ぐ。
- 第七章、理想から現実へ:取引を執行する。
- 第八章、運用開始後の実務:モニタリング、診断、反復改善。
- 第九章、新たな機会を見つける:ファクターリサーチの入門。
章立ての順番は注目に値します。ポジションサイジングは第三章で扱われ、バックテストに関する二つの章より前に置かれています。ファクターリサーチは最後です。独学の進め方は通常、逆になります。まずファクターのアイデアを考え、次にバックテストを行い、ポジションサイジングのルールは設けないという流れです。付属の演習リポジトリは、同日時点で333スターを獲得しており、完成したコードではなく、文章で記述したタスク仕様を中心に構成されています。読者はAIアシスタントに、その仕様の実装を指示します。自分で書いていないコードを読む力が、以下のすべてを左右します。後に起きるそれぞれの失敗は、実装上の一つの細部に潜んでいるからです。
第1段階:データを取得し、対象銘柄群を定義する
データ処理で目に見えるのは、悪い約定記録、欠落セッション、株式分割や配当の調整です。どの銘柄を分析対象にするかを決める作業は目に見えません。しかし、戦略コードを一行も書く前に、ここで生存者バイアスが入り込みます。6月のある1週間に取引が成立した米国の全ティッカーを年ごとに抽出し、そのうち2026年の同じ週にも取引されていた銘柄数を確認します。
各数値の背後にある正確なSQL
WITH june_week AS (
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
ticker
FROM global_markets.delayed_stocks_minute_aggs
WHERE toMonth(toTimeZone(window_start, 'America/New_York')) = 6
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 16
AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2026
AND volume > 0
GROUP BY year, ticker
),
survivors AS (
SELECT ticker FROM june_week WHERE year = 2026
)
SELECT year,
uniqExact(ticker) AS tickers_traded,
uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors)) AS still_trading_2026,
round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors))
/ uniqExact(ticker), 1) AS still_trading_pct
FROM june_week
GROUP BY year
ORDER BY year2016のその週に取引された8224銘柄のうち、2026の同じ週にも取引されていたのは50%でした。残りは買収、合併、社名変更、または上場廃止となっています。現在の銘柄リストで構築したバックテストは、残った銘柄だけを分析します。そして、事後的に選ばれた企業を保有する戦略に報酬を与えることになります。初心者向けのフィードでは、注意書きなしにこの生存銘柄リストが渡されます。無料の株式市場データAPIガイドでは、こうしたフィードに含まれるデータと含まれないデータを解説しています。
第二段階:データをシグナルに変える
シグナルとは、ある時点で銘柄を評価するルールです。ファクターとは、多数の銘柄に同時に有効だと考えるシグナルです。モメンタム、バリュー、低ボラティリティが典型例です。
この段階での失敗は、機能するまでルールを検証し続けることです。一つの指数の十年間のデータで移動平均クロスオーバーを二十通り試せば、必ず一つは最も良い結果になります。しかし、そのルールはノイズに最も適合しただけです。
対策は地味です。測定する前にルールを固定します。決して見ない期間を過去データから切り分けます。試したすべてのバリエーションを記録します。調整可能な数値は少ない方を優先します。XQuantはファクター研究に先立ち、この点を一章丸ごと使って説明しています。この順序が適切です。
ステージ三:バックテスト。ここでほとんどの初心者は止まります
独学のプロジェクトの多くは、この段階で終わります。しかも、見栄えのよいエクイティカーブを残して静かに終わります。上で説明したサバイバーシップ・バイアスが、二つある誤りの一つ目です。二つ目はルックアヘッド・バイアスです。これは、注文を出す時点までに市場がまだ届けていなかった数値を、戦略が使うことです。最も一般的なのは、当日の終値からルールを計算し、その同じ終値で約定させるケースです。その仮定が飛ばしている距離を測定してください。
各数値の背後にある正確なSQL
WITH sessions AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMin(open, window_start) AS session_open,
argMax(close, window_start) AS session_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'NVDA')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
gaps AS (
SELECT ticker,
session,
toFloat64(session_open) AS open_px,
toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
FROM sessions
)
SELECT formatDateTime(toStartOfMonth(session), '%Y-%m') AS month,
formatDateTimeInJodaSyntax(toStartOfMonth(session), 'MMMM yyyy') AS month_label,
round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'SPY'), 1) AS spy_gap_bps,
round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'NVDA'), 1) AS nvda_gap_bps
FROM gaps
WHERE prev_close > 0
GROUP BY month, month_label
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'NVDA') > 0
ORDER BY monthJuly 2026では、ある終値から次の始値までの平均的な距離は、SPYで40.8ベーシスポイント、NVDAで107.4ベーシスポイントでした。ベーシスポイントは、パーセントポイントの百分の一です。August 2024から始まるパネル上の全24カ月は、ゼロを上回っています。終値で判断し、その終値で約定させるバックテストは、すべての取引でこの距離を無料で得ます。しかし、実際の注文でそのようなことは起こりません。バックテストにおけるルックアヘッド・バイアスではその仕組みを分解し、株価が夜間にギャップを形成する理由ではギャップ自体を説明しています。
ステージ四:購入額を決める
ここで欠けているのは、ルールです。独学のトレーダーの多くは、ポジションサイズのルールを書き出しません。そのため、意図せずルールを持つことになります。通常は、銘柄ごとに同額を投じるか、使える現金を投じるというものです。同額投資は、同一のリスクを意味しません。
各数値の背後にある正確なSQL
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(close, window_start) AS session_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'AAPL', 'NVDA', 'TSLA', 'COIN')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
rets AS (
SELECT ticker,
toFloat64(session_close) AS close_px,
toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
FROM daily
)
SELECT ticker,
round(stddevSamp(close_px / prev_close - 1) * sqrt(252) * 100, 1) AS annualized_vol_pct,
round(abs(min(close_px / prev_close - 1)) * 100, 2) AS worst_day_pct
FROM rets
WHERE prev_close > 0
GROUP BY ticker
ORDER BY annualized_vol_pct DESC2026年7月31日までの十二カ月間で、COINの年率換算ボラティリティは68%でした。一方、パネル内で変動が最も小さかったSPYは12.7%でした。COINの最悪の一セッションの終値は、前日終値を13.34%下回りました。これに対し、SPYの最悪の日は2.69%でした。各銘柄に同額を投じても、日々の値動きは大きく異なります。初心者が実際に経験するのは、シグナルではなく、この値動きです。Kelly基準によるポジションサイジングでは、正式な解決策の一つを説明しています。また、集中投資リスクでは、非公式な解決策の形を示しています。
第五段階:執行とバックテストが見落とすコスト
目に見えるコストは一つです。手数料と規制関連手数料は取引明細に表示されます。一方、スリッページは表示されません。これは画面上の価格と、実際に約定する価格との差です。その下限はbid-ask spreadです。これは、その時点での最良の買い気配と最良の売り気配の差を指します。買い手はaskで買い、売り手はbidにぶつけて売るため、往復取引ではspreadを二度またぎます。spreadは一定ではありません。
各数値の背後にある正確なSQL
WITH quotes AS (
SELECT ticker,
toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,
toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'KO')
AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')
AND sip_timestamp < toDateTime('2026-07-17 21:00:00')
AND bid_price > 0
AND ask_price > bid_price
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,
round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps
FROM quotes
WHERE spread_bps > 0 AND spread_bps < 500
GROUP BY et_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY et_timeこのパネルは、ある金曜日の半時間区分16個を対象としています。始値の鐘が鳴る前の09:00区分から、取引終了後の16:30区分までです。最初の区分でAAPLの気配幅は10.53ベーシスポイント、最後の区分では3.27でした。KOはそれぞれ28.87と8.04でした。その日の最も狭い気配は、チャート中央の両端の間にあります。市場で最も流動性の高い銘柄の一つで始値取引を行う戦略は、同じ戦略を昼間に実行する場合とは異なるコストを負担します。コストをゼロと仮定するバックテストは、どちらのコストも適切に反映しません。bid-ask spreadとはが数値を定義し、始値でspreadが拡大する理由が曲線を説明し、株式の取引コストが往復取引全体を積み上げます。クリーンなバックテストと実資金の運用の間には、もう一つ段階があります。実資金を投じる前のペーパートレーディングです。
A株カリキュラムのどの部分が米国株に応用できるか
XQuantとその類似手法は、中国A株とETF向けに書かれています。手法の骨格はそのまま応用できます。ステージの順序、定義、過学習を避ける規律、コストを後付けではなく項目として記載する習慣、そしてポジションサイズ計算のすべてです。価格バーはどの市場でも価格バーです。応用できないのは、それを取り巻くルールです。
- A株には実質的なT+1規制があります。当日買った株式は、次のセッションまで売却できません。米国のT+1は決済慣行であり、日中取引を妨げません。ただし、パターン・デイトレーダー規則により、25,000ドル未満の証拠金口座では、5営業日以内のデイトレードが3回までに制限されます。
- A株のメインボードは、1日の値動きが10%で制限されます。グロースボードでは20%です。米国株に日次の値幅制限はありません。代わりに、ボラティリティバンドやニュースによる取引停止が適用されます。
- A株の注文は100株単位で取引されます。米国の多くのブローカーは端株を約定させるため、ポジションサイズのルールで表現できる内容自体が変わります。
- 中国では売り側に印紙税がかかります。米国の売り手は、規模も仕組みも異なる少額の規制手数料を支払います。
- セッション構成も異なります。上海・深圳には昼休みがあります。米国株式市場の取引時間は連続しており、引けはクロージングオークションで終了します。
講座からコストや時間に関する定数を自分のコードへそのままコピーすると、最初の実売買で不具合になります。
READMEではなく参照先を固定する
2026年8月時点で、このリポジトリにはタグ付きリリースがありません。そのため、永続的に参照できる引用元は、2026年7月14日付のコミット 016b66e です。執筆途中の書籍では、これは重要です。章番号は変わり、READMEファイルは書き換えられ、見出しも移動します。第七章を指していたリンクが、いつの間にか別の内容を指すこともあります。コミットと日付を引用し、番号ではなく読んだ章のタイトルを記録すれば、1年後でもノートを検証できます。原稿は CC BY-NC-SA 4.0で公開され、ビルドスクリプトには MITライセンスが適用されています。この原則自体が、シラバスの最後の教訓でもあります。固定したデータスナップショットから再実行できない戦略は、結果ではなく単なる物語です。
FAQ
無料のオープンソース書籍でクオンツ取引を学べますか?
全体像を把握する目的なら可能です。オープンな原稿なら、すべての主張を出典と照合できます。ただし、書籍では自分の市場のデータ、コスト、規則までは用意できません。ここで、特定の取引所向けに書かれたカリキュラムと、利用するブローカーの実務とのずれが生じます。
クオンツのカリキュラムで、初心者が最もつまずきやすい段階はどこですか?
バックテストです。そこには結果を実際以上に良く見せる二つの誤りがあります。事後的に構成した銘柄ユニバースによるサバイバーシップ・バイアスと、まだ価格が付いていない時点の価格で約定させる先読みバイアスです。50%のティッカーだけが、2016の六月のその週に取引されており、その後十年間も取引を続けていました。
サバイバーシップ・バイアスと先読みバイアスの違いは何ですか?
サバイバーシップ・バイアスは、検証対象の銘柄が存続した銘柄に偏っているという、ユニバースの問題です。先読みバイアスは、注文を出すはずだった時点ではまだ存在しなかった数値を戦略が使うという、タイミングの問題です。前者は銘柄群を実際以上に良く見せ、後者は約定価格を実際以上に良く見せます。
中国A株向けのクオンツ講座は米国株にも有効ですか?
手法は有効です。ただし、市場の規則は異なります。段階の順序、過剰適合を避ける規律、コスト計算は維持してください。そのうえで、資金を動かす前に、データ処理、T+1の売却制限、日々の値幅制限、売買単位を米国市場の相当する仕組みに置き換えます。
上記の各パネルは、下部にSQLを備えた保存済みクエリです。パネルを開き、ティッカーまたは日付を入れ替えて、Strasmore terminalで自分で実行してください。