2020年11月22日 星期日

[python抓爬仔]~~抓取指定股票前31天股價資料並使用Matplotlib繪製圖表

 好的視覺化圖表可以讓人迅速掌握資料的特性及重要意涵,是在資料處理中相當重要的一環!

前面分別介紹過台銀即時匯率資料及股票交易資料的抓取操作範例!

也介紹過將資料儲存至sqlite資料庫的方法,當資料日積月累的儲存一段時間後,也就可以進行資料的分析及圖表繪製工作了!

這次我們延續之前台灣股票套件(twstock)的操作,利用其套件進行抓取指定股票(本次操作以「廣達(2382)」為例)前31天的股價資料,並將其資料利用python視覺化圖表工具:Matplotlib,進行圖表繪製操作,作為練習Matplotlib及資料視覺化的入門。

首先確定你已經安裝本次操作所需的套件:twstock, matplotlib

若尚未安裝或不確定,可以透過以下指令進行安裝或檢測:

pip install -U twstock
pip install -U matplotlib

想對Matplotlib有更完整的認識,可以到這裡逛逛



這次的操作練習我們分成二個層次進行操作:

第一階段:我們著重將資料抓取後,迅速繪製出圖表並加以儲存、呈現。

第二階段:我們則進一步,將重點放在圖表的設定操作上,讓圖表呈現更具個性化!

好囉~~現在就先看第一階段目標如何達成囉...........

from matplotlib import pyplot as plt
from twstock import Stock

tw2382 = Stock("2382")  # 設定指定的股票(代號)

x = list(range(-31, 0))     # 產生一組[-31~-1]的列表(list)作為對應
y1 = tw2382.price    # 抓取指定股票前31天收盤價
y2 = tw2382.high    # 抓取指定股票前31天最高價
y3 = tw2382.low     # 抓取指定股票前31天最低價

plt.title("廣達(2382)前31天交易價格變動趨勢圖")   # 設定圖表標題
plt.xlabel(f"日期區間")     # 設定x軸標籤
plt.ylabel("價格(元)")        # 設定y軸標籤

plt.plot(x, y1)     # 繪製第一組數線
plt.plot(x, y2)
plt.plot(x, y3)

plt.savefig('tw2382_o.png')
plt.show()   # 顯示圖表

執行結果,會將繪製的圖表以檔名:tw2382_o.png儲存於程式目錄下,如下圖所示:(驚不驚喜~~意不意外...簡單吧?!呵~~)

基本上,這樣就可以完成將資料視覺化的初步工作!

在第一階段中~~你唯一可能遇到的問題,就是中文無法正常顯示(變成亂碼)的狀況,這問題我在之前就有先描述談論過了,有中文無法正常顯示困擾的請看這裡參考!

假如你已經滿意以上的結果,就可以打完收工~~吃飯睡覺去了!

========== ******************* ============

若是你跟我一樣有點「龜毛」~~想要對圖表進行一些個人化的設定工作,那就歡迎繼續看下去~~~

第二階段:我們會進一步設定包括~~標題格式、X,Y軸標籤設定、折線線條設定、圖例等相關操作設定。

目標是將上圖透過相關設定產生以下視覺效果:

如何讓醜小鴨變天鵝呢~~~我們直接貼上第二階段程式碼來看~~~

from matplotlib import pyplot as plt
from twstock import Stock
from datetime import timedelta, date

n_date = date.today()
tw2382 = Stock("2382")

# x = []
# for i in range(31, 0, -1):
#    x.append((n_date - timedelta(days=i)).strftime("%m/%d"))
x = list(map(lambda i: (n_date - timedelta(days=i)).strftime("%m/%d"), range(31, 0, -1)))

y1 = tw2382.price    # 抓取指定股票前31天收盤價
y2 = tw2382.high    # 抓取指定股票前31天最高價
y3 = tw2382.low     # 抓取指定股票前31天最低價

plt.figure(figsize=(9, 7))      # 設定圖表尺寸(9, 5)→900*500
plt.title("廣達(2382)前31天交易價格變動趨勢圖", color = 'blue', fontsize=20)   # 設定圖表標題
plt.xlabel(f"日期區間({x[0]}~{x[-1]})", fontsize=14)     # 設定x軸標籤
plt.ylabel("價格(元)", fontsize=14)        # 設定y軸標籤

plt.plot(x, y1)     # 繪製第一組數線
plt.plot(x, y2, marker='o', linestyle = '-.')    # 設定折點圖示符號、線條樣式
plt.plot(x, y3, marker='x', linestyle = '--')
# 設定圖表示例
plt.legend(("收盤價", "最高點", "最低點"), loc="best", framealpha=0.25, prop={'size': 'medium'})

plt.ylim(70, 78)   # 設定y軸數值區間範圍
plt.xticks(rotation=60, color = (0.3, 0, 0))    # 設定x軸標籤型式

plt.savefig('tw2382_f.png')    # 命名儲存圖檔於同目錄下
plt.show()   # 顯示圖表

其中有一些涉及到日期操作及其格式化、lambda(匿名函示)操作的部分,這裡就不花篇幅說明了~~有困擾或有興趣的朋友,我們後續有緣再見囉~~~哈!

主要說明一點:程式中第8~10行,有關日期的操作及格式化,可以透過第11行的lambda及相關函式的操作一行就完成!(在這裡只是記錄二種操作方式供自己紀錄及有興趣的朋友參考!)

至於二階段在程式操作上的差異,就請各位自行參照比對囉!

基本上,參考每行程式的註釋說明,應該都能掌握才是!

想要對折線圖數線樣式設定有更多認識的朋友,可以參考以下這篇文章

最後,附上兩階段成果的對照圖供參囉~~!



1 則留言:

  1. 我想請問一下,我用了您提供的第二段程式碼,圖框有跑出來,但是折線條沒有出來@@
    想跟您請教一下

    回覆刪除