用SVM看看技術指標有沒有用

作為一個炒過幾年美股,關注了知乎股票話題的吃瓜群眾,時間線上總是會出現各種各樣關於技術指標的討論。總是能看到有人說技術指標是騙人的,股市無法預測,所以技術指標並沒有什麼亂用。也總能看到有人反駁說,你說技術指標沒用,那是因為你不會用,我用就可以穩穩賺錢。

作為一個操作股票全靠瞎蒙的小白,我經常看這些爭論看的不知所措,不知道哪一方說的才是真理,還好學過一點統計學,一點機器學習,所以就決定跑個模型看看技術指標到底有沒有用。

首先要確定的是,有哪些技術指標。去Investopedia上找了一下,真是把我嚇了一跳。

Active Trading - Technical Indicators | Investopedia

上面的鏈接里,列了一整頁的技術指標,不得不感嘆人類為了賺錢真是喪心病狂。

不過,不管怎麼說,所謂的技術指標總是離不開對過往價格和交易量做的各種加減乘除。這裡,我就採用幾種比較常見的技術指標:

1. 動量(Momentum):其實就是一段時間的收益;

2. 成交量(Volume)

3. 均線(Moving average):就是某一段時間內價格的平均值。

4. 波動率(Volatility):就是莫一段時間內價格的標準差。

參數上,全部使用了最常見的5日,10日,20日,50日和200日 。

在數據方面,使用了標普500所有股票2015年到2016年的數據,數據源是雅虎。使用pandas-datareader包可以方便地得到數據,代碼如下:

不同股票之間的價格和成交量差別巨大,為了統一,這裡對所有指標做了標準化(Normalize)。例如,這裡所謂的均線其實是當年收盤價與均線的比值。

剔除NaN後一共得到了大約12萬組數據,從所有數據中,沒10個數據採樣一次,得到了一個12000個左右的樣本用來做分析

由於不清楚這些指標對多長時間的收益能更有效的預測,這裡我計算了未來10天,20天和50天的收益,分別做模型。下圖是收益的分布。

很明顯,在我們的樣本里,不管多長時間,收益的平均值和中位數都在0左右,可以說正收益和負收益基本各佔一半。為方便起見,這裡只針對正負收益做一個分類器(classifier)。

這裡我用的是sklearn包里的SVC,使用的是rbf kernel。好吧,我還用了sigmoid kernel和linear kernel,sigmoid kernel效果不如rbf kernel,而linear kernel在運行了很長時間以後還是無法收斂,這裡我就不貼結果了,代碼如下:

分別對10日,20日和50日收益做預測,得到了下面的結果:

得出來的結果還是比較不錯的,在設定了適當的C值後,我們可以看到,不管看多還是看空,SVC都能夠達到60%左右的成功率。對50日收益的預測結果比較好,可以做到超過60%,至少比拋硬幣強多了~考慮到這只是一個簡單的模型,這樣的結果應該還是挺讓人滿意的。

當然,這模型除了做了一次cross validation外,並沒有做更多的防止過擬合的工作,也不能保證這裡得出的結論能夠保持穩定,所以大家看看就好,別太當真了。

仔細想一想,如果要進一步完善這個模型,可以考慮下面幾個方向:

1. 加入更多的特徵(feature),儘管這個模型中的特徵已經可以表示相當多的指標,還是有一些指標沒有辦法表示的比如RSI,可以在後續的模型中加入這些指標。

2.使用不同的模型,即使是分類器,也還有logistic regression, decision tree可以用。也可以用regression直接預測未來收益,那樣將有更多的優化的機會。

3. 對結果做更多處理。例如在使用logistic regression是,我們其實是將結果假設位伯努利分布(Bernoulli distribution),預測p,當p>0.5時看漲,反之看跌。我們完全可以改變這個標準(例如改為p>0.6看漲,p<0.4看跌)來提高預測的正確率。當然這會要求我們使用更多的手段防止過擬合。

嗯,說了這麼多改進方向,等我下次想起來再說吧。。。

PS,不知道為什麼,在用seaborn和matplotlib畫圖時,在標題和坐標軸上輸入中文時,顯示出來會亂碼。用jupyter notebook將文件導出位pdf時也會報錯,應該是因為notebook里有用中文的關係,有沒有大神教教我應該怎麼設置。。。。


推薦閱讀:

TAG:股票 | Python | 机器学习 |