【中編】Pythonで作る投資戦略|ロジック構築と検証方法


📌 この記事でわかること:

  • クオンツ投資におけるバックテストの基本とその重要性
  • Pythonで移動平均線を使ったバックテストの実装方法
  • 実際のAAPL株を用いた戦略の比較・評価と改善ポイント

👤 対象となる読者:

  • クオンツ投資をPythonで始めたい初~中級者
  • 移動平均線を使ったシンプルな戦略を検証してみたい方
  • データ分析を活かして株式運用に挑戦したい方

🔧 活用できるシーン:

  • 自作のバックテストツールを作って戦略を比較したいとき
  • 移動平均戦略の限界と改良方法を理解したいとき
  • Pythonの実務スキルとして金融データ分析を試してみたいとき

目次

1. クオンツ投資の実践:バックテストの重要性

1.1.バックテストとは?

クオンツ投資において、バックテスト(Backtesting)非常に重要なプロセスです。
バックテストとは、過去の市場データを使って投資戦略の有効性を検証する手法 であり、戦略が実際の市場で機能するかどうかを確認するために欠かせません。

なぜバックテストが必要なのか?

  1. 投資戦略の検証:感覚的な判断ではなく、データに基づいた戦略を作ることができる。
  2. リスクの把握:戦略のドローダウン(最大損失幅)やリスクを事前に確認できる。
  3. パフォーマンスの最適化:異なるパラメータや条件でのパフォーマンス比較が可能。
  4. マーケット環境の適応:特定の市場環境で有効な戦略かどうかを分析できる。

1.2.Pythonでバックテストを行うメリット

Pythonを活用すると、シンプルなコードでクオンツ投資のバックテストをシンプルなコードで実装できます。pandasnumpy を活用することで、過去の株価データを使ったシミュレーションを簡単に行うことが可能です。

また、前編 ではPythonを使って移動平均線を計算し、そのクロスを売買シグナルとして可視化しました。

👉 まだ読んでいない方はこちらをご覧ください!
 🔗 【前編】Pythonで学ぶクオンツ投資

中編では、この移動平均線の売買シグナルを活用し、クオンツ投資のバックテストを行っていきます!

2. Pythonでバックテストを実装する

ここでは、移動平均線を用いたトレード戦略のバックテスト をPythonで実装していきます。

2.1. バックテストの準備

まず、yfinanceを使って市場データを取得し、移動平均線の売買シグナルを作成します。今回もAAPL(Apple)を使います。

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 📌 株価データの取得(AAPLの例)
data = yf.download('AAPL', start='2020-01-01', end='2024-03-31')

# 📌 50日移動平均線 & 200日移動平均線を計算
data['SMA50'] = data['Close'].rolling(window=50).mean()
data['SMA200'] = data['Close'].rolling(window=200).mean()

# 📌 売買シグナルの作成(ゴールデンクロスで買い、デッドクロスで売り)
data['Signal'] = np.where(data['SMA50'] > data['SMA200'], 1, 0)

2.2. バックテストの実施

次に、クオンツ投資のバックテストを行い、売買シグナルが資産にどのような影響を与えるかを検証します。

# 📌 日次リターンの計算
data['Daily Return'] = data['Close'].pct_change()

# 📌 戦略のリターン(前日のシグナルに基づいて取引)
data['Strategy Return'] = data['Signal'].shift(1) * data['Daily Return']

# 📌 累積リターンの計算
data['Cumulative Return'] = (1 + data['Strategy Return']).cumprod()

2.3. 結果の分析

バックテストの結果の可視化(グラフ表示)と計算を行います。

plt.figure(figsize=(12,6))
plt.plot(data.index, data['Cumulative Return'], label='Strategy', color='blue')
plt.plot(data.index, (1 + data['Daily Return']).cumprod(), label='Buy & Hold', color='gray', linestyle='dashed')

plt.legend()
plt.title('Backtest Performance')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.grid()
plt.show()

# 📌 平均リターン & ボラティリティ
mean_return = data['Strategy Return'].mean()
volatility = data['Strategy Return'].std()

# 📌 シャープレシオの計算(リスク調整後のリターン評価)
sharpe_ratio = mean_return / volatility * np.sqrt(252)

print(f'📊 平均リターン: {mean_return:.4f}')
print(f'📊 ボラティリティ: {volatility:.4f}')
print(f'📊 シャープレシオ: {sharpe_ratio:.2f}')

グラフ:

グラフの見方(Backtest Performance)

  • 青線(Strategy) → 移動平均線の売買シグナルに基づいた累積リターン
  • 灰色の破線(Buy & Hold) → 株を買って持ち続けた場合の累積リターン

