iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
1
Software Development

糊裡糊塗Python就上手系列 第 24

[2020鐵人賽Day24]糊裡糊塗Python就上手-數據化圖之術(下)

今日目標

今天來點很多人想學 Python 做折線圖,其中一個原因是想抓取股票資訊做分析,那今天就來實作這項好了

Install twstock

twstock 台灣股市股票價格擷取
https://pypi.org/project/twstock/

使用 pip 進行安裝 twstock:

pip install twstock

https://ithelp.ithome.com.tw/upload/images/20201009/2009133315T97THNPX.png

實作台股個股股價折線圖

導入將使用的模組

import matplotlib.pyplot as plt
import twstock
import datetime

設置詢問使用者股票代碼

# 詢問使用者股票代碼
stock_code = input("請輸入將要查詢的股票代碼:")

建立 Stock 物件

stock = twstock.Stock(stock_code) # 建立 Stock 物件

取得查詢當年年份及上個月月份

now_date = datetime.datetime.now() # 取得查詢當下的時間
now_year = now_date.year # 取得查詢當下當年年份

# 取得查詢當下上個月月份
if(now_date.month != 1):
    last_month = now_date.month - 1
else:
    last_month = 12

取得「查詢年/查詢時間前一個月」的股票資料

使用語法:(查詢某年某月的股票資料)

stock.fetch(year, month)

此次需求的「查詢年/查詢時間前一個月」的股票資料:

stocklist = stock.fetch(now_year, last_month)

建立 x, y 軸串列,x 軸為日期時間(date),y 軸為收盤價(close)

印出 stock.data[0],可以觀察到「close」就是收盤價的價位資料

print(stock.data[0])

https://ithelp.ithome.com.tw/upload/images/20201009/20091333g5xxnihvGo.png

因此,此次實作的 x, y 軸資料擷取如下:

listx = []
listy = []
for value in stocklist:
    listx.append(value.date.strftime('%Y-%m-%d'))
    listy.append(value.close)

設定圖表區寬高

plt.figure(figsize=(10,10)) # 設定圖表區寬高

設定 x 軸標題、y 軸標題、圖表標題

plt.xlabel('日期', fontsize="16") # 設定 x 軸標題內容及大小
plt.ylabel('股價', fontsize="16") # 設定 y 軸標題標題內容及大小
plt.title('Taiwan Stock', fontsize="18") # 設定圖表標題內容及大小

將 x軸串列資料,y軸串列資料,使用 plot 函式將折線圖實現出來,並且顏色為紅色,標記為「點」,標記大小為 16

plt.plot(listx, listy, color='red', markersize="16", marker=".") # 紅色,實線,標記大小 16,標記為「點」

讓 x 坐標軸標題旋轉 45 度,使得文字不會重疊

plt.xticks(rotation = 45) # 讓 x 坐標軸標題旋轉 45 度

中文亂碼,解決方法

在使用時,會發現使用中文會出現方框亂碼,無法正常顯示出來,因此可以透過 Matplotlib 的 rcParams 設定中文字型檔:

# 設定讓中文可順利顯示不亂碼
plt.rcParams["font.sans-serif"] = "Microsoft JhengHei" # 將字體換成 Microsoft JhengHei

但這還不足夠,若是有負數「-」則會再度出現方框亂碼,因此還需要再多設定:

plt.rcParams["axes.unicode_minus"] = False # 讓負號可正常顯示

將圖表呈現出來

plt.show()

完整代碼

import matplotlib.pyplot as plt
import twstock
import datetime

# 詢問使用者股票代碼
stock_code = input("請輸入將要查詢的股票代碼:")

stock = twstock.Stock(stock_code) # 建立 Stock 物件
now_date = datetime.datetime.now() # 取得查詢當下的時間
now_year = now_date.year # 取得查詢當下當年年份

# 取得查詢當下上個月月份
if(now_date.month != 1):
    last_month = now_date.month - 1
else:
    last_month = 12

stocklist = stock.fetch(now_year, last_month)

listx = []
listy = []
for value in stocklist:
    listx.append(value.date.strftime('%Y-%m-%d'))
    listy.append(value.close)
    
plt.figure(figsize=(10,10)) # 設定圖表區寬高
plt.xlabel('日期', fontsize="16") # 設定 x 軸標題內容及大小
plt.ylabel('股價', fontsize="16") # 設定 y 軸標題標題內容及大小
plt.title('Taiwan Stock', fontsize="18") # 設定圖表標題內容及大小
plt.plot(listx, listy, color='red', markersize="16", marker=".") # 紅色,實線,標記大小 16,標記為「點」
plt.xticks(rotation = 45) # 讓 x 坐標軸標題旋轉 45 度

# 設定讓中文可順利顯示不亂碼
plt.rcParams["font.sans-serif"] = "Microsoft JhengHei" # 將字體換成 Microsoft JhengHei
plt.rcParams["axes.unicode_minus"] = False # 讓負號可正常顯示

plt.show()

https://i.imgur.com/nw0jRrX.gif

結論

這篇僅只是基礎教學,若有興趣的可以當配資料庫或其他工具做到不一樣的效果
同時,可以研究一下如何可以做到股票的量化分析或者回歸分析


上一篇
[2020鐵人賽Day23]糊裡糊塗Python就上手-數據化圖之術(中)
下一篇
[2020鐵人賽Day25]糊裡糊塗Python就上手-圖形介面設計方法
系列文
糊裡糊塗Python就上手30

尚未有邦友留言

立即登入留言