Python K 線圖(Candlestick Charts)

Photo by Libby Penner on Unsplash
Photo by Libby Penner on Unsplash
K 線圖(Candlestick Charts)常用來顯示股價的走勢。單根 K 線可以表示出股價的四個價位,分別為最高價、開盤價、收盤價、以及最低價。本文章將介紹如何使用 Python 的 mplfinance 和 Plotly 套件來繪製 K 線圖。

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

mplfinanceMatplotlib 的一個用來視覺化金融數據的套件。利用 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')
mplfinance candlestick
mplfinance candlestick

如果想要顯示成交量的話,將參數 volume 設定為 True 即可。

import mplfinance as mpf

mpf.plot(df, 
         type='candle',
         title='2330',
         volume=True,
         ylabel_lower='Shares')
mplfinance candlestick with volume
mplfinance candlestick with volume

設定樣式與顏色

雖然我們剛剛已經輕易地繪製出 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')
mplfinance candlestick with yahoo style
mplfinance candlestick with yahoo style

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 candlestick with setting mpf style
mplfinance candlestick with setting mpf style

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)
mplfinance candlestick with setting mpl style
mplfinance candlestick with setting mpl style

移動平均線(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 candlestick with mav lines
mplfinance candlestick with mav lines

改變預設的欄位名稱

雖然 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=['開盤價', '最高價', '最低價', '收盤價', '成交股數'])
mplfinance candlestick
mplfinance candlestick

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()
Plotly candlestick
Plotly candlestick

如果你不喜歡下方的 Slider,可以呼用 update_layout() 來隱藏它。此外,update_layout() 還可以設定圖表的標題和 y 軸的標題。

fig.update_layout(xaxis_rangeslider_visible=False)
fig.update_layout(title="2330", yaxis_title='Price')
fig.show()
Plotly candlestick with title and without slider
Plotly candlestick with title and without slider

設定顏色

與 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()
Plotly candlestick of changing colors
Plotly candlestick of changing colors

移動平均線(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()
Plotly candlestick with MA lines
Plotly candlestick with MA lines

結論

我們介紹了兩套繪製 K 線圖的套件。不論是 mplfinance 或是 Plotly,它們都讓我們可以輕鬆地繪製出 K 線圖。而且,都可以繪製出相當漂亮的圖表。不過,Plotly 還額外地提供互動式的工具列。根據你的需求與喜好來決定要使用哪個套件吧!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like