💡 気づき

  • 「Strategy(青線)」がほぼ横ばい → 移動平均戦略があまり機能していない可能性
  • 「Buy & Hold(灰色)」は右肩上がり → 持ち続けるだけの方がリターンが良い

パフォーマンス指標の解釈

📊 平均リターン: 0.0003
📊 ボラティリティ: 0.0130
📊 シャープレシオ: 0.36

💡 意味すること

  • シャープレシオが1.0未満(0.36) → リスクに対してリターンが少なく、パフォーマンスが悪い
  • 日次リターンがほぼゼロに近い(0.03%) → 戦略が市場の動きを捉えられていない可能性

📌 期待通りか?

期待通りではないかも(戦略が機能していない可能性)
💡 改善策を考える必要がある

2.4. バックテストの改善点

バックテストの結果が良くない場合、以下のような改善策を検討できます。

  • パラメータの最適化:移動平均線の期間を変更して最適な組み合わせを探る。
  • リスク管理の追加:最大ドローダウンを考慮し、ストップロス(損切り)を設定する。
  • 手数料を考慮:取引ごとの手数料を考慮したリアルなシミュレーションを行う。

今回の場合、次の改善案が考えられます。

  • 移動平均線のパラメータを変える
    例えば、20日 & 100日移動平均線にすると反応が早くなるかも?
  • リスク管理を追加する
    ストップロス(損切り)を入れるとドローダウンが抑えられるかも?
  • 他のファクターを組み合わせる
    例えば、RSI(相対力指数)や出来高を加えるとシグナルの精度が上がる可能性

次の章では移動平均のパラメータを調整し、パフォーマンスの指標を比較検証します!

3. AAPLのバックテスト結果と戦略の改善

3.1. AAPLのバックテスト結果の振り返り

AAPL(Apple)のバックテストを行った結果、移動平均線の組み合わせによって戦略の有効性が大きく変化すること が分かりました。

移動平均線の組み合わせ平均リターン (%)ボラティリティ (%)シャープレシオ結果の評価
50日 & 200日0.03%1.30%0.36❌ 機能せず
50日 & 100日0.20%2.88%1.10✅ 最適!
20日 & 50日0.05%1.30%0.64❌ 短期すぎて悪化

💡 ポイント

  • 50日 & 200日SMA → シグナルが少なすぎて機能しない(遅すぎる)
  • 50日 & 100日SMA → 最も良い結果!適度なトレンドフォローが可能
  • 20日 & 50日SMA → 過剰に売買してしまい、パフォーマンス悪化

3.2. なぜ「50日 & 100日SMA」が最適だったのか?

  • AAPLは中期トレンドが安定している → 100日SMAが適度に長期のトレンドを捉え、50日SMAがエントリーの最適化に貢献した。
  • 市場ノイズを適度に排除できる → 20日 & 50日だと売買回数が増えすぎてパフォーマンスが低下した。
  • ボラティリティが低めの銘柄には、中期のトレンドフォローが適している → 短期では振り回されるが、長期すぎるとタイミングを逃す。

3.3. では、どのように活用すべきか?

トレードスタイルに応じた活用方法

  • 短期トレード移動平均線だけでは不十分。他の指標(RSIなど)と組み合わせる。
  • 中期トレード50日 & 100日SMAが有効!トレンドフォロー戦略として活用可能。
  • 長期投資Buy & Hold(長期保有)が最適。移動平均線戦略を使う必要は低い。

💡 結論: AAPLは「50日 & 100日SMA」を使った中期戦略が有効であり、それ以外ではパフォーマンスが低下する。


4. ここまでのまとめ

AAPLのバックテスト結果を通じて、移動平均線戦略の有効性と限界を検証しました。
その結果、AAPLには50日 & 100日SMAが最も適している ことが分かりました。
しかし、どんなに優れた戦略でも リスク管理をしなければ、実際の運用では大きな損失につながる可能性 があります。

📌 次のステップ: クオンツ投資におけるリスク管理

次回の 「後編」 では、

  • ボラティリティ・シャープレシオ・最大ドローダウンの計算方法
  • リスクを抑えながら安定した運用を行うための考え方
  • Pythonを活用したリスク管理の実践

を解説予定です。

📌 次のステップではリスク管理を深掘りし、戦略改善を実装していきます!
 🔗【後編】Pythonで学ぶクオンツ投資・リスク管理と戦略改善

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Python・投資・業務効率化をテーマにしたブログを運営しています。
本業では社内ツール・アプリの運営・開発をしており、趣味はキャンプや食べ歩きです。

このブログでは、実体験や実務で役立った知識をベースに、
初心者でも再現できる情報発信を心がけています。

コメント

コメント一覧 (2件)

コメントする

目次