高速取得全台股價資訊,馬上用黃金交叉練習看看【附Python程式碼】

選股的方式主要分成四大類:基本面、技術面、籌碼面、內線消息面,在多年的教學經驗中,我發現大概有80%的投資人都是使用技術面。而技術面就是利用股市每天所產生的五個數值,來進行不同的技術分析,五個數值分別為:「開盤價、收盤價、最高點、最低點、成交量」,藉此發展出KD線、MACD線、RSI指標...等。 許多同學在上完我的爬蟲課程後,都興致勃勃地到公開資訊觀測站進行爬蟲,然後又因為太高頻率的請求被網站擋住,或者爬蟲方式遇到困難而止步,回來找我求助。我在了解完他想要的資訊後,發現他只是要上述的技術分析五個數值,「其實你要的資料,我可以幾秒鐘把全台的股票都拉下來」我平淡的說。

1. 可交付成果

本文章會介紹目前Python的函式庫中,大家最常使用於取得技術分析五個數值「開盤價、收盤價、最高點、最低點、成交量」的套件pandas_datareader,以及這個套件的使用方式與範例程式碼。在文章的最後,也會為這個套件進整體性的比較,並加入作者個人的見解,提供給在股海中沉浮的您一個參考。 另外,行銷搬進大程式一直以來強調的都是實作,而本篇文章也不例外。因此,我們在最後,也會使用學完的套件,挑選出全台灣每日「短期突破長期」的股票,也就是俗稱的「黃金交叉」股,是每天全台灣的所有上市櫃股票通通掃一遍喔!

警告:本文章內容僅作為程式分享與範例,並非投資建議,基於文章之任何交易或投資決定,使用者須自負風險及盈虧,本文章與程式亦不負任何責任

2. 套件:pandas_datareader

pandas_datareader套件可以說是股價資訊的長輩,已經開發建立很長一段時間了,並且最吸引人的是,pandas_datareader支援全球的股市資訊,因此若您是投資美股、日股、港股,也都可以使用這個套件拉到相關資料。

1. 安裝pandas_datareader

由於本文章還是聚焦於台股,因此pandas_datareader套件的資料庫中,有支援台股的,就只有Yahoo資料庫了。而想要使用Yahoo資料庫套件,還必須要多下載yfinance套件,才能順利地跟Yahoo取得股市資料,因此需要輸入以下環境安裝指令:

pip install pandas_datareader
pip install yfinance

2. 設定抓取日期區間

我們當然不可能把所有上市櫃公司從上市以來的資訊全部拉下來,除了分析上沒有意義外,更會因為請求量過大被擋掉,因此我們先抓取全台所有股票30天內的資料即可。

import datetime
import pandas as pd
from pandas_datareader import data
# 需要用此套建載入yahoo的API,否則無法取得資訊
import yfinance as yf
yf.pdr_override()

# 已經整理好全台所有股票
all_stock = ['1101.TW', '1102.TW', '1103.TW', '1104.TW', '1108.TW', '1109.TW...太多了其他請見完整程式碼']

#先設定要爬的時間
start = datetime.datetime.now() - datetime.timedelta(days=30) 
end = datetime.datetime.now()

3. 抓取全台30天交易資料

行銷搬進大程式 設定完成後,即可使用「get_data_yahoo」方法,取得股票資訊了,而方法中的三個參數也不難理解,分別是「想抓的股票、開始日期、結束日期」,抓下來的資料會以DataFrame的格式呈現。其中值得一提的是,「想抓的股票」這個部分除了可以以陣列的方式指定大量的股票,也可以傳送字串格式抓取單一股票喔!

# 取得全台灣所有的股票,每天的交易資訊
df_stock = data.get_data_yahoo(all_stock, start, end)

行銷搬進大程式

在拉取多個股票資訊時,存取的DataFrame會是以三維度的方式呈現,因此再取資料的部分也會比較複雜,詳情請看下一段「黃金交叉」做為參考喔!

3. 實作「黃金交叉」選股

