機器學習:教你用numpy撰寫KNN算法 並預測價格走勢

KNN算法簡介

KNN 算法實際上是一句中國諺語智慧的體現:“物以類聚,人以羣分”,是一種聚類分析的方法,也是目前最簡單的無監督類學習方法。

我們在日常生活中有這樣的推論,身邊朋友都愛喝酒的人,可能是愛喝酒的人;身邊朋友都認爲身邊朋友都愛喝酒的人可能是愛喝酒的人的人,可能是認爲身邊朋友都愛喝酒的人可能是愛喝酒的人的人。

基於這樣的邏輯,如果現在我們有幾個點,分佈在二維平面上:

現在突然出現了一個這樣顏色不明的點(這明明就是黑的)

很自然的我們下意識的覺得這個點

是藍的!

好好好,別動手有話好商量,事實上正常人肯定覺得這個點顏色應該是紅色的。

這種聚類思想可以運用到很多分類問題中,比如股票價格未來走勢的預測(醒醒吧,也就這麼順口一說,要是準確率高我還會在這裏寫文章嗎?)

這種方法的嚴謹的數學表達是:首先確定距離的度量方法,事實上在數學上有很多種距離的度量方法,比如切比雪夫距離,歐氏距離,曼哈頓距離,這些距離實際上對應的是一個叫做範數的數學概念,鑑於這篇文章不是數學講堂,同時還指望着流量點擊養家餬口,就不一一敘述了。這裏我們給出對歐式距離(L2 範數)的計算方法

對於 x ∈ Rn,存在 x 的集合 X,x1、x2 ∈ X,定義

誒嘿,是不是突然發現很熟悉,然後讀者們可能就要開始罵了,故弄什麼玄虛,這不就是 n 維空間內點的直線距離嗎,沒有錯,L2 範數對應的就是點在空間內部的直線距離。根據分類的標的不同,我們使用不同的距離度量方法來適應樣本的獨特性質,不過一般情況下使用直線距離就足夠了,畢竟老夫也不是什麼惡魔,況且 L2 範數已經具有相當良好的數學性質,比如連續,可導…跑題了,咳……

既然剛剛已經明確了距離的概念,這樣當我們擁有一個非常完整的樣本的情況下,特徵完整標籤明確。當我們想對一個新來的點或者一些樣本進行分類的時候,我們可以逐一計算這個(些)新來的樣本和已知的樣本點之間的距離,然後取離這個點最近的 K 個已知樣本。統計一下這些已知樣本點對應標籤的數量,選取出現次數最多的標籤作爲新來樣本點的分類。

當然這個 K 參數是自行選擇的,有一個小技巧是,K 參數儘量避免成爲標籤集合數量的倍數,原因試一試就知道了。

KNN 算法的優點在於:

對病態數據不敏感(畢竟取了K個數據,有一兩個病態的數據基本不影響結果。有的親一定要槓一下,就要問了:要是全部樣本都病了怎麼辦呢?親,我們這邊建議毆打給你樣本數據的人)

分類精度比較高

對數據不需要預先的假設(比如強行規定他服從XX分佈……金融分析最喜歡做的事ORZ)

KNN算法的缺點在於:

①計算複雜度高,大樣本下計算時間長

②邊緣樣本分類精度明顯下降

KNN算法實戰

1.選取標的:中證 800

2.選取特徵:5 日MA,5 日價格波動率,日內成交額

3.分類目標:當日獲取數據後 3 日收益率,爲正標註爲 1,爲負標註爲-1,0 變動標註爲 0

4.特徵處理:對量綱不同的數據進行歸一化

5.算法實現:導入必要庫

獲取價格,計算三日收益率並標註數據

提取特徵值並歸一化

分離測試樣本與訓練樣本

定義計算L2範數方法

預測並評估性能

6.訓練結果:

最終全市場訓練準確率在各個參數下,均值收斂到53.6%,雖然一般但是已經好過隨機選擇很多了

值得一提的是……emmmm,有隻股票的預測準確率居然達到了100%......這顯然就是樣本數量取少了碰巧蒙上了,但是不要緊,至少這個方法會了就行了。


點擊【閱讀原文】,查看完整研究源碼~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章