機械学習を用いた金融市場予測における平均回帰戦略のPython実装
本記事では、機械学習を活用した金融市場の予測手法として、平均回帰(Mean Reversion)戦略について解説します。特に、Pythonを使用して実際のデータを取得し、移動平均を用いたシグナル生成から、機械学習によるシグナル精度向上までの一連の流れを示します。使用するライブラリは、yfinance、pandas、matplotlib、scikit-learn、ccxtです。
平均回帰戦略とは?
平均回帰戦略は、資産価格が過去の平均値に戻ると仮定する投資戦略です。この戦略は、短期的な価格の変動を捉え、利益を上げることを目指します。特に、過剰な買いまたは売りが発生した際に有効とされ、高ボラティリティな市場での利用が多いです。
データ取得:yfinanceを使った株価データの取得
Yahoo Financeから株価データを取得するために、yfinanceライブラリを使用します。まずはライブラリのインストールを行います。
pip install yfinance
次に、以下のコードでApple(AAPL)の株価データを取得します。
import yfinance as yf
import pandas as pd
# AAPLの株価データを取得
ticker = 'AAPL'
data = yf.download(ticker, start='2020-01-01', end='2023-01-01')
data['Close'].plot(title=f'{ticker}の株価')
移動平均を使ったシグナル生成
移動平均を計算し、売買シグナルを生成します。20日移動平均(SMA20)と50日移動平均(SMA50)を用いて、クロスしたポイントをエントリーポイントとします。
# 移動平均の計算
data['SMA20'] = data['Close'].rolling(window=20).mean()
data['SMA50'] = data['Close'].rolling(window=50).mean()
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['SMA20'], label='20-Day SMA')
plt.plot(data['SMA50'], label='50-Day SMA')
plt.title(f"{ticker}の移動平均")
plt.legend()
plt.show()
シグナル判定とバックテストの準備
長期および短期の移動平均が交差するポイントで売買シグナルを生成します。以下のコードでシグナルを判定し、バックテスト用のデータフレームを作成します。
data['Signal'] = 0
data['Signal'][20:] = np.where(data['SMA20'][20:] > data['SMA50'][20:], 1, 0)
data['Position'] = data['Signal'].diff()
# バックテストの計算
data['Strategy Returns'] = data['Close'].pct_change() * data['Signal'].shift(1)
cumulative_strategy_returns = (1 + data['Strategy Returns']).cumprod() - 1
plt.figure(figsize=(12,6))
plt.plot(cumulative_strategy_returns, label='Strategy Returns')
plt.title('バックテスト結果')
plt.legend()
plt.show()
機械学習によるシグナルの向上
機械学習を導入することで、シグナルの精度をさらに向上させることが期待できます。以下に、scikit-learnライブラリを使ったロジスティック回帰モデルの実装例を示します。
まず、ライブラリをインストールします。
pip install scikit-learn
次に、特徴量とターゲットの作成を行います。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 特徴量とターゲットの作成
data['rs'] = data['Close'].diff(1) # 価格の変化率
data['target'] = (data['Close'].shift(-1) > data['Close']).astype(int)
# 学習データとテストデータに分割
features = data[['SMA20', 'SMA50', 'rs']].dropna()
target = data['target'].dropna()
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)
# ロジスティック回帰モデルの実装
model = LogisticRegression()
model.fit(X_train, y_train)
# 結果の出力
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
メトリクスを確認し、精度の向上を図るためにハイパーパラメータの最適化や他のモデル(例:ランダムフォレストやXGBoost)を試すことも検討しましょう。
リアルタイムデータの取得とトレード
実際の取引を行う際にはリアルタイムデータが必要です。ccxtライブラリを用いることで、複数の取引所からリアルタイムの価格情報を取得可能です。
pip install ccxt
以下は、Binanceからビットコインのリアルタイムデータを取得する例です。
import ccxt
exchange = ccxt.binance()
symbol = 'BTC/USDT'
data = exchange.fetch_ticker(symbol)
print(data) # リアルタイムの価格情報を出力
まとめと次のステップ
本記事では、平均回帰戦略を用いた金融市場の予測方法を解説しました。機械学習の導入により、シグナルの精度向上が期待できます。次のステップとして、独自のデータ分析を行い、異なる戦略を比較することをお勧めします。また、取得したデータを元に自動売買システムを構築することで、投資の効率を大幅に改善することが可能です。資産運用の革新をこの手に掴みましょう!
【お知らせ】
システム全体のインフラ構成や、より詳細な統計検証データについては、プロフィール欄に記載のリンク先(技術メディア)にて随時公開しています。