アルゴリズムトレードには様々な戦略(ストラテジー)があります。この記事では、プロの機関投資家も使う有名な10種類の戦略をPythonコード付きで解説します。
戦略1:移動平均クロス(トレンドフォロー)
短期移動平均が長期移動平均を上抜けたら買い(ゴールデンクロス)、下抜けたら売り(デッドクロス)という最もシンプルなトレンド戦略です。
import yfinance as yf
import pandas as pd
import numpy as np
df = yf.download("7203.T", period="2y", progress=False)
df['MA25'] = df['Close'].rolling(25).mean()
df['MA75'] = df['Close'].rolling(75).mean()
df['Signal'] = np.where(df['MA25'] > df['MA75'], 1, -1)
print("移動平均クロス シグナル数:", df['Signal'].diff().ne(0).sum())
戦略2:RSIによる逆張り(平均回帰)
RSI(相対力指数)が30以下で売られすぎ→買い、70以上で買われすぎ→売りというオシレーター系の代表的戦略です。
def calculate_rsi(series, period=14):
delta = series.diff()
gain = delta.clip(lower=0).rolling(period).mean()
loss = (-delta.clip(upper=0)).rolling(period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
df['RSI'] = calculate_rsi(df['Close'])
df['RSI_Signal'] = 0
df.loc[df['RSI'] < 30, 'RSI_Signal'] = 1 # 買い
df.loc[df['RSI'] > 70, 'RSI_Signal'] = -1 # 売り
戦略3:ボリンジャーバンド逆張り
標準偏差で計算したバンドの外に価格が出たら平均回帰を狙う戦略です。
df['BB_Mid'] = df['Close'].rolling(20).mean()
df['BB_Std'] = df['Close'].rolling(20).std()
df['BB_Upper'] = df['BB_Mid'] + 2 * df['BB_Std']
df['BB_Lower'] = df['BB_Mid'] - 2 * df['BB_Std']
# 下限バンドを下抜けたら買い、上限バンドを上抜けたら売り
df['BB_Signal'] = 0
df.loc[df['Close'] < df['BB_Lower'], 'BB_Signal'] = 1
df.loc[df['Close'] > df['BB_Upper'], 'BB_Signal'] = -1
戦略4:ペアトレード(統計的裁定)
相関の高い2つの銘柄の価格差が開いたとき、割高な方を売り・割安な方を買うニュートラル戦略です。
import statsmodels.api as sm
# トヨタとホンダの例
toyota = yf.download("7203.T", period="2y", progress=False)['Close']
honda = yf.download("7267.T", period="2y", progress=False)['Close']
# 共和分検定(ペアとして有効か確認)
from statsmodels.tsa.stattools import coint
score, pvalue, _ = coint(toyota, honda)
print(f"共和分検定 p値: {pvalue:.4f} ({'有効' if pvalue < 0.05 else '無効'})")
# スプレッド計算
model = sm.OLS(toyota, sm.add_constant(honda)).fit()
spread = toyota - model.params[1] * honda - model.params[0]
z_score = (spread - spread.mean()) / spread.std()
# シグナル(Zスコアが2を超えたら売り、-2を下回ったら買い)
print(f"現在のZスコア: {z_score.iloc[-1]:.2f}")
戦略5:モメンタム戦略
過去N日間のリターンが高い銘柄はその後も上がりやすいという「モメンタム効果」を利用する戦略です。
tickers = ["7203.T", "9984.T", "6758.T", "8306.T", "4063.T",
"9433.T", "6902.T", "4502.T", "8001.T", "7267.T"]
# 各銘柄の12ヶ月リターンを計算
returns = {}
for t in tickers:
data = yf.download(t, period="13mo", progress=False)['Close']
returns[t] = (data.iloc[-1] / data.iloc[0]) - 1
# リターン上位3銘柄を買い、下位3銘柄を売り
sorted_returns = sorted(returns.items(), key=lambda x: x[1], reverse=True)
long_portfolio = [t for t, r in sorted_returns[:3]]
short_portfolio = [t for t, r in sorted_returns[-3:]]
print(f"ロング: {long_portfolio}")
print(f"ショート: {short_portfolio}")
戦略6:ブレイクアウト戦略
一定期間の高値・安値をブレイクしたらトレンドが継続すると判断して乗っていく戦略です。
N = 20 # 20日間の高値・安値
df['High_N'] = df['High'].rolling(N).max().shift(1)
df['Low_N'] = df['Low'].rolling(N).min().shift(1)
df['Breakout_Signal'] = 0
df.loc[df['Close'] > df['High_N'], 'Breakout_Signal'] = 1 # 上抜けで買い
df.loc[df['Close'] < df['Low_N'], 'Breakout_Signal'] = -1 # 下抜けで売り
戦略7:MACD戦略
短期EMAと長期EMAの差(MACD)とそのシグナル線のクロスで売買判断をする戦略です。
df['EMA12'] = df['Close'].ewm(span=12, adjust=False).mean()
df['EMA26'] = df['Close'].ewm(span=26, adjust=False).mean()
df['MACD'] = df['EMA12'] - df['EMA26']
df['Signal_Line'] = df['MACD'].ewm(span=9, adjust=False).mean()
df['MACD_Signal'] = np.where(df['MACD'] > df['Signal_Line'], 1, -1)
戦略8:カレンダー効果(月次アノマリー)
「1月効果」「月末効果」など、特定の時期に価格が動きやすいアノマリーを利用する戦略です。
df['Month'] = df.index.month
df['Returns'] = df['Close'].pct_change()
# 月別平均リターン
monthly_returns = df.groupby('Month')['Returns'].mean() * 100
print(monthly_returns)
戦略9:VIX(恐怖指数)連動戦略
市場の恐怖指数VIXが急上昇した際に逆張りで株を買う戦略です。
# VIX(恐怖指数)の取得
vix = yf.download("^VIX", period="2y", progress=False)['Close']
sp500 = yf.download("^GSPC", period="2y", progress=False)['Close']
# VIXが30を超えたら買いシグナル
signal = (vix > 30).astype(int)
print(f"VIXが30超えた日数: {signal.sum()}日")
戦略10:機械学習(ランダムフォレスト)戦略
過去の特徴量(テクニカル指標)から翌日の騰落を機械学習で予測する戦略です。
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# 特徴量を作成
df['Return_1d'] = df['Close'].pct_change()
df['Return_5d'] = df['Close'].pct_change(5)
df['RSI'] = calculate_rsi(df['Close'])
df['Volume_Ratio'] = df['Volume'] / df['Volume'].rolling(20).mean()
df['Target'] = (df['Return_1d'].shift(-1) > 0).astype(int)
# 学習・予測
features = ['Return_1d', 'Return_5d', 'RSI', 'Volume_Ratio']
df_clean = df.dropna()
X = df_clean[features]
y = df_clean['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
accuracy = model.score(X_test, y_test)
print(f"予測精度: {accuracy:.1%}")
まとめ
アルゴリズム戦略は大きく「トレンドフォロー」「平均回帰」「統計的裁定」「機械学習」の4カテゴリに分類できます。初心者は移動平均クロスやRSI戦略から始め、慣れてきたらペアトレードや機械学習戦略に挑戦してみましょう。どの戦略も必ずバックテストで有効性を確認してから本番投入することが重要です。

