stock-correlation
株式間の相関関係を分析し、連動する銘柄やトレーディングペアを見つけるスキルです。「NVDAと相関する銘柄は?」「AAPLとMSFTの相関関係」「一緒に動く株」「セクター内の競合銘柄」「ペアトレード」など、複数銘柄の値動きの関係性や、特定銘柄と連動・逆相関する銘柄を調べたい場合に起動します。銘柄が1つだけ指定された場合も、関連する相関銘柄を自動的に探索します。
description の原文を見る
> Analyze stock correlations to find related companies and trading pairs. Use when the user asks about correlated stocks, related companies, sector peers, trading pairs, or how two or more stocks move together. Triggers: "what correlates with NVDA", "find stocks related to AMD", "correlation between AAPL and MSFT", "what moves with", "sector peers", "pair trading", "correlated stocks", "when NVDA drops what else drops", "stocks that move together", "beta to", "relative performance", "supply chain partners", "correlation matrix", "co-movement", "related tickers", "sympathy plays", "semiconductor peers", "hedging pair", "realized correlation", "rolling correlation", or any request about stocks that move in tandem or inversely. Also triggers for well-known pairs like AMD/NVDA, GOOGL/AVGO, LITE/COHR. If only one ticker is provided, infer the user wants correlated peers.
SKILL.md 本文
株式相関分析スキル
yfinance経由でYahoo Financeから取得した履歴価格データを使用して相関のある株を見つけて分析します。ユーザーの意図に基づいて専門の副スキルにルーティングします。
重要: これは研究および教育目的のみです。金融アドバイスではありません。yfinanceはYahoo, Inc.と提携していません。
ステップ1: 依存関係が利用可能であることを確認する
現在の環境ステータス:
!`python3 -c "import yfinance, pandas, numpy; print(f'yfinance={yfinance.__version__} pandas={pandas.__version__} numpy={numpy.__version__}')" 2>/dev/null || echo "DEPS_MISSING"`
DEPS_MISSINGの場合、任意のコードを実行する前に必要なパッケージをインストールします:
import subprocess, sys
subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "yfinance", "pandas", "numpy"])
すべての依存関係が既にインストールされている場合、インストールステップをスキップして直接進めます。
ステップ2: 正しい副スキルにルーティングする
ユーザーのリクエストを分類して、以下の対応する副スキルセクションに遷移します。
| ユーザーリクエスト | ルーティング先 | 例 |
|---|---|---|
| 単一ティッカー、関連する株を見つけたい | 副スキルA: 共動き発見 | 「NVDAと相関する株」、「AMDに関連する株を見つけて」、「TSLAのシンパシープレー」 |
| 2つ以上の特定ティッカー、関係の詳細が欲しい | 副スキルB: リターン相関 | 「AMDとNVDAの相関」、「LITEとCOHRはどのように一緒に動くか」、「AAPLとMSFTを比較」 |
| ティッカーのグループ、構造/グループ化が欲しい | 副スキルC: セクタークラスタリング | 「FAANGの相関行列」、「これらの半導体株をクラスタ化」、「AMDのセクター内競合」 |
| 時間変動型または条件付き相関が欲しい | 副スキルD: 実現相関 | 「AMDとNVDAのローリング相関」、「NVDAが下がると何が下がる」、「相関がどのように変わったか」 |
曖昧な場合、単一ティッカーの場合は副スキルA(共動き発見)、2つのティッカーの場合は副スキルB(リターン相関)にデフォルト設定します。
すべての副スキルのデフォルト値
| パラメータ | デフォルト |
|---|---|
| ルックバック期間 | 1y (1年) |
| データ間隔 | 1d (日次) |
| 相関方法 | ピアソン |
| 最小相関閾値 | 0.60 |
| 結果数 | トップ10 |
| リターンタイプ | 日次対数リターン |
| ローリングウィンドウ | 60営業日 |
副スキルA: 共動き発見
目標: 単一ティッカーが与えられた場合、それと一緒に動く株を見つけます。
A1: ピアユニバースを構築する
15~30の候補が必要です。ハードコードされたティッカーリストを使用しないでください ― ピアユニバースを実行時に動的に構築します。完全な実装についてはreferences/sector_universes.mdを参照してください。アプローチは以下の通りです:
- 同じ業界の株をスクリーンする:
yf.screen()+yf.EquityQueryを使用してターゲットと同じ業界の株を見つける - 業界スクリーンが10未満のピアを返す場合、セクターに拡大する
- テーマ別/隣接産業を追加する ― ターゲットの
longBusinessSummaryを読み、1~2の関連産業をスクリーン(例: 半導体企業 → 半導体装置もスクリーン) - 結合、重複排除、ターゲットティッカーを削除
A2: 相関を計算する
import yfinance as yf
import pandas as pd
import numpy as np
def discover_comovement(target_ticker, peer_tickers, period="1y"):
all_tickers = [target_ticker] + [t for t in peer_tickers if t != target_ticker]
data = yf.download(all_tickers, period=period, auto_adjust=True, progress=False)
# 終値を抽出 ― yf.downloadはマルチインデックス(Price, Ticker)列を返す
closes = data["Close"].dropna(axis=1, thresh=max(60, len(data) // 2))
# 対数リターン
returns = np.log(closes / closes.shift(1)).dropna()
corr_series = returns.corr()[target_ticker].drop(target_ticker, errors="ignore")
# 絶対相関でランク付け
ranked = corr_series.abs().sort_values(ascending=False)
result = pd.DataFrame({
"Ticker": ranked.index,
"Correlation": [round(corr_series[t], 4) for t in ranked.index],
})
return result, returns
A3: 結果を表示する
会社名とセクターを含むランク付けテーブルを表示します(yf.Ticker(t).info.get("shortName")経由で取得):
| ランク | ティッカー | 企業名 | 相関 | リンク理由 |
|---|---|---|---|---|
| 1 | AMD | Advanced Micro Devices | 0.82 | 同じ業界 ― GPU/CPU |
| 2 | AVGO | Broadcom | 0.78 | AI インフラストラクチャ競合 |
以下を含めます:
- 上位10の正の相関のある株
- 注目すべき負相関のある株(潜在的なヘッジ)
- 各株がリンクしている理由の簡潔な説明(セクター、サプライチェーン、顧客重複)
副スキルB: リターン相関
目標: 2つ(または数個)の特定ティッカー間の関係に深く掘り下げます。
B1: ダウンロードして計算する
import yfinance as yf
import pandas as pd
import numpy as np
def return_correlation(ticker_a, ticker_b, period="1y"):
data = yf.download([ticker_a, ticker_b], period=period, auto_adjust=True, progress=False)
closes = data["Close"][[ticker_a, ticker_b]].dropna()
returns = np.log(closes / closes.shift(1)).dropna()
corr = returns[ticker_a].corr(returns[ticker_b])
# ベータ: Bがアの単位移動当たりいくら動くか
cov_matrix = returns.cov()
beta = cov_matrix.loc[ticker_b, ticker_a] / cov_matrix.loc[ticker_a, ticker_a]
# R二乗
r_squared = corr ** 2
# 安定性のための60日ローリング相関
rolling_corr = returns[ticker_a].rolling(60).corr(returns[ticker_b])
# スプレッド(対数価格比): 平均回帰用
spread = np.log(closes[ticker_a] / closes[ticker_b])
spread_z = (spread - spread.mean()) / spread.std()
return {
"correlation": round(corr, 4),
"beta": round(beta, 4),
"r_squared": round(r_squared, 4),
"rolling_corr_mean": round(rolling_corr.mean(), 4),
"rolling_corr_std": round(rolling_corr.std(), 4),
"rolling_corr_min": round(rolling_corr.min(), 4),
"rolling_corr_max": round(rolling_corr.max(), 4),
"spread_z_current": round(spread_z.iloc[-1], 4),
"observations": len(returns),
}
B2: 結果を表示する
サマリーカードを表示します:
| メトリック | 値 |
|---|---|
| ピアソン相関 | 0.82 |
| ベータ(BvsA) | 1.15 |
| R二乗 | 0.67 |
| ローリング相関(60d平均) | 0.80 |
| ローリング相関範囲 | [0.55, 0.94] |
| ローリング相関標準偏差 | 0.08 |
| スプレッドZスコア(現在) | +1.2 |
| 観測数 | 250 |
解釈ガイド:
- 相関 > 0.80: 強い共動き ― これらの株は密接にリンクしている
- 相関0.50~0.80: 中程度 ― 共有セクタードライバーがあるが独立した要因もある
- 相関 < 0.50: 弱い ― セクター重複の可能性はあるが共動きは限定的
- 高いローリング標準偏差: 不安定な関係 ― 相関が時間経過で大きく変動
- スプレッドZ > |2|: 異常な乖離 ― 履歴的な関係からの異常な分岐
副スキルC: セクタークラスタリング
目標: ティッカーのグループが与えられた場合、完全な相関構造を表示してクラスタを特定します。
C1: 相関行列を構築する
import yfinance as yf
import pandas as pd
import numpy as np
def sector_clustering(tickers, period="1y"):
data = yf.download(tickers, period=period, auto_adjust=True, progress=False)
# yf.downloadはマルチインデックス(Price, Ticker)列を返す
closes = data["Close"].dropna(axis=1, thresh=max(60, len(data) // 2))
returns = np.log(closes / closes.shift(1)).dropna()
corr_matrix = returns.corr()
# 階層クラスタリング順序
from scipy.cluster.hierarchy import linkage, leaves_list
from scipy.spatial.distance import squareform
dist_matrix = 1 - corr_matrix.abs()
np.fill_diagonal(dist_matrix.values, 0)
condensed = squareform(dist_matrix)
linkage_matrix = linkage(condensed, method="ward")
order = leaves_list(linkage_matrix)
ordered_tickers = [corr_matrix.columns[i] for i in order]
# 行列を再順序付け
clustered = corr_matrix.loc[ordered_tickers, ordered_tickers]
return clustered, returns
注: scipyが利用できない場合、階層クラスタリングの代わりに平均相関でソートすることにフォールバックします。
C2: 結果を表示する
-
完全相関行列 ― テーブルとしてフォーマットされます。ティッカーが8を超える場合、ヒートマップ説明として、または最強/最弱ペアのみを強調表示します。
-
特定されたクラスタ ― グループ内相関が高いティッカーをグループ化:
- クラスタ1: [NVDA, AMD, AVGO] ― 平均グループ内相関0.82
- クラスタ2: [AAPL, MSFT] ― 平均グループ内相関0.75
-
外れ値 ― グループの平均相関が低いティッカー(潜在的な分散化器)。
-
最強ペア ― 行列内の相関が最も高いトップ5ペア。
-
最弱ペア ― 最も低い/負相関のトップ5ペア(ヘッジング候補)。
副スキルD: 実現相関
目標: 相関が時間経過でどのように変化し、異なる市場環境下でどのように変化するかを示します。
D1: ローリング相関
import yfinance as yf
import pandas as pd
import numpy as np
def realized_correlation(ticker_a, ticker_b, period="2y", windows=[20, 60, 120]):
data = yf.download([ticker_a, ticker_b], period=period, auto_adjust=True, progress=False)
closes = data["Close"][[ticker_a, ticker_b]].dropna()
returns = np.log(closes / closes.shift(1)).dropna()
rolling = {}
for w in windows:
rolling[f"{w}d"] = returns[ticker_a].rolling(w).corr(returns[ticker_b])
return rolling, returns
D2: レジーム条件付き相関
def regime_correlation(returns, ticker_a, ticker_b, condition_ticker=None):
"""上昇/下降/ボラティリティレジーム間で相関を比較します。"""
if condition_ticker is None:
condition_ticker = ticker_a
ret = returns[condition_ticker]
regimes = {
"All Days": pd.Series(True, index=returns.index),
"Up Days (target > 0)": ret > 0,
"Down Days (target < 0)": ret < 0,
"High Vol (top 25%)": ret.abs() > ret.abs().quantile(0.75),
"Low Vol (bottom 25%)": ret.abs() < ret.abs().quantile(0.25),
"Large Drawdown (< -2%)": ret < -0.02,
}
results = {}
for name, mask in regimes.items():
subset = returns[mask]
if len(subset) >= 20:
results[name] = {
"correlation": round(subset[ticker_a].corr(subset[ticker_b]), 4),
"days": int(mask.sum()),
}
return results
D3: 結果を表示する
- ローリング相関サマリーテーブル:
| ウィンドウ | 現在 | 平均 | 最小 | 最大 | 標準偏差 |
|---|---|---|---|---|---|
| 20日 | 0.88 | 0.76 | 0.32 | 0.95 | 0.12 |
| 60日 | 0.82 | 0.78 | 0.55 | 0.92 | 0.08 |
| 120日 | 0.80 | 0.79 | 0.68 | 0.88 | 0.05 |
- レジーム相関テーブル:
| レジーム | 相関 | 日数 |
|---|---|---|
| すべての日 | 0.82 | 250 |
| 上昇日 | 0.75 | 132 |
| 下降日 | 0.87 | 118 |
| 高ボラティリティ(上位25%) | 0.90 | 63 |
| 大幅ドローダウン(< -2%) | 0.93 | 28 |
-
重要な洞察: 相関が売却時に増加するかどうかを強調します(非常に一般的 ― 「危機では相関は1になる」)。これはリスク管理にとって重要です。
-
トレンド: 相関は最近、その履歴平均と比較してより高くなるか、またはより低くなる傾向にあるか?
ステップ3: ユーザーに応答する
適切な副スキルを実行した後、結果を明確に表示します:
常に含める
- 使用したルックバック期間とデータ間隔
- 観測数(営業日)
- データ不足によりドロップされたティッカー
常に注釈をつける
- 相関は因果関係ではありません ― 共動きは因果関係を意味しません
- 過去の相関が将来の相関を保証しません ― レジームは変わります
- 短いルックバックウィンドウはノイズの多い推定を生成します; 長いウィンドウは平滑化しますがレジーム変化を見逃す可能性があります
実際的な応用(関連する場合に言及)
- シンパシープレー: ピアの決算/ニュースの動きに続く可能性が高い株
- ペアトレード: スプレッドが履歴的な平均から乖離している高相関ペア
- ポートフォリオ分散: リスクを軽減するための低相関資産の検出
- ヘッジ: 逆相関の商品の特定
- セクタローテーション: どのセクターが一緒に動くかを理解する
- リスク管理: ストレス時に相関が急上昇 ― 必要な時点で分散化が失敗する可能性
重要: 特定のトレードを推奨しないでください。データを提示して、ユーザーが結論を引き出すようにします。
参照ファイル
references/sector_universes.md― yfinance Screener APIを使用した動的ピアユニバース構築
特定のティッカーのピアユニバースを構築する必要がある場合は参照ファイルを読んでください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- himself65
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/himself65/finance-skills / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。