用 Python 打造自己的股市資料庫 — 美股篇

AI StockBoy
AI 股仔-創新投資理財模式
11 min readSep 21, 2019

Python DIY 資料庫系列;Yahoo Finance API;FRED API;Google Trends API

股仔與新創夥伴合作打造的美股資訊站 — FinGuider,歡迎前往體驗!

小小前言

所謂『垃圾進,垃圾出』,不論是開發策略也好或是數據分析也好,如果使用的數據資料來源不可靠,那出來的成品也難以說服他人。我們要開發 A.I. 策略前進股市,首要關鍵就是取得良好的財經資料庫。

首選:從知名財經資料庫取得數據資料,但要付錢

市面上有許多知名的財經資料庫可以選擇,Bloomberg、Datastream、MetaStock Xenith、Wind、CMoney、TEJ …。各家財經資料庫都有其所長,例如 Bloomberg 及 Datastream 的資料涵蓋率極廣,且資料品質極高;Wind 的中國資料庫非常優秀,API 使用體驗也佳;CMoney 及 TEJ 在台灣資料庫上資料完整,費用也較為親民。

針對你主力投資的市場,衡量費用預算後,就可從中選擇出符合需求的財經資料庫,透過專業財經資料庫取得數據資料絕對會是策略開發的首選。

未來我也會撰寫《財經資料庫 Python API》這一系列的文章,分享如何透過 Python API 快速的從這些財經資料庫中取得資料,不用手動按個老半天。

次選:透過 Python 從各大網站中免費取得數據資料,建立自己的資料庫

如果暫時沒法購買資料庫,難道策略研究、數據分析就要中斷了嗎?不!這篇就是要教大家如何從各大知名網站中,善用 Python 套件,透過簡單的語法有效取得大量數據資料!讓我們開始吧!

連結引導:

(未刊登)用 Python 打造自己的股市資料庫 —《台股篇》
(未刊登)用 Python 打造自己的股市資料庫 — 《陸股篇》

研究美股,需要什麼資料?

資料庫的內容越豐富,後續研究開發越有利。本文將教大家取得以下資料:

  • 公司資料:公司基本資料、市值、經營業務、產業類別…
  • 基本面資料:三大財報資料、每股盈餘、ROE…
  • 價量資料:調整後開高低收、成交量、股利、股票分割…
  • 總體經濟資料:公債殖利率、國內生產總值、消費者物價指數…
  • 個股情緒資料:個股搜尋熱度數據…

上哪找這些資料?

知道需要什麼資料後,下一個問題就是去哪取得這些資料。
前提是,有 2 個條件需要符合:

1. 資料來源可信度要夠(確保資料品質)2. 要能透過 python 自動排程取得(方便建構大樣本資料庫)

這裡就把符合條件的網站推薦給大家:

  • Yahoo Finance:主要的資料來源處 / 美股資料品質不錯
  • FRED:滿滿的總體經濟數據
  • Google Trends:可獲得股票關鍵字搜尋流行度的資料

它們都有很好的 python API 讓大家可以用簡單的 code 輕鬆建立起自己的美股資料庫喔!

需要安裝的 Python Modules

我們先把所需 modules 安裝好。

pip install yfinance #Yahoo Finance python API
pip install fredapi #FRED python API
pip install pytrends #Google Trends python API

等待安裝的時候,我們可以先建立資料夾,作為我們的美股資料庫!

從 Yahoo Finance 取得個股資料

我們將透過 yfinance 這個 API 取得以下資料:

  • 公司資料:公司基本資料、市值、經營業務、產業類別…
  • 基本面資料:三大財報資料、每股盈餘、ROE…
  • 價量資料:調整後開高低收、成交量、股利、股票分割…

STEP 1:資料庫中的股票代碼

所有資料庫都會分別替每一支個股取一個獨特的股票代碼,美股在不同資料庫的代碼有良好的一致性,但仍有小部份股票代碼會有差異,舉例 :

  • 『Apple』 不管在哪個資料庫的股票代碼都是 『AAPL』
  • 『 Berkshire Hathaway』在 Yahoo Finance 中的股票代碼是『BRK-B
  • 『 Berkshire Hathaway』在 CMoney 中的股票代碼是『BRK.B

