學會用機器學習預測股價 — 完整流程教學與實作

AI StockBoy
AI 股仔-創新投資理財模式
28 min readOct 18, 2019

Python + A.I. 股市應用系列;機器學習之概念講解 & 流程拆解;以決策樹實作美國 S&P 500 ETF 的預測機器人

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

小小前言

Python + A.I. 股市應用』這個系列將陸續分享各種 機器學習 / 深度學習 金融股市應用的知識文以及實作文。內容全以 Python 實作並附上 code 給各位參考,有興趣的話歡迎持續追蹤!

首篇文章,希望能用簡單的文字及較多的圖示,讓沒有接觸過 A.I. 的初學者,能夠理解要從 0 到 1 做出一套 A.I. 模型,有什麼流程。當初學者有了整個設計藍圖的概念以後,我們再去慢慢了解跟 A.I. 有關的一些背景、一些知識,以及各個環節中的種種要點。

本文要做出一個能夠『預測股市』的機器人。這個議題,在全世界都相當的火熱,畢竟它跟財富的相關性最為直接!但是燒了好幾十年的議題,至今卻仍未有穩定獲利的 A.I. 模型出現!為什麼這樣說呢?

因為基金經理人都還沒失業呢!

就產業結構來說,當未來有一天大家發現人類基金經理人開始逐漸失業時,可能就代表那個時候的 A.I. 投資預測模型已經有著極優秀且穩定的績效,能夠完全取代人類了。股市數據的特性,其實是極難做出能夠穩定預測的 A.I. 模型,假若哪天 A.I. 連這關都克服了,代表 A.I. 在其他領域幾乎都已行得通,那人類的工作機會可能…

話題扯遠之前,我們還是先回到數據分析的角度,去了解一下剛剛的問題 — 現在專業人士所開發出來的 A.I. 投資機器人,程度到哪了?

延伸閱讀 : 人工智能AI投資 V.S. 專業投資人 — AI衝擊下的新投資模式

現今人類使用 A.I. 投資的程度到哪了?

我們參考 Eurekahedge AI Hedge Fund Index(點擊連結將前往 Eurekahege 官方網站),此指數追蹤了全球 14 檔對沖基金,而這 14 檔基金的共通點就是:

  • 皆使用 A.I. 預測模型進行投資決策判斷,甚至用於資金管理判斷

這個特性使得此指數的績效好壞,能夠反映現今全球的專業人士所開發出來的 A.I. 投資預測模型,優劣程度為何。

Eurekahedge AI Hedge Fund Index(藍線)從 2010 至今(資料到 2019 年 9 月)的績效由下圖呈現,若 10 年前投入 100,現在已翻了好幾倍變成 324。以年化報酬率換算的話,大約每年有 12.5% 的報酬率。看似不錯對吧?

Eurekahedge AI Hedge Fund Index 績效圖,資料來源 — Eurekahedge

但是如果把美國大盤指數 — DJ USA Index(紅線)加入作為比較對象的話,我們可以看到大盤已經迎頭趕上。大盤在 2019 年 9 月底的績效數值剛好也是累積到 324,與 Eurekahedge AI Hedge Fund Index(藍線)的績效一致。

Eurekahedge AI Hedge Fund Index 比較 DJ USA Index,資料來源 — Eurekahedge

你也許會說:績效一樣,但是藍線比紅線穩定多了!

確實沒錯,Eurekahedge AI Hedge Fund Index 從 2010 年至 2017 年底的績效表現可謂「完勝」大盤。該期間不論大盤漲或跌,A.I. 基金指數都能夠穩定的漲漲漲,幾乎沒有什麼回落,直到 2018 年。

我們用一條紅線,將資料從 2018 年 1 月切分兩段,就能一眼看出左右兩區塊的差別,再把注意力放在 2018 年 1 月至今的表現:

  • 大盤績效:+8.36% |A.I. 基金績效:-2.41%
  • 兩者漲跌相關性變高,A.I. 基金漲幅趨緩

我們不能否認 A.I. 過去的表現,但就最近一年九個月的表現來說,A.I. 投資落後了大盤整整 10% 以上,表現是差強人意的。

大家下一個問題或許是:這一年九個月的 A.I. 基金表現為何變這麼差?

