mcpField
P
pair-trade-screener

pair-trade-screener

github.com/tradermontyその他3.4k3.5k 回インストール2 日前に更新
リポジトリ

pair-trade-screener について

pair-trade-screenerは、統計的アービトラージのペアを探して評価するPythonスキルです。相関と共和分の検定で銘柄を絞り、スプレッドのシグナル、ヘッジ比率、リスク指標を分析します。

主な機能

  1. 01セクターまたは指定銘柄のスクリーニング
  2. 02相関と共和分の検定
  3. 03スプレッドのZスコアと平均回帰分析
  4. 04エントリー、決済、損切りの基準
  5. 05ヘッジ比率とポジションサイズの算出
  6. 06JSONのペア結果と分析レポート

活用シーン

  1. 01セクター内のトレード候補ペアを検索
  2. 022銘柄間の共和分関係を検証
  3. 03スプレッドの乖離と売買シグナルを評価
  4. 04マーケットニュートラル運用のヘッジ規模を見積もる

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tradermonty/claude-trading-skills --skill pair-trade-screener

インストール後、Claude Code で/pair-trade-screenerを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
requirements.txt
references/
cointegration_guide.md
methodology.md
scripts/
analyze_spread.py
find_pairs.py
statsmodels_support.py
scripts/tests/
conftest.py
test_find_pairs_screener.py
test_pair_statistics_and_cli.py
test_pair_trade_coverage.py

詳細

ペアトレードスクリーナー

概要

このスキルは、ペアトレードを通じて統計的裁定取引の機会を特定し、分析します。ペアトレードは、市場全体の方向にかかわらず、相関する2つの証券の相対的な価格変動から利益を得るマーケットニュートラル戦略です。このスキルでは、相関分析や共和分検定などの厳密な統計手法を使用して、信頼性の高い取引ペアを見つけます。

主な手法:

  • 相関が高く、セクターや業種へのエクスポージャーが類似する株式のペアを特定します
  • 共和分(長期的な統計的関係)を検定します
  • スプレッドのZスコアを計算して、平均回帰の機会を特定します
  • 統計的な閾値に基づいてエントリー/エグジットシグナルを生成します
  • マーケットニュートラルなエクスポージャーのポジションサイズを提示します

主な利点:

  • マーケットニュートラル:上昇相場、下落相場、横ばい相場のいずれでも利益を狙えます
  • リスク管理:市場全体の動きへのエクスポージャーを抑えられます
  • 統計的基盤:裁量ではなく、データに基づきます
  • 分散効果:従来のロングオンリー戦略とは相関しません

このスキルを使用する場面

次の場合にこのスキルを使用します:

  • ユーザーが「ペアトレードの機会」を求めている
  • ユーザーが「マーケットニュートラル戦略」を希望している
  • ユーザーが「統計的裁定取引のスクリーニング」を依頼している
  • ユーザーが「一緒に動く株式はどれか」と尋ねている
  • ユーザーがセクターエクスポージャーのヘッジを希望している
  • ユーザーが平均回帰を狙うトレードアイデアを求めている
  • ユーザーが相対価値取引について尋ねている

ユーザーからの依頼例:

  • 「テクノロジーセクターでペアトレードの機会を見つけて」
  • 「共和分関係にある株式はどれですか?」
  • 「統計的裁定取引の機会をスクリーニングして」
  • 「平均回帰するペアを見つけて」
  • 「今、良いマーケットニュートラル取引は何ですか?」

前提条件

  • Python 3.9 以降
  • 企業スクリーナーと過去価格のエンドポイントを利用できる FMP API キー
  • ADF と自己回帰の計算に使用する statsmodels>=0.14,<0.15

コマンドラインやコミット済みファイルに API キーを記載せずに設定します:

export FMP_API_KEY="<fmp-api-key>"

統計関連の依存関係をコマンドに分離し、リポジトリのルートからスクリプトを実行します:

uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/find_pairs.py \
  --symbols AAPL,MSFT \
  --output /tmp/pair-trade/pairs.json

分析ワークフロー

ステップ 1:ペアの対象範囲を定義する