既然要從 Yahoo Finance 取得資料,就要先取得 Yahoo Finance 中的股票代碼清單。股票代碼清單是根據自己想研究的標的所建立,這裡舉兩個範例:

  1. 最近一日交易量最大的前 100 檔熱門美股
  2. S&P 500 的成份股名單

範例1:最近一日交易量最大的前 100 檔熱門美股

  • 善用 Yahoo Finance 中的 Screeners 功能,可以建立不同主題的股票清單
  • 這裡我選擇了 Most Actives 股票清單,從下圖中可以得知 Most Actives 這份清單的篩股條件,點選『Edit』可以隨意修改篩股準則。
    底下 Matching Stocks 表格呈現出篩選出來的股票清單,再依據 Volume 成交量來進行排序
  • 再往下拉,可以看到這份表格預設是呈現 25 檔股票,我們將它改成一次呈現 100 檔股票
  • 設定好之後,可以點選剛剛『Edit』旁有一個『Save As』將這份清單下載後,再匯入 Python 處理。更快的辦法,是直接用 pandas 的 read_html 語法,把這份表格抓下來

範例2:最新的 S&P 500 成份股名單

  • 首先當然會想看看 Yahoo Finance 可否點出 S&P 500 的成份股名單,結果發現 Yahoo Finance 並無提供這個資料
  • 這樣的話就只好從外部找了。因為是 S&P 500,從 Google 輕鬆搜尋一下子就找到需要的清單,資料來自 Slickcharts
  • 我們用一樣的語法,輕鬆抓到這份表格。但要注意!Slickcharts 替股票命名的方式跟 Yahoo Finance 稍有不同!有些股票有類別之分,股票代碼與股票類別透過特殊符號隔開,Slickcharts 採用的符號是『.』,而 Yahoo Finance 採用的符號是『-』。因此我們補上了一行 code,把符號做一個修改!
  • {2019/11/11 更新}
    近期發現上述 code 會被 slickcharts 阻擋,故在此提供另一段 code 去提取股票代碼:
# 安裝所需 module - requests
pip install requests

STEP 2:用 yfinance 批次爬取股票資料

解決了股票代碼的問題後,可以開始爬取資料。這裡依序示範爬取:
公司資料基本面資料價量資料個股選擇權資料

先整理出 yfinance 會用到的語法:

# 必要步驟!告訴 python 你的標的股票是什麼
stock = yf.Ticker('股票代碼')
# 取得各種資料
stock.info # 取得公司資料
stock.financials # 取得損益表
stock.balance_sheet # 取得資產負債表
stock.cashflow # 取得現金流量表
stock.history # 取得價量資料+股利發放資料+股票分割資料

※ GET 公司資

  • 我們將做出一張如下圖的大表格,裡頭記載 yfinance 所提供的公司資料
欄:公司資料項目 (共 70 種資料項目)
列:公司股票代碼 (下圖以 S&P 500 成份股為例)
  • 程式碼以及敘述如下:

※ GET 基本面資料

  • 再來我們把三大財報資料給爬下來,由於美股財報日期不一,所以每一檔個股的三份財報都分開儲存比較好
備註:yfinance 所提供的財報資料只有最近 4 季,算是一個小缺點。
  • 程式碼以及敘述如下:

※ GET 價量資料+股利發放+股票分割

  • 接下來我們來爬取最重要的價量資料以及個股所有歷史財務操作紀錄,每檔個股存一份完整的資料
備註:此處下載的開、高、低、收資料全部都經過『股利』以及『股票分割』的還原喔!
  • 程式碼以及敘述如下:

從 FRED 取得總體經濟資料

FRED(Federal Reserve Economic Data)的總體經濟資料非常完善,資料可靠度極高,第三方提供的 python API 選擇也多達三種以上,絕對是取得總體經濟資料的首選。而首要步驟,就是先申請一個 FRED 帳號,再申請一組專屬的 API 序號,過程完全免費喔!