由於我無法取得這 14 檔 A.I. 對沖基金的 A.I. 模型,也就無法探究為何它們過去績效優良,現在卻差了這麼多。但不要忘了,除了這 14 檔基金的專業經理人以外,世界上還有無數工程師 / 投資人時時刻刻都在挑戰「A.I. 股市預測」這項任務,然而這無數人過了這麼久也都尚未有足以淘汰經理人的成果發表(有趣的是,即使做出來了,你願意發表嗎?),這表示了 A.I. 股市預測這件事情本身存在了難以突破的要素,這些要素可以寫成一篇文章,這裡就先列出兩點:

  • 並不像動物辨識那般,數據樣本越多越詳細,就越能夠開發出準確度高的 A.I. 模型。股市預測最大的問題是,過去的股市,可能不會重演,即便「看似」要重演,也會是演出完全不一樣的版本,數據樣本越多越詳細,不代表能夠開發出準確度高的 A.I. 模型。
  • 股市是由無數行為綜合產生的結果,這一份自然現象的數據集,在統計特徵上有著極大差異性。如果能收集所有股市參與者的即時詳細資料,諸如看盤時的心跳、委託單情報、最近瀏覽網頁等等,那準確預測股市的 A.I. 理應能開發出來。但現實是,我們僅能取得公開資料。

本文內容大綱與備註

內容大綱:

  • 機器學習應用於股價預測 — 完整步驟流程圖
  • 各步驟詳細解說與示範

本文備註:

  • 本文以監督式機器學習的角度介紹機器學習的流程架構,暫不提及非監督式機器學習的差異,避免初學者混淆。

機器學習應用於股價預測 — 完整步驟流程圖

要做一套 A.I. 預測模型,流程如下:

  1. 設定預測目標(做出來的 A.I. 要幫你解決什麼問題?)
  2. 蒐集資料數據(大數據的時代,此為最關鍵的第一步)
  3. 選擇 A.I. 模型(A.I. 模型各有優缺,選出最適合的模型)
  4. 標記你的預測目標(先準備一份標準答案,讓 A.I. 能夠分辨對錯)
  5. 整理剩餘的資料(答案以外的數據,就是 A.I. 的學習資料庫)
  6. 把資料切成三份(一份給 A.I. 學習,一份給 A.I. 改正,一份給 A.I. 測驗)
  7. 讓 A.I. 學習(設定基礎參數,開始讓 A.I. 進行學習,然後生出一個模型)
  8. 讓 A.I. 改正(驗證一下生出來的模型好不好,進行模型的調整)
  9. 讓 A.I. 測驗(實際給 A.I. 一批它沒看過的資料,看看結果如何)
  10. 測驗結果分析(對結果進行績效分析,從結果決定這個模型該保留與否)
  11. 模型保留 → 未來實際應用 / 模型不保留 → 重新建設

步驟〔1〕 :設定預測目標

在金融界, A.I. 的應用越來越多,例如:

  • 貸款人信用評分、違約風險評估
  • 信用卡詐欺、洗錢的識別與防制
  • 大數據即時風控
  • 機器人客服
  • 股市預測
  • (未來)A.I. 心跳偵測?
  • (未來)自助式 VR 客服?

以上都是「預測目標」,是我們在開始開發一個 A.I. 機器人之前,首要決定出來的最終目標。

本文設定最終目標是:『預測一週後收盤價相對今日收盤價是漲或跌
而標的是:『美國 S&P 500 ETF — SPY

這目標屬於「股市預測」這個大分類中一個相當簡單的預測目標。除此以外還有無數個預測目標可設計,這裡稍微舉幾個例子:

  • 當沖漲跌預測;
  • 區間反轉點預測;
  • 區間報酬率(漲跌)預測;
  • 目標漲跌幅度趨勢預測;
  • 趨勢最佳買賣點預測…

看文字可能有點抽象,我稍微將以上預測目標圖示化:

預測目標:每日當沖的漲或跌
預測目標:一個區間的反轉點
預測目標:一個區間的報酬率 / 漲或跌
預測目標:一定程度的漲跌趨勢
預測目標:一個趨勢中的最佳買賣點

預測目標可以天馬行空隨意設計,我們到了步驟〔3〕的時候將會用程式定義出設定的預測目標。而本文預測目標其實就是上面第三張圖,把設定區間改成 5 日即是。