目的: ペア関係を分析する株式の候補群を設定します。

オプション A:セクター別スクリーニング(推奨)

スクリーニング対象のセクターを選択します:

  • テクノロジー
  • 金融
  • ヘルスケア
  • 一般消費財
  • 資本財
  • エネルギー
  • 素材
  • 生活必需品
  • 公益事業
  • 不動産
  • コミュニケーション・サービス

オプション B:カスタム株式リスト

ユーザーが分析する特定のティッカーを指定します:

Example: ["AAPL", "MSFT", "GOOGL", "META", "NVDA"]

オプション C:業種別

セクター内の特定の業種に対象を絞ります:

  • 例:テクノロジーセクターの「ソフトウェア」
  • 例:金融セクターの「地方銀行」

フィルタリング条件:

  • 最低時価総額:20億ドル(中型株以上)
  • 最低平均売買高:1日あたり100万株(流動性要件)
  • 活発な取引:上場廃止または取引停止中の株式は除外します
  • 同一取引所を優先:取引所をまたぐことによる複雑さを避けます
ステップ 2:過去の価格データを取得する

目的: 相関分析と共和分分析のための価格履歴を取得します。

データ要件:

  • 期間:2年間(最低252取引日)
  • 頻度:日次終値
  • 調整:株式分割と配当を反映
  • クリーンなデータ:欠損や欠落がないこと

FMP API エンドポイント:

GET /v3/historical-price-full/{symbol}?apikey=YOUR_API_KEY

データの検証:

  • すべてのシンボルの日付範囲が一致していることを確認します
  • 欠損データが10%を超える株式を除外します
  • 軽微な欠損は前方補完方式で補完します
  • データ品質の問題を記録します

スクリプトの実行:

uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/find_pairs.py \
  --sector Technology \
  --lookback-days 730 \
  --output /tmp/pair-trade/technology.json
ステップ 3:相関とベータの計算

目的: 強い線形関係を持つ候補ペアを特定します。

相関分析:

対象銘柄群の各銘柄ペア(i、j)について:

  1. ピアソン相関係数(ρ)を計算します
  2. 安定性を確認するため、ローリング相関(90 日間のウィンドウ)を計算します
  3. ρ >= 0.70 のペア(強い正の相関)に絞り込みます

相関の解釈:

  • ρ >= 0.90:非常に強い相関(最良の候補)
  • ρ 0.70-0.90:強い相関(有望な候補)
  • ρ 0.50-0.70:中程度の相関(候補としてはやや弱い)
  • ρ < 0.50:弱い相関(除外)

ベータの計算:

各候補ペア(銘柄 A、銘柄 B)について:

Beta = Covariance(A, B) / Variance(B)

ベータはヘッジ比率を示します:

  • ベータ = 1.0:同額の投資
  • ベータ = 1.5:A に 1.00 ドル投資するごとに、B に 1.50 ドル投資
  • ベータ = 0.8:A に 1.00 ドル投資するごとに、B に 0.80 ドル投資

相関の安定性チェック:

  • 複数の期間(6mo、1yr、2yr)にわたって相関を計算します
  • 相関が安定している(悪化していない)ことを確認します
  • 最近の相関が過去の相関を 0.15 超下回るペアにフラグを付けます
ステップ 4:共和分検定

目的: 長期的な均衡関係を統計的に検証します。

共和分が重要な理由:

  • 相関は短期的な連動性を測定します
  • 共和分は長期的な均衡関係を示します
  • 共和分関係にあるペアは、予測可能な形で平均回帰します
  • 共和分関係にないペアは、恒久的に乖離する可能性があります

拡張ディッキー・フラー(ADF)検定:

相関のある各ペアについて:

  1. スプレッドを計算します:Spread = Price_A - (Beta × Price_B)
  2. スプレッド系列に対して ADF 検定を実行します
  3. p 値を確認します:p < 0.05 は共和分を示します(単位根の帰無仮説を棄却)
  4. 強さの順位付けに使用する ADF 統計量を取得します

