[Python] 使用mplfinance和matplotlib繪製台積電的MACD圖表

在本篇文章中,我們專注於股市趨勢分析的圖表繪製過程。此過程包括五個部分:初始配置、數據準備、圖表輪廓創建、主圖渲染、繪製MACD指標和MACD振蕩器直方圖、圖表標題、圖例、刻度設置和圖表輸出。

初始配置與數據準備

我們導入必要的庫和模塊以繪製圖表,並為所需的股票準備數據。我們使用yahooquery從Yahoo Finance獲取股價數據,包括特定時期的開盤價、收盤價、最高價和最低價。這些數據點是圖表創建的重要組成部分。

代碼

python
from yahooquery import Ticker
import pandas as pd

# 要顯示的數據數量
show_count = 250
# 要在x軸上顯示的刻度數量
tick_count = 10

# 通過yahooquery下載台積電的股票數據
tsmc = Ticker('2330.TW')
data = tsmc.history(period="2y")
# 重置'symbol'和'date'的索引,並使用'date'列設置新索引
data.reset_index(inplace=True)
data['date'] = pd.to_datetime(data['date'])
data.set_index('date', inplace=True)

# 使用talib庫計算移動平均
data["sma5"] = talib.SMA(data.close, timeperiod=5)  # 5天移動平均
data["sma20"] = talib.SMA(data.close, timeperiod=20) # 20天移動平均
data["sma60"] = talib.SMA(data.close, timeperiod=60) # 60天移動平均

# 計算MACD
data["macd"], data["macd_signal"], data["macd_hist"] = talib.MACD(data['close'])

# 只使用最後250個數據
data = data.tail(show_count)

解釋

  1. 數據配置: 設置要顯示的股票數據數量(show_count)和x軸上的刻度標記數量(tick_count)。
  2. 台積電數據下載: 使用yahooquery下載台積電的股票數據,期限為2年。如何使用yahooquery獲取股票數據,請參見[Python] Yahooquery:取得和管理過去股票和財務數據
  3. 索引配置: 通過yahooquery下載的數據按'symbol'和'date'進行索引,因此必須重置,並將'date'列轉換為日期時間類型,並設置為圖表繪製的新索引。
  4. 移動平均計算: 利用TA-Lib庫計算5天、20天和60天的移動平均。如何計算和使用移動平均,請參見[TA-Lib] #4:利用TA-Lib進行移動平均線分析 - 偵測市場趨勢並捕捉黃金交叉與死亡交叉
  5. MACD計算: 計算MACD、MACD信號和MACD直方圖。這些值用於分析股票的動量,有關如何計算和分析MACD的詳細信息,可以在[TA-Lib] #6: 使用TA-Lib分析和計算MACD中閱讀。
  6. 數據篩選: 僅選擇最新的250個數據進行分析。此步驟強調了在給定時期內分析最近趨勢的重要性。

創建圖表輪廓

設置圖表的整體形狀和大小。

代碼

python
import matplotlib.pyplot as plt
import mplfinance as mpf

# 設置圖表的整體大小
fig = mpf.figure(figsize=(12,10))

# 為主圖、MACD圖和MACD振蕩器圖創建子圖
ax_main = fig.add_subplot(5, 1, (1, 3), facecolor='white')

 # 主圖
ax_macd = fig.add_subplot(5, 1, (4, 4), facecolor='white') # MACD圖
ax_hist = fig.add_subplot(5, 1, (5, 5), facecolor='white') # MACD振蕩器圖

# 調整子圖之間的間距
fig.tight_layout()

解釋

  1. 設置整體圖形大小: 使用mpf.figure(figsize=(12,10))確定整體圖形的大小,寬度為12英寸,高度為10英寸。此尺寸定義了整個圖形窗口。
  2. 創建子圖: 子圖定義了整個圖形窗口內各個圖表的位置和大小。
    • 主圖: fig.add_subplot(5, 1, (1, 3), facecolor='white')將整個圖形垂直分為5部分,水平分為1部分,將前3個垂直部分分配給主圖。
    • MACD圖: fig.add_subplot(5, 1, (4, 4), facecolor='white')將第四個垂直部分分配給MACD圖。
    • MACD振蕩器圖: fig.add_subplot(5, 1, (5, 5), facecolor='white')將最後一個垂直部分分配給MACD振蕩器圖。
  3. 間距調整: 使用fig.tight_layout()調整子圖之間的間距,確保圖表均勻排列,呈現美觀的佈局。
