テクニカル分析のMACDでシミュレーションしてみる

シミュレーション

短期と中期を用いて移動平均からゴールデンクロス、デッドクロスを見つけ出して投資するとどうなるかをシミュレーションしてみました。

続いて移動平均の発展版であるMACD(マックディー)についてチャットGPTを使いながら分析してましょう。まずはMACDとは何かを確認してみます。

MACDとは

MACD(Moving Average Convergence Divergence)は、テクニカル分析において広く使用される指標の一つです。ジェラルド・アペルによって1970年代に開発されました。この指標は、二つの移動平均線(EMA: Exponential Moving Average)の差異を利用して市場のトレンドやその変化を捉えることを目的としています。

チャットGPT4

MACDの計算方法

次にMACDの計算方法を聞いてみます。

MACDは主に以下の三つの部分で構成されます。

  1. MACDライン: 短期EMA(通常は12日間)から長期EMA(通常は26日間)を引いたもの。
  2. シグナルライン: MACDラインのEMA(通常は9日間)。MACDラインの平滑化された形となります。
  3. ヒストグラム: MACDラインとシグナルラインの差。市場の勢いを表すと考えられています。
チャットGPT4

言葉だけではよくわからないので移動平均と同様にPythonを用いてグラフを描いてみます。

データの取得

ゴールデンクロス、デッドクロスの時の保存したデータをGoogle driveから読み込んで使用します。データは10年分ありますが、グラフを見やすくするために3年分のみをスライスしておきます。

from google.colab import drive
drive.mount('/content/drive')

path = '/content/drive/My Drive/data/USDJPY_2013_2023.pkl'
df = pd.read_pickle(path)
df = df['2020':'2023']

MACDのグラフを描く

今の時代、プログラミングを難しいと感じる必要はもうありません。作りたいモノが明確になっていればチャットGPTに聞いてみるだけです。今回は「MACDのグラフを描くコードを書いて下さい。」でコードを出力してくれます。プログラミングの基本のみを学習すればコーディングで悩む必要は本当になくなりました。

import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import datetime

# MACDの計算
ema_short = df['Close'].ewm(span=12, adjust=False).mean()
ema_long = df['Close'].ewm(span=26, adjust=False).mean()
df['MACD'] = ema_short - ema_long
df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
df['Histogram'] = df['MACD'] - df['Signal']

# グラフ描画
plt.figure(figsize=(14, 7))

# 株価のプロット
plt.subplot(2, 1, 1)
plt.plot(df.index, df['Close'], label='Close')
plt.title('Close Price and MACD (10 Years)')
plt.legend()

# MACDのプロット
plt.subplot(2, 1, 2)
plt.plot(df.index, df['MACD'], label='MACD', color='blue')
plt.plot(df.index, df['Signal'], label='Signal', color='red')
plt.bar(df.index, df['Histogram'], label='Histogram', color='grey', alpha=0.5)
plt.legend()

plt.show()
  • 上部: 株価のクローズ価格を示しており、市場の全体的な動向を捉えることができます。
  • 下部: MACD指標が描かれています。青い線がMACDライン、赤い線がシグナルライン、灰色のバーがヒストグラムです。MACDラインとシグナルラインの交差点は、市場のトレンド変化を示唆するシグナルとして解釈されます。また、ヒストグラムの大きさはトレンドの勢いを表しています。

売買のシグナルを追加

それでは買いシグナルと売りシグナルがどこになるのかをグラフにプロットしてみます。

import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import datetime
import numpy as np

# MACDの計算
ema_short = df['Close'].ewm(span=12, adjust=False).mean()
ema_long = df['Close'].ewm(span=26, adjust=False).mean()
df['MACD'] = ema_short - ema_long
df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
df['Histogram'] = df['MACD'] - df['Signal']

# シグナル検出
df['Buy_Signal'] = (df['MACD'] > df['Signal']) & (df['MACD'].shift(1) <= df['Signal'].shift(1))
df['Sell_Signal'] = (df['MACD'] < df['Signal']) & (df['MACD'].shift(1) >= df['Signal'].shift(1))

# グラフ描画
plt.figure(figsize=(14, 7))

# 為替レートのプロット
plt.subplot(2, 1, 1)
plt.plot(df.index, df['Close'], label='Close')
plt.title('Close Price and MACD (10 Years) with Trading Signals')
plt.legend()

# 買いシグナルのプロット
plt.scatter(df.index[df['Buy_Signal']], df['Close'][df['Buy_Signal']], color='green', marker='^', alpha=1, label='Buy Signal')

# 売りシグナルのプロット
plt.scatter(df.index[df['Sell_Signal']], df['Close'][df['Sell_Signal']], color='red', marker='v', alpha=1, label='Sell Signal')

# MACDのプロット
plt.subplot(2, 1, 2)
plt.plot(df.index, df['MACD'], label='MACD', color='blue')
plt.plot(df.index, df['Signal'], label='Signal', color='red')
plt.bar(df.index, df['Histogram'], label='Histogram', color='grey', alpha=0.5)
plt.legend()

plt.show()

売買シミュレーション

最後に1万円を元手に買いシグナルで全額購入して、売りシグナルで全て売却するシミュレーションを行ってみます。期間は2023年の1月から12月としてみます。

import pandas as pd

# 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"] = df["MACD"].ewm(span=9, adjust=False).mean()

# 売買シグナルの生成
df["Buy_Signal"] = (df["MACD"] > df["Signal"]) & (df["MACD"].shift(1) <= df["Signal"].shift(1))
df["Sell_Signal"] = (df["MACD"] < df["Signal"]) & (df["MACD"].shift(1) >= df["Signal"].shift(1))

# 取引シミュレーション
initial_capital = 10000
capital = initial_capital
shares = 0

for i, row in df.iterrows():
    if row["Buy_Signal"] and capital > 0:
        shares = capital / row["Close"]
        capital = 0
    elif row["Sell_Signal"] and shares > 0:
        capital = shares * row["Close"]
        shares = 0

# 最終資産の計算
final_capital = capital + (shares * df.iloc[-1]["Close"])
profit = final_capital - initial_capital

print(f"Initial Capital: {initial_capital:,}円")
print(f"Final Capital: {final_capital:,.0f}円")
print(f"Profit: {profit:.0f}円")

Initial Capital: 10,000円
Final Capital: 10,600円
Profit: 600円

MACDのみで売買してもあまり良い結果は得られませんね。他のテクニカル分析を組み合わせて検討する必要があるようです。RSIと組み合わせた指標がよく使われているようなので次回確認しましょう。

コメント