共和分の解釈:

  • p-value < 0.01:非常に強い共和分(★★★)
  • p-value 0.01-0.05:中程度の共和分(★★)
  • p-value > 0.05:共和分なし(除外)

半減期の計算:

平均回帰の速度を推定します:

Half-Life = -log(2) / log(mean_reversion_coefficient)
  • 半減期 < 30 日:平均回帰が速い(短期取引に適しています)
  • 半減期 30-60 日:中程度の速度(標準的)
  • 半減期 > 60 日:平均回帰が遅い(保有期間が長くなります)

Python での実装:

from statsmodels.tsa.stattools import adfuller

# Calculate spread
spread = price_a - (beta * price_b)

# ADF test
result = adfuller(spread)
adf_stat = result[0]
p_value = result[1]

# Interpret
is_cointegrated = p_value < 0.05
ステップ 5:スプレッド分析と Z スコアの計算

目的: 均衡状態からの現在のスプレッドの乖離を定量化します。

スプレッドの計算:

一般的な方法は 2 つあります。

方法 1:価格差(加法)

Spread = Price_A - (Beta × Price_B)

最適な用途:価格水準が近い銘柄

方法 2:価格比(乗法)

Spread = Price_A / Price_B

最適な用途:価格水準が異なる銘柄。解釈が容易です

Z スコアの計算:

スプレッドが平均から標準偏差いくつ分離れているかを測定します:

Z-Score = (Current_Spread - Mean_Spread) / Std_Dev_Spread

Z スコアの解釈:

  • Z > +2.0:B と比べて銘柄 A が割高(A をショートし、B をロング)
  • Z > +1.5:やや割高(エントリーのタイミングを確認)
  • Z -1.5 to +1.5:通常の範囲(取引なし)
  • Z < -1.5:やや割安(エントリーのタイミングを確認)
  • Z < -2.0:B と比べて銘柄 A が割安(A をロングし、B をショート)

過去のスプレッド分析:

  • 90 日間のローリングウィンドウで平均と標準偏差を計算します
  • 過去の Z スコア分布をプロットします
  • 過去の Z スコアの最大乖離を特定します
  • 構造変化(スプレッドのレジーム変化)を確認します
ステップ 6:エントリー/エグジットの推奨事項を生成

目的: 明確なルールに基づく、実行可能な取引シグナルを提示します。

エントリー条件:

保守的なアプローチ(Z ≥ ±2.0):

LONG Signal:
- Z-score < -2.0 (spread 2+ std devs below mean)
- Spread is mean-reverting (cointegration p < 0.05)
- Half-life < 60 days
→ Action: Buy Stock A, Short Stock B (hedge ratio = beta)

SHORT Signal:
- Z-score > +2.0 (spread 2+ std devs above mean)
- Spread is mean-reverting (cointegration p < 0.05)
- Half-life < 60 days
→ Action: Short Stock A, Buy Stock B (hedge ratio = beta)

積極的なアプローチ(Z ≥ ±1.5):

  • しきい値を下げて、取引頻度を高めます
  • 勝率は高くなりますが、取引ごとの平均利益は小さくなります
  • より厳格なリスク管理が必要です

エグジット条件:

主なエグジット:平均回帰(Z = 0)

Exit when spread returns to mean (z-score crosses 0)
→ Close both legs simultaneously

二次エグジット:利益の一部確定

Exit 50% when z-score reaches ±1.0
Exit remaining 50% at z-score = 0

損切り:

Exit if z-score extends beyond ±3.0 (extreme divergence)
Risk: Possible structural break in relationship

期間に基づくエグジット:

Exit after 90 days if no mean-reversion
Prevents holding broken pairs indefinitely
ステップ 7:ポジションサイジングとリスク管理

目的: マーケットニュートラルなエクスポージャーの金額を決定します。

マーケットニュートラルなサイジング:

ベータ = β のペア(株式 A、株式 B)の場合:

ドルエクスポージャーを均等にする:

If portfolio size = $10,000 allocated to this pair:
- Long $5,000 of Stock A
- Short $5,000 × β of Stock B

Example (β = 1.2):
- Long $5,000 Stock A
- Short $6,000 Stock B
→ Market neutral, beta = 0

