Showing posts with label Crawler. Show all posts
Showing posts with label Crawler. Show all posts

Wednesday, June 2, 2021

Python王者歸來 台股量化交易從入門到放棄 (1)取得數據

        最近持續會在一些論壇或學習群看到如何取得股價的問題。這問題說難不難,說簡單也不簡單,今天來介紹一下台股價量以及一些金融數據的下載方法。



  • 架構 

       原本這系列是想先從架構介紹起。先從想要怎樣的成果開始介紹,然後回講到這樣的成果要如何建立開發環境,最後才介紹python。至於取得股價,原本不在寫作計畫內。畢竟對於有python基礎的朋友來說,網上有很多取得免費股價的方法,看一看複製貼上就寫完了。但對於一些新同學來說,這一關可能會卡很久。因此這篇除了介紹一些免費取得股價的方法之外,還介紹一些選擇數據源和儲存數據的考量。

        為什麼貼了上面這個架構圖?是因為要提醒新同學,要學的東西真的很多,自己斟酌一下哪些是你該花時間學的,哪些功能找網路上的簡單代碼複製貼上就好。

        網路上有很多取得股市數據的教學文或現成的代碼,所以當你看到網路上有取得股市數據的教學時立刻動手做之前,請先檢查一下一些事。你或許想取得當天即時成交股價,但你看一篇文章看了半天才,跑完代碼才發現這是歷史股價,又或許花了好幾天時間修改網路上的代碼才發現一分鐘限制你讀取次數。以下是我踩了許多坑之後,所整理出來的匯總表。

數據源取得方式參考鏈結即時/歷史優點缺點
yahoo股市爬蟲https://tw.stock.yahoo.com/即時初學者最直觀開發與維護的難度高
yfinanceapihttps://pypi.org/project/yfinance/歷史直接套用函式只有歷史股價
證交所/櫃買html傳輸python爬蟲 — 每日即時股價即時官方數據限制高頻使用,需要另外開發
永豐金證券shioajiapi永豐金證券即時/歷史直接套用函式只有股價數據。要先開戶
finmindtradeapihttps://finmindtrade.com/即時/歷史直接套用函式。
有股價以外的市場數據
部分數據需要繳交會員費

        在介紹如何取得股價的方法之前,先介紹一下股價有歷史股價與當天即時成交股價兩種。兩種數據的數據源和存儲格式都不相同。由於取得歷史股價的方法比較多,可以參考這張彙總表。以下實戰部分是取得當天即時成交股價的方法作為例子。

  • 實戰

        除了歷史數據還是即時數據之外,另一個要考慮的是返回的是怎樣的數據格式。初學者比較孰悉的是爬取網頁上的數據,如果你學習的主要目的是學爬蟲,這或許是個不錯的數據源。但爬蟲其實是挺深的領域。你想爬對方網頁的數據,對方也知道你想爬他們的數據,自然有許多反爬蟲手段,最簡單的是隨便改個頁面配置或是訪問限制,或是設個人機辨識的captcha就能夠讓你忙翻天。

        另外就數據處理來說,網頁爬回來的數據需要相當多的加工。也增加你整套分析架構的工作量與不穩定性。


        另一種數據源是http通訊。透過網址傳入參數(post),以網頁回傳結果(get)。證交所目前是用這種格是返回即時股價,數據內容是json串。如果你受限於一些因素需要採用這種格式的數據,json串處理起來也不難,也是個挺穩定的數據來源。一些小缺點包括上市上櫃給先分開查詢,還有需要另外一段代碼來轉換成接下來能運算的數據。但這種方式的最大問題是通常會限制訪問頻率,如果你的策略是要高頻取得股價,建議你換個方式。

        比較推薦的方式是api。回傳的就是類似Excel(DataFrame)能夠直接使用的數據格式,你不用自己拆解和重新命名欄位。

  • 操作建議

        每個人的需求不同,因此搭建的架構也會不同,以下的操作建議是基於我的量化交易架構圖所開展出來的。

        由於我需要歷史股價、當日即時股價、三大法人、融資融券、公司營收獲利等各種財金數據,因此我遵守儘量集中我的數據源、儘量不自己開發取數代碼這兩個原則。畢竟取數不是我的核心工作,也減少上線後代碼出問題debug的工作,因此我是採取永金證券的當日即時股價,合併finmindtrade的其他數據,含計算含當日成交價量的跨日技術指標。

        在命名欄位名稱時,建議參考mplfinance的命名方式,你會發現這套命名規則和yfinance是一樣的。也就是用Date、Open、High、Low、Close、Volume這幾個欄位名稱(注意大小寫)來命名日期時間、開盤價、當日最高價、當日最低價、收盤價、成交量。

Monday, January 11, 2021

Python學習筆記:是否該學爬蟲

         今天聊一個可能會讓有些人不高興的論點:是否該學爬蟲?

         這幾年常常聽到機器學習、人工智慧、大數據,以至於很多沒有接觸過寫程式的朋友連自己要學的目的,或是以及該學哪一個領域這些關鍵問題都還沒弄清,一開口就要說要學python。先不說需要大量數學基礎的人工智慧、機器學習。這篇先來談談比較多人入門接觸的爬蟲。

         先說說我的故事,我一開始接觸爬蟲是工作上有需要爬一些查詢資料,那時候經濟部對於公司查詢沒有任何限制,也沒有圖形認證這類的captcha,excel寫個很簡單的巨集就能抓回幾萬筆的公司資料。我目前頂多用python去get一些公司內部PAAS平台的數據。對於爬蟲這一塊,我早早就放棄了,公司內部自然有專業爬蟲團隊來處理

         先說結論:先認清你產出的價值在哪塊。除非你是專業做這領域的商業應用,否則建議不用學爬蟲了。這樣的結論主要來自兩點:難的你學不會,簡單的有現成的。

         先說說簡單的有現成的這塊。最簡單的爬蟲在Google Sheet或是Excel裡面都有power query,能把網頁中的表格數據導入到Excel。需要點擊、翻頁這類動作或是條件動作爬蟲,則有八爪魚這樣的免費軟體,拖拉點選就完成了。如果你超過每日下載筆數限制、加速爬取或是需要proxy避免被反爬蟲時,你才需要支付費用。


         再說說難的你學不會這塊。爬蟲難的其實是從進網站到日後的維護。這包括一開始查詢前的captcha圖像識別、簡訊認證、查詢中的反偵測技術、被爬網站持續性的網頁調整等等,每一個領域的難度都夠你退卻。除非你真的是專業從事這領域的,請仔細想想你是否值得要學習爬蟲。



?:,