株式投資の世界では、株価が上がるか下がるかを予想するのが一般的です。しかし、市場全体の動きに左右されず、2つの銘柄の「価格差」にだけ注目する戦略があります。それが「ペアトレード」です。
この記事では、統計学の力を借りて、似た動きをする2銘柄の「一時的なズレ」をPythonで自動検出する方法を解説します。プログラミング初心者の方でも、この記事を読み終える頃には、自分だけの分析ツールを動かせるようになります。
市場全体の動きに左右されないペアトレードとは?
ペアトレードは、古くからヘッジファンドなどが使ってきた「裁定取引」の一つです。相場全体が暴落しても、選んだ2銘柄の関係性さえ維持されていれば、利益を狙えるのが大きな特徴です。
この章では、ペアトレードの基本的な考え方から、なぜこの手法が投資の王道と呼ばれるのかを説明します。仕組み、メリット、判断基準の3つの視点から、全体像を把握していきましょう。
割安な方を買い、割高な方を売る「サヤ取り」の仕組み
ペアトレードの本質は、一時的に開いた「サヤ(価格差)」が、元の状態に戻る性質を利用することにあります。例えば、同じような業績で連動して動くA社とB社があるとします。何らかの理由でA社だけが急騰し、B社が変わらなければ、その差は異常な状態といえます。
この時、高いA社を売り、安いB社を買うことで、2つの価格が再び近づいた時に利益が手に入ります。
- 価格が離れたら「逆張り」でエントリーする。
- 価格が元に戻ったら(収束したら)決済する。
- 2銘柄の「絶対的な価格」ではなく「相対的な差」を見る。
例えば、トヨタとホンダのようなライバル企業は、同じ経済ニュースに反応しやすいため、この手法が使いやすい典型的な例です。
上昇相場でも下落相場でも利益を狙える理由
ペアトレードの最大の強みは、マーケットニュートラル(市場中立)という考え方にあります。買い(ロング)と売り(ショート)を同時に持つため、日経平均が1,000円暴落しても、2銘柄が同じように下がれば損失は相殺されます。
相場がどちらに動いても、2銘柄の「ズレ」が解消されれば利益になるのです。
つまり、予測が難しい地合いでも安定して運用を続けられることを意味します。
確かに、市場全体の大きな波を無視できる安心感は、個人投資家にとって精神的な支えになるはずです。
勘ではなく「統計的根拠」で売買を判断する
「なんとなく離れている気がする」といった主観でトレードをすると、たいてい失敗します。ペアトレードでは、過去のデータから計算された「平均値」と「標準偏差」を使って、今の乖離が異常かどうかを数字で判断します。
統計学的に「95%以上の確率でこの範囲に収まるはずだ」という枠を超えた時だけ、トレードを行います。
このように、明確なルールを設けることで、感情に流されない一貫した運用が可能になります。
数字に基づいたアクションは、トレード後の振り返りも容易にし、あなたの投資技術を着実に向上させてくれるでしょう。
Pythonでペアトレードを行うための環境準備
ペアトレードを実践するには、膨大な過去データを計算する必要があります。手作業では限界がありますが、Pythonを使えば一瞬で終わります。
この章では、分析に必要なライブラリの導入から、最短でコードを動かすためのセットアップまでを解説します。難しい設定はAIや便利なツールに任せて、まずは動く環境を作ってしまいましょう。
yfinanceを導入して株価データを自動取得する
まずは、Yahoo! Financeから株価データを無料で取得できる yfinance というライブラリを用意します。これを使えば、銘柄コードと期間を指定するだけで、過去の終値をリスト形式で取り出すことができます。
一度コードを書いてしまえば、毎日最新のデータを自動で集めてくれるようになります。
面倒な会員登録やAPIキーの発行も不要です。
インストールコマンドを一行打つだけで、あなたのパソコンが強力な金融分析マシンに進化します。
pandasとstatsmodelsで統計計算を行う
取得したデータを整理し、統計的なテストを行うために pandas と statsmodels を使います。
pandas はデータをExcelのような表形式で扱うための道具で、statsmodels は2銘柄の連動性を厳密にチェックするために必要です。
特に「本当にこの2銘柄は連動しているのか」を科学的に証明する際に、これらのライブラリが威力を発揮します。
pandas:データの加工、移動平均の算出に使う。statsmodels:コインテグレーション検定などの統計解析に使う。matplotlib:計算結果をグラフにして視覚化する。
これらのライブラリは世界中のデータサイエンティストが使っている標準的なもので、情報の信頼性も非常に高いのが魅力です。
実行環境を1分でセットアップするコード
準備ができたら、実際にライブラリを読み込んでみましょう。
以下のコードをコピーして貼り付けるだけで、分析の土台が完成します。
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# データの表示設定(見やすくするため)
pd.options.display.max_rows = 10
環境構築でつまづく人は多いですが、Google Colabなどのブラウザ上で動く環境を使えば、数分で最初のグラフを出すことができます。
まずは「自分でも動かせた」という実感を持ち、次のステップへ進みましょう。
連動する「最強のペア」を特定する方法
ペアトレードの成否は、銘柄の組み合わせ選びで8割が決まります。似たような動きをしているように見えても、実は全く関係のない動きをしている「偽物のペア」を排除しなければなりません。
この章では、統計的に信頼できる銘柄の組み合わせを見つけるための3つのステップを紹介します。数字の裏付けがある銘柄を選んで、勝率の底上げを図りましょう。
相関係数を使って似た動きの銘柄を絞り込む
銘柄探しの第一歩は、相関係数をチェックすることです。相関係数は-1から1の間の数値で表され、1に近いほど「同じように動いている」ことを示します。
一般的に0.8以上の銘柄ペアを探すのが、ペアトレードの基本です。
ただし、相関が高いだけでは不十分なこともあります。たまたま同じ期間に上がっていただけの銘柄もあるため、あくまで「候補を絞り込むためのフィルター」として活用してください。
コインテグレーション(共積)を確認して「戻る力」を測る
相関よりも重要なのが「コインテグレーション」という概念です。これは、2銘柄の価格差が、時間が経っても一定の範囲に収まり続ける性質を指します。
「離れても、必ず元の位置に戻ってくる」という強い絆があるかどうかを確認するテストです。
Pythonの statsmodels を使えば、ADF検定という手法でこの性質を数値化できます。
この数値が一定以下であれば、統計的に「連動している」とみなされ、安心してトレードの対象にできます。
銘柄選びで失敗しないための業種・属性の組み合わせ例
統計指標だけでなく、ビジネスモデルの共通点も重要です。同じ市場環境で戦っている企業同士は、コインテグレーションが成立しやすい傾向があります。
以下の表に、ペアトレードでよく狙われる組み合わせの例をまとめました。
| 組み合わせのタイプ | 具体的な銘柄例 | 理由 |
| ライバル企業 | トヨタ(7203) / ホンダ(7267) | 同じ自動車業界で景気影響が共通 |
| メガバンク同士 | 三菱UFJ(8306) / 三井住友(8316) | 金利政策の影響を同じように受ける |
| 親子上場 | 親会社 / 上場子会社 | 資本関係があり、業績が連動しやすい |
| ETF対抗 | 日経平均ETF / 先物 | 指数そのものの動きを狙う |
まずはこうした「王道」のペアから分析を始め、徐々に自分だけの隠れた優良ペアを探していくのが効率的です。
価格の「乖離」を数値化する Zスコアのロジック
銘柄が決まったら、次はいよいよ「いつエントリーするか」を決めます。価格がどれくらい離れたら「異常」なのか、それを数値で教えてくれるのが「Zスコア」です。
この章では、Zスコアの正体と、それを使った具体的な売買サインの出し方を解説します。
このロジックを理解すれば、チャートを見て悩む時間はゼロになります。
2銘柄の価格差(スプレッド)を計算する
まずは2つの銘柄の価格の関係を一本の線にします。これを「スプレッド」と呼びます。
単純な「Aの価格 - Bの価格」でも良いですが、価格帯が違う場合は「A ÷ B」の比率(レシオ)で見る方が正確です。
このスプレッドが水平な線に近いほど、ペアとしての質が高いといえます。
Pythonでは spread = data[t1] / data[t2] のように記述するだけで、過去すべての時点での価格比が計算されます。
この一本の線が、あなたのトレードの羅針盤になります。
移動平均からのズレを標準偏差で割る理由
スプレッドそのものだけでは、今の値が「高いのか低いのか」が分かりません。そこで、過去20日間などの平均値から、今の値がどれくらい離れているかを計算します。
この「離れ具合」を、価格のボラティリティ(標準偏差)で割ることで、どの銘柄でも共通して使える「Zスコア」が誕生します。
- 平均と同じなら Zスコアは 0
- 上に離れればプラスの値
- 下に離れればマイナスの値
このように数値を標準化することで、異なる銘柄ペアでも同じ「±2」という基準で売買できるようになるのです。
「±2」をエントリーのサインとする統計的根拠
統計学の正規分布という考え方では、データが平均から標準偏差の2倍(2σ)以内に収まる確率は約95.4%です。つまり、Zスコアが2を超えたり-2を下回ったりするのは、わずか4.6%しか起こらない「異常な事態」といえます。
この「めったに起きないズレ」が起きた時こそが、絶好のエントリーチャンスです。
「いずれ95%の範囲(平均)に戻ってくるだろう」という統計的な裏付けがあるからこそ、自信を持って逆張りができるのです。
もちろん、稀に±3まで行くこともありますが、その時はさらなるチャンスと捉えるか、異常事態として撤退するかを事前に決めておくことが大切です。
【実践】Pythonで乖離を検出する全コード
理論がわかったところで、実際にコードを書いて分析してみましょう。
ここでは、データを取得し、Zスコアを算出して、視覚的なチャートを出力するまでの一連のプログラムを紹介します。
このコードをコピーして、気になる銘柄コードを入れ替えるだけで、すぐに自分専用のスクリーニングが始められます。
まずは全体の流れを確認し、実際に動かしてみましょう。
株価データの取得とスプレッド算出の実装
以下の関数は、2つの銘柄名(ティッカー)を受け取り、その比率であるスプレッドを返します。
yfinance を使って、直近1年分のデータを取得する仕様にしています。
def get_pair_analysis(t1, t2):
# 株価を取得
df = yf.download([t1, t2], period="1y")['Close']
# 欠損値を消してスプレッドを計算
df = df.dropna()
df['Spread'] = df[t1] / df[t2]
return df
この処理だけで、複雑な価格データの整理が完了します。
自分でCSVをダウンロードしてExcelで加工する手間を考えると、Pythonの凄さがよく分かるはずです。
Zスコアの計算と可視化チャートの作成
次に、計算したスプレッドからZスコアを導き出し、グラフにするコードです。
21日間の移動平均を基準にして、乖離を計算させています。
def plot_zscore(df, t1, t2):
window = 21
# Zスコアの計算
mean = df['Spread'].rolling(window=window).mean()
std = df['Spread'].rolling(window=window).std()
df['Z-Score'] = (df['Spread'] - mean) / std
# グラフ描画
plt.figure(figsize=(12, 6))
df['Z-Score'].plot()
plt.axhline(2, color='red', linestyle='--') # 上の境界線
plt.axhline(-2, color='green', linestyle='--') # 下の境界線
plt.axhline(0, color='black', alpha=0.5) # 平均線
plt.title(f'Z-Score of {t1} and {t2}')
plt.show()
このグラフで、青い線が赤い点線(+2)を超えたら「上の銘柄を売り、下の銘柄を買う」チャンスです。
逆に緑の点線(-2)を下回ったら、その反対のトレードを行います。
出力されたチャートからチャンスを読み解く方法
グラフが表示されたら、直近の動きをチェックしてください。
Zスコアが外側の線にタッチした後、中央の黒い線(平均)に向かって戻り始めている箇所があれば、それは収束が始まっているサインです。
もし、線がずっと外側にはりついたまま戻ってこない場合は、注意が必要です。
2つの銘柄の関係性が壊れてしまった可能性(構造変化)があるため、エントリーを控えるべき局面です。
このように、数値とグラフをセットで見ることで、より安全なトレード判断が可能になります。
利益を積み上げるための運用ルール作り
ツールが完成しても、ルールなしでトレードを始めてはいけません。
「どこで入ってどこで出るか」を明確に決めておくことが、長生きする投資家の条件です。
この章では、実戦で利益を残すための具体的な運用ステップを解説します。
エントリー、枚数調整、手数料の3つのポイントを押さえて、システムの精度を高めていきましょう。
エントリーと利益確定のタイミングを決める
最も一般的なルールは、Zスコアが「±2」に達した時にエントリーし、中央の「0」に戻った時に利益を確定させることです。
平均に戻った時点で、そのペアの異常状態は解消されたとみなすためです。
あえて「0」まで待たずに、「1」や「-1」あたりで早めに利確する手法もあります。
- エントリー: Zスコアが±2を超えた時。
- 利益確定: Zスコアが0(平均)に戻った時。
- 追加エントリー: Zスコアが±3まで拡大した時に、枚数を増やす(ナンピン)。
欲張りすぎず、確率的に戻りやすい範囲で着実に利益を拾っていくのが、ペアトレードの定石です。
投資金額の比率を調整してリスクを分散する
2銘柄を売買する際、単純に「100株ずつ」買うのは危険です。
株価が違う場合、片方の動きがもう片方を打ち消してしまい、マーケットニュートラルにならないからです。
基本的には、それぞれの銘柄に投じる「金額」が同じになるように調整します。
例えば、株価5,000円のA社を100株買うなら、株価2,500円のB社は200株売る、といった具合です。
これにより、市場全体の上下動をきれいに相殺し、純粋に「価格差の収縮」だけを利益に変えられるようになります。
運用成績を左右する取引手数料を考慮する
ペアトレードは、一度のチャンスで2つの取引(買いと売り)を行います。
つまり、手数料も通常の2倍かかることを忘れてはいけません。
計算上の利益が小さすぎると、手数料を払ったら赤字だった、という「手数料負け」が起こります。
投資金額が少ない場合は、手数料の安いネット証券を選ぶか、1回の期待利益が十分に大きい(Zスコアの乖離が深い)ペアだけに絞ってエントリーするようにしましょう。
このコスト意識こそが、理論を現実に変えるための重要なステップです。
失敗を防ぐためのリスク管理と損切り
ペアトレードは安定した手法ですが、100%安全ではありません。
「離れたものは必ず戻る」という前提が崩れた時、損失は無限に膨らむ可能性があります。
最悪の事態を防ぐためのチェックリストを確認しましょう。
あらかじめ負け方を決めておくことで、一度の失敗で市場から退場するリスクをゼロにできます。
相関が戻らない「構造変化」を見極めるコツ
最も恐ろしいのは、2銘柄の連動性が永久に失われる「構造変化」です。
例えば、片方の会社が画期的な新製品を発表したり、逆に不祥事を起こしたりした場合、もはや2社は同じようには動きません。
Zスコアが±2を超えたまま、さらに離れ続ける場合は、何か致命的なニュースが出ていないか確認してください。
統計は過去の縮図に過ぎず、未来の突発的な変化までは予測できません。
「これは統計的なズレではなく、企業の価値そのものが変わったんだ」と気づいたら、すぐにポジションを閉じる潔さが必要です。
損切り価格を設定して大きな損失を避ける
感情に頼らず、機械的に損切りを行う基準を作っておきましょう。
Zスコアがさらに拡大し、「±3」や「±3.5」に達した場合は、統計的に見てモデルが壊れている可能性が高いです。
この数値を損切りラインとして設定しておくのが、プロのやり方です。
このように、出口をセットで決めておくことで、夜も安心して眠れるようになります。
長期間乖離が埋まらないときの期限ルール
価格が戻るのを待ち続けて、数ヶ月も資金が拘束されてしまうのは非効率です。
ペアトレードは資金の回転率も重要なので、一定期間(例えば20営業日)経っても目標に達しない場合は、一度決済する「時間による損切り」も検討してください。
新しいチャンスは他にもたくさんあります。
- 価格による損切り: Zスコアが一定値(例:3.0)を超えた時。
- 時間による損切り: 保有期間が21日を超えた時。
執着を捨てて、次の統計的に有利なペアに資金を移動させる。
このドライな判断こそが、ペアトレードで資産を複利で増やしていくための秘訣です。
まとめ:自分だけの「裁定ペア」を見つけて運用を始める
ペアトレードは、派手さはありませんが、統計学に基づいた非常に堅実な投資手法です。Pythonという強力なツールを味方につけることで、個人投資家でも機関投資家と同じ土俵で戦うことができます。
今回の内容を振り返ってみましょう。
- 仕組み: 連動する2銘柄の「一時的なズレ」を狙い、市場の上下に左右されない利益を目指す。
- 準備: yfinanceやstatsmodelsを使い、データ取得から統計テストまでを自動化する。
- ロジック: Zスコアが±2を超えた時を異常事態(チャンス)として検知する。
- 実践: トヨタとホンダのような、共通の背景を持つ「最強のペア」から分析を始める。
- リスク: 構造変化に備え、Zスコアの拡大や保有期間による損切りルールを徹底する。
まずは、身近なライバル企業をいくつか選んで、今回紹介したコードで分析してみてください。
数字が語る「相場のゆがみ」を見つけたとき、あなたの投資は勘に頼るものから、科学的なビジネスへと進化するはずです。