ポジションサイジングに関する考慮事項:

  • ペアごとの配分総額:ポートフォリオの 10~20%
  • ペアの最大数:分散投資のため、アクティブなペアは 5~8 組
  • ペア間の相関:相関の高いペアは避けます

リスク指標:

  • ペアごとの最大損失:ポートフォリオ全体の 2~3%
  • 損切りのトリガー:Z スコア > ±3.0、またはスプレッドで -5%の損失
  • ポートフォリオ全体のリスク:全ペアのリスク合計 ≤ 10%
ステップ 8:ペア分析レポートを生成する

目的: 分析結果と推奨事項をまとめた、構造化された Markdown レポートを作成します。

レポートのセクション:

  1. エグゼクティブサマリー

    • 分析したペアの総数
    • 見つかった共和分ペアの数
    • 統計的な強さで順位付けした上位 5 件の機会
  2. 共和分ペアの表

    • ペア名(株式 A / 株式 B)
    • 相関係数
    • 共和分の p 値
    • 現在の Z スコア
    • 取引シグナル(ロング/ショート/なし)
    • 半減期
  3. 詳細分析(上位 10 ペア)

    • ペアの説明
    • 統計指標
    • 現在のスプレッドポジション
    • エントリー/エグジットの推奨事項
    • ポジションサイジング
    • リスク評価
  4. スプレッドチャート(テキスト形式)

    • 過去の Z スコアプロット(ASCII アート)
    • エントリー/エグジットの水準を表示
    • 現在のポジションを示す指標
  5. リスクに関する警告

    • 相関が悪化しているペア
    • 検出された構造変化
    • 流動性の低さに関する警告

ファイル名の規則:

pair_trade_analysis_[SECTOR]_[YYYY-MM-DD].md

例:pair_trade_analysis_Technology_2025-11-08.md

出力

find_pairs.py は指定された親ディレクトリを作成し、metadata と pairs キーを含む JSON オブジェクトを 1 つ書き込みます。各ペアには、相関、ヘッジ比率、ADF 結果、半減期、現在の Z スコア、シグナル、生成タイムスタンプが含まれます。進捗状況と順位付けした概要は stdout に書き込まれます。ファイルシステムのエラーが発生した場合は、簡潔なメッセージを stderr に出力し、ゼロ以外の終了コードを返します。

analyze_spread.py は単一ペアの統計レポートを stdout に書き込み、ファイルは作成しません。どちらのコマンドも、API リクエストを行う前に、無効または有限でないしきい値、十分でないルックバック期間、重複するシンボルを拒否します。statsmodels が見つからない場合は、トレースバックを表示せず、インストールコマンドを stderr に出力します。

品質基準

統計的厳密性

有効なペアの最低要件:

  • ✓ 2 年間の相関 ≥ 0.70
  • ✓ 共和分の p 値 < 0.05(ADF 検定)
  • ✓ スプレッドの定常性が確認されている
  • ✓ 半減期 < 90 日
  • ✓ 直近 6 か月に構造変化がない

危険信号(ペアを除外):

  • 直近 6 か月で相関が >0.20 低下
  • 共和分の p 値 > 0.05
  • 半減期が時間とともに増加している(平均回帰の弱まり)
  • 重大な企業イベント(合併、スピンオフ、倒産リスク)
  • 流動性に関する懸念(平均出来高が 1 日あたり 50 万株未満)
実務上の考慮事項

取引コスト:

  • 片道往復あたりのコストを各レッグ 0.1%と仮定します
  • ペアごとの総コスト = 0.4%(エントリー+エグジット、両レッグ)
  • 最小 Z スコアのしきい値は取引コストを上回る必要があります

空売り:

  • 株式が空売り可能か(借りにくい銘柄ではないか)を確認します
  • 空売りコスト(借株手数料)を考慮します
  • ショートスクイーズのリスクを監視します

執行:

  • 両レッグを同時にエントリー/エグジットします(レッグリスクを回避)
  • スリッページを抑えるため、指値注文を使用します
  • エントリー前に空売り用の株式を事前に確保します

