要說 Python 裡其中一個最適合訓練手勢(沒錯,Python 編程像沖咖啡一樣,有手藝可言)的 Library,莫過於 yfinance 。
yfinance 是一個可以下載股票數據的 Library。由於股票數據,例如價格、交易等頗為大眾化,無論您是一個投資老手、投資初哥、或是完全不懂投資,都可以把 yfinance 視作 Python 修道館!
YFinance 與 Yahoo! Finance API
顧名思義,yfinance 這個 Library 的功能是一個 Python 獲取 Yahoo Finance API 的好用小夥伴。
這裡我們先科普一下 API 的概念。
凡人的 API 解釋
API 就像一個餐廳的服務生,而他只懂得端出餐廳菜單上有的料理。
我們每次跟他點菜時,要告訴他我們想要哪一道菜,以及個人的口味,例如比較鹹、甜等。
API 也是這樣運作的。他是伺服器的服務生,只懂得處理既定類型的請求。透過一個請求,我們便可以提取需要的數據。
Yahoo! Finance API
有玩過股票的朋友就會知道 Yahoo! Finance 是其中一個最為方便的數據庫。
譬如我們想知道台積電(TSM)的股價,在網頁可以到移動到「歷史數據」。我們可以透過更改「時段」等的參數獲取不同的數據。
我們這次運用到 Yahoo! Finance API,基本上與這個網頁版無異。只要我們時刻提醒自己這個數據的來源,就更能掌握 API 的語法了。
YFinance 使用教學
這次我們繼續用 Google Colab 教學。有興趣了解 Google Colab 可以到這裡:新手 1/3:5 分鐘免安裝學習 Python?Google Colab Notebook 幫緊您!
在 Google Colab 環境安裝 YFinance
由於 yfinance 不是 Google Colab 預設安裝的元件,所以我們需要先告訴 Google Colab 安裝 yfinance。
!pip install yfinance import yfinance as yf
透過以上 2 行的指令,我們要求我們的 Python Library 管理員,pip,去安裝 yfinance 這個 Library。安裝成功後,我們再匯入整個 Library。
如果您不太了解 Library,可以到這一邊看看喔:新手 2/3:Google Colab 如何製做互動表格和圖表?快來學 Import library/Jupyter。
獲取單一股票的數據
接下來我們先學如何深入提取 1 隻股票的數據。
定義 Ticker 物件
yfinance 運作的方式是透過我們定義一個 Ticker 的物件(Object),而透過這個物件,我們存取 Yahoo! Finance 的數據。
tsm = yf.Ticker(‘TSM’) tsla = yf.Ticker(‘TSLA’)
定義一個 Ticker 的方法十分簡單,就是 yf.Ticker(’SYMBOL’)
。
Ticker 物件的指令
Ticker 物件有許多功能(methods/functions),但我們集中討論一下常見的幾個指令。注意:以下使用 TSM 作例子,而我們已經定義 tsm
為 yf.Ticker('TSM')
。
指令 | 回傳 |
---|---|
tsm.info | 股票的基本資料,例如公司名、行業、市值、以及一系列的財務比率(Financial Ratios)如 P/E, P/B 比率等。 |
tsm.financials | 公司的損益表(Income Statement),一次可以獲取 4 年的數據。 |
tsm.earnings | 公司 4 年間的總收入(Revenue)與盈虧(Earnings),即 Top-line 與 Bottom-line 數據 |
tsm.actions | 公司的企業行動(Corporate Action)資料,例如股息(Dividend)和拆股(Stock Split) |
tsm.history() | 股票價格和企業行動的歷史。包含 OHLC(開盤 Open、最高 High、最低 Low、收市 Close)、成交量(Volume)等的重要數據。 |
有興趣了解每一個指令的回傳,可以在文末的 Google Colab Notebook 看看噢。
獲取多個股票的交易數據
這是 yfinance 的最主要用途之一。我們投資股票時總會先看看股價的走勢,再決定投資額、時期等。
Start/end 模式
# 語法是 yf.download( # 股票代號, # start=開始日期, # end=完結日期 # ) yf.download('TSM TSLA',start='2016-01-01',end='2021-01-01')
最常用的方法是使用所謂的 Start/End 模式來獲取數據,即是指定數據開始和結束日期。
透過以下的 3 個參數(parameters),我們提取到一個含有 OHLC 及交易量的 pandas dataframe。
參數 | 描述 |
---|---|
股票代號(例如 ‘TSM TSLA’) | 列舉所需的股票代號(可以在 Yahoo! Finance 的搜索找到每隻股票的代號)。除了以空格分開每隻股票代號,您亦可以直接使用一個列表,如 [‘TSM’, ‘TSLA’]。 |
開始日期(例如 ‘2016-01-01’) | 以 YYYY-MM-DD 的格式輸入數據的開始日期。如果日期不是交易日(trading days),那麼回傳的數據會以最近的下個交易日開始。 |
完結日期(例如 ‘2016-01-01’) | 以 YYYY-MM-DD 的格式輸入數據的完結日期。如果日期不是交易日(trading days),那麼回傳的數據會以最近的上個交易日開始。 |
Period 模式
# 語法是 yf.download( # 股票代號, # period=日期範圍 (1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max) # interval=頻率 (1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo) # ) yf.download('TSM TSLA',period='6mo',interval='1mo')
另外一個常見的用法是 Period 模式,指定數據的日期範圍,例如 3 個月前、6 個月前、1 年前等至今的數據。
Period 模式常見會聯合 interval 參數使用,提取到的 pandas dataframe 與 Start/End 模式差不多:
參數 | 描述 |
---|---|
日期範圍(例如 ‘6mo’) | 3 個月、6 個月前的數據,適用於計算投資時間回報(3 個月回報,今年至今回報等)。 |
頻率(例如 ‘1mo’) | 數據的頻率,可用於計算單月(1mo)、3 個月(3mo)等的回報。 |
企業行動
留意在以上的圖片例子裡,固然有 2021-01-01、 2021-02-01 等的數據,但怎麼會有 2021-03-17 等非月份的數據?
這是因為在那些日期,出現了如股息(Dividends)、拆股(Stock Split)等的企業行動。您可以上個環節提及的 tsm.actions
等的指令查看。
提取高頻股票數據(High Frequency)
最後我們來說一下高頻數據的提取方法。
高頻數據(High Frequency Data)是近年興起的一個概念,透過分析非常細膩、日內(Intraday)的股票走動,例如每分鐘的股票跳動,再以電腦作交易。這種交易方法特別見於外匯市場(Foreign Exchange)。
yf.download('TSM TSLA',period='7d',interval='1m')
細心一看,這個語法是 Period 模式的語法的延伸。
Yahoo! Finance 提供最近 7 天的日內(Intraday)數據。透過指定頻率(interval)為 1m/5m/10m/90m 等(m 代表分鐘),可以提取到高頻率的股票價格數據。
教學完整代碼
最後送給大家這篇教學的 Google Colab 完整代碼。如果您不懂得使用免安裝又好用的 Google Colab Notebook,記得閱讀這篇教學了:新手 1/3:5 分鐘免安裝學習 Python?Google Colab Notebook 幫緊您!
結語
希望您透過以上教學了解更多透過 yfinance 存取 Yahoo! Finance 股票數據的方法。記得繼續看看我們下一篇有關使用 pandas dataframe 來分析 yfinance 提取到的數據的技巧!