MACD(移動平均收斂和散漫)是用於分析市場過去數據以預測未來價格走勢的方法之一。它廣泛地用於分析市場趨勢和動能。在本文中,我們將介紹使用"TA-Lib"計算MACD線、信號線和柱狀圖的過程。我們還將全面檢查如何使用MACD進行趨勢分析,以及確定超買/超賣條件的標準。您可以在[TA-Lib] #2: 技術分析的TA-Lib安裝中找到如何安裝TA-Lib,以及在[TA-Lib] #5 MACD - 如何理解 MACD 指標及其在市場趨勢中的角色中找到MACD的基本概念。
使用TA-Lib庫可以輕鬆地計算MACD(移動平均收斂和散漫)。
TA-Lib中的MACD默認公式涉及長期(通常為26天)指數移動平均(EMA)與短期(通常為12天)EMA之間的差異。信號線由此MACD線的9天EMA組成。柱狀圖作為MACD線和信號線之間的差異,用於評估市場的動能。
# 導入庫
from yahooquery import Ticker
import talib
import pandas as pd
# 獲取台積電(2330.TW)股票數據
google = Ticker('2330.TW')
df = google.history(period='2y') # 2年數據
# 使用基本設定計算MACD
macd, signal, histogram = talib.MACD(df['close'])
# 將結果添加到DataFrame
df['macd'] = macd
df['signal'] = signal
df['histogram'] = histogram
# 打印結果
print(df.tail())
macd signal histogram
date
2023-08-18 08:00:00+08:00 -7.826629 -6.007324 -1.819306
2023-08-21 08:00:00+08:00 -8.168350 -6.439529 -1.728821
2023-08-22 08:00:00+08:00 -8.023905 -6.756404 -1.267501
2023-08-23 08:00:00+08:00 -6.941803 -6.793484 -0.148319
2023-08-24 11:57:31+08:00 -5.376716 -6.510130 1.133414
如果您希望自定義移動平均的期間,可以調整TA-Lib的MACD函數中的fastperiod
、slowperiod
、signalperiod
參數。
# 使用自定義移動平均期間計算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 08:00:00+08:00 -7.955613 -6.539785 -1.415829
2023-08-21 08:00:00+08:00 -8.202992 -6.872426 -1.330566
2023-08-22 08:00:00+08:00 -7.878654 -7.073671 -0.804982
2023-08-23 08:00:00+08:00 -6.468320 -6.952601 0.484281
2023-08-24 11:57:31+08:00 -4.553591 -6.472799 1.919208
通過上述代碼,您可以通過調整每個移動平均的期間來適應各種市場條件和策略,執行MACD分析。
MACD線和信號線之間的交叉被視為識別市場波動的重要信號。通過捕捉這些交叉點,您可以辨識趨勢變化的可能性,並相應地作出投資決策。
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-15 08:00:00+08:00 True False
...
2023-08-24 11:57:31+08:00 True False
死亡交叉點:
goldenCross deadCross
date
2021-10-13 08:00:00+08:00 False True
...
2023-07-18 08:00:00+08:00 False True
可以通過兩種重要方式,使用柱狀圖的大小進行趨勢分析:
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['weak_bull']])
print('弱勢空頭趨勢的起始點:')
print(df[df['weak_bear']])
強勢多頭趨勢的起始點:
strong_bull strong_bear weak_bull weak_bear
date
2022-01-04 08:00:00+08:00 True False False False
...
2023-05-22 08:00:00+08:00 True False False False
強勢空頭趨勢的起始點:
strong_bull strong_bear weak_bull weak_bear
date
2022-02-07 08:00:00+08:00 False True False False
...
2023-07-24 08:00:00+08:00 False True False False
弱勢多頭趨勢的起始點:
strong_bull strong_bear weak_bull weak_bear
date
2021-10-29 08:00:00+08:00 False False True False
...
2023-07-17 08:00:00+08:00 False False True False
弱勢空頭趨勢的起始點:
strong_bull strong_bear weak_bull weak_bear
date
2023-01-06 08:00:00+08:00 False False False True
...
2023-08-21 08:00:00+08:00 False False False True
這段代碼通過跟踪柱狀圖大小的五次或更多連續增加或減少,分析了趨勢。通過此方法,市場趨勢可以更精確地辨識,從而使策略調整更為精確。
MACD可用來判定市場的買超和賣超狀況。透過分析MACD線與信號線之間的偏離度,或計算與零線的交叉點,可洞悉市場的現況。
MACD線與信號線之間的偏離度可視為兩線之間的距離,使我們能夠分析市場狀況。較大的距離可能表示市場過熱(買超),可能是賣出的機會。相反地,若距離較小,則可能表示市場賣超狀況,可能是購買的機會。
偏離度的判定標準可能因市場狀況和資產特性的不同而有所不同。在下方的程式碼示例中,如果當前的偏離度是過去30天最大偏離度的80%或更多,則認為兩條線相距過遠,被認為是賣出時機。相反地,如果當前的偏離度小於過去30天最小偏離度的120%,則認為兩條線過於接近,被認為是購買時機。
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
2021-12-30 08:00:00+08:00 True False
... ... ...
2023-08-24 11:57:31+08:00 True False
賣超
Empty DataFrame
Columns: [sell_signal, buy_signal]
Index: []
80%和120%是實驗性的值,可根據個人市場條件和策略進行調整。
當MACD線向上或向下穿越零線時,它可以是一個重要的交易信號。向上交叉可能表示購買機會,而向下交叉可能表示賣出機會。
# 計算零線交叉
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
2021-10-27 08:00:00+08:00 True False
...
2023-05-19 08:00:00+08:00 True False
向下穿越零線
cross_zero_line_up cross_zero_line_down
date
2021-11-01 08:00:00+08:00 False True
...
2023-07-27 08:00:00+08:00 False True
MACD是趨勢和動量分析的優秀工具,是投資決策中的重要指標。通過本文,您已了解如何使用TA-Lib輕鬆計算和分析MACD,使您能針對各種市場情況和策略進行量身定制的分析,從而作出更精確的投資決策。
[TA-Lib] #7: 了解及應用RSI(相對強度指數) |
---|
[TA-Lib] #6: 使用TA-Lib分析和計算MACD |
[TA-Lib] #5 MACD - 如何理解 MACD 指標及其在市場趨勢中的角色 |
[TA-Lib] #4:利用TA-Lib進行移動平均線分析 - 偵測市場趨勢並捕捉黃金交叉與死亡交叉 |
[TA-Lib] #3: 市場趨勢理解 - 短期、中期、長期移動平均線及黃金交叉與死亡交叉 |
CloneCoding
創新從一行代碼開始!