K 線圖(Candlestick Charts)常用來顯示股價的走勢。單根 K 線可以表示出股價的四個價位,分別為最高價、開盤價、收盤價、以及最低價。本文章將介紹如何使用 Python 的 mplfinance 和 Plotly 套件來繪製 K 線圖。
範例的資料集
本文章中將使用台積電(2330)2021 年 2 月份的股價作為範例。各欄位代表的意義如下:
- Date:日期
- Volume:成交量
- Open:開盤價
- High:最高價
- Low:最低價
- Close:收盤價
我們會使用以下的程式碼來載入股價。
import pandas as pd df = pd.DataFrame([ ['2021-02-01',70161939,595.00,612.00,587.00,611.00], ['2021-02-02',80724207,629.00,638.00,622.00,632.00], ['2021-02-03',59763227,638.00,642.00,630.00,630.00], ['2021-02-04',47547873,626.00,632.00,620.00,627.00], ['2021-02-05',57350831,638.00,641.00,631.00,632.00], ['2021-02-17',115578402,663.00,668.00,660.00,663.00], ['2021-02-18',54520341,664.00,665.00,656.00,660.00], ['2021-02-19',51651844,656.00,657.00,647.00,652.00], ['2021-02-22',39512078,660.00,662.00,650.00,650.00], ['2021-02-23',52868029,641.00,643.00,633.00,641.00], ['2021-02-24',80010637,627.00,636.00,625.00,625.00], ['2021-02-25',45279276,636.00,636.00,628.00,635.00], ['2021-02-26',137933162,611.00,618.00,606.00,606.00], ], columns=['Date', 'Volume', 'Open', 'High', 'Low', 'Close']
mplfinance
mplfinance 是 Matplotlib 的一個用來視覺化金融數據的套件。利用 mplfinance 的 plot() 函式可以簡單地繪製 K 線圖。先讓我們來看看 plot() 的宣告。其它的參數,請參照官網。
mplfinance.plot(data, type, style, volume, mav, title, ylabel, ylabel_lower, columns)
- data:資料。型態為 DataFrame。
- type:圖表的類別。其值可以是 candle、candlestick、ohlc、ohlc_bars、line、renko、pnf。
- style:圖表的樣式。
- volume:是否顯示成交量。
- mav:移動平均線。
- title:圖表標題。
- ylabel:y 軸的標題。
- ylabel_lower:成交量的 y 軸標題。
- columns:指定不同的欄位名稱。
基本用法
一個 K 線圖有以下的基本元素,分別為日期、開盤價、收盤價、最高價、最低價、成交量、以及股價。由於這些元素是必需的,所以 plot() 預先定義了這些資料的欄位名稱。這些預先定義好的欄位名稱,正是我們範例資料集所使用的名稱。
- 成交量:Volume
- 開盤價:Open
- 最高價:High
- 最低價:Low
- 收盤價:Close
此外,它會使用 index 作為日期,而且其型態必需為 Date
。所以我們先用以下程式碼來調整一下資料。
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d') df.set_index('Date', inplace=True)
資料準備就緒後,我們就可以呼叫 plot() 來繪製 K 線圖了!
import mplfinance as mpf mpf.plot(df, type='candle', title='2330')
如果想要顯示成交量的話,將參數 volume 設定為 True 即可。
import mplfinance as mpf mpf.plot(df, type='candle', title='2330', volume=True, ylabel_lower='Shares')
設定樣式與顏色
雖然我們剛剛已經輕易地繪製出 K 線圖了。但是黑白的 K 線圖實在不怎麼好看。以下讓我們來美化我們的 K 線圖吧。
我們可以藉由設定 plot() 的參數 style 來快速地美化 K 線圖。mplfinance 內建不少樣式。我們可以執行下方的程式碼,來列出內建的樣式。
mpf.available_styles()
['binance', 'blueskies', 'brasil', 'charles', 'checkers', 'classic', 'default', 'mike', 'nightclouds', 'sas', 'starsandstripes', 'yahoo']
相信很多人都用過 Yahoo 來看股票,所以我們來套用 Yahoo 的樣式吧。
mpf.plot(df, type='candlestick', style='yahoo', ylabel='$', title='2330')
Yahoo 的樣式是不是好看很多了呢?不過,在台灣,我們還是習慣用紅色表示股價上漲,用綠色表示股價下跌。正好與上圖相反。mplfinance 允許我們在某個樣式上做一些調整。
mplfinance 的 make_marketcolors() 可以讓我們設定單根 K 線圖的顏色。下方的程式碼中,我們設定上漲時為紅色,下跌時為綠色。inherit
表示沿用樣式的設定。
mc = mpf.make_marketcolors(up='r', down='g', edge='', wick='inherit', volume='inherit') s = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc) mpf.plot(df, type='candle', style=s, volume=True)
mplfinance 除了讓我們可以使用它內建的樣式,它還允許我們使用 Matplotlib 內建的樣式。我們可以用以下程式碼來列出 Matplotlib 內建的樣式。
import matplotlib as mpl mpl.style.available
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
要使用 Matplotlib 的樣式的話,其方法和使用 mplfinance 的一樣,都是呼叫 mplfinance.make_mpf_style()
。不過,要改用參數 base_mpl_style
。
s = mpf.make_mpf_style(base_mpl_style='seaborn-whitegrid', marketcolors=mc) mpf.plot(df, type='candle', style=s, volume=True)
移動平均線(MA)
在看股價趨勢時,我們不但使用 K 線圖,還會搭配移動平均線(MA)。mplfinance.plot() 也可以繪製移動平均線。我們在參數 mav 設定移動平均線的天數即可。下面的範例中,我們設定了兩條移動平均線,一條是 2 日移動平均線,另外一條是 3 日移動平均線。由於資料的數量不多,所以我們將天數設短一點。
mpf.plot(df, type='candle', style='yahoo', mav=(2, 3), title='2330', volume=True, ylabel_lower='Shares')
改變預設的欄位名稱
雖然 mplfinance 預先設定了欄位的名稱,但是它也允許我們去指定不同的名稱。我們只要將指定的欄位名稱陣列傳入參數 columns 即可。其中,陣列裡的名稱順序依序為 Open、High、Low、Close、和 Volume。使用範例如下。
df_c = pd.DataFrame([ ['2021-02-01',70161939,595.00,612.00,587.00,611.00], ['2021-02-02',80724207,629.00,638.00,622.00,632.00], ['2021-02-03',59763227,638.00,642.00,630.00,630.00], ['2021-02-04',47547873,626.00,632.00,620.00,627.00], ['2021-02-05',57350831,638.00,641.00,631.00,632.00], ['2021-02-17',115578402,663.00,668.00,660.00,663.00], ['2021-02-18',54520341,664.00,665.00,656.00,660.00], ['2021-02-19',51651844,656.00,657.00,647.00,652.00], ['2021-02-22',39512078,660.00,662.00,650.00,650.00], ['2021-02-23',52868029,641.00,643.00,633.00,641.00], ['2021-02-24',80010637,627.00,636.00,625.00,625.00], ['2021-02-25',45279276,636.00,636.00,628.00,635.00], ['2021-02-26',137933162,611.00,618.00,606.00,606.00], ], columns=['日期', '成交股數', '開盤價', '最高價', '最低價', '收盤價']) df_c['日期'] = pd.to_datetime(df_c['日期'], format='%Y-%m-%d') df_c.set_index('日期', inplace=True) mpf.plot(df_c, type='candle', title='2330', columns=['開盤價', '最高價', '最低價', '收盤價', '成交股數'])
Plotly
Plotly 也是一個常用的資料視覺化套件。它也提供了繪製 K 線圖的方法。讓我們先來看一下 Candlestick 的宣告。它的參數,請參照官網。
Candlestick(close=None, high=None, low=None, open=None, x=None)
- x:日期。
- open:開盤價。
- high:最高價。
- low:最低價。
- close:收盤價。
基本用法
Candlestick 是一個 Plotly Trace,而不是一個 Plotly Figure。所以,我們必須將產生出來的 Candlestick Trace 放入一個 Figure,再繪製出來。
import plotly.graph_objects as go candlestick = go.Candlestick(x=df['Date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close']) fig = go.Figure(data=[candlestick]) fig.show()
如果你不喜歡下方的 Slider,可以呼用 update_layout()
來隱藏它。此外,update_layout() 還可以設定圖表的標題和 y 軸的標題。
fig.update_layout(xaxis_rangeslider_visible=False) fig.update_layout(title="2330", yaxis_title='Price') fig.show()
設定顏色
與 mplfinance 的 Yahoo 樣式一樣,它預設上漲為綠色,下跌為紅色。讓我們來將上漲設為紅色,下跌設為綠色。
candlestick = go.Candlestick(x=df['Date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], increasing_line_color='red', decreasing_line_color='green') fig = go.Figure(data=[candlestick]) fig.show()
移動平均線(MA)
Plotly 的 Candlestick 無法繪製移動平均線。不過,我們可以搭配 Plotly 的 Scatter 來繪製移動平均線。如果你不熟悉 Plotly 的 Scatter 的話,可以先閱讀以下的文章。
首先,我們可以用 DataFrame 的 rolling() 來輕鬆地計算出移動平均線所需的資料。
df['MA5'] = df['Close'].rolling(5).mean() df['MA10'] = df['Close'].rolling(10).mean()
然後,我們產生 K 線圖的 Trace,再產生兩個移動平均線的 Traces。最後,將這些 Traces 都放入到一個 Figure 裡,並將 Figure 繪製出來。
candlestick = go.Candlestick(x=df['Date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], increasing_line_color='red', decreasing_line_color='green') ma5_scatter = go.Scatter(x=df['Date'], y=df['MA5'], line=dict(color='orange', width=1), mode='lines') ma10_scatter = go.Scatter(x=df['Date'], y=df['MA10'], line=dict(color='green', width=1), mode='lines') fig = go.Figure(data=[candlestick, ma5_scatter, ma10_scatter]) fig.show()
結論
我們介紹了兩套繪製 K 線圖的套件。不論是 mplfinance 或是 Plotly,它們都讓我們可以輕鬆地繪製出 K 線圖。而且,都可以繪製出相當漂亮的圖表。不過,Plotly 還額外地提供互動式的工具列。根據你的需求與喜好來決定要使用哪個套件吧!