目前進度整理:

  • (New)標的:S&P 500 ETF — SPY(日資料)
  • (New)預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌

步驟〔2〕 :蒐集資料數據

數據資料越多越廣 → 模型越有機會做得好

  • 資料越:A.I. 能參考、學習的樣本越多,越能歸納出優良的邏輯公式
  • 資料越:生成的因子越多,差異性越大,越有機會拼湊出預測能力佳的因子組合

所以,盡量運用手頭上的資源,準備一份齊全的資料吧!而這份資料最低限度要有:

  1. 能夠定義出我們預測目標的數據
  2. 至少一個拿來預測目標的因子

﹝開始 Python 做中學!﹞

我們將使用過去兩篇文章的教學,快速的使用 Python 準備一份資料。

※ 資料收集的話,可以參考 這篇文章※ 計算技術指標的話,可以參考 這篇文章

STEP:取得能夠定義預測目標的資料

本文的標的是 SPY,它是一檔 ETF,追蹤美國 S&P 500 指數。

我們用過去教學的方法,迅速的取得了 SPY 的歷史股價(還原股價)。而這份股價資料,完全能夠定義我們的預測目標 — 『5日報酬率漲跌』。

STEP:準備更多拿來預測目標的因子

透過什麼能判斷一週後的美國大盤?

  • 美國 / 中國 / 某國經濟?
  • 美國大盤自身?
  • 美國氣候?
  • 失業 / 痛苦指數?
  • 交叉匯率走勢?
  • 石油 / 黃金價格?
  • 貿易戰輿論情緒?
  • VIX 恐慌指數?
  • 各產業報酬率相關性?
  • 股票報酬率網絡群聚現象?

人類難以處理上百上千的因子,但機器可以。若能取得任何相關的因子,就先納入數據資料之中。

之後會發布一篇文章關於『如何判斷因子重要性』,本文此處先採用過去教學的 TA-Lib,快速準備一些技術指標作為因子。

蒐集好資料數據了!來看一眼吧!(看到 nan 不用擔心,此階段先盡量蒐集數據資料,下一步驟再處理數據)

我們用這些數據來做一個 A.I. 預測機器人

目前進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • (New)資料數據:價量資料與 4 種技術指標

步驟〔3〕 :選擇 A.I. 模型

這些是什麼?好可怕!

初學者不用擔心!各個模型的理論我們以後再慢慢分享。這邊直接進入應用的部份。

本文從眾多 A.I. 模型中選擇了『決策樹』,它的預測效果在眾多 A.I. 模型中可能不是那麼好,但為什麼還要選擇它呢?原因是:

  • 決策樹能夠良好的進行視覺化,初學者即使完全不懂 A.I. 也能理解決策樹在做什麼
  • 數據預處理程序較少,初學者進入門檻比較低

我們來看一眼決策樹的長相:

人類版決策樹示意圖

是不是非常近似人類思考問題的過程呢?但是人類在面對一個問題,可能會思考十幾個條件判斷去做決策,複雜一點可能就是數十個條件判斷,如果要思考上百個條件做判斷,可能就暈了。

但我們建造出來的 A.I. 卻沒有上限,它能夠根據無上限個條件、無上限個參數綜合考量後,進行最有利的判斷,類似下方圖片:

機器版決策樹示意圖

是不是很誇張呢?而本文到最後就會帶著大家做出這樣一個 A.I. 自動產出的決策樹喔!

但其實如此「複雜」的決策樹,有可能會產生一些問題喔!諸如節點、資訊獲利、過度擬合等等的問題,本文後段會帶到一些過度擬合的問題,其他的就等以後另開一篇決策樹教學時再慢慢分享。現在先繼續本文內容吧!

目前進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • 資料數據:價量資料與 4 種技術指標
  • (New)A.I. 模型:決策樹

步驟〔4~5〕 :標記預測目標,整理剩餘的資料

步驟〔4〕:標記預測目標

大家有聽過「資料標註員」嗎?這是在 A.I. 時代才出現的新型態工作職位。他們負責的事情,就是在原始資料上標記「答案」,讓 A.I. 知道該往哪個方向學習才是正確的。

若沒有準確的資料標註,A.I. 將會學得一塌糊塗

這是 A.I. 流程中最基層的工作,卻也是最重要的工作之一。我們在此階段,就要靠自己寫出 Python 程式,將我們的原始資料,自動進行「答案」的標記。

