[TA-Lib] #6: TA-Libを活用したMACDの計算と分析

MACD(移動平均収束拡散)は、市場の過去のデータを分析し、将来の価格動向を予測するために使用される方法の一つです。市場のトレンドとモメンタムの分析に幅広く利用されています。本稿では、"TA-Lib"を使用してMACDライン、シグナルライン、ヒストグラムの計算プロセスを紹介します。MACDを使用したトレンド分析、買い過ぎ/売り過ぎの判断基準についても詳しく検討します。TA-Libのインストール方法は[TA-Lib] #2: 技術的分析のためのTA-Libインストールで、MACDの基本概念は[TA-Lib] #5 MACD - MACD とは何か、指标としての役割の分析で確認できます。

TA-Libを使用したMACDライン、シグナルライン、ヒストグラムの計算

MACD(移動平均収束拡散)の計算は、TA-Libライブラリを使用することで、容易に実行することができます。

基本設定でのMACDの計算

TA-LibのMACDのデフォルトの式では、長期(通常26日間)の指数移動平均(EMA)と短期(通常12日間)のEMAとの差異が求められます。シグナルラインは、このMACDラインの9日間のEMAで構成されます。ヒストグラムはMACDラインとシグナルラインとの差であり、市場の勢いを評価するために使用されます。

python
# ライブラリのインポート
from yahooquery import Ticker
import talib
import pandas as pd

# トヨタ自動車株式会社 (7203.T) の株価データの取得
google = Ticker('7203.T')
df = google.history(period='2y')  # 2年間のデータ

# 基本設定でのMACDの計算
macd_line, signal_line, histogram = talib.MACD(df['close'])

# DataFrameへの結果の追加
df['macd'] = macd_line
df['signal'] = signal_line
df['histogram'] = histogram

# 結果の印刷
print(df.tail())
                                macd     signal  histogram
date                                                      
2023-08-18 09:00:00+09:00  30.848448  44.090851 -13.242404
2023-08-21 09:00:00+09:00  26.079412  40.488564 -14.409151
2023-08-22 09:00:00+09:00  26.832112  37.757273 -10.925162
2023-08-23 09:00:00+09:00  26.637422  35.533303  -8.895881
2023-08-24 12:58:02+09:00  25.303834  33.487409  -8.183575

カスタム設定でのMACDの計算

移動平均の期間をカスタム設定したい場合は、TA-LibのMACD関数のfastperiodslowperiodsignalperiodパラメーターを調整できます。

python
# カスタム移動平均期間でのMACDの計算
# 例:fast_periodを10に、slow_periodを22に変更:
macd_line_custom, signal_line_custom, histogram_custom = talib.MACD(df['close'], fastperiod=10, slowperiod=22)

# DataFrameへの結果の追加
df['macdCustom'] = macd_line_custom
df['signalCustom'] = signal_line_custom
df['histogramCustom'] = histogram_custom

# 結果の印刷
print(df.tail())
                           macdCustom  signalCustom  histogramCustom
date                                                                
2023-08-18 09:00:00+09:00   20.638677     35.780924       -15.142247
2023-08-21 09:00:00+09:00   15.803763     31.785492       -15.981729
2023-08-22 09:00:00+09:00   17.633748     28.955143       -11.321395
2023-08-23 09:00:00+09:00   18.152848     26.794684        -8.641837
2023-08-24 12:58:02+09:00   17.210154     24.877778        -7.667624

上記のコードを通じて、各移動平均の期間をさまざまな市場状況と戦略に合わせて調整することで、MACD分析を実行できます。

TA-Libを使用したMACD分析

トレンドフォロー

MACDラインとシグナルラインのクロスオーバーポイントの特定

MACDラインとシグナルラインのクロスオーバーは、市場の変動を認識するための重要なシグナルとなります。これらのクロスオーバーを把握することで、トレンドの変化の可能性を見極め、投資判断を行うことができます。

  • ゴールデンクロス: MACDラインがシグナルラインを下からクロスすると発生します。この現象は、上昇トレンドの開始を代表し、買いの機会と解釈することができます。
  • デッドクロス: MACDラインがシグナルラインを上からクロスすると発生します。このシグナルは、下降トレンドの始まりを示すかもしれず、売りのポイントと考えられるでしょう。
python
import talib

macd, signal, _ = talib.MACD(df['close'])
df['macd'] = macd
df['signal'] = signal

df['upward'] = df['macd'] > df['signal']
df['downward'] = df['macd'] < df['signal']
df['goldenCross'] = (df['upward']) & (~df['upward'].shift(1).fillna(False))
df['deadCross'] = (df['downward']) & (~df['downward'].shift(1).fillna(False))