利用可能なスクリプト

scripts/find_pairs.py

目的: セクターまたはカスタムリスト内で共和分しているペアをスクリーニングします。

使用方法:

# Sector-based screening
uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/find_pairs.py \
  --sector Technology \
  --min-correlation 0.70 \
  --output /tmp/pair-trade/technology.json

# Custom stock list
uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/find_pairs.py \
  --symbols AAPL,MSFT,GOOGL,META \
  --min-correlation 0.75 \
  --output /tmp/pair-trade/custom.json

# Full options
uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/find_pairs.py \
  --sector Financials \
  --min-correlation 0.70 \
  --min-market-cap 2000000000 \
  --lookback-days 730 \
  --output /tmp/pair-trade/financials.json

パラメーター:

  • --sector:セクター名(Technology、Financials など)
  • --symbols:ティッカーのカンマ区切りリスト(sector の代替)
  • --min-correlation:相関の最小しきい値(デフォルト:0.70)
  • --min-market-cap:時価総額の最小フィルター(デフォルト:$2B)
  • --lookback-days:過去データの期間(デフォルト:730 日)
  • --output:出力 JSON ファイル(デフォルト:pair_analysis.json)
  • --api-key:FMP API キー(または FMP_API_KEY 環境変数を設定)

出力:

[
  {
    "pair": "AAPL/MSFT",
    "stock_a": "AAPL",
    "stock_b": "MSFT",
    "correlation": 0.87,
    "beta": 1.15,
    "cointegration_pvalue": 0.012,
    "adf_statistic": -3.45,
    "half_life_days": 42,
    "current_zscore": -2.3,
    "signal": "LONG",
    "strength": "Strong"
  }
]
scripts/analyze_spread.py

目的: 特定のペアのスプレッドの動きを分析し、取引シグナルを生成します。

使用方法:

# Analyze specific pair
uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/analyze_spread.py \
  --stock-a AAPL \
  --stock-b MSFT

# Custom lookback period
uv run --with 'statsmodels>=0.14,<0.15' python \
  skills/pair-trade-screener/scripts/analyze_spread.py \
  --stock-a JPM \
  --stock-b BAC \
  --lookback-days 365 \
  --entry-zscore 2.0 \
  --exit-zscore 0.5

パラメーター:

  • --stock-a:1 つ目の銘柄ティッカー
  • --stock-b:2 つ目の銘柄ティッカー
  • --lookback-days:分析期間(デフォルト:365)
  • --entry-zscore:エントリーの Z スコアしきい値(デフォルト:2.0)
  • --exit-zscore:エグジットの Z スコアしきい値(デフォルト:0.0)
  • --api-key:FMP API キー

出力:

  • 現在のスプレッド分析
  • Z スコアの計算
  • エントリー/エグジットの推奨
  • ポジションサイジング
  • 過去の Z スコアチャート(テキスト)

リファレンスドキュメント

references/methodology.md

統計的裁定取引とペアトレーディングの包括的なガイド:

  • ペアの選定基準:有望なペア候補の特定方法
  • 統計検定:相関、共和分、定常性
  • スプレッドの構築:価格差と価格比のアプローチ
  • 平均回帰:半減期の計算と解釈
  • リスク管理:ポジションサイジング、損切り、分散
  • よくある落とし穴:サバイバーシップバイアス、先読みバイアス、過剰適合
references/cointegration_guide.md

共和分検定の詳細な解説:

  • 共和分とは?:直感的な説明
  • ADF 検定:手順を追った解説
  • P 値の解釈:統計的有意性のしきい値
  • 半減期の推定:AR(1)モデルによる方法
  • 構造変化:レジーム変化の検定
  • 実践例:実際のペアを用いた事例研究

他のスキルとの連携

セクターアナリストとの連携:

  • セクターアナリストを使って、ローテーション中のセクターを特定します
  • パフォーマンスが優れたセクター内でペアをスクリーニングします
  • 先行するセクターのペアは、より強いトレンドを示す可能性があります