我們的最終目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌

這目標很簡單,答案有兩種:

  • :五交易日後的收盤價,比今日收盤價
  • :五交易日後的收盤價,比今日收盤價

兩種答案,分別授予一個代號,讓機器清楚辨識:

  • :1
  • :0

﹝開始 Python 做中學!﹞

STEP:標記預測目標

由於這次的目標定義實在單純,一行 code 就成功定義出來了!

我們習慣會將定義出來的目標進行視覺化,一方面是做個檢查,另一方面是透過視覺檢驗,能夠激發腦部進行更多的想像,進而有機會設計出更棒的目標!

備註:
下面的程式碼只為了進行視覺化,不是本文主旨因此不多做解釋。
未來我會開設「Python 視覺化」的專題系列,再分享大量的視覺化的寫法與成品。

來看看我們標記的答案在 2019 年的視覺化:

  • 紅色區塊 = 五日後 →
  • 綠色區塊 = 五日後 →
  • 這就是我們希望 A.I. 能夠做出的預測。

步驟〔5〕:整理剩餘的資料

如果做出一個 A.I. 機器人要花你 100 分鐘的時間,那步驟〔4+5〕很有可能會佔了其中的 90 分鐘,尤其是步驟〔5〕

整理剩餘的資料,又或者是稱為「資料預處理」,是 A.I. 製作過程中不可或缺的一步。所謂「垃圾進,垃圾出」,如果資料處理得不好,那 A.I. 就會看到品質不好的「垃圾」,這樣我們就不能期待 A.I. 會產出多好的結果了。

資料預處理的一般流程如下:

  1. 缺值的處理
  2. 類別數據的處理
  3. 數據標準化

不同的 A.I. 模型,資料預處理的流程會有差異。例如本文採用的「決策樹」模型,數據可以不用標準化,算是非常方便的模型。其他 A.I. 模型如「神經網路」、「LSTM」等等都需要更深入探討資料預處理,未來將另開專題分享。

﹝開始 Python 做中學!﹞

STEP:資料預處理

本文資料相對單純,三個流程中:

  1. 缺值的處理:『要處理』,技術指標中存在 nan 值
  2. 類別數據的處理:『不須處理』,這次數據資料中並無類別數據
  3. 數據標準化:『不須處理』,決策樹可以不用執行標準化

目前進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • 資料數據:價量資料與 4 種技術指標
  • A.I. 模型:決策樹
  • (New)目標標記與資料預處理:完成

步驟〔6〕 :把資料切成三份

一般來說,到了這個階段,我們要如上圖般將資料分成完全獨立的三部份

  1. 訓練集:約 50% 的資料。A.I. 拿著一批因子,看著正確答案,學習判斷邏輯
  2. 驗證集:約 25% 的資料。工程師用這份數據優化 A.I. 模型的參數設定
  3. 測試集:約 25% 的資料。A.I. 拿到了一份從沒看過的數據,使用它生成的判斷邏輯,進行測驗,而我們這些考官就透過測驗成績評斷 A.I. 的優劣

研究時,一般都切三份;實際應用時,可以切兩份即可:

  1. 訓練集: 75% 的資料。
  2. 測試集: 25% 的資料。

上面所有『約 xx% 的資料』,是比較普遍的設定,並非一定要依照這比例。只要視你手中的樣本數量,進行合理的配置即可!譬如說你手中的樣本很少,那可能訓練樣本多一些(85%),測試樣本少一些(15%),否則機器可能學習效果不佳。

還有一點,就是股市這種時間序列的資料,在樣本切割的時候也有些許不同:

  • 非時間序列機器學習:『假設有 100 個樣本,訓練集要 75% 好了。』
    一般是用隨機抽樣的方式,從 100 個樣本中,隨機挑選 75 個樣本作為訓練集,剩下的 25 個樣本就是測試集。
  • 時間序列機器學習:『假設有 100 天的樣本,訓練集也是 75% 好了。』
    由於這種資料前後相鄰的資料相關性非常高,為了不破壞這種連續性的特性,所以這份資料就不是隨機抽取喔!而是將前面 75 天的資料作為訓練集,後面 25 天的樣本就是測試集。

切割的流程,也有兩種方式喔!我把這兩種方式視覺化呈現,希望初學者能較好吸收,請看下圖:

