NOTE: (責任更新2022/4/15)
pandas_datareader
的yahoo_finace API遇到尚未修復的問題,參考該github的issue#916,改採yfinance
模組即可(已修正以下程式)
Pandas
模組清理為可處理的格式,最後再以 matplotlib
模組繪圖完成資料視覺化。這樣的過程您應該可以在其他系列文或文章學習,礙於本系列文主軸及篇幅不再贅述,有興趣認識 Pandas
操作方式可以參閱我自行翻譯官方的 10 分鐘 Pandas 繁體中文文章,最好你10分鐘看得完,根本另外個30天系列文。pandas-datareader
、 mplfinance
此 2 個模組完成 K 線圖,您會發現怎麼這麼輕鬆。(2022/4/15更新: pandas-datareader
改採 yfinance
模組亦可)。認識 pandas-datareader
(2022/4/15更新: 目前該模組yahoo finace API錯誤尚未修復)
pandas-datareader
作為 Pandas
取得真實世界資料集的 API 介面,以股市交易資訊為主,可以取得的資源包含股價、ETF資訊、歐盟統計、NSDQ 交易資訊、莫斯科交易所(MOEX)歷史資訊、韓國交易所KOSDAQ歷史數據等。操作 pandas-datareader
pip install pandas_datareader
,如果為筆記本環境記得在開頭加入 !
魔術指令。
pip install pandas_datareader
0050
的 "元大寶來台灣卓越50證券投資信託基金" 的資料,台灣的股市資訊需要在代碼後方加上 .tw
;資料來源為 "Yahoo! Finance" ,並顯示近5筆交易資料。
import pandas_datareader.data as web
#讀取yahoo財經
df = web.DataReader('0050.tw', 'yahoo', '2020-07-01')
#顯示最新10筆盤後交易資料
df.tail(5)
pandas_datareader.data.DataReader()
函數的參數設定,還記得嗎? 滑鼠在 Colab 的參數輸入(
前方停留一下,跳出的提示點選查看原始碼 Source Code
,參數設定及使用範例資訊可供閱覽。認識 yfinance
# 改以yfinance讀取股價
import yfinance as yf
start = "2022-1-1"
end = '2022-4-14'
df = yf.download('0050.tw',start,end)
認識 mplfinance
mplfinance
是個基於 matplotlib
針對財金資訊圖表特別設計的模組,更為方便易用,相關範例請參閱上方 GitHub 介紹。操作 mplfinance
mplfinance.plot()
函數進行繪圖,參數包含資料來源 df
, 圖形 candle
也就是我們常講的K線(蠟燭圖), 平均移動線 mav
繪製5、20日MA, 包含交易量、標題、並儲存圖片至本機,以上設定一次完成。
import mplfinance as mpf
#繪製K線圖
mpf.plot(df, type='candle', mav=(5,20), volume=True, title='0050.TW', savefig='test_plot.png')
test_plot.png
檔案,或用筆記本顯示圖片的模組與指令查閱。
from IPython.display import Image
from IPython.core.display import HTML
#顯示本機圖片
Image("test_plot.png")
mplfinance.plot()
函數的說明比較凌亂,但透過程式觀察幾乎仍保留 matplotlib
對於X軸 xlabel
、Y軸 ylabel
、標題 title
等圖片客制屬性,也可以用 addplot
屬性,以串列 list 配合mpf.make_addplot()
函數增加一系列所需線圖或標示,您可以在官方 GitHub 找到各種範例,像這張擷取範例的圖片,感覺就很厲害。我們將pandas-datareader
(2022/4/15改用yfinance
) 、 mplfinance
、 pyimgur
等3個模組組合包成函數,方便取得K線圖片連結。
函數-1,第3個參數為自訂資料起始日期(預設2020-01-01起):
#包成函數-1
import mplfinance as mpf
# import pandas_datareader.data as web
import yfinance as yf
import pyimgur
CLIENT_ID = "你的Imgur Client ID"
def plot_stcok_k_chart(CLIENT_ID, stock="0050" , date_from='2020-01-01' ):
"""
進行個股K線繪製,回傳至於雲端圖床的連結。將顯示包含5MA、20MA及量價關係,預設為'2020-01-01'迄今收盤價。
:stock :個股代碼(字串),預設0050。
:date_from :起始日(字串),格式為%Y-%m-%d,預設自2020-01-01起。
"""
stock = str(stock)+".tw"
# df = web.DataReader(stock, 'yahoo', date_from) # 已知有未修復的錯誤
df = yf.download(stock, date_from)
mpf.plot(df,type='candle',mav=(5,20),volume=True,title=stock.upper() ,savefig='testsave.png')
PATH = "testsave.png"
im = pyimgur.Imgur(CLIENT_ID)
uploaded_image = im.upload_image(PATH, title=stock+" candlestick chart")
return uploaded_image.link
result = plot_stcok_k_chart(CLIENT_ID, "0050", "2020-09-01")
print(result)
from IPython.display import Image
from IPython.core.display import HTML
Image(result)
函數-2,第3個參數為交易筆數(預設為50日),並用 datetime
計算回推起始日::
#包成函數-2
import mplfinance as mpf
import pandas_datareader.data as web
import datetime
CLIENT_ID = "471baf81eb0e7f9"
def plot_stcok_k_chart(IMGUR_CLIENT_ID, stock="0050" , during_days=50):
"""
進行個股K線繪製,回傳至於雲端圖床的連結。將顯示包含5MA、20MA及量價關係。
:stock :個股代碼(字串),預設0050。
:during_days :蒐集幾日前的資料,預設50日前(包含假日),但呈現的K線會扣掉。
"""
stock = str(stock)+".tw"
start_date = (datetime.datetime.now() - datetime.timedelta(int(during_days))).strftime("%Y-%m-%d") #計算蒐集起始日
# df = web.DataReader(stock, 'yahoo', start_date) # 已知有未修復的錯誤
df = yf.download(stock, start_date)
mpf.plot(df.tail(int(during_days)),type='candle',mav=(5,20),volume=True, ylabel=stock.upper()+' Price' ,savefig='testsave.png')
PATH = "testsave.png"
im = pyimgur.Imgur(IMGUR_CLIENT_ID)
uploaded_image = im.upload_image(PATH, title=stock+" candlestick chart")
return uploaded_image.link
result = plot_stcok_k_chart(CLIENT_ID,"0050",60)
print(result)
from IPython.display import Image
from IPython.core.display import HTML
Image(result)
下一篇加入 LINE 聊天機器人功能時將採用第 1 種,原因後述。
在 Python 要熟悉資料操作勢必離不開 Pandas
模組,要產生數據圖形也勢必需要認識理解如何運用 matplotlib
繪圖,好在有巨人的肩膀可以任我們攀爬延伸,運用 pandas-datareader
(2022/4/15更新採yfinance
) 、 mplfinance
、 pyimgur
等 3 個模組迅速解決擷取股市資料、視覺化K線圖表並上傳雲端圖床,下篇我們會佈署為 LINE 聊天機器人功能,我們下篇見。
您好,最近在研究LINE Bot 發現您的文章非常受用!
但是到股市這章節的時候發現程式碼無法作用~想詢問您是什麼原因~
希望能得到您的回應,感謝!
謝謝您的鼓勵,經您提醒pandas_datareader
使用yahoo_finance API會出錯,這種模組因為外部相依性導致錯誤的問題挺常見的,故也提供我的解決方式供您參考:
yfinance
模組。yfinance
模組大同小異,也可以跟其他模組共用,以此模組修正程式與文章。StackoverFlow跟Github issue是技術問題搜尋的好朋友!希望有幫助到您~