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是一樣的。也就是用DateOpenHighLowCloseVolume這幾個欄位名稱(注意大小寫)來命名日期時間、開盤價、當日最高價、當日最低價、收盤價、成交量。

Thursday, May 27, 2021

Jupyter有兩種:Jupyter Note和JupyterLab

         Jupyter 是python最通用的IDE之一。配置簡單、容易測試、網頁介面等,都是Jupyter的優點。一般在說Jupyter時,其實說的是Jupyter Notebook,Jupyter有兩個產品:Jupyter Notebook和JupyterLab。Jupyter Notebook大部分人都很熟悉,這裡要介紹的是JupyterLab。

         



      

        在打開Anaconda的時候,我們可以看到有Jupyter Notebook和JupyterLab。JupyterLab的安裝環境和配置都和Jupyter Notebook一樣,使用方法也一樣,因此可以無痛轉換。 

        我自己原本也是用Jupyter Notebook好幾年了,但一換到JupyterLab後就真的回不去了。我個人推薦JupyterLab取代Jupyter Notebook的理由如下:

  • 頁面整合
  • 支持插件

        先說說第一點:同一個頁流覽器面開啟多個Jupyter頁面。開發過程中經常會多段代碼同時推進,在Jupyter Notebook上就得開多個流覽器,如果你是使用chrome,那對佔用相當龐大的記憶體。另外,雖然chrome可以分組管理頁面,但你還得開檔編輯器、檔案管理器。整個視窗是相當混亂的。

        關於視窗管理,Jupyter Notebook是單一頁面管理,對頁面空白處的使用是比較沒效率,你想同時管理檔案時,又得跳出頁面。JupyterLab可以同時開啟多個視窗,也可以暫時關閉管理視窗延長代碼視窗

        第二點是可以安裝插件,這一點讓JupterLab有了無限的擴充性。我個人目前最依賴的是csv編輯器。你可以在server上使用vi、vim編輯檔,但遇到編輯csv時就得等跳出平臺使用其他編輯器。如果是使用Excel,csv開檔存檔都會面臨格式問題,使用文字編輯器又有欄位分隔問題,JupyterLab上的csv編輯器完美解決了這個需求。


  


Friday, April 16, 2021

關於大數據(1):容量

         今天來談談大資料。大數據這名稱有點魔幻,到底多大的資料才算是大資料?資料有多大跟我有什麼關係?今天要介紹的,是從一個學生的角度,來思考大資料要如何入門。


         網路上可以找到一些關於大資料的定義,這裡結錄一段基本概念:

「大數據(big data)」這一名詞是2008年由Infineta Systems公司的Haseeb Budhani提出。麥肯錫公司2011年對大數據有如下定義:大數據是其體量超出了傳統資料庫軟體工具的採集、存儲、管理和分析能力的數據。

大數據有5V特性,分別是VolumeVelocityVarietyValueVeracity

容量(Volume):大數據量大,不僅量大而且增長速度快;

變化性(Velocity):數據流動性大,變化迅速;

種類(Variety):數據類型的多樣性;

價值(Value):價值是決定大數據應用的根本屬性,沒有價值就沒有大數據;

真實性(Veracity):要求數據準確,準確的數據才能反映真實的資訊。


