python爬蟲 - 個股歷年股價資訊

Rainie
職場學習筆記
Published in
Jul 22, 2018

小資族的資金是非常有限的,每一筆錢都要花在刀口上,當我們下手買一隻股票時,都希望能買在合理的價格,因此單看每日的股價資訊是不夠的,還需要把股票以前的資訊考慮進來,觀察過去一段時間內這隻股票是逐漸成長還是逐漸衰退,亦或是現在的買價是相對高點還是相對低點,來作為判斷合理股價的依據。

此外,投資領域有一個很重要的觀念就是回測,當你想要測試自己的投資組合是否真的有效,可以透過過去的數據來驗證,利用回測模擬過去一段時間內的真實損益,所以歷年股價是一項非常重要的資訊,這篇就要來教大家如何爬取個股歷年的股價資訊。

程式碼奉上:

將上述程式碼拆分成四個步驟:

1. import package2. 爬取每月股價的目標網站並包裝成函式3. 根據使用者輸入的日期,以月為單位,重複呼叫爬取月股價的函式4. 將爬取到的歷年股價資訊繪成圖表並儲存成csv檔

Step1. import package

這篇使用到6個package,名稱與主要功能分別是:

  • urllib - 提供網頁存取,讓網頁類似於文件操作
  • dateutil - rrule提供自定義的規則方便生成datetime
  • matplotlib - 繪製圖表
  • pandas - 建立系統化的表格資訊,方便後續資料應用
  • datetime - 處理和日期相關的資訊
  • json - 爬取json格式的資料

上面表列屬於Python3 standard library的package,不須特別安裝,但對於不屬於的部分,請記得先使用pip安裝,避免import時產生error code。

Step2. 爬取每月股價的目標網站並包裝成函式

爬取歷年股價的時間一旦拉長是一項非常費時的工作,如果用個股每日統計資訊一日一日爬取太浪費時間了,還好證卷交易所有提供每月統整的日成交資訊,讓我們可以以月為單位爬取個股每日的歷史股價。

URL

觀察上圖的網址格式,找到日期與股價代號,依照同樣格式將要爬取的日期與股票代號填入url相對應的位置。特別提醒一下這邊跟之前文章不一樣的地方是url裡response的部分從html改成json。

json是一種輕量級的數據交換格式,將資料使用鍵值對組成,格式非常簡單,很適合用來爬取大量的表格資訊。這邊使用json的原因是希望能讓爬取方式更多樣性,此外,使用json也不會有之前爬取html時得濾掉額外表格的工作。

json format

json重要的數據有兩個:第一個就是存放欄位名稱(ex. 日期、成交股數等等...)的filed,和實際對應每個欄位股價資訊的data,指定這兩個欄位將爬取出來的資料放入dataframe內。因為爬取月股價是需要一直重複執行的動作,將上述的功能包裝成函式(craw_one_month)方便後續使用與呼叫。

Step3. 根據使用者輸入的日期,以月為單位,重複呼叫爬取月股價的函式

假設使用者指定要爬取台積電從2017年1月開始到現在2018年7月的股價,必須先產生19個日期變數並呼叫craw_one_month 19次。一開始先將起始爬取的日期正規化成%Y-%m-%d的格式並設定成起始月份b_month,之後再透過datatime取得現在時間並設定成結束月份e_month。

將月份透過rrule迭代傳入函式的參數內,重複呼叫craw_one_month直到e_month結束,最後將全部爬取到的表格concat起來,就能得到一張完整歷史股價的大表囉!

dataframe的使用前幾篇文章都有提到,這裡就不特別贅述了。這邊需要提醒大家的是:對網頁發出請求的動作不能執行的過於頻繁,不然IP會被鎖一段時間無法連上目標網站,因此每次爬取一個月份後記得一定要延遲個幾毫秒。

Step4. 將爬取到的歷年股價資訊繪成圖表並儲存成csv檔

最後,一大堆的表格資訊難以看出股價的漲跌,因此將所有股票的收盤價畫成圖表方便觀察。

到目前為止已經能夠將股票重要的報表都爬取下來了並將資料轉換成csv檔儲存,讓每個人都可以簡單的設計出符合自己投資組合與需求的資料。

最近因為參加了公司的AI比賽,得花上許多時間準備,因此關於股票爬蟲的更新可能會暫緩,等到比賽告一段落才會繼續。如果之前的文章有任何勘誤或是不懂的部分,都歡迎留言給我,我有看到會立即回覆的,等手上的事情都告一段落後我會再把參加AI比賽的心得寫成文章與大家分享~

[2023/1/11] 更新程式碼,目前已可爬取 ETF 股價資訊

--

--