[Python 技術指標分析] 學會MACD找出你的黃金交叉

Mr.HandbyHand
6 min readOct 12, 2020
Image by Gerd Altmann from Pixabay

常在股海裡闖蕩的朋友們應該很常聽到 MACD 這四個英文字母,常常會聽到當快線 (DIFF) 向上穿越慢線 (MACD) 是黃金交叉代表買入訊號、快線向下跌穿慢線是死亡交叉代表賣出訊號這類的說法,這一篇會先介紹 MACD 技術指標是什麼?再來用 Python 的方式來實作 MACD 技術指標分析,對量化交易有興趣或想理解 MACD 技術指標的朋友們可別錯過啦~

MACD 介紹

MACD (Moving Average Convergence / Divergence) 中文為指數平滑移動平均線常會在技術分析中被提到也是投資人最常使用的分析指標之一,只要能理解快線 (DIF) 與慢線 (MACD) 的發散或收斂關係就能讓投資人迅速掌握一支股票的近出場時機,簡單來說:

快線 (DIF) 向上穿越慢線 (MACD) > 買進訊號 (黃金交叉)

快線 (DIF) 向下跌穿慢線 (MACD) > 賣出訊號 (死亡交叉)

MACD 計算方式

指數移動平均線 (EMA)

在計算快線與慢線前需要先理解指數移動平均線 (EMA),指數移動平均線與均線 (MA) 最大的差異為:EMA 是有經過權重控制後得出,日期越接近現在的股價有越大的權重,對於時間較長遠的股價則給予較小的權重。EMA 就是透過不同天用不同大小權重計算後得出

快線 (DIF)

理解什麼是 EMA 後,就能快速理解快、慢線計算方式了。DIF 則是用兩個不同天期的 EMA 相減後得出。常用 26天作為長天期、12天作為短天期

DIF = EMA(12) - EMA(26)

慢線 (MACD)

計算出快線後,再用 9日的 DIF 再取一次 EMA 就是所謂的慢線 (MACD)

MACD = EMA(DIF, 9)

Python code 範例

Step 1. 獲取資料

以台積電 (2330.TW) 為例,先透過 yfinance 獲取每日股價資料並以2020/08/01為起算日

import pandas as pd
import yfinance as yf

stock_num = "2330"
stockNo = "{}.TW".format(stock_num)
startDate = "2020-08-01"
stock = yf.Ticker(stockNo)
stock_df = pd.DataFrame(stock.history(start=startDate))
stock_df = stock_df.reset_index()
print("參考交易日天數: {} 天".format(len(stock_df)))
stock_df.head()

Step 2. 計算快慢線

stock_df['EMA_12'] = stock_df['Close'].ewm(span=12, adjust=False).mean()
stock_df['EMA_26'] = stock_df['Close'].ewm(span=26, adjust=False).mean()
stock_df['DIF'] = stock_df['EMA_12'] - stock_df['EMA_26']
stock_df['MACD'] = stock_df['DIF'].ewm(span=9, adjust=False).mean()
stock_df.head()

Step 3. 畫出圖表找出黃金交叉

這邊將股價走勢與 MACD 線圖結合,方便讀者看出股價與 MACD 變化關係。從範例圖中可以看出當黃線向上穿越橘線時即是黃金交叉同時股價走揚,反之則為死亡交叉股價開始向下反轉

import matplotlib.pyplot as pltfig, ax1 = plt.subplots()
fig.set_size_inches(20, 6)
plt.title('MACD by Mr.HandByHand')
plt.xlabel('Date')
ax2 = ax1.twinx()
# macd & dif
ax1.set_ylabel('MACD', color='black')
ax1.plot(stock_df['Date'], stock_df['DIF'], color='gold', label="DIF", alpha=1)
ax1.plot(stock_df['Date'], stock_df['MACD'], color='coral', label="MACD", alpha=1)
ax1.legend(loc="lower left")
ax1.tick_params(axis='y', labelcolor='black')
ax1.grid(True)
# price
ax2.set_ylabel('Price', color='black')
ax2.plot(stock_df['Date'], stock_df['Close'], color='black', label="Price", linestyle=':', alpha=0.8)
ax2.legend(loc="upper left")
ax2.tick_params(axis='y', labelcolor='black')
fig.autofmt_xdate()
fig.show()
台積電 2330 MACD
2330 MACD 範例圖
歡迎請我喝咖啡
歡迎讚賞,您的鼓勵是我的動力
如果覺得這篇文章有幫助到你可以給我 拍手 當作鼓勵唷,也歡迎您點擊上方 讚賞鍵 不需要花費就能鼓勵創作者 (最多點擊 5 下) ,也歡迎 Follow 我,下次見

--

--

Mr.HandbyHand

AI/程式/投資理財/Crypto 分享與紀錄學習mr.handbyhand666@gmail.com