2022年9月20日 星期二

Python 學習筆記 : 用 mplfinance 套件繪製金融圖表 (一) K 線圖

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 :  


參考書籍 :


本篇是我在 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')  




參考 :


沒有留言:

張貼留言