切一刀即可,初學者請採用這個
處理時間序列資料的推薦切割方式:前進式學習

基本上應用在股市這種時間序列資料的機器學習模型,我已經全部都採用『前進式學習』了喔!它的優點是:

  • 比較貼近真實
  • 減少過度擬合的問題發生

初學階段,我們就從第一種方式開始練習吧!

﹝開始 Python 做中學!﹞

STEP:學習 / 測試樣本切割

我們採用「切一刀」的方式,比例就設定 70%,30% 學習好了!

這樣就切割好囉,至於為什麼測試樣本中我要捨棄最後 5 筆樣本呢?
test = data.iloc[split_point:-5,:].copy()
原因是我們的預測目標是 5 日後的漲跌,所以測試樣本中的最後五筆資料還沒有正確答案的!不管 A.I. 在那五天做出什麼預測,我們都無從評斷它正確於否,所以就直接拿掉吧!

由於機器還不知道資料中,哪些是因子(稱為 X),哪項是正確答案(稱為 y),所以我們要把切好的資料,再做 X,y 的區分:

目前進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • 資料數據:價量資料與 4 種技術指標
  • A.I. 模型:決策樹
  • 目標標記與資料預處理:完成
  • (New)訓練 / 測試樣本切割:70% 學習樣本 | 30% 測試樣本

步驟〔7~9〕 :讓 A.I. 學習 → 改正 → 測驗

接下來的工作就交棒給『決策樹 A.I.』囉!

如果我們上面是把資料切三份,那這邊就會有三個環節:學習 → 改正 → 測驗,比照上圖辦理。

但因為我們上一階段是把資料切成學習與測試兩份,所以我們這邊的環節會變成:學習 → 測驗

問題來了… A.I. 的程式要怎麼寫出來…

答案是:不需要自己寫!

這邊就要簡單介紹一下 Python 中的機器學習工具包 — scikit-learn,又簡稱 sklearn。這個工具包,已用高效的演算法,將絕大部分的 A.I. 模型都寫好給你使用了!如 SVM、Random Forest、k-Means、PCA、XGBoost … 都有提供喔,詳情可以點此連結前往官方網站查看。

安裝 sklearn:

pip install -U scikit-learn

這也是為什麼要學習 A.I.,最推薦的程式語言就是 Python,資源實在太豐富了!接下來就開始使用 sklearn,用簡單的語法,建造我們的決策樹 A.I.吧!

﹝開始 Python 做中學!﹞

STEP:匯入 sklearn,創造一個決策樹

一行指令DecisionTreeClassifier就能生成一個決策樹模型了,我把模型取名叫做 model,其中我放了一個參數的調整:max_depth = 7,這個參數是什麼呢?

  • 它代表這棵樹要長多「」,或這棵樹要長多「高」

再看一次我在上面所放的兩張決策樹的示意圖:

深度:4
深度:24

可以看到,深度越深的樹,表示它有著越多的分支,意思是為了要得到正確的答案,它強硬要求自己要把因子拆得很細去拼湊出最能解釋答案的邏輯。

咦?這樣不是很好嗎?

別忘了我們前面有提到金融預測的問題:股市不會一模一樣的重演。所以 A.I. 根據『過去的學習資料』完美的拼湊出了能夠『 100% 正確判斷過去』的邏輯。這個邏輯,在未來可能完全不適用

  • 決策樹最大的問題是很容易過度擬合,而控制「深度」就能有效防止這個問題

那如何決定深度呢?這問題我會在步驟〔10〕伴隨著績效分析,提供一個決定深度的辦法,這邊我們先隨便設定一個深度即可。

STEP:讓決策樹學習與測驗

model 就是我們剛剛創造出來的決策樹,要讓它從過去資料學習的話,只要使用model.fit(train_X, train_y)即可。記得 train_X 是學習樣本的因子,而 train_y 是學習樣本的答案。

不到一秒的時間, model 就學習完畢了!接下來就讓 model 考試吧。使用model.predict(test_X)就能讓 model 根據 test_X (測試樣本的因子)去做預測判斷,我們再把 model 做出的預測,存到 prediction,就可以方便待會進行測驗結果的分析囉!