大數據有多大?這麼大!!

         由於篇幅比較大,今天先介紹關於資料容量的部分。也是我個人覺得重要性排名比較後的一部分。往下介紹之前,要說明的是大數據的出現,並不會影響這名詞出現前的分析方法或工具。現今大數據最大的跳戰,在於從不同的異種數據之間(例如圖像+語音+GPS+app操作習慣),挖掘出數據價值。

         先岔開一個話題。就我個人認知而言,大數據表現出來的是有價值的重點資訊,跟資料量多寡沒有直接關係。舉例來說:利用全國人口資料,能算出全國男女比例、年齡分佈等人口統計,這是大資料沒錯。

        而一家服裝公司累積了幾十年的客戶身材資料,能夠快速設計出各種服裝,這些累積的身材資料可能只有幾十個mb,一個小小的筆電用excel也能產出極高的商業價值。我個人認為這也是的大資料。

        除非是討論技術問題,就資料價值來說,將焦點放在資料量的“大小”,其實沒太大的實質意義。因此接下來的說明,都是站在你該“學習”什麼大數據技術的角度來了解什麼是大數據。

 

  • 容量(Volume:

        我們從最終數據使用者的角度出發,從一般人都孰悉的Excel開始,一步一步往數據源走,了解什麼是大數據。        

        容量是第一個遇到的問題。但在說明容量之前,還要叉出去一個話題。你有沒有過這樣的經驗,一個幾十萬筆的excel(csv)你用excel開不了,但在同一台電腦上裝上MySQL或是python這些工具,都能秒開這些資料。關鍵問題是excel不是為了這樣數量的資料設計的,但資料庫的應用程式就是專門為了這些資料量設計的而這一塊是數據工具方面。

        容量的問題另一個核心問題是資料庫的設計。舉個簡單的例子,如果你的資料量每天都在增加,你可以設計成每天、每月存成一個檔案。資料查詢太慢,你可以改變將一些欄位的定義。例如在Excel中,你要查詢文字是很慢的,但查詢數字是很快的。如果在你的資料中,有些數字類型的欄位元例如收入、生日、股價的資料,就要改成數字格式。以上這些領域是數據結構的領域。

        接下來一個情境是,你需要讀入多個資料來源。例如你需要讀入財務部關於成本的數據,你需要業務部的銷售數據、你需要開發部提供的客戶在官網webapp上的行為數據、你還需要接入一些外部公司的資料例如客戶透過fb粉絲群的反應。這時候你需要中台部門幫你整合並管理這些資料介面你只面對數據中台,不需要自己都去接這些數據源,也不用去管理不同團隊間的權限和數據庫驅動。這是中台部門的領域。

        這些不同的數據沒法直接提煉出你要的決策數據,你可以想像,面對這麼多數源(sheet),你要在excel中做出個樞紐分析表前,得先將這些資料來源根據一些規則合併成一張sheet,而這就是商業智慧(BI)部門在做的事。這些同事依據你給的規則,幫你做出自動產出、即時更新的分析層資料集市(Data Mart)以及分析圖表(大部分情況是他們提供分析工具讓你自己做報表)

        再往上走接下來資料量更大了,例如電信公司會存用戶上網時,是哪個基地台、用了多少用量。這時候涉及同一份庫表存在不同的物理硬碟或是伺服器上,你如果依照某些檔案存在某個物理磁片上的單機經驗,你的磁片很快就會爆而且磁碟空間的使用很沒效率。這領域是分散式存儲分散式運算

        再往上還有呢。現在業界面臨的一個問題是資料孤島的問題。你家客戶的數據跟我家客戶的數據是不相通的。在面對一些問題的時候往往需要相互合作。例如某個信用卡詐欺集團同時申請了多家銀行的信用卡,如何跨銀行間合作找出這些詐欺集團的行為特徵?如何偵測同一個pos機或是商家在短期間內出現多家銀行信用卡的刷卡消費?銀行間如何在保密和合作間找到解決方案?就算有加密你的客戶資料會不會被合作夥伴用一些驗算法找出你的客群畫像?目前這一塊領域還在發展中,有興趣的可以找一下聯邦學習(Federated Learning)?


Sunday, April 11, 2021

對於新手入手Python的一些建議

        最近這幾年python彷彿成了一門顯學。數據分析也pyhon,AI也python,大數據也python,爬蟲也python。彷彿python無所不能一樣

        對於一些專業論壇來說,很多高手其實從大學或是高中就開始學程式語言一些專業背景的例如Computer Science或是資訊管理科系,或甚至理工科系的畢業生,大多有些基礎或是已經投入在某些專業領域。因此對於沒程式基礎的小白來說,往往是一開始就讓人放棄的,讓小白想放棄的原因包括

  • 沒全觀視角
  • 人工智慧、大數據、機器學習被濫用
  • debug
        以上說的這些問題,每個都可能讓新同學放棄學習python。因此建議在學習python之前。先仔細思考一下你學習python的目的,以及你在學習中會遇到的困難,還有你能取得到的資源。再決定你的學習路徑(包括一開始就放棄或選擇其他程式語言)。

Friday, January 15, 2021

量化交易筆記(0)--構思

          從2020年年中開始,我幾年沒動的股票又開始交易了起來,那時候面臨一個問題:我跟蹤了很多股票,但往往幾天沒注意到幾隻股票,這幾支股票就發射升空了。那時候在想,有沒有辦法透過Python,每天找出符合一些條件的票?這個想法慢慢推進到現在,陸續遇到一些問題,也找到一些解決方法。隨著慢慢有一些成果出來,也把一路上的想法與遇到的問題和解決方法做個整理記錄。

        一開始的想法只是很單純的在收盤後用python分析網路上有些相關資源或是教學,但這些資源都是分散破碎的,例如教數據接入、自動圖表製作、交易策略、消息推送等等。但這些資源都是對單一主題在說明。

        原始的想法慢慢的成朝一個產品方向推進,從盤中數據接入,盤中追蹤個股分析,到最終分析結果自動推送到line或是wechat這些通訊軟體,以後可能會對接到下單系統。總之就是把一個產品的流程從頭到尾走一遍。不僅把各地蒐集到的教學和大馬整合在一起,也完整做出一個產品。

        計畫是採模組化開發,在定義好欄位後,不同的模塊可以互相對接。核心的股價欄位名稱是參考上圖mplfiance的欄位,日交易的分鐘檔也可以參考這些欄位名稱。  








Monday, January 11, 2021

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

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

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

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

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

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


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



?:,


Friday, January 8, 2021

Python量化交易筆記(1)--建設隨時隨地寫Python的環境

         從2020年年中開始,我幾年沒動的股票又開始交易了起來,那時候面臨一個問題:我跟蹤了很多股票,但往往幾天沒注意到幾隻股票,這幾支股票就發射升空了。那時候在想,有沒有辦法透過Python,每天找出符合一些條件的票?這個想法慢慢推進到現在,陸續遇到一些問題,也找到一些解決方法。隨著慢慢有一些成果出來,也把這半年內遇到的問題和解決方法做個整理記錄。

         這其中幾個最大的問題有兩個開發平台的建立消息推送。今天這篇先聊聊開發平台的的建立。

         如果你只在公司內幫公司寫代碼,那麼工作時間、軟硬體條件都不會是問題,這篇其實你也可以跳過了。但如果你自己私人平常有其他開發目標,那麼環境建置就是一個很大的挑戰,也是你遲早必須解決的問題

         寫代碼往往受限於環境,你得在家裡、在公司,用著已經配置好的電腦。不然一台新電腦光配置編寫環境,就夠耗上你好幾個小時了。另外新電腦上面也不會有你之前已寫好的代碼,要引用一些配置或是看看之前自己的代碼是怎麼寫的,都是相當困難的。如果你自己私人也有寫一些代碼。但是你在公司忽然想編輯,理論上也是不太可行的。你也不可能隨時帶著一台性能超強的筆電,電源、重量、大小都夠你累的了。另外有些代碼是需要跑後台或是長時間運算,當你要出門離開或是下班的時候,你就得停下來或是隔一段時間才能修改,對開發時間來說,都是不小的耽擱。

         有沒有可能自己建一個jupyter平台,任何時間任何地點外部任何一台電腦都能連上。這樣一方面能隨時隨地保存、呼叫自己寫的代碼 ,也不用去解決環境設置的問題這篇整理了這幾個月我遇到的情況和幾個解決方案,這幾個解決方案在成本、算力、建置複雜性上,都有顯著的差異

  • AWS

         AWS是Amazon提供的雲端服務。你可以在網路上找到相當多AWS架設Jupyter的教學,他是所有解決方案中,少數幾個提供免費的解決方案,Colab雖然也免費,但整體環境沒有AWS完整。

         如果你平常是在linux上開發,那麼你對aws的環境會相當熟悉。


         AWS的缺點也很明顯,就是貴!!免費版本EC2跑得比我的筆電還慢,如果不是商業用途,交錢真的會花到心在淌血。我發現EC2另一個問題是service會忽然被關掉,就算我只是幾分鐘沒用就被踢掉了,可能是我沒交錢,可能是設置問題,我沒去探討原因,畢竟那不重要了。因此我在嘗試一個禮拜的AWS後,我就放棄AWS了。

  • NAS Docker
         如果你自己有NAS,不妨可以可以在裝個Jupyter的Docker。NAS的好處,除了可以利用平常沒在運轉的NAS之外,最大的好處是NAS的DDNS可以讓你實現內網穿透。當你的主機使用內部網域的虛擬ip架設Jupyter時,便可以從外部訪問你的主機。
         原本我以為可以在我家裡的NAS上架設Jupyter時,我發現一個最致命的問題:我的NAS是DS216 play,是不支援Docker的。網路上有一些關於在DS216 Play安裝Docker的教學。一方面我覺得太複雜了,二方面這麼低階又這麼老的NAS耗了這麼大的力氣,跑起來也會很糟。因為我又放棄了。

  • 內網穿透
         我目前使用的解決方案是內網穿透,家裡的電腦啟動Jupyter後,開啟內網穿透應用程式就完成了。由於外網端口和域名都可以自定義,因此也很容易記憶。以下面這個例子來說,外面任何一台電腦或是手機,連上 http://jupyter.nat123.fun:7777  就能連回家裡的jupyter,環境是和在家使用jupyter完全相同的

         我買兩年送一年1M的方案大概是NTD700左右,除了安裝簡單之外在成本、效能、方便性、安全性、穩定性、彈性上都算是非常超值的 。
         談完了開發環境的架設,接下來的問題是當你主機持續在運行中輸出的結果,能隨時隨地通知到你。下一篇再來談談如何將python輸出的消息推送到你的手機。