print('ゴールデンクロス:')
print(df[df['goldenCross']])

print('デッドクロス:')
print(df[df['deadCross']])
ゴールデンクロス:
                           goldenCross  deadCross
date                                             
2021-10-18 09:00:00+09:00         True      False
...
2023-07-31 09:00:00+09:00         True      False


デッドクロス:
                           goldenCross  deadCross
date                                             
2021-10-12 09:00:00+09:00        False       True
...
2023-08-14 09:00:00+09:00        False       True

ヒストグラムのサイズを使用したトレンド分析

ヒストグラムのサイズを使用したトレンド分析は、次の2つの重要な方法で実施できます:

  • 強いトレンド: ヒストグラムのサイズが徐々に増加している場合、現在のトレンド(上向きまたは下向き)が強化していることを示します。これは市場の強い力を代表し、その方向での投資戦略を強化することができます。
  • トレンドの弱化: サイズが減少している場合、トレンドが弱化していることを示し、ポジションを調整する時期である可能性があります。これは、トレンドの逆転に警戒し、適切に対応する必要があることを意味します。
python
macd, signal, histogram = talib.MACD(df['close'])
df['macd'] = macd
df['signal'] =

 signal
df['histogram'] = histogram

# トレンド列の初期化
df['strong_bull'] = False
df['strong_bear'] = False
df['weak_bull'] = False
df['weak_bear'] = False

consecutive_increase = 0
consecutive_decrease = 0
prev_hist_size = abs(df['histogram'][0])

for i in df.index:
    curr_hist_size = abs(df['histogram'][i])

    if curr_hist_size > prev_hist_size:
        consecutive_increase += 1
        consecutive_decrease = 0
    elif curr_hist_size < prev_hist_size:
        consecutive_decrease += 1
        consecutive_increase = 0

    if consecutive_increase >= 5:
        trend_col = 'strong_bull' if df['histogram'][i] > 0 else 'strong_bear'
        df.at[i, trend_col] = True
        consecutive_increase = 0

    if consecutive_decrease >= 5:
        trend_col = 'weak_bull' if df['histogram'][i] > 0 else 'weak_bear'
        df.at[i, trend_col] = True
        consecutive_decrease = 0

    prev_hist_size = curr_hist_size

print('強い上昇トレンドの開始点:')
print(df[df['strong_bull']])

print('強い下降トレンドの開始点:')
print(df[df['strong_bear']])

print('弱化している上昇トレンドの開始点:')
print(df[df['strong_bear']])

print('弱化している下降トレンドの開始点:')
print(df[df['weak_bear']])
強勢多頭趨勢的起始點:
                           strong_bull  strong_bear  weak_bull  weak_bear
date                                                                     
2022-01-11 09:00:00+09:00         True        False      False      False
...
2023-06-15 09:00:00+09:00         True        False      False      False


強勢空頭趨勢的起始點:
                           strong_bull  strong_bear  weak_bull  weak_bear
date                                                                     
2022-02-17 09:00:00+09:00        False         True      False      False
...
2023-08-18 09:00:00+09:00        False         True      False      False


弱勢多頭趨勢的起始點:
                           strong_bull  strong_bear  weak_bull  weak_bear
date                                                                     
2021-11-25 09:00:00+09:00        False        False       True      False
...
2023-08-09 09:00:00+09:00        False        False       True      False


弱勢空頭趨勢的起始點:
                           strong_bull  strong_bear  weak_bull  weak_bear
date                                                                     
2021-12-07 09:00:00+09:00        False        False      False       True
...
2023-07-21 09:00:00+09:00        False        False      False       True

このコードは、ヒストグラムのサイズの5回以上の連続増減を追跡してトレンドを分析します。この方法に従うことで、市場のトレンドをより正確に見極め、戦略を正確に調整することが可能となります。

買い過ぎ/売り過ぎ

MACDは市場の買い過ぎと売り過ぎの状態を判断するために使用できます。MACDラインとシグナルラインとの間の乖離を分析したり、ゼロラインとの交差を計算したりすることで、市場の状態を見極めることができます。

MACDラインとシグナルライン間の乖離計算

MACDラインとシグナルラインの間の乖離は、両ライン間の距離として捉えることができ、市場の状態を分析するための基準となります。広い距離は市場が過熱している(買い過ぎ)ことを示す可能性があり、売却の機会を示唆するかもしれません。逆に、距離が狭い場合は、売り過ぎの市場状態を示し、買い付けの機会である可能性があります。

