常在股海裡闖蕩的朋友們應該很常聽到 MACD 這四個英文字母,常常會聽到當快線 (DIFF) 向上穿越慢線 (MACD) 是黃金交叉代表買入訊號、快線向下跌穿慢線是死亡交叉代表賣出訊號這類的說法,這一篇會先介紹 MACD 技術指標是什麼?再來用 Python 的方式來實作 MACD 技術指標分析,對量化交易有興趣或想理解 MACD 技術指標的朋友們可別錯過啦~
MACD (Moving Average Convergence / Divergence) 中文為指數平滑移動平均線,常會在技術分析中被提到也是投資人最常使用的分析指標之一,只要能理解快線 (DIF) 與慢線 (MACD) 的發散或收斂關係就能讓投資人迅速掌握一支股票的近出場時機,簡單來說:
快線 (DIF) 向上穿越慢線 (MACD) > 買進訊號 (黃金交叉)
快線 (DIF) 向下跌穿慢線 (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)
Step 1. 獲取資料
以台積電 (2330.TW) 為例,先透過 yfinance 獲取每日股價資料並以2020/08/01為起算日
import pandas as pd
import yfinance as yfstock_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 範例圖
資料來源: https://mrhandbyhand.medium.com/python-macd-indicator-find-golden-cross-b876abcfe2d7
沒有留言:
張貼留言