
Pythonによるクオンツトレーディング戦略
平均回帰、トレンドフォロー、ペアトレード、統計的アービトラージ、ボラティリティトレードの5戦略をPythonコード付きで解説。クオンツ開発者に最適。
アルゴリズムトレーディングの普及に伴い、Pythonはクオンツ開発従事者にとって必須のツールとなっています。これは、Pythonが科学計算やデータ分析の分野で強力なエコシステムを持ち、優れたサードパーティライブラリを備えているためです。特にPandas、NumPy、SciPyなどのライブラリは、クオンツトレーディングに豊富なデータ処理、数値計算、科学計算機能を提供し、開発者が効率的にクオンツ分析や戦略開発を行えるようにします。本日は、5つの古典的なクオンツトレーディング戦略と、対応するPythonコード例をご紹介します。
#1 平均回帰戦略
平均回帰戦略は統計的アービトラージ戦略の一種で、長期的には資産価格が平均値の周りで変動するが、最終的にはその長期平均に回帰するという仮定に基づいています。以下は、単純移動平均線を用いて「平均」価格を定義し、標準偏差を用いて買い・売りシグナルを生成する簡単な平均回帰戦略のコード例です。
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({
'Date': pd.date_range(start='2023-01-01', periods=100),
'Close': np.random.normal(100, 10, 100) # シミュレーションデータ生成
})
data.set_index('Date', inplace=True)
# 20日移動平均と標準偏差を計算
window = 20
data['Moving Average'] = data['Close'].rolling(window=window).mean()
data['Standard Deviation'] = data['Close'].rolling(window=window).std()
# 買い・売りシグナルの閾値を定義
data['Upper Bound'] = data['Moving Average'] + data['Standard Deviation']
data['Lower Bound'] = data['Moving Average'] - data['Standard Deviation']
# トレーディングシグナルを生成
# 価格が平均を下回れば買い、上回れば売り
data['Position'] = 0
data.loc[data['Close'] < data['Lower Bound'], 'Position'] = 1 # 買いシグナル
data.loc[data['Close'] > data['Upper Bound'], 'Position'] = -1 # 売りシグナル
# 価格と平均回帰バンドをプロット
plt.figure(figsize=(14, 7))
plt.plot(data['Close'], label='終値')
plt.plot(data['Moving Average'], label='移動平均')
plt.fill_between(data.index, data['Upper Bound'], data['Lower Bound'], color='gray', alpha=0.3, label='平均回帰バンド')
plt.plot(data.index, data['Position'] * 50, label='トレードシグナル', color='magenta')
plt.legend()
plt.show()
#2 トレンドフォロー戦略
トレンドフォロー戦略は、短期平均価格と長期平均価格を比較して市場の支配的なトレンドを特定し、そのトレンドが反転するまで追随します。簡単に言えば、ある株に対する現在の市場コンセンサスを見つけ、みんなが買っているならそれに従い、トレンドが変わるまで保有します。Pythonでは、移動平均収束拡散(MACD)を用いて短期価格トレンドを判断し、対応する買い・売りシグナルを生成します。
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({
'Date': pd.date_range(start='2023-01-01', periods=200),
'Close': np.random.normal(100, 15, 200) # シミュレーションデータ
})
data.set_index('Date', inplace=True)
# 単純移動平均線を計算
short_window = 40
long_window = 100
data['Short MA'] = data['Close'].rolling(window=short_window).mean()
data['Long MA'] = data['Close'].rolling(window=long_window).mean()
# トレーディングシグナルを生成
# 短期MAが長期MAをクロスした時にシグナル
data['Signal'] = 0
data['Signal'][short_window:] = np.where(data['Short MA'][short_window:] > data['Long MA'][short_window:], 1, 0)
data['Position'] = data['Signal'].diff()
# 価格と移動平均線をプロット
plt.figure(figsize=(14, 7))
plt.plot(data['Close'], label='終値')
plt.plot(data['Short MA'], label='40日移動平均')
plt.plot(data['Long MA'], label='100日移動平均')
plt.plot(data.index, data['Position'] * 50, label='トレードシグナル', color='magenta', marker='o', linestyle='None')
plt.legend()
plt.show()
#3 ペアトレード
ペアトレードは、価格相関が非常に高い2つの異なる資産間の統計的アービトラージに基づきます。両者の価格差が通常範囲を超えて逸脱した場合、割安な資産を買い、割高な資産を売ります。長期的には両資産の価格は平均に回帰するはずですが、短期的にアービトラージ機会が生じることがあります。
2つの資産間の過去の価格関係を分析し、期待されるスプレッドからの逸脱に基づいてトレードシグナルを生成します:
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 相関の高い2資産のシミュレーションデータを作成
np.random.seed(42)
data = pd.DataFrame({
'Date': pd.date_range(start='2023-01-01', periods=180),
'Asset_A': np.random.normal(100, 10, 180).cumsum() + 100,
'Asset_B': np.random.normal(100, 10, 180).cumsum() + 120
})
data.set_index('Date', inplace=True)
# 価格差(スプレッド)を計算
data['Price_Diff'] = data['Asset_A'] - data['Asset_B']
# スプレッドの移動平均と標準偏差を計算
window = 30
data['Mean_Diff'] = data['Price_Diff'].rolling(window=window).mean()
data['Std_Diff'] = data['Price_Diff'].rolling(window=window).std()
# エントリー・エグジット閾値を設定
data['Upper_Bound'] = data['Mean_Diff'] + data['Std_Diff']
data['Lower_Bound'] = data['Mean_Diff'] - data['Std_Diff']
# シグナル生成
# スプレッド > 上限 → 資産Aを空売り、資産Bを買い
# スプレッド < 下限 → 資産Aを買い、資産Bを空売り
data['Position'] = 0
data.loc[data['Price_Diff'] > data['Upper_Bound'], 'Position'] = -1
data.loc[data['Price_Diff'] < data['Lower_Bound'], 'Position'] = 1
# 資産価格とシグナルをプロット
plt.figure(figsize=(14, 7))
plt.subplot(211)
plt.plot(data['Asset_A'], label='資産A')
plt.plot(data['Asset_B'], label='資産B')
plt.legend()
plt.subplot(212)
plt.plot(data['Price_Diff'], label='価格差')
plt.plot(data['Mean_Diff'], label='平均差')
plt.fill_between(data.index, data['Upper_Bound'], data['Lower_Bound'], color='gray', alpha=0.3, label='トレードゾーン')
plt.plot(data.index, data['Position'] * 20, label='トレードシグナル', color='magenta', marker='o', linestyle='None')
plt.legend()
plt.show()
#4 統計的アービトラージ
統計的アービトラージは、複数の資産間の価格差を利用して利益を得る手法です。一般的なアプローチの一つは、正常な価格範囲から逸脱した銘柄ペアやポートフォリオを特定し、それに応じて売買を行うことです。以下は、2つの株価間のスプレッドに基づいてトレードする、Pythonによる簡単な統計的アービトラージ戦略の例です。
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(42)
data = pd.DataFrame({
'Date': pd.date_range(start='2023-01-01', periods=250),
'Stock_A': np.random.normal(0, 1, 250).cumsum() + 50,
'Stock_B': np.random.normal(0, 1, 250).cumsum() + 50
})
data.set_index('Date', inplace=True)
# 2銘柄のスプレッドを計算
data['Spread'] = data['Stock_A'] - data['Stock_B']
# スプレッドの移動平均と標準偏差を計算
window = 20
data['Spread Mean'] = data['Spread'].rolling(window=window).mean()
data['Spread Std'] = data['Spread'].rolling(window=window).std()
# エントリー・エグジット閾値を設定
entry_z = 2
exit_z = 0
data['Upper Threshold'] = data['Spread Mean'] + entry_z * data['Spread Std']
data['Lower Threshold'] = data['Spread Mean'] - entry_z * data['Spread Std']
data['Exit Threshold'] = data['Spread Mean'] + exit_z * data['Spread Std']
# シグナル生成
data['Position'] = 0
data.loc[data['Spread'] > data['Upper Threshold'], 'Position'] = -1 # Aを空売り、Bを買い
data.loc[data['Spread'] < data['Lower Threshold'], 'Position'] = 1 # Aを買い、Bを空売り
data.loc[data['Spread'] * data['Position'] < data['Exit Threshold'], 'Position'] = 0 # エグジット
# 価格とシグナルをプロット
plt.figure(figsize=(14, 7))
plt.subplot(211)
plt.plot(data['Stock_A'], label='銘柄A')
plt.plot(data['Stock_B'], label='銘柄B')
plt.title('株価')
plt.legend()
plt.subplot(212)
plt.plot(data['Spread'], label='スプレッド')
plt.plot(data['Spread Mean'], label='平均スプレッド')
plt.fill_between(data.index, data['Upper Threshold'], data['Lower Threshold'], color='gray', alpha=0.3, label='エントリーゾーン')
plt.plot(data.index, data['Position'] * 10, label='トレードシグナル', color='magenta', marker='o', linestyle='None')
plt.title('スプレッドとトレードシグナル')
plt.legend()
plt.show()
#5 ボラティリティトレード
ボラティリティ戦略は、市場のボラティリティの変動を利用して利益を得ます。ボラティリティが低い時に買い、高い時に売ります。例えば、日次リターンと過去ボラティリティ(年率標準偏差)を計算し、ボラティリティが平均の1.2倍を超えたら売り、0.8倍を下回ったら買いという条件を設定します。以下のコードをご覧ください。
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', periods=250)
prices = np.random.normal(0, 1, 250).cumsum() + 100
data = pd.DataFrame({
'Date': dates,
'Price': prices
})
data.set_index('Date', inplace=True)
# 日次リターンを計算
data['Returns'] = data['Price'].pct_change()
data.dropna(inplace=True)
# 過去ボラティリティを計算(標準偏差をボラティリティの尺度として使用)
window = 20
data['Volatility'] = data['Returns'].rolling(window=window).std() * np.sqrt(252) # 年率換算
# 戦略を定義
threshold_high = data['Volatility'].mean() * 1.2
threshold_low = data['Volatility'].mean() * 0.8
data['Position'] = 0
data.loc[data['Volatility'] > threshold_high, 'Position'] = -1 # 高ボラティリティで売り
data.loc[data['Volatility'] < threshold_low, 'Position'] = 1 # 低ボラティリティで買い
# 価格とボラティリティをプロット
plt.figure(figsize=(14, 10))
plt.subplot(211)
plt.plot(data['Price'], label='価格')
plt.title('株価')
plt.legend()
plt.subplot(212)
plt.plot(data['Volatility'], label='ボラティリティ')
plt.axhline(y=threshold_high, color='r', linestyle='--', label='高閾値')
plt.axhline(y=threshold_low, color='g', linestyle='--', label='低閾値')
plt.plot(data.index, data['Position'] * 0.01, label='トレードシグナル', color='magenta', marker='o', linestyle='None')
plt.title('ボラティリティとトレードシグナル')
plt.legend()
plt.show()
おすすめPythonクオンツトレーディング書籍
Pythonでクオンツトレーディングを行うのは技術が求められる仕事です。生涯学習の姿勢を持ち続け、継続的にスキルアップしてください。
以下は、初心者から上級者まで役立つと思う電子書籍をいくつか紹介します。画像をクリックして直接読み始められます。どうぞご自由にお取りください。これらの本がお役に立てば、ぜひお友達にもお勧めください。
- 1. ゼロから始めるPythonビッグデータとクオンツトレーディング – 対象:初心者
クリックしてダウンロード 『ゼロから始めるPythonビッグデータとクオンツトレーディング』.pdf - 2. クオンツトレーディングへの道:Pythonによる株式クオンツ分析 – 対象:中級者
クリックしてダウンロード 『クオンツトレーディングへの道:Pythonによる株式クオンツ分析』.pdf - 3. 金融人工知能:Pythonで実装するAIクオンツトレーディング – 対象:上級者
クリックしてダウンロード 『金融人工知能:Pythonで実装するAIクオンツトレーディング』.pdf
【おすすめ読書】先物取引必読書推薦
【おすすめ読書】クオンツ投資おすすめ書籍