還未知道什麼是 Google Colab Notebook?記得閱讀:新手 1/3:5 分鐘免安裝學習 Python?Google Colab Notebook 幫緊您!
上回我們提及 Google Colab Notebook 的好處是免安裝,十分適合零經驗、想直接學習 Python 編程的小夥伴。現在,我們來一些複雜一點的編程,希望從中學習:
- 什麼是 Library/如何 Import Library
- 製作一張簡單、易明的 Google Colab Notebook 表格
- 製作精美的互動式(Interactive)圖表
- 多一些 Python 編程的技巧
左思右想,還是覺得一個股票類的例子比較容易明白。我們今天的目標是在 Google Colab Notebook 設計一張可以匯入股價的表格,並以圖表形式顯示股票最近 5 年的走勢。
我們的數據來源是 Yahoo! Finance,有興趣了解更多有關 Yahoo! Finance 的資訊可以按這裡。
事不宜遲,我們開始咯!
第一步:設計表格
首先我們加入 2 個 Markdown block (如何加入 Markdown Block?),並且分別填上「# Google Colab Notebook 範例 1」及「## 表格」。留意 “#” 是代表 Markdown block 的大小,越多 “#”,字體越小。
完成後,我們在 Code block 的位置填上以下代碼:
#@title 設定股票 symbol = '0005.HK' #@param {type:"string"} print('系統已經紀錄: '+ symbol)
留意畫面的右方會出現一個「symbol: “0005.HK”」的框。這個就是 Google Colab/Jupyter 的互動式(Interactive)表格,可以方便我們隨時隨地更改變數的值。
點擊一下 Play 按鈕,下方將會顯示成功的信息。由於我們的 Notebook 已經紀錄了 symbol 是 “0005.HK”,所以待會可以直接使用 symbol 變數。
第二步:匯入 Pandas 等的 Library
什麼是 Library
其中一個 Python 編程普及的原因,在於 Python 語言擁有十分豐富的編程 Library。Library 是指一些已經完成的 Python 編碼,可以延伸 Python 編程的功能。
比方說,如果 Python 編程是健身,那麼 Python 內置的功能(例如加減乘除)就是健身室,而 Python 的 Library 就是健身設備。如果只有健身室,那麼您能夠做到的運動動作很有限/十分艱辛;但如果您有許多不同的健身設備,例如跑步機、背肌重訓托架,那麼您能完成的動作將會大幅增加。
Pandas、Pandas Datareader、Plotly、Flask、Tensorflow、NLTK 等等的 Library 就是您的健身設備。因為這些豐富的免費/公開 Library,我們可以省卻許多艱鉅(Technical)的編程,而主要專注在應用(Implementation)方面。
我們需要什麼 Library
第二個問題就是我們需要什麼 Library。這是開始每個 Python 編程的項目前,我們必須考慮和探索的問題。以下分享一個我覺得好用的思考方法,讓大家參考如何決定自己需要什麼 Library:
先問自己:用途 | 再去發掘:Library |
---|---|
從 Yahoo! Finance下載股票價格資料 | pandas_datareader yfinance |
把數據匯出成圖表 | plotly matplotlib |
計算今天與 1 年前的日期 | datetime |
隨著您對 Python 的認識加深,您會發現許多時候,滿足同一個用途的 Library 不只 1 個。如果我們有多於一個選擇時,該如何處理?
如何決定用那個 Library
這是,我們便需要以一些準則作出判斷,包括但不限於:
- 最符合自己用途的 Library (未必是最流行的 Library!!)
- 有良好用戶群體的 Library,方便自己解決編程問題
- 原作者十分活躍的 Library,這樣的 Library 長遠來說較穩定
對於新手/選擇困難症來說,這步或會頗有挑戰,但只要多做研究(例如 Google 一下其他用家的評價)、不怕試錯,這也是 Python 編程重要和好玩的一環。
匯入 Library
感謝網友 K. K. 提點 pandas_datareader 的問題,現已更新以下教學內容。
說了那麼多,我們來學習如何在 Google Colab Notebook 匯入 Library 吧!
import datetime !pip install pandas_datareader --upgrade from pandas_datareader import get_data_yahoo import plotly.express as px import plotly.graph_objects as go
匯入 Library 有 3 種語法:
語法 | 用途 |
---|---|
import library | 把這個 Library 的所有功能匯入。適用於重要的 Library,例如 pandas . |
from library import object | 從 Library 抽取其中一個組件匯入。適用於在非常大的 Library (例如 plotly )但只需要一個組件的時候 |
import library as abbr 或 import library.object as abbr | 將 Library 或其中一個組件匯入,並簡寫為 abbr。適用於名字很長的 Library 或約定俗成的用法(例如 pd 是 pandas 慣用的簡寫) |
留意我們在 import pandas_datareader
前加入了 !pip install pandas_datareader --upgrade
的字句。這是因為 Colab 的 pandas_datareader
版本比較舊,沒有兼容最新的數據。所以,我們先將 pandas_datareader
更新,再匯入這個 Library。
有興趣詳情可以參考這篇:VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!
第三步:提取股價
noOfYears = 5 endDate = datetime.datetime.now() startDate = endDate - datetime.timedelta(days=365 * noOfYears) print('現在我們提取從 ', startDate, ' 到 ', endDate, ' 的股價\n') data = get_data_yahoo(symbol, startDate, endDate) print('提取成功!數據是:\n', data)
計算日期
我們需要先找出今天與5年前的日期,以告訴 Python 去提取什麼日子的數據。datetime
library 的 datetime.datetime.now()
將會是您的好朋友,而 datetime.timedelta()
則可以為我們進行日期的運算。透過上面第 1 至 4 行的編程,我們成功計算出今天與5年前的日期。
接著,我們把股票代號(symbol),起始日(startDate)和完結日(endDate)作為函數(Inputs)輸入 Pandas Datareader
的 get_data_yahoo()
功能。
從 Pandas Datareader 提取數據
留意由於我們前面 import library 時使用了 from pandas_datareader import get_data_yahoo
而非 import pandas_datareader as pdr
,所以可以直接使用 data = get_data_yahoo()
而不需要 data = pdr.get_data_yahoo()
。
當我們把 data
變數 print 出來看時,可以見到一個類似 Excel 試算表的輸出。這個變數其實就是鼎鼎大名的 Pandas Dataframe!(這也很合理,因為我們使用了 Pandas Datareader)
從這個輸出,我們亦能看到有關這個 Pandas Dataframe 的基礎資料。例如這裡顯示有 1,236 列(Row)和 6 行(Column),代表我們有這個股票代號 1,236 個交易日(約 5 年)的 6 項資料。這 6 項資料就是 High, Low, Open, Close, Volume, Adj Close。
有了 Pandas Dataframe 就好辦事了!
第四步:製作圖表
還記得我們有 import Plotly
這個 library 嗎?沒錯,這個就是我們製作圖表的好朋友(Graphing engine)。
簡單:折線圖
data = data.reset_index() fig = px.line(data, x="Date", y="Adj Close", title= symbol + ' 的走勢圖') fig.show()
首先我們來一個比較容易的圖表。Yahoo! Finance 的 Adj Close (調整後收市價)是一個包含股息(Dividend)、企業行動(Corporate Action)影響的股價,比較適合量化持股總收益(Total Return)。
我們在上述 3 行編碼,把先前從 Pandas Datareader 獲得的 Pandas Dataframe(即是 data
變數)數據製成圖表。x="Date"
即是把數據的日期設為 X 軸,而 y="Adj Close"
就是把數據的調整後收市價設為 Y 軸。
留意我們加入了 data = data.reset_index()
,因為原先數據的 Date 是一個索引(Index)而非一個行(Column),所以我們透過重設索引,使 Date 變成可以用以製作圖表的行(Column)。
按下 Play 按鈕後,在 Code Block 的下方出現了一張互動式(Interactive)折線圖。把鼠標在圖表上移動的話,可以徘徊(Hover)時看到不同日子的數值。有興趣了解更多有關 Plotly 互動式圖表可以按此。
進階:OHLC (陰陽燭)圖表
data = data.tail(255) fig = go.Figure( data=go.Ohlc( x=data['Date'], open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'] ), layout=dict(title= symbol + ' 的 OHLC 圖') ) fig.show()
除了剛才提及的折線圖外,我們亦可以製做俗稱陰陽燭的 OHLC 圖表。這種圖表用於股票走勢的技術分析(Technical Analysis),亦是 Plotly 這個 Library 的內置圖表之一。
與剛才略有不同,我們使用 plotly.graph_objects
,是比較進階的 Plotly 圖表,但基本使用跟 plotly.express
差不多,也就不在這裡重複。
留意我們在編程的第一句使用了 data.tail(255)
。tail(n)
這個功能讓我們可以直接提取 Pandas Dataframe 的最後 n 個列(Row),所以我們使用這個功能,把數據限制於最後 255 列,大概就是一年的交易日數目。
製成品/完整代碼
恭喜您已經建立了第一個 Google Colab Notebook 表格,並以 Google Colab Notebook 為基礎,透過股票價格數據製成精美圖表!
除了 0005.HK 以外,您也可以在表格嘗試其他股票代號以獲取其他股票的價格。小貼士:您可以按 Runtime -> Run all 一次執行所有 Code block,就不用逐個逐個按 Play 按鈕。
在這裏亦分享這個教程的完整代碼,如果您想直接使用我的 Python 代碼拷貝,可以在下方按 “Open in Colab” 直接執行這個 Google Colab Notebook 喔。
下一步
下一篇我們來學習一下 Google Colab Notebook 的 I/O,讓我們可以直接在 Google Colab Notebook 使用我們自訂的文件/數據!
下一篇:新手 3/3:Google Colab 如何讀取/輸出檔案?從 Google Drive 存取 CSV