乖離の基準は市場の状況や資産の特性によって異なる場合があります。以下のコード例では、現在の乖離が過去30日間の最大乖離の80%以上であれば、二つのラインが離れすぎていると判断され、売却のタイミングとされます。逆に、現在の乖離が過去30日間の最小乖離の120%未満であれば、二つのラインが近すぎると判断され、買い付けのタイミングとされます。

python
macd, signal, _ = talib.MACD(df['close'])
df['macd'] = macd
df['signal'] = signal

# MACDラインとシグナルライン間の乖離を計算する。
df['divergence'] = df['macd'] - df['signal']

# 過去30日間の最大および最小乖離を計算する。
df['max_divergence'] = df['divergence'].rolling(window=30).max()
df['min_divergence'] = df['divergence'].rolling(window=30).min()

# 売却のタイミング判断:現在の乖離が最大乖離の80%以上。
df['sell_signal'] = df['divergence'] >= df['max_divergence'] * 0.8

# 買い付けのタイミング判断:現在の乖離が最小乖離の120%未満。
df['buy_signal'] = df['divergence'] <= df['min_divergence'] * 1.2

print('買い過ぎ')
print(df[df['sell_signal']])

print('売り過ぎ')
print(df[df['buy_signal']])
買い過ぎ
                           sell_signal  buy_signal
date                                              
2022-01-04 09:00:00+09:00         True       False
...                    
2023-08-02 09:00:00+09:00         True       False


売り過ぎ
Empty DataFrame
Columns: [sell_signal, buy_signal]
Index: []

80%と120%は試験値であり、個別の市場状況と戦略に応じて調整することができます。

ゼロライン交差計算

MACDラインが上向きまたは下向きにゼロラインを交差する場合、重要な取引のシグナルとなることがあります。上向きの交差は買い付けの機会を、下向きの交差は売却の機会を示すかもしれません。

python
# ゼロライン交差を計算する
df['cross_zero_line_up'] = (df['macd'] > 0) & (df['macd'].shift(1) <= 0)
df['cross_zero_line_down'] = (df['macd'] < 0) & (df['macd'].shift(1) >= 0)

print('ゼロラインを上向きに交差')
print(df[df['cross_zero_line_up']])

print('ゼロラインを下向きに交差')
print(df[df['cross_zero_line_down']])
ゼロラインを上向きに交差
                           cross_zero_line_up  cross_zero_line_down
date                                                               
2022-03-28 09:00:00+09:00                True                 False
...
2023-05-02 09:00:00+09:00                True                 False


ゼロラインを下向きに交差
                           cross_zero_line_up  cross_zero_line_down
date                                                               
2022-02-15 09:00:00+09:00               False                  True
...
2023-04-06 09:00:00+09:00               False                  True

MACDは、投資判断に欠かせない指標として、トレンドとモメンタム分析に優れたツールです。この記事を通じて、TA-Libを使用してMACDを簡単に計算し分析する方法を学びました。これにより、様々な市場の状況と戦略に合わせた分析を行うことができ、より精確な投資判断が可能となります。


よくある質問(FAQs)

  1. TA-LibのMACD機能でfastperiod、slowperiod、signalperiod以外のパラメータを調整できますか?
    • TA-LibのMACD機能では、通常これら三つの主要なパラメータの調整が可能です。特殊なケースでない限り、追加の設定は一般的に使用されません。
  2. MACD分析で使用する期間をどう選ぶべきですか?
    • MACD分析で使用する期間は戦略や市場状況によって異なる場合があります。一般的なデフォルト値は12、26、9日ですが、特定の市場や製品に最適な値は実験を通じて見つけることができます。
  3. MACDヒストグラムが負の場合、どう解釈すべきですか?
    • MACDヒストグラムが負であれば、MACDラインがシグナルラインより低いことを示しています。これは下降トレンドの可能性が高く、売却のシグナルと解釈されることがあります。具体的な市場状況と戦略に応じた慎重な分析が必要です。
  4. yahooqueryを使用してMACD分析を行いたい場合、どうすればよいですか?
  5. TA-LibをインストールせずにMACD分析を行いたい場合、どうすればよいですか?
    • TA-Libを使用せずにMACDを計算することは可能ですが、コードが複雑になることがあります。PythonのPandasのようなライブラリを直接使用して実装することができます。しかし、TA-Libの便利さと効率を享受するために、インストールすることをお勧めします。インストールに関する情報は[TA-Lib] #2: 技術的分析のためのTA-Libインストールで見つけることができます。
© Copyright 2023 CLONE CODING