進入下一步驟前,這邊先提供一個視覺化這棵樹的程式碼,可以看到這棵 A.I. 決策樹到底在想什麼,非常有趣喔!但由於不是本文重點,程式碼的部份就不多做解釋囉!

※ 若要順利進行此部份的視覺化,需要先安裝 graphviz,官方下載網頁連結請點此
‧ Windows 的話選擇安裝:Stable 2.38 Windows install packages 即可
※ 開啟 anaconda prompt:
‧ pip install graphviz
※ 然後,將安裝路徑放到環境變數中:
‧ 路徑類似於:C:/Program Files(x86)/Graphviz2.38/bin/
‧ 在 Python 進行環境變數的設定:
‧ import os
‧ os.environ['PATH'] += os.pathsep + '路徑'

來看看 model 的真面目!

咱們創造的 A.I. 決策樹 model 原來是依據這樣的邏輯判斷股市未來五天的漲跌!

目前進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • 資料數據:價量資料與 4 種技術指標
  • A.I. 模型:決策樹
  • 目標標記與資料預處理:完成
  • 訓練 / 測試樣本切割:70% 學習樣本 | 30% 測試樣本
  • (New)建立一個 A.I. 決策樹:完成,取名 model
  • (New)讓 A.I. 學習與測試:完成,採 depth = 7,結果放 prediction

步驟〔10〕 :測驗結果分析

如何判斷 A.I. 的好壞?

這裡分享上圖的三種判斷 A.I. 學習完之後好壞的方法:

  1. 混淆矩陣分析
  2. ROC / AUC 分析
  3. 投資回測績效分析

接下來逐一做介紹,同時看看我們 model 的表現:

※ 混淆矩陣分析

先來看一張混淆矩陣的圖表:

混淆矩陣示範圖表

這張混淆矩陣表,告訴了我們什麼事呢?

  • 測試樣本總數共 100 筆資料
  • 這份測試樣本裡面,真正的答案,包含了 60 次的跌,以及 40 次的漲
  • A.I. 做的預測,包含了 72 次的跌,以及 28 次的漲
  • True跌)真實「」,而 A.I. 正確預測「」的次數一共 50 次
  • False漲)真實「」,但 A.I. 錯誤預測「」的次數一共 10 次
  • True漲)真實「」,而 A.I. 正確預測「」的次數一共 18次
  • False跌)真實「」,但 A.I. 錯誤預測「」的次數一共 22次

而混淆矩陣最重要的事情是,它能夠告訴我們這個 A.I. 的準確率是多少!但是要自己計算喔,公式如下:

  • 準確率 計算:(True跌 + True漲)/ 總樣本數
  • 上圖的示範:(50 + 18)/ 100 = 68% 的準確率

那本文的 model 在混淆矩陣的表現如何呢?

﹝開始 Python 做中學!﹞

STEP:看看混淆矩陣,計算準確率

簡單的指令confusion_matrix(test_y, prediction)就能生成混淆矩陣囉!而 test_y 就是測試樣本中真正正確的答案;prediction 的話就是上一個步驟我們存起來的 A.I. 的預測結果喔!

準備率也相當好計算,在 model 後方,使用簡單的指令
.score(test_X, test_y)就能快速計算出混淆矩陣的準確率了!其中 test_X 是測試樣本的因子矩陣;test_y 一樣就是測試樣本中真正正確的答案。

混淆矩陣及準確率回傳結果

從回傳的結果,我們看到了一個 2x2 的混淆矩陣。由於我們在步驟〔4〕的時候,標記了:

  • 跌:0
  • 漲:1

因此數字代碼較小的「跌:0」將會優先排入混淆矩陣的計算。所以 178 這個數字表示的意思就是:

  • True跌)真實「」,而 A.I. 正確預測「」的次數一共 178 次

因此這回傳結果的混淆矩陣,相當於下表:

這樣就比較好理解了!

回傳的結果同時也看到了準確度約 55.54%,以本次初學階段如此簡單設定的 A.I. 模型來說,準確度不算太差。

只參考準確度夠不夠呢?答案是絕對不夠的!因為這個指標有一個嚴重的問題,我們假設一個情況:

  • 測試樣本共 100 天的結果,其中 99 天漲,1 天跌
  • 假設 A.I. 學得極差,這個 A.I. 只懂得預測漲,不懂得預測跌
  • 所以這 A.I. 在這 100 天的預測結果是,100 天都預測漲