STEP 1:需要先申請 FRED 帳號 + API 序號

請點選『FRED API 申請』進入下圖 FRED 的網頁

右上角有一個『My Account』,我們點進去後,
再點選『Create New Account』申請 FRED 帳號

成功申請帳號後,就會自動導過來會員帳號頁面,我們點選『API Keys』,再點選『+ Request API Keys』就好了喔!

STEP 2:用 fredapi 取得需要的總體經濟資料

來了解一下 FRED 資料長怎樣

1. 舉例『wage』也就是薪資相關的數據好了!
2. 在 FRED 中,跟『wage』有關聯的數據至少有 7 個大分類,例如:
* 355:Minimum Wage Rates、
* 439:Mean Household Wages Adjusted by Cost of Living…
3. 每一個大分類都有一個專屬的『大分類 ID』,就是前面的那個數字
4. 而每一個大分類底下,又會有 N 的子項目,例如 355:Minimum Wage Rates底下:
* FEDMINNFRWG:Nonfarm Workers Minimum Hourly Wage
* FEDMINFRMWG:Farm Workers Minimum Hourly Wage
5. 每一個子項目也有一個專屬的『子項目英文代碼』,就是前面的那串英文字

所以呢!如果我想得到『非農就業的最低工資』這項經濟數據,就要先得到:

  1. 『大分類 ID』:355
  2. 『子項目英文代碼』:FEDMINNFRWG

待會那段 fredapi 爬資料的程式碼,當中的流程就是:

1. 先取得 FRED 有發布過什麼大分類的表,得到相對應的『大分類 ID』
2. 看看大分類的內容,選擇你需要的大分類,當然也可全選
3. 我會提供一個從大分類表中進行關鍵字搜尋的程式碼,方便大家查詢
(舉例:搜尋"wage"、"interest"、"gdp"、"yield"等等)
4. 創造一個以季為更新單位總表
5. 開始迴圈爬資料:
5-1. 第一層迴圈(大分類):
每個大分類底下,篩選出『最熱門的前三子項目』,以及相對應的『子項目英文代碼』
(當然也可以整個 FRED 所有項目內容都爬取下來,這邊僅做示範)
5-2. 第二層迴圈(子項目):
陸續將每一個項目放入該總表裡面,完成你的經濟數據庫!

完成的經濟資料庫會長這樣:

程式碼以及敘述如下:

從 Google Trends 取得關鍵字搜尋量資料

完成了個股資料以及總體經濟面資料後,已經足以開發投資策略了。但是大數據時代資料不嫌多,而且現代人只要有什麼事情想知道,都會先去 Google 一番,Google 搜尋熱度逐漸成為了一項很不錯的數據。這段就是教大家怎麼用 Google Trends 的 python API — pytrends,準備一份股票代碼搜尋熱度的資料。

完成後的 Google Trends 個股代碼搜尋熱度表格會長這樣:

程式碼以及敘述如下:

這樣就完成了 95% 的 Google Trends 個股搜尋熱度資料庫了,為什麼是 95%呢?因為熟悉 Google Trends 的使用者應該有看過下圖的一段話。

這段話是描述 Google Trends 將一段時間數據標準化的方式。
而我們取巧獲得長期間日頻率資料的方式,是每 270 天為一個時間區間推進一次去爬取日資料。這就產生了一個小小的問題:

  • Day 1 ~ Day 270 期間的最大值,是 Day 1 ~ Day 270 期間的標準化方式
  • Day 271 ~ Day 540 期間的最大值,是 Day 271 ~ Day 540 期間的標準化方式

所以資料合併在一起的時候,每一段資料標準化的依據都是不同的!因此我們還需要做一些調整,請見下方程式碼以及描述:

這樣就終於完成了!

終於建好美股資料庫了!希望大家滿意這篇教學~如果喜歡這篇文章,歡迎按下拍手給我支持,你們的鼓勵能驅使我加速寫出更多優質文章喔!感謝各位!

--

--