K 線圖是觀察股票價格變化的重要工具, 也是技術分析的一環, 分成美式 K 線與日式 K 線兩種, 後者源自早期日本米商紀錄米價起伏之需要, 因外形狀似蠟燭, 故又稱為蠟燭圖. Python 功能強大的老牌繪圖套件 Matplotlib 雖然可以繪製 K 線, 但用它來手刻 K 線圖頗為繁瑣, 因為它的 API 較低階, 資料來源僅支援 Python 串列與 Numpy 陣列, 且需要設定的參數頗多, 參考 :
mpffinance 是歷經演化而成的繪圖套f件, 可用來繪製包括 K 線圖的金融圖形, 最早源自 Matplotlib 內建的金融圖形子套件 matplotlib.finance, 它具備收集 (collecting), 分析 (analyzing), 與繪圖 (plotting) 三大功能, 但在 Matplotlib 1.4 版時此 finance 子套件被移出到 mpl_toolkits 套件而被棄用, 並於 2.2.2 版時正式從 Matplotlib 中刪除, 參考 :
後來 Daniel Goldfarb 在 2019 年接手 matplotlib.finance 移出後的維護, 將其發展成擁有更多功能的 mpl-finance 套件, 但他拋棄了 matplotlib.finance 原有的資料收集 (collecting) 功能, 即放棄可下載金融資料的函式, 讓 mpl-finance 專注於金融資料視覺化部分, 參考 :
2020 年 Daniel Goldfarb 又將 mpl-finance 改良為 mplfinance 套件, 以便更能完美地支援 Pandas, 並使繪製金融圖形更簡易 (主要是使底層的 Matplotlib 設定自動化). 新的 mplfinance 在用法上做了很大改變, 主要是棄用了 mpl-finance 的 K 線圖繪製函式 candlestick2_ochl(), 改以兩個新函式 plot() 與 make_addplot() 取代, 其優點摘要如下 :
- plot() 可直接使用 Pandas 資料 (舊的 mpl-finance 只能用 Numpy 陣列)
- plot() 可自動印出圖表, 繪製均線只要一個參數即可
- 自動剔除停盤時間的空白
- 時間座標自動完成
mplfinance 的原始碼與說明文件參考 GitHub :
網上教學文件也很多, 參考 :
參考書籍 :
# Python 股票演算法交易實務 147 個關鍵技巧詳解 (博碩, 2021)
# Python 量化交易 Ta-Lib 技術指標 139 個活用技巧 (博碩, 2022)
本篇是我在 Windows 與樹莓派上對 mplfinance 的測試紀錄, 所使用的股價資料是利用 yfinance 套件從 Yahoo Finance API 下載取得, 關於 yfinance 用法參考 :
1. 在 Windows 安裝 mplfinance :
首先來安裝 mplfinance 套件 :
D:\test\python>pip install mplfinance
Collecting mplfinance
Downloading mplfinance-0.12.9b1-py3-none-any.whl (70 kB)
---------------------------------------- 70.9/70.9 kB 485.3 kB/s eta 0:00:00
Requirement already satisfied: pandas in c:\python37\lib\site-packages (from mplfinance) (1.2.5)
Requirement already satisfied: matplotlib in c:\python37\lib\site-packages (from mplfinance) (3.2.1)
Requirement already satisfied: python-dateutil>=2.1 in c:\python37\lib\site-packages (from matplotlib->mplfinance) (2.7.5)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\python37\lib\site-packages (from matplotlib->mplfinance) (2.3.1)
Requirement already satisfied: numpy>=1.11 in c:\python37\lib\site-packages (from matplotlib->mplfinance) (1.19.4)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\python37\lib\site-packages (from matplotlib->mplfinance) (1.0.1)
Requirement already satisfied: cycler>=0.10 in c:\python37\lib\site-packages (from matplotlib->mplfinance) (0.10.0)
Requirement already satisfied: pytz>=2017.3 in c:\python37\lib\site-packages (from pandas->mplfinance) (2018.9)
Requirement already satisfied: six in c:\python37\lib\site-packages (from cycler>=0.10->matplotlib->mplfinance) (1.12.0)
Requirement already satisfied: setuptools in c:\python37\lib\site-packages (from kiwisolver>=1.0.1->matplotlib->mplfinance) (51.0.0)
Installing collected packages: mplfinance
Successfully installed mplfinance-0.12.9b1
可見 mplfinance 主要是建立在 Matplotlib 與 Pandas 這兩個套件之上.
2. 在樹莓派安裝 mplfinance :
pi@raspberrypi:~ $ pip3 install mplfinance
Collecting mplfinance
Downloading https://files.pythonhosted.org/packages/15/3b/ccd6dd1593bc9e60ffd3d9b816e084445d20b6408c1c7a6602aab13e90cf/mplfinance-0.12.9b1-py3-none-any.whl (70kB)
Collecting pandas (from mplfinance)
Downloading https://www.piwheels.org/simple/pandas/pandas-0.25.3-cp35-cp35m-linux_armv7l.whl (27.5MB)
Collecting matplotlib (from mplfinance)
Downloading https://www.piwheels.org/simple/matplotlib/matplotlib-3.0.3-cp35-cp35m-linux_armv7l.whl (10.9MB)
Collecting python-dateutil>=2.6.1 (from pandas->mplfinance)
Downloading https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl (247kB)
Collecting pytz>=2017.2 (from pandas->mplfinance)
Downloading https://files.pythonhosted.org/packages/d5/50/54451e88e3da4616286029a3a17fc377de817f66a0f50e1faaee90161724/pytz-2022.2.1-py2.py3-none-any.whl (500kB)
Collecting numpy>=1.13.3 (from pandas->mplfinance)
Using cached https://www.piwheels.org/simple/numpy/numpy-1.18.5-cp35-cp35m-linux_armv7l.whl
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 (from matplotlib->mplfinance)
Downloading https://files.pythonhosted.org/packages/8a/bb/488841f56197b13700afd5658fc279a2025a39e22449b7cf29864669b15d/pyparsing-2.4.7-py2.py3-none-any.whl (67kB)
Collecting kiwisolver>=1.0.1 (from matplotlib->mplfinance)
Downloading https://www.piwheels.org/simple/kiwisolver/kiwisolver-1.1.0-cp35-cp35m-linux_armv7l.whl (912kB)
Collecting cycler>=0.10 (from matplotlib->mplfinance)
Using cached https://files.pythonhosted.org/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl
Collecting six>=1.5 (from python-dateutil>=2.6.1->pandas->mplfinance)
Downloading https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl
Collecting setuptools (from kiwisolver>=1.0.1->matplotlib->mplfinance)
Using cached https://files.pythonhosted.org/packages/6d/38/c21ef5034684ffc0412deefbb07d66678332290c14bb5269c85145fbd55e/setuptools-50.3.2-py3-none-any.whl
Installing collected packages: six, python-dateutil, pytz, numpy, pandas, pyparsing, setuptools, kiwisolver, cycler, matplotlib, mplfinance
Successfully installed cycler-0.10.0 kiwisolver-1.1.0 matplotlib-3.0.3 mplfinance-0.12.9b1 numpy-1.18.5 pandas-0.25.3 pyparsing-2.4.7 python-dateutil-2.8.2 pytz-2022.2.1 setuptools-50.3.2 six-1.16.0
3. 檢視 mplfinance 內容 :
安裝好後先來檢視 mplfinance 套件的內容, 以下使用一個自訂模組 members, 其 list_members() 函式會列出模組或套件中的公開成員 (即屬性與方法), 參考 :
# Python 學習筆記 : 檢視物件成員與取得變數名稱字串的方法
使用 mplfinance 前須先用 import 匯入, 通常取別名為 mpf :
>>> import mplfinance as mpf
>>> import members
>>> members.list_members(mpf)
available_styles <class 'function'>
figure <class 'function'>
kwarg_help <class 'function'>
make_addplot <class 'function'>
make_marketcolors <class 'function'>
make_mpf_style <class 'function'>
mplfinance <class 'module'>
plot <class 'function'>
plotting <class 'module'>
show <class 'function'>
write_style_file <class 'function'>
常用的函式說明如下表 :
mplfinance 常用函式 | 說明 |
plot(data [, type='ohlc', style, volumn, title, mav, savefig]) | 繪製 data 的圖形, 預設傳回 None |
make_addplot(data [, color, type) | 在 K 線圖上添加子圖 |
make_marketcolors(up, down [, inherit]) | 自訂樣式之上漲下跌顏色, 傳回 dict |
make_mpf_style(base_mpf_style, marketcolors) | 依據內建樣式與自訂顏色建立新樣式 |
available_styles() | 傳回可用之樣式名稱串列 |
其中主要的繪圖函式 plot(), 其常用參數說明如下 :
plot() 函式的參數 | 說明 |
data | 包含 Date, Open, High, Low, Close 等欄位之時間序列 DataFrame |
type | 圖形類型 : 'ohlc' (預設), 'candle', 'line', 'renko', 'pnf' |
style | 圖形樣式, 可用選項有 : 'classic' (預設), 'yahoo', 'charles', 'mike', 'blueskies', 'starsandstripes' 等, 呼叫 available_styles() 函式可取得完整樣式串列 |
volume | 是否顯示成交量 (布林值), 預設 False |
title | 設定圖形標題 |
tight_layout | 是否以緊緻方式排版 (布林值), 預設 False |
mav | 設定均線日期, 可以是整數 (單天期均線) 或整數串列 (多天期均線) |
figratio | 圖形寬高尺寸比例, 可用 tuple (寬, 高) 或 list [寬, 高], 預設 (8, 5.75), 單位為吋 |
figscale | 圖形縮放比率 (在 figration 尺寸基礎上進行縮放) |
returnfig | 是否傳回 Figure 物件 (布林值), 預設 False |
show_nontrading | 是否顯示非交易日, True/False (預設) |
addplot | 添加之子圖物件 |
xrotation | X 軸標籤旋轉角度 (預設 45) |
block | 是否直接繪圖 (布林值), 預設 True. 若設為 False 須用 plt.show() 繪圖 |
savefig | 設定欲儲存之圖檔檔名 (支援 jpg, png, pdf, 與 svg) |
參數 type 預設值 'ohlc' 唯美式 K 線, 若要繪製日式 K 線 (蠟燭圖) 要設定 type='candle'.
下面測試所使用的金融資料來源是利用 yfinance 套件從 Yahoo Finance 取得 DataFrame 型態的歷史股價, 故首先須匯入 pandas, yfinance 與 mplfinance 這三個套件 :
>>> import pandas as pd
>>> import yfinance as yf
>>> import mplfinance as mpf
為了能顯示 DataFrame 全部欄位, 先設定 Pandas 的顯示選項, 並將寬度放到足夠大 :
>>> pd.set_option('display.max_columns', None)
>>> pd.set_option('display.width', 1000)
然後用 yfinance 下載股價歷史資料, 以走勢貼近大盤的台灣五十 (0050) 為例 :
>>> data=yf.download('0050.tw', period='1mo')
[*********************100%***********************] 1 of 1 completed
>>> data
Open High Low Close Adj Close Volume
Date
2022-08-19 121.250000 122.000000 120.900002 121.550003 121.550003 4026019
2022-08-22 120.000000 120.250000 119.750000 120.050003 120.050003 5007000
2022-08-23 118.550003 119.000000 118.199997 118.199997 118.199997 10325627
2022-08-24 118.800003 118.949997 117.650002 117.900002 117.900002 7063478
2022-08-25 118.500000 119.449997 118.449997 119.000000 119.000000 4893719
2022-08-26 119.849998 120.099998 119.449997 119.599998 119.599998 9959737
2022-08-29 116.250000 116.949997 116.000000 116.550003 116.550003 15775738
2022-08-30 116.550003 117.199997 116.199997 116.750000 116.750000 12155353
2022-08-31 115.949997 117.599998 115.800003 117.599998 117.599998 7045914
2022-09-01 115.500000 115.599998 114.750000 115.150002 115.150002 21061579
2022-09-02 115.099998 115.099998 113.849998 113.900002 113.900002 13994058
2022-09-05 114.099998 114.750000 113.699997 114.150002 114.150002 8878179
2022-09-06 114.800003 115.400002 114.250000 114.900002 114.900002 6476116
2022-09-07 113.099998 113.150002 112.099998 112.199997 112.199997 15488892
2022-09-08 113.050003 113.050003 112.400002 113.000000 113.000000 7117171
2022-09-12 115.300003 115.650002 115.000000 115.400002 115.400002 7545318
2022-09-13 116.099998 116.400002 115.750000 116.000000 116.000000 4540486
2022-09-14 113.050003 113.949997 112.800003 113.650002 113.650002 10945566
2022-09-15 113.500000 114.250000 113.199997 113.849998 113.849998 3684100
2022-09-16 112.650002 112.849998 112.300003 112.550003 112.550003 12950907
2022-09-19 112.949997 112.949997 111.900002 112.050003 112.050003 7563027
可見傳回值為含有 OHLC 的 Padas DataFrame 物件.
1. 圖形類型 (type 參數) :
mpf.plot() 函式的 type 參數用來決定要繪製哪種金融圖形, 預設值是 'ohlc' 是繪製美式 K 線, 將上面下載的台灣五十過去兩個月歷史價量 (日線) data 傳入 mpf.plot() :
>>> mpf.plot(data=data) # 不指定參數名亦可
結果會開啟繪圖視窗顯示美式 K 線 :
這是因為 mpf.plot() 預設 type 參數是 'ohlc', 表示要繪製美式 K 線. 此種畫法以垂直線表示最高價 (上端) 與最低價 (下端), 開盤價以水平短線標在垂直線左邊, 收盤價標在右邊.
如果傳入 type='candle' 則會繪製日式 K 線 (即蠟燭圖), 預設樣式為 style='default', 例如 :
>>> mpf.plot(data, type='candle')
可見在預設 default 樣式下, 上漲燭身為白, 下跌為黑 (收黑).
傳入 type='line' 時 mplfinance 會繪製收盤價之折線圖 :
>>> mpf.plot(data, type='line')
傳入 type='renko' 的話 mplfinance 會繪製歷史價格的磚形圖, 這種圖形忽略價格的細部時間變化, 凸顯其空間波動特性 (黑色磚塊表示下跌趨勢, 白色為上漲趨勢) :
>>> mpf.plot(data, type='renko')
可以傳入 renko_params 字典參數的 brick_size 屬性來設定磚盒的大小 :
>>> mpf.plot(data, type='renko', renko_params=dict(brick_size=0.5))
傳入 type='pnf' 時 mplfinance 會繪製歷史價格的 OX 點數圖, 它與磚形圖一樣也是忽略價格的時間變化, 凸顯價格之空間波動特性 :
>>> mpf.plot(data, type='pnf')
可見 OX 點數圖的 X 軸並非線性時間軸. 可以傳入 pnf_params 字典參數的 box_size 屬性來設定點數的最小一距離, 例如 :
>>> mpf.plot(data, type='pnf', pnf_params=dict(box_size=0.5))
由於磚形圖與 OX 點數圖都是忽略細部的時間關係, 故這兩種圖不應再用 addplot 參數添加時間序列有關的子圖, 參考 :
2. 圖形樣式 (style 參數) :
mplfinance 內建了 14 種圖形樣式可在呼叫 mpf.plot() 繪圖時用 style 參數指定套用, 不傳入 style 時預設樣式為 'default' (已如上面所示), 呼叫 mpf.available_styles() 函式會傳回全部可用之樣式名稱串列, 例如 :
>>> mpf.available_styles()
['binance', 'blueskies', 'brasil', 'charles', 'checkers', 'classic', 'default', 'ibd', 'kenan', 'mike', 'nightclouds', 'sas', 'starsandstripes', 'yahoo']
參考 :
以下用蠟燭圖為例說明各種樣式的外觀.
傳入 style='classic' 的樣式效果如下 :
>>> mpf.plot(data, type='candle', style='classic')
與上面僅傳入 type='candle' 參數的預設樣式圖形比較, 差別是此樣式網格背景為白色, Y 軸標題改成放在右邊, 其餘與預設樣式一樣, 燭身上漲為白色, 下跌為黑色.
傳入 style='yahoo' 的樣式效果如下, 上漲為綠色, 下跌為紅色 (與台灣習慣剛好相反) :
>>> mpf.plot(data, type='candle', style='yahoo')
style='charles' 的樣式效果如下, 此樣式背景為白色, 燭身顏色都是咖啡色無法區分上漲還是下跌 (不優) :
>>> mpf.plot(data, type='candle', style='charles')
style='mike' 的樣式效果如下, 此樣式背景為黑色, 燭身上漲為黑色下跌為藍色 :
>>> mpf.plot(data, type='candle', style='mike')
style='blueskies' 的樣式效果如下, 此樣式背景為淡藍色, 燭身上漲為白色下跌為藍色, 且 Y 軸標題改在左邊顯示 :
>>> mpf.plot(data, type='candle', style='blueskies')
style='brasil' 的樣式效果如下, 此樣式背景為草綠色, 燭身上漲為黃色下跌為藍色 :
>>> mpf.plot(data, type='candle', style='brasil')
style='binance' 的樣式效果如下, 此樣式背景為白色, 燭身上漲為橘色下跌為褐色 :
>>> mpf.plot(data, type='candle', style='binance')
style='checkers' 的樣式效果如下, 此樣式背景為白色, 燭身上漲為黑色下跌為紅色 :
>>> mpf.plot(data, type='candle', style='checkers')
style='ibd' 的樣式效果如下, 此樣式背景為白色, 燭身上漲為藍色下跌為灰色 :
>>> mpf.plot(data, type='candle', style='ibd')
style='kenan' 的樣式效果如下, 此樣式背景為淡藍色, 燭身上漲為黑色下跌為綠色 :
>>> mpf.plot(data, type='candle', style='kenan')
style='nightclouds' 的樣式效果如下, 此樣式與 mike 相似, 背景為黑色, 差別是燭身上漲為白色, 下跌仍為藍色 :
>>> mpf.plot(data, type='candle', style='nightclouds')
style='sas' 的樣式效果如下, 此樣式背景為淡藍色, 燭身上漲為紫色下跌為褐色 :
>>> mpf.plot(data, type='candle', style='sas')
3. 自訂樣式 :
雖然 mplfinance 內建樣式有 14 種之多, 但仍提供 make_marketcolors() 與 make_mpf_style() 這兩個函式讓使用者可在這 14 個內建樣式基礎上進行修改以建立自訂樣式, 主要就是上漲與下跌的顏色設定 :
- make_marketcolors(up, down, inherit=True) :
參數 up 表示上漲顏色, down 表示下跌顏色, 可使用顏色名稱, 例如 'r' 或 'red' 表示紅色; 'g' 或 'green' 表示綠色, 也可以使用色碼, 例如 '#ff0000' 表示紅色; '#00ff00' 表示綠色. inherit 表示是否要繼承預設樣式的所有顏色設定, 此函式會傳回一個代表新樣式顏色設定之字典. - make_mpf_style(base_mpf_style, marketcolors [, rc]) :
參數 base_mpf_style 用來指定用哪一個內建樣式做基礎樣式, 參數 marketcolors 用來指定用 make_marketcolors() 製作的樣式顏色字典. 參數 rc 用來設定底層 Matplotlib 之參數 (例如自行設定等).
例如預設樣式 style='default' 有 Seaborn 的 Fu (很不錯), 但是燭身上漲為白色, 下跌為黑色與台灣股票市場的 '漲紅跌綠' 不同, 可以用預設樣式當基礎樣式進行加工, 改成 '漲紅跌綠' 的新樣式 :
首先呼叫 make_marketcolors() 函式建立樣式顏色字典 :
>>> color=mpf.make_marketcolors(up='red', down='green', inherit=True)
>>> type(color)
<class 'dict'>
>>> color
{'candle': {'up': 'red', 'down': 'green'}, 'edge': {'up': 'red', 'down': 'green'}, 'wick': {'up': 'red', 'down': 'green'}, 'ohlc': {'up': 'red', 'down': 'green'}, 'volume': {'up': 'red', 'down': 'green'}, 'vcedge': {'up': '#1f77b4', 'down': '#1f77b4'}, 'vcdopcod': False, 'alpha': 0.9}
可見 make_marketcolors() 傳回一個顏色樣式字典, 它繼承了預設樣式, 但上漲下跌顏色已經被改成 '漲紅跌綠' 了. 接著就可呼叫 make_mpf_style() 函式, 並將此顏色樣式字典傳給其 marketcolors 參數以建立新樣式 :
>>> style=mpf.make_mpf_style(base_mpf_style='default', marketcolors=color)
>>> type(style)
<class 'dict'>
>>> style
{'style_name': 'default', 'base_mpl_style': 'seaborn-darkgrid', 'marketcolors': {'candle': {'up': 'red', 'down': 'green'}, 'edge': {'up': 'red', 'down': 'green'}, 'wick': {'up': 'red', 'down': 'green'}, 'ohlc': {'up': 'red', 'down': 'green'}, 'volume': {'up': 'red', 'down': 'green'}, 'vcedge': {'up': '#1f77b4', 'down': '#1f77b4'}, 'vcdopcod': False, 'alpha': 0.9}, 'mavcolors': ['#40e0d0', '#ff00ff', '#ffd700', '#1f77b4', '#ff7f0e', '#2ca02c', '#e377c2'], 'y_on_right': False, 'gridcolor': None, 'gridstyle': None, 'facecolor': '#DCE3EF', 'rc': [('axes.edgecolor', 'black'), ('axes.linewidth', 1.5), ('axes.labelsize', 'large'), ('axes.labelweight', 'semibold'), ('lines.linewidth', 2.0), ('font.weight', 'medium'), ('font.size', 12.0), ('figure.titlesize', 'x-large'), ('figure.titleweight', 'semibold')], 'base_mpf_style': 'default'}
可見 make_mpf_style() 也是傳回一個字典, 即新樣式的所有設定, 上漲下跌相關的顏色都已被改成 '漲紅跌綠' 了, 這時呼叫 plot() 繪圖並用 style 指定此新樣式即可得到所要的 K 線圖了 :
>>> mpf.plot(data, type='candle', style=style)
其實, 對於有紅綠色弱 (分辨顏色沒問題, 但紅色與綠色彩球混在一起出現時就不太分得清, 體檢時這部分只能用猜的) 毛病的我來說, 還是用預設樣式的漲白跌黑更清楚, 哈哈.
4. 顯示成交量圖形 (volume 參數) :
在 mpf.plot() 函式鐘還可以傳入 volume=True 參數, 這樣會在 K 線圖底下顯示成交量的長條圖 (此參數預設 False), 例如 :
>>> mpf.plot(data, type='candle', volume=True)
哇, 成交量都是藍色, 看不出漲跌. 如果使用上面的自訂樣式, 效果如下 :
>>> mpf.plot(data, type='candle', style=style, volume=True)
這樣從底下成交量就可以看出漲跌情形了 (還是這個自訂樣式好).
5. 顯示標題 (title 參數) :
呼叫 plot() 時傳入 title 參數可設定圖形標題, 例如 :
>>> mpf.plot(data, type='candle', title='Taiwan 50(0050)')
但若傳入含有中文的標題, 中文部分會變成亂碼, 且會出現 font error, 例如 :
>>> mpf.plot(data, type='candle', title='台灣五十(0050)')
C:\Python37\lib\site-packages\matplotlib\backends\backend_agg.py:214: RuntimeWarning: Glyph 21488 missing from current font.
這讓我想到, 是否這是因為沒有設定 Matplotlib 的中文字型之故 (因 mplfinance 底層是以 Matplotlib 為基礎建構的), 因此參考之前 Matplotlib 的作法, 用 rcParams 參數設定 font.family 屬性為 Windows 內建中文字型 "微軟正黑體", 且將 axes.unicode_minus 屬性設為 False (關閉軸標籤的負號顯示) :
例如 :
>>> import matplotlib.pyplot as plt
>>> plt.rcParams["font.family"]=["Microsoft JhengHei"] # 設定字型為微軟正黑體
>>> plt.rcParams['axes.unicode_minus']=False # 關閉軸標籤的負號顯示
但完成上面設定之後並無法解決 mplfinance 的中文顯示問題. 解決辦法是利用上面的 make_mpf_style() 函式傳入 rc={'font.family': 'Microsoft JhengHei'} 參數指定中文字型為微軟正黑體來建立自訂樣式, 然後利用此樣式來繪圖即可順利顯示中文, 參考 :
例如 :
>>> font={'font.family': 'Microsoft JhengHei'}
>>> style=mpf.make_mpf_style(base_mpf_style='default', rc=font)
>>> mpf.plot(data, type='candle', title='台灣五十(0050)', style=style)
只要用自訂樣式就可以解決顯示中文的問題, 不需要去設定 Matplotlib (沒有用).
6. 以緊緻方式排版 (tight_layout 參數) :
mpf.plot() 預設的版面配置較寬鬆, 但可以用 tight_layout=True 以緊緻方式排版, 例如 :
>>> mpf.plot(data, type='candle', title='Taiwan 50(0050)', tight_layout=True)
可見使用緊緻排版時, 圖形標題會被移到圖形內的上方, K 線圖也會緊靠邊框.
7. 顯示均線 (mav 參數) :
mpf.plot() 函式傳入 mav 參數可以在 K 線圖上繪製指定天數的收盤價均線 (移動平均值), 可傳入單一整數繪製單天期之均線, 例如 :
>>> mpf.plot(data, type='candle', mav=3) # 繪製 3 日收盤價均線
亦可傳入一個整數串列繪製多天期均線, 例如 :
>>> mpf.plot(data, type='candle', mav=[3, 5, 10]) # 繪製 3, 5, 10 日均線
mplfinance 會自動為各天期均線選定不同顏色, 上圖灰色為 3 日均線, 藍色為 5 日均線, 黃色為 10 日均線.
7. 設定圖形尺寸比例與縮放比例 (figratio 與 figscale 參數) :
mpf.plot() 預設的畫布 (Figure 物件) 尺寸是 8 吋寬, 5.75 吋高 (參考 mplfinance 原始碼), 但可透過 figration 參數設定, 可傳入元組 (寬, 高) 或串列 [寬, 高], 例如 :
>>> mpf.plot(data, type='candle', figratio=(16, 9))
而 figscale 則可設定畫布尺寸縮放 (< 1 為縮小, > 1 為放大), 例如 :
>>> mpf.plot(data, type='candle', figratio=(16, 9), figscale=0.5)
可見畫布縮小了 1/4 (0.5*0.5=0.25).
8. 顯示非交易日 (show_nontrading 參數) :
show_nontrading 參數預設為 False, 亦即 plot() 在繪製圖形時會將 DataFrame 時間序列索引中的非交易日空缺自動跳開, 若將此參數設為 True 就會顯示此無資料空缺, 例如 :
>>> mpf.plot(data, type='candle', volume=True, show_nontrading=True)
此處也將 volume 參數設為 True 顯示成交量, 可見所繪製的圖形會顯示非交易日 (即週六週日與國定假日等休市日) 的無值空缺, 其實顯示非交易日用途不大.
9. 設定 X 軸刻度標籤旋轉角度 (xrotation 參數) :
在上面的範例中, X 軸刻度標籤皆以預設之 45 度旋轉角標示, 這可以用 xrotation 參數設定 :
>>> mpf.plot(data, type='candle', xrotation=15)
也可以設為 0 度 (不旋轉) :
>>> mpf.plot(data, type='candle', xrotation=0)
10. 儲存圖檔 (savefig 與 returnfig 參數) :
mplfinance 所繪製的圖形可用 savefig 參數指定圖檔路徑名稱來存檔, 支援之圖檔格式與 Matplotlib 相同, 即 png, jpg, pdf, 與 svg 四種, 例如 :
>>> mpf.plot(data, type='candle', savefig='0050.png')
這會將圖形儲存在目前工作目錄下之 0050.png :
另外一個方法是使用 returnfig=True 參數讓 mpf.plot() 回傳 (fig, axes) 物件元組, 利用 Matplotlib 的 Figure 物件之 savefig() 方法存檔 (事實上 mplfinance 的 savefig 參數也是這麼做的) :
>>> fig, axes=mpf.plot(data, type='candle', returnfig=True)
>>> type(fig)
<class 'matplotlib.figure.Figure'>
>>> type(axes)
<class 'list'>
>>> len(axes)
2
>>> axes
[<matplotlib.axes._axes.Axes object at 0x000001E06EFE16D8>, <matplotlib.axes._axes.Axes object at 0x000001E06F015898>]
可見當傳入 returnfig=True 時, mpf.plot() 會傳傳回一個兩元素之 tuple (returnfig 預設 False 傳回 None), 第一元素為 Figure 畫布物件, 第二個元素是兩個 Axes 軸物件組成之串列. 可以呼叫 Figure 物件的 savefig() 方法存檔, 例如 :
>>> fig.savefig('0050.jpg')
參考 :
沒有留言:
張貼留言