在以上的情況中,A.I. 的準確率為多少呢?

準確率:99%…

很顯然的,如果光靠準確率來判斷 A.I. 好壞,是有可能產生偏誤的。因此,我們需要多看 AUC 分析以及回測績效分析。

※ ROC / AUC 分析

先來看一張 ROC / AUC 的圖:

ROC / AUC 示意圖

ROC / AUC 經常被拿來分析一個機器學習模型的優劣,由於要詳細介紹相關知識可能篇幅過長,初學者在此階段先了解關鍵指標 AUC 面積該如何應用即可:

  • AUC 是介於 0 到 1 之間的一個數值,全名: Area under the Curve of ROC
  • AUC = 1:表示這個 A.I. 是完美的
  • 0.5 < AUC < 1:表示這個 A.I. 相比隨機猜測來得優秀,妥善運用的話,能夠產生預測價值
  • AUC = 0.5:表示這個 A.I. 做的預測跟隨機猜測一樣,沒有價值
  • AUC < 0.5:表示這個 A.I. 做的預測比隨機猜測還差;但是!如果把這個 A.I. 當成反指標,將每次的預測結果反過來,就會優於隨機猜測

那本文的 model 在 AUC 的表現如何呢?

﹝開始 Python 做中學!﹞

STEP:計算 AUC

要得到 AUC,需要先算出 ROC 曲線,我們使用
roc_curve(test_y, prediction)就能得到 ROC 的座標資訊,分別存在 false_positive_rate 以及 true_positive_rate 當中,對照上方 ROC / AUC 示意圖就能知道 false_positive_rate 是 X 軸的資料,而 true_positive_rate 是 Y 軸的資料。

我們再把這兩項資料,放入函數 auc 當中
auc(false_positive_rate, true_positive_rate)就能算出 AUC 面積了!

AUC 回傳結果

從回傳結果得知,model 的 AUC 評分只有 0.51,只比隨機亂猜(AUC = 0.5)好一點點而已。這個數值,對於本文簡單的模型設定來說,非常的合理。

STEP:透過 AUC,決定決策樹深度的最佳參數

還記不記得在步驟〔7~9〕,我們創造決策樹的時候,有提到深度的問題呢?

該如何決定一棵樹要長多深?

在學會計算 AUC 後,就可以透過 AUC 的評分,來檢驗深度這個參數的理想設定是多少。

當時我們隨意設定了一個決策樹的深度max_depth = 7,而這個 model 得到 AUC 的評分 0.51 分。接下來我們就用迴圈的方式,測試所有深度參數的設定會分別得到多少 AUC,再用視覺化的方式幫助我們找到答案。

開始以前,先看個重點備註:

找到最佳模型參數,屬於優化模型的環節。理論上是【學習 > 優化 > 測驗】當中優化的部份。資料如果分三塊,其中優化模型資料的部份就可以拿來尋找最佳參數。由於本文為了簡化教學,資料只分成兩塊【學習 > 測驗】,因此只能先拿測驗樣本示範參數最佳化喔!

這段 code,大家會發現我特地讓模型去對「學習樣本」也進行測驗,其實就是為了呈現上面曾經提過的一段話:

  • 使用決策樹的話,假如不設定深度,該模型很容易『過度擬合
  • 而過度擬合的模型,即使能完美解釋過去,卻不一定能夠預測未來,尤其是股市的預測

從視覺化的圖中就能看出這一點:

決策樹的過度擬合問題

大約從黃線標記處開始,也就是深度參數設定在大約 18 的時候,模型已經根據學習樣本而過度擬合。它完美地解釋了過去(AUC = 1),但是該模型套用在測試樣本的時候,績效並沒有提昇。

離題了!「最理想的深度參數是多少?」這個才是我們的問題!其實上圖同時也畫出答案了:

  • 紅線的最高點(獲得最高的 AUC),理論上就是最佳的深度參數

我們單獨視覺化紅線看看:

可以看到,深度參數設定在 12 的時候,測試樣本的 AUC 達到了最高值:0.5226。因此可以視 12 為最理想的深度參數設定喔。

※ 回測績效分析

最後一個評斷模型優劣的方法,就是直接將 model 對測試樣本所做出的預測,當作一個投資策略的訊號。從模擬投資的角度,去觀察這個 A.I. 模型做出的預測,到底有沒有發展成策略的可能性。