既然使用到黃金交叉這個選股方式,也簡單介紹一下。黃金交叉主要是判斷某支股票短期平均線大於長期平均線為買點,這其實也是很簡單的統計學概念,若某股票10天來的平均股價在100元,而這5日的平均股價卻是150元,這代表甚麼?最近這五天肯定有幾天的股價在100元這個平均之上,換句話說,就是這個股票最近漲很兇。 在市場中「黃金交叉」有許多的版本,每個人對於短期平均線與長期平均線的定義不同,這個部分是沒有對錯,只取決於您的投資策略,本文章就以以下的定義來舉例,您可以再依照自己的策略去微調程式碼:

  • 短期平均:5日。
  • 長期平均:30日。
  • 選股條件:該股票前5天收盤價的平均,大於前30天收盤價的平均。

1. 取得收盤價

因為這次我們只會用到收盤價的資訊,因此只需要取出收盤價的資訊即可。在前面拉下所有股票資料時,結果資料是以三維度的方式呈現,在columns的部分占了兩個維度,第一個維度的欄位分別是「Adj Close、Close、High、Low、Open、Volume」,也對應到「調整後收盤價、收盤價、最高點、最低點、開盤價、交易量」。其中您可能會比較好奇「調整後收盤價」,由於台灣在發放股利時,股價會因發放股利而向下調整(股價減去股利),因此才會有調整收盤價的出現。

df_stock['Close'].columns # 先簡單查看收盤價的所有欄位

get_close = df_stock['Close']

在本次範例中我們使用一般的收盤價即可,因此使用「Close」欄位即可。

2. 計算平均線

算出5日平均與30日平均其實非常簡單。先從30日平均說起,由於我們本來拉下來的資料就是30日的資料,因此直接皆將所有的資料使用mean()方法進行平均即可。5日的平均則是要抓取資料的最後五列,因為資料是按照日期由小到大排序的,因此需要先使用iloc[-5:]挑出最後列的資料。

get_close.mean() # 三十天平均
get_close.iloc[-5:].mean() # 五天平均

3. 計算黃金交叉

行銷搬進大程式

最後只需要將前一個部份的結果進行比較即可,將五天平均大於三十天平均的結果存成變數bigger,若想要取得詳細的股票代號,只需要挑選出變數bigger裡面為true的資料,並且列出他的index就好了喔!最後如上圖的結果,有540檔股票符合這個條件!

# 計算黃金交叉
bigger = get_close.iloc[-5:].mean() > get_close.mean()
bigger[bigger==True].index # 列出符合條件的所有股票

經過此次範例,基本上若您的選股需求是以股價平均線的方式進行挑選,那只需要將品篇文章的程式碼進行微調即可,但仍需再次提醒,**本文章內容僅作為程式分享與範例,並非投資建議,基於文章之任何交易或投資決定,使用者須自負風險及盈虧,本文章與程式亦不負任何責任**。

4. 套件總整理

整體來說pandas_datareader套件還是非常好用的,可以說是基本技術分析的不二人選。以下是您對於這個套件使用需求上,可能會有疑問的部分:

  1. 這個套件穩定嗎? 不穩,很誠實地跟您說。畢竟這個套件是免費提供,並且提供給全世界的投資人,能夠做到這樣已經很不容易了。雖然說我在使用時偶爾會出錯拉不到資料,但多拉幾次還是可以拉到的,比起自己寫爬蟲去爬,使用這個套件的穩定向還是相對較高的。
  2. 最久可以拉多久之前的股價資訊? 筆者想做這個實驗,但太久遠資料也容易拉不到,因此到底是沒資料還是暫時拉不到其實有點難判斷。但依照筆者的經驗,我最久會拉10年的股價資訊進行判斷,且穩定度大約8成,可以提供給您做參考。
  3. 權證與特別股拉的到嗎? 特別股是可以的,同樣在股號後面加上「.TW」即可,例如「2887F.TW」。但權證的部分就拉不到了。

作者:楊超霆 行銷搬進大程式 創辦人

©2023 行銷搬進大程式 Marketing Live in Code