主圖、MACD和MACD振蕩器的輪廓,各放置在不同區域
主圖、MACD和MACD振蕩器在不同區域的輪廓。每個特定區域都配置用於分析股票的各個方面。

創建主要圖表(蠟燭圖與移動平均線)

蠟燭圖作為分析股市趨勢的重要工具,圖形化地呈現開盤、收盤、最高和最低價格,而移動平均線則描繪股票在特定期間的平均價格。利用TA-Lib庫能簡化這類分析的執行。

代碼

python
added_plots = {
    'MA5': mpf.make_addplot(data.sma5, type='line', ax=ax_main, width=1.5),
    'MA20': mpf.make_addplot(data.sma20, type='line', ax=ax_main, width=1.5),
    'MA60': mpf.make_addplot(data.sma60, type='line', ax=ax_main, width=1.5),
}

mc = mpf.make_marketcolors(up="#BE452D", down="#4375E0", edge='black')

s = mpf.make_mpf_style(marketcolors=mc, gridcolor='#DDDDDD', gridstyle="--")

mpf.plot(data,
         style=s,
         type='candle',
         ax=ax_main,
         addplot=list(added_plots.values()),
         datetime_format='%Y-%m-%d',
         returnfig=True)

ax_main.set_ylabel('')

解釋

  1. 設定移動平均線圖表: 透過mpf.make_addplot函數,繪製5天、20天和60天的移動平均線為折線圖,其中ax=ax_main表示在主圖上繪製移動平均線。
  2. 配置市場顏色: mpf.make_marketcolors函數設置蠟燭圖上升和下降趨勢的顏色。在此例中,紅色(#BE452D)表示增加,藍色(#4375E0)表示減少。
  3. 風格設計: mpf.make_mpf_style函數配置整體圖形的美觀,指定市場顏色、網格顏色和網格樣式。
  4. 繪製蠟燭圖: 使用mpf.plot函數渲染蠟燭圖以及之前設定的移動平均線。此處,addplot參數添加移動平均線圖表,並且datetime_format確定日期格式。
  5. Y軸標籤配置: ax_main.set_ylabel('')移除Y軸標籤。

本代碼展示了使用mplfinance庫繪製台積電股票的蠟燭圖和移動平均線的過程。這個庫具有輕鬆繪製蠟燭圖和移動平均線並利用內置風格的優勢。

有關如何使用mplfinance庫繪製蠟燭圖的詳細指南,請參見[Python] 使用mplfinance繪製蠟燭圖表


描繪MACD指標和MACD震盪器柱狀圖

MACD指標代表了兩個移動平均線之間的差異,這一差異在分辨趨勢的強度和方向方面起到關鍵作用。MACD震盪器柱狀圖通過形象地描繪這一差異以柱形圖形式,有助於視覺分析。

代碼

python
ax_macd.plot([0, len(index)-1],
                 [0, 0],
                 color='#DE0000',
                 linestyle='--',
                 linewidth=0.7)

ax_macd.plot(data.index,
                data['macd'],
                label='MACD')

ax_macd.plot(data.index,
                data['macd_signal'],
                label='MACD Signal')

histogram = data['macd_hist']
index = data.index.strftime('%Y-%m-%d')
ax_hist.bar(list(index), list(histogram.where(histogram > 0)), 0.7, color="#EC3019")
ax_hist.bar(list(index), list(histogram.where(histogram < 0)), 0.7, color="#4375E0")

解釋

  1. 繪製中心線: 在MACD圖上繪製中心線。此線作為基准線,判斷MACD值是正還是負。它以紅色虛線(#DE0000)顯示。
  2. 繪製MACD和MACD信號: 使用ax_macd.plot函數渲染MACD值和MACD信號值作為折線圖。
  3. 描繪MACD柱狀圖: ax_hist.bar函數繪製MACD柱狀圖,判斷正值和負值,並用紅色(#EC3019)和藍色(#4375E0)標記。
  • 轉換索引字符串: 在繪製柱狀圖時將索引轉換為字符串的主要原因是克服連續工作日的問題,例如股票數據。通常,將x軸以日期格式傳遞會用零值替換不存在的日期(例如週末)。這種方法可能不適用於僅在特定日期存在數據的股市等場景。因此,通過將索引轉換為'年-月-日'字符串,避免了日期的連續顯示,防止了沒有數據的日期的呈現。strftime('%Y-%m-%d')函數將日期索引轉換為相應的字符串格式。

設定圖表標題、圖例、刻度,並呈現圖表

在此部分,執行圖表所需的最終步驟。添加標題以闡明圖表的主題,並使用圖例來闡述圖表的每一部分。刻度設置指定了軸的單位,完成所有設置後,圖表將被呈現。

代碼

python
# 為每個圖表設置標題
ax_main.set_title('台積電', fontsize=15, fontdict={'family': 'Noto Sans TC'})
ax_macd.set_title('MACD', fontsize=15)
ax_hist.set_title('MACD Signal', fontsize=15)

# 為主圖表設置圖例
font = font_manager.FontProperties(family='Noto Sans TC', weight='normal')
ax_main.legend([None]*(len(added_plots)+2))
handles = ax_main.get_legend().legend_handles
ax_main.legend(handles=handles[2:], labels=list(added_plots.keys()), prop=font)

# 為 MACD 圖表設置圖例
ax_macd.legend(loc=2, prop=font)

# 設置x軸刻度標記
step = (len(data) - 1) / (tick_count - 1)
ticks = [0 + int(step * i) for i in range(tick_count)]
ax_main.xaxis.set_ticks(ticks)
ax_macd.xaxis.set_ticks(ticks)
ax_hist.xaxis.set_ticks(ticks)
ax_main.xaxis.set_ticklabels([])
ax_macd.xaxis.set_ticklabels([])

# 配置網格
ax_main.grid(color='#dddddd', linestyle='--', linewidth=0.5)
ax_macd.grid(color='#dddddd', linestyle='--', linewidth=0.5)
ax_hist.grid(color='#dddddd', linestyle='--', linewidth=0.5)

# 展示圖表
plt.show()

描述

  1. 設置圖表標題: 透過 ax_main.set_titleax_macd.set_titleax_hist.set_title 設定每個圖表的標題,傳入標題字串和字體大小作為參數。
  2. 配置主圖表的圖例: 設置主圖表的移動平均線圖例。由於 mplfinance 所繪製的圖表不直接允許圖例,因此使用多步程序附加圖例。首先通過 ax_main.legend([None]*(len(added_plots)+2)) 創建空圖例,然後使用 handles 設置實際圖例。
  3. 配置 MACD 圖表的圖例: 向 MACD 圖表添加圖例。可以指定位置和字體屬性。
  4. 設置 x 軸刻度標記: 使用 tick_count 變量計算並設置要在 x 軸上顯示的刻度標記數量。每個刻度標記的位置基於總數據長度和刻度標記數均勻分佈。
  5. 網格配置: 為每個圖表定義網格的樣式和顏色,增強圖表的可讀性。
  6. 展示圖表: 通過調用 plt.show() 在屏幕上呈現圖表。

主圖表的圖例配置需要複雜的程序,這是由於 mplfinance 庫內的特定行為。精確理解和實現這一部分至關重要。


包含蠟燭圖、移動平均線、MACD 指標和 MACD 振盪器直方圖的圖表。
台積電的蠟燭圖,MACD,MACD 振盪器。此圖表協助分析股價趨勢和交易信號。

FAQs

  1. 使用 yahooquery 獲取數據的過程複雜嗎?
  2. 如何使用 TA-Lib 繪製移動平均線?
  3. MACD 指標為何重要,如何使用?
    • MACD 指標是評估趨勢強度和方向的重要工具。通過評估兩個移動平均線之間的差異,它評估市場動能並有助於投資決策。使用 TA-Lib,您可以輕鬆計算和分析 MACD 指標。全面的分析方法可以在 [TA-Lib] #6: 使用TA-Lib分析和計算MACD 上找到。
  4. 圖表的圖例和刻度標記設置為何重要?
    • 圖例和刻度標記在閱讀和理解圖表中起著至關重要的作用。圖例描述了各種線條和顏色代表的內容,而刻度標記則為圖表的軸提供了精確的值和單位。這些元素增強了圖表的可讀性,並協助用戶更容易並準確地從圖表中識別出重要信息。
  5. 執行此項目所需的程式設計知識是什麼?
    • 為了執行此項目,您需要具備 Python 程式設計和資料可視化的基本理解。使用像 yahooquery 和 TA-Lib 這樣的庫可以大大簡化複雜的計算和可視化,因此不需要繁瑣的數學知識。關於特定庫和模塊的詳細信息可以在上述鏈接中參考。
© Copyright 2023 CLONE CODING