回測績效分析,檢驗 A.I. 的同時,也檢驗了你替 A.I. 設定的目標是否適合開發投資策略。

換句話說好了:一個不適合拿來投資的預測目標,即使 A.I. 能夠 99% 預測成功,策略績效也不會好。

另外要注意的是,投資策略可以有很多設計,但此處策略的作用是「為了驗證 A.I. 模型的優劣」,因此我們須使用毫無設計過的投資策略(無停損停利、無加碼減碼等等)。

根據每日 A.I. 的預測訊號:

  • T-1 日的預測為「」而 T 日的預測為「」,則 T+1 日開盤『買進
  • T-1 日的預測為「」而 T 日的預測為「」,則 T+1 日開盤『賣出
  • 連續預測「」,則『持續持有
  • 連續預測「」,則『空手等待

﹝開始 Python 做中學!﹞

STEP:簡易回測與績效計算

我們來看看績效會如何吧!

簡易績效表

這樣的績效評測如何呢?答案可能就見仁見智了。對我而言,就算此策略自身每個格子的績效看似都不錯,像是勝率有 68.9%、獲利因子高達 2.33、每次交易平均淨報酬率也接近 1%。

但是稍微跟買進持有比較(紅線 v.s. 黑線),除了最終績效差了很多以外,許多標的大漲的地方,策略沒有跟到;許多標的大跌的地方,策略也沒有躲到。

我們發展一個預測 5 日後漲跌的 A.I. 預測模型,最大的目的是希望 A.I. 能夠有效偵測買點且規避風險,提供優良的進出場建議。但從結果來看,這次 A.I. 的結果並不良好。

因此針對這次結果,我可以做出這個結論:

  • 預測目標的設計還可以,有開發空間
  • A.I. 學習效果不佳,需重新建設

目前進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • 資料數據:價量資料與 4 種技術指標
  • A.I. 模型:決策樹
  • 目標標記與資料預處理:完成
  • 訓練 / 測試樣本切割:70% 學習樣本 | 30% 測試樣本
  • 建立一個 A.I. 決策樹:完成,取名 model
  • 讓 A.I. 學習與測試:完成,採 depth = 7,結果放 prediction
  • (New)測驗結果分析:三階段檢驗完成

步驟〔11〕 :決定 A.I. 模型保留與否

終於完成三階段的 A.I. 績效分析了,統整一下結果:

  • 準確率:55.54% → 普通
  • AUC:0.51 → 非常普通
  • 回測績效:綜合考量 → 偏差

結論就是:這個 A.I. 模型並不及格,需要重新開發。

但是!我們這裡先假設這個模型及格!因為我們流程終於來到最後一步了:

如何保留模型?後續要怎麼應用?

﹝開始 Python 做中學!﹞

STEP:存 / 取 A.I. 模型

相當簡單吧。接下來,假設我取出我的模型 — model 了,那該如何預測呢?

還記得前面我們有切出一份測試樣本,然後讓 A.I. 測驗嗎?其實這正正就是使用 model 進行預測的流程!

所以未來,只需要把每一天收盤後的最新資料,整理成測試樣本的樣子,叫做 future_X好了。然後再用model.predict(future_X) 就可了看到他回傳最新的預測了!

最終進度整理:

  • 標的:S&P 500 ETF — SPY(日資料)
  • 預測目標:預測一週後(五交易日後)收盤價相對今日收盤價是漲或跌
  • 資料數據:價量資料與 4 種技術指標
  • A.I. 模型:決策樹
  • 目標標記與資料預處理:完成
  • 訓練 / 測試樣本切割:70% 學習樣本 | 30% 測試樣本
  • 建立一個 A.I. 決策樹:完成,取名 model
  • 讓 A.I. 學習與測試:完成,採 depth = 7,結果放 prediction
  • 測驗結果分析:三階段檢驗完成
  • (New)模型後續應用:沒問題!
感謝各位看完這篇這麼長的教學文,辛苦了!也希望內容對你有幫助!如果覺得這篇文章不錯,記得按『拍手』以及『分享』出去~此系列文章未來會講更多「使用 A.I. 投資」的內容,也會陸續分享一些我做出來的成果與心得分享,如果有興趣的話,記得要『追蹤』喔!感謝各位!

--

--