テクニカルアナリストとの連携:

  • 個別銘柄のテクニカル分析でペアのエントリー/エグジットを確認します
  • エントリー前にサポート/レジスタンス水準を確認します
  • トレンドの方向がスプレッドのシグナルと一致しているか検証します

バックテストエキスパートとの連携:

  • ペア候補をバックテストエキスパートに渡して検証します
  • 過去の Z スコアによるエントリー/エグジットルールをテストします
  • しきい値パラメーター(エントリー Z スコア、損切り)を最適化します
  • 頑健性を確認するため、ウォークフォワード分析を行います

市場環境分析との連携:

  • 極端なボラティリティ(VIX > 30)の期間は、ペアトレーディングを避けます
  • 危機的な期間には相関が崩れることがあります
  • 横ばい相場やレンジ相場では、ペアトレーディングを優先します

ポートフォリオマネージャーとの連携:

  • 複数のペアポジションを追跡します
  • 市場中立のエクスポージャー全体を監視します
  • ポートフォリオ全体のペアトレーディング損益を計算します
  • ヘッジ比率を定期的にリバランスします

重要な注意事項

  • すべての分析と出力は英語です
  • **統計的基盤:**裁量的な解釈は行いません
  • **市場中立を重視:**方向性のあるベータエクスポージャーを最小限に抑えます
  • **データ品質が重要:**入力が不適切であれば、出力も不適切になります
  • **FMP API キーが必要です:**基本的なスクリーニングには無料プランで十分です
  • **Python の依存関係:**pandas、numpy、scipy、requests、statsmodels>=0.14,<0.15

よくあるユースケース

ユースケース 1:テクノロジーセクターのペア

User: "Find pair trading opportunities in tech stocks"

Workflow:
1. Screen Technology sector for stocks with market cap > $10B
2. Calculate all pairwise correlations
3. Filter pairs with correlation ≥ 0.75
4. Run cointegration tests
5. Identify current z-score extremes (|z| > 2.0)
6. Generate top 10 pairs report

ユースケース 2:特定ペアの分析

User: "Analyze AAPL and MSFT as a pair trade"

Workflow:
1. Fetch 2-year price history for AAPL and MSFT
2. Calculate correlation and beta
3. Test for cointegration
4. Calculate current spread and z-score
5. Generate entry/exit recommendation
6. Provide position sizing guidance

ユースケース 3:地方銀行のペア

User: "Screen for pairs among regional banks"

Workflow:
1. Filter Financials sector for industry = "Regional Banks"
2. Exclude banks with <$5B market cap
3. Calculate pairwise statistics
4. Rank by cointegration strength
5. Focus on pairs with half-life < 45 days
6. Report top 5 mean-reverting pairs

トラブルシューティング

問題:共和分ペアが見つかりません

解決策:

  • 対象銘柄を広げます(時価総額のしきい値を下げます)
  • 共和分の p 値を 0.10 に緩和します
  • 別のセクターを試します(公益事業は共和分が見られることがよくあります)
  • ルックバック期間を 3 年に延ばします

問題:すべての z スコアがゼロ付近で、取引シグナルがありません

解決策:

  • 市場が通常の状態にあり、ペアが均衡状態にあります
  • 後で再確認するか、対象銘柄を広げます
  • エントリーしきい値を ±2.0 ではなく ±1.5 に下げます

問題:ペアの相関が崩れました

解決策:

  • 企業イベント(決算、ガイダンスの変更)がないか確認します
  • M&A 活動やリストラクチャリングがないことを確認します
  • 構造的な変化が確認された場合は、ペアをウォッチリストから削除します
  • 再エントリーする前に 30 日間監視します

API の要件

  • 必須:FMP API キー(無料プランで十分です)
  • レート制限:無料プランでは 1 日あたり約 250 リクエスト
  • データ使用量:2 年分の履歴データの場合、シンボルあたり約 2 リクエスト
  • アップグレード:頻繁にスクリーニングする場合は、Professional プラン($29/mo)を推奨します

リソース


バージョン: 1.0 最終更新日: 2025-11-08 依存関係: Python 3.8+, pandas, numpy, scipy, statsmodels, requests

コメント