我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

【AI科技大本營導讀】比來,A股市場尤其是上證指數走勢凌厲,讓營長有種身在牛市中的錯覺。然而大盤天天漲,營長賬戶中仍是那幾百萬,甚至還有所縮水。夜深人靜的時辰,營長經常會點著一支菸,考慮到底有沒有一個完滿的算法,可以預測股價的漲跌,如許就可以早日實現財務自由,走向人生頂峰。這時,一篇外國友人的文章成功引起了營長的注意,看完後備受啟發,所以我們將其編譯後,分享給大師,尤其是天天編碼的軌範員。

交情提示:股市有風險,投資需謹嚴。營長忘了說,幾十億津巴布韋比。

對數據科學家來說,預測證券市場走勢是一項很是有勾引力的工作,固然,他們如許做的目的很洪流平上並不是為了獲取物質報答,而是為了挑戰本身。證券市場起升沉伏、變幻莫測,試想一下,若是在這個市場裡存在一些我們或者我們的模子可以進修到的既定形式,讓我們可以打敗那些商科畢業的操盤手,將是何等美好。固然,當我一起頭使用加性模子(additive model)來做時辰序列預測時,我不得不先用模仿盤來驗證我的模子在股票市場上的默示。

一眾挑戰者們都希望在每日收益率上可以跑贏市場,可是大多數都失敗了,我也未能倖免。不外,在這個過程中也學到了大量Python相干知識,網羅面向工具編程、數據措置、建模、以及可視化等等。同時,我也認清了一個事理,不要在每日收益率上錙銖必較,學會容忍恰當的短期虧損,放長線才能釣大魚。

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

一天與三十年比力成效:你甘願把錢投在哪裡?

在任何使命中(不僅是數據科學),當我們沒有獲得立竿見影的成效時,我們都有三個選擇:

1. 調解成效,讓我們看起來像是成功了

2. 潛匿成效,所以沒有人會注意到

3. 公開我們所有的成效和編制,以便其別人(以及我們本身)可以從中吸收經歷和教訓

顯然,不管站在小我仍是社會層面,方案三都是最佳選擇,但它同時也是最必要勇氣去理論的。我可以選擇性地公佈成效,比如當我的模子可以帶來豐厚的利潤報答時,我也可以包庇失敗的現實,假裝本身從來沒有在這項工作上花過時辰。這似乎是很無邪的設法!我們之所以可以前進是由於不竭頻頻失敗——進修這個過程,而不僅僅是之前的成功。並且,為有難度的使命編寫Python代碼而付出的全力也並不該該空費!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

這篇文章記實了我使用Python開發的“stock explorer”工具——Stocker的預測功能。此前,我曾展現了若何使用Stocker停止分析,並且將完好的代碼貼在GitHub上,以便當大師。

Github代碼地點:

https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker

▌實現預測的Stocker工具

Stocker是一款用於試探股票情形的Python工具。一旦我們安裝了所需的庫(檢察文檔),我們可以在劇本的統一文件夾中啟動一個Jupyter Notebook,並導入Stocker類:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

如今可以訪謁這個類了。我們經由過程通報任一有效的股票代碼(粗體是輸出)來建樹一個Stocker類的工具:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

按照上面的輸出成效,我們有20年的亞馬遜每日股票數據可以用來試探! Stocker工具是建立在Quandl金融庫上,並且擁有3000多隻股票可以使用。我們可以使用plot_stock函數來繪製一個簡單的歷史股價圖:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

Stocker的分析功能可以用來創造數據中的團體趨向和形式,但我們將重點關注預測股票將來的價錢上。Stocker中的預測功能是使用一個加性模子來實現的,該模子將時辰序列視為季節性(如每日、每週和每月)的團體趨向組合。Stocker使用Facebook開發的智能軟件包停止加性建模,用一行代碼就可以建示範子並停止預測:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

注意,表示預測成效的綠線包含了相對應的置信區間,這代表在模子預測的不確定性。在這種情形下,若是將置信區間寬度設置為80%,這意味著我們估量這個規模將包含實際值的可能性為80%。置信區間將跟著時辰進一步擴大,這是由於跟著預測時辰間隔現稀有據的時辰越來越遠,預測值將面臨更多的不確定性。任何時辰我們做如許的預測,都必需包含一個置信區間。雖然大多數人傾向於一個確定的值,但我們的預測成效必需反響出我們餬口在一個佈滿不確定性的世界!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

任何人都可以做股票預測:簡單地選擇一個數字,而這就是你的估測(我可能是錯的,但我敢必定,這是華爾街所有人都市做的)。為了讓我們的模子具有可託度,我們必要評估它的切確性。Stocker工具中有良多用於評估模子切確度的編制。

▌評估預測成效

為了計較切確率,我們必要一個測試集和一個練習集。我們必要曉得測試集的謎底,也就是實際的股價,所以我們將使用曩昔一年的歷史數據(本例中為2017年)。練習時,我們不選用2014-2016的數據來作為練習集。把守進修的根基思惟是模子從練習集中進修到數據中的形式和關係,然後可以在測試數據上精確地重現成效。

我們必要量化我們的切確率,所以我們使用了測試集的預測成效和實際值,我們計較的目標網羅測試集和練習集的美元均勻誤差、精確預測價錢變化趨向的時辰百分比、以及實際價錢落在預測成效80%置信區間內的時辰百分比。所有這些計較都由Stocker主動完成,並且可視化了局很好:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

可以看到,預測成效真是蹩腳透了,還不如直接拋硬幣。若是我們按照這個預測成效來投資,那麼我們最好是買買彩票,如許鬥勁明智。可是,不要拋卻這個模子,第一個模子通常鬥勁蹩腳,由於我們使用的是默認參數(稱為超參數)。若是我們最後的考試考試不成功,那麼我們可以調解這些參數來獲得一個更好的模子。在Prophet模子中有良多不合的參數設置必要調解,最重要的是變點先驗標準(changepoint prior scale),它節制著模子在數據趨向上的偏移量。

我用Python分析股票價格走勢,學以致用獲取第一桶金!

▌變點先驗(Changepoint Prior)的選擇

變點代表時辰序列從添加到減少,或者從緩慢添加到越來越快(反之亦然)。它們呈如今時辰序列變化率最大的地方。變點先驗標準體如今模子中給以變點的偏移量。這是用來節制過度擬合與欠擬合的(也被稱為誤差與方差間的權衡)。

一個更高的先驗能創造一個更多變點權重和更具彈性的模子,但這可能會導致過擬合,由於該模子將嚴格服從練習數據的紀律,而不能將它泛化到新的測試數據中。降低先驗會減少模子的矯捷性,而這又可能會導致相反的問題:欠擬合,當我們的模子沒有完全服從練習數據,而沒有進修到底層形式時,這種情形就會產生。若何找出恰當的參數以到達精確的平衡,這更多的是一個工程問題而不是理論問題,在這裡,我們只能依靠經歷成效。Stocker類有兩種不合的編制來選擇恰當的先驗:可視化和量化。 我們可以從可視化編制起頭:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

在這裡,我們使用三年的數據停止練習,然後表示了六個月的預測成效。我們沒有量化這裡的預測成效,由於我們只是試圖去理解變點先驗值的浸染。這個圖表很好地說了然過擬合與欠擬合!代表最小先驗的藍線與代表練習數據的黑線值並不是非常接近,就彷彿它有本身的一套形式,並在數據的四周隨意選了一條道路。比力之下,代表最大先驗的黃線,則與練習察算作果很是切近。變點先驗的默認值是0.5,它落在兩個極值之間的某處。

我們還要注意先驗值不合帶來的不確定性(暗影區間)方面的差異。最小的先驗值在練習數據上默示有最大的不確定性,但在測試數據上的不確定性卻是最小。比力之下,最大的先驗值在練習數據上具有最小的不確定性,但在測試數據上卻有最大的不確定性。先驗值越高,對練習數據的擬合就越好,由於它緊跟每次的不雅觀不雅觀察值。可是,當使用測試數據時,過擬合模子就會由於沒有任何數據點來定位而迷失掉。由於股票具有相稱多的變化性,我們可能必要比默認模子更矯捷的模子,如許才能夠捕捉儘可能多的形式信息。

如今我們對先驗值帶來的影響有了一個概念,我們可以使用練習集和驗證集對數值停止評估:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

在這裡,我們必需注意到,我們的驗證集和測試集是不一樣的數據。若是它們是一樣的,那麼我們會獲得在測試數據上了局最好的模子,可是它只是在測試數據上過擬合了,而我們的模子也不能用於實際世界的數據。總的來說,就像在數據科學中通常所做的那樣,我們正在使用三組不合的數據:練習集(2013-2015)、驗證集(2016)和測試集(2017)。

我們用四個目標來評估四個先驗值:練習誤差、練習規模(置信區間)、測試誤差和測試規模(置信區間),所有的值都以美元為單位。正如我們在圖中看到的那樣,先驗值越高,練習誤差越低,練習數據的不確定性越低。我們也可以看到,更高的先驗能降低我們的測試錯誤。為了在測試集上獲得更高的切確率,作為交流,跟著先驗的添加,我們在測試數據上獲得了更大規模的不確定性。

Stocker先驗驗證還可以經由過程兩條線來闡述這些點:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

基於不合變點先驗標準下,練習和測試切確性曲線和不確定性曲線

既然最高的先驗值產生了最低的測試誤差率,我們應該考試考試再添加先驗值來看看是否能獲得更好的成效。我們可以經由過程在驗證中參加其它值的編制來優化我們的搜索:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

改進後的練習和測試曲線

領先驗值為0.5時,測試集的錯誤率將最小化。是以我們將重新設置Stocker工具的變點先驗值。

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我們可以調解模子的其他參數,比如我們期望看到的形式,或者模子使用的練習數據。找到最佳組合只必要頻頻上述過程,並使用一些不合的值。請隨意考試考試肆意的參數!

▌評估改進的模子

如今我們的模子已經優化好了,我們可以再次評估它:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

如今看起來良多若干好多了! 這表示了模子優化的重要性。使用默認值可以供給第一次合理揣測,可是我們必要確定,我們正在使用精確的模子“設置”,就像我們試圖經由過程調解平衡和淡入淡出來優化立體聲的聲音那樣(很抱愧引用了一個過時的例子)。

▌玩轉股票市場

股票預測是一個幽默的理論,但真正的樂趣在於不雅觀不雅觀察這些預測成效在實際市場中會闡揚多好的浸染。使用evaluate_prediction函數,我們可以在評估時代使用我們的模子“玩一玩”股票市場。我們將使用模子預測給出的計策,與我們在整個時代簡單地採辦和持有股票的計策停止一個比力。

我們的計策軌則很簡單,如下:

1、當模子預測股價會上漲的那一天,我們起頭買入,並在一天竣事時賣出。當模子預測股價下跌時,我們就不買入任何股票;

2、若是我們採辦股票的價錢在當天上漲,那麼我們就把股票上漲的幅度乘以我們採辦的股票的數目;

3、若是我們採辦的股票價錢下跌,我們就把下跌的幅度乘以股票的數目,計作我們的損失。

在整個評估時代,也就是2017年,我們天天以如許的編制停止股票把持。將股票的數目添加進模子回饋裡面,Stocker就會以數字和圖表表示的編制告訴我們這個計策是若何停止的:

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

上圖告訴了我們一個很是貴重的計策:買入並持有!雖然我們可以在計策上再作出相稱大的調解,但更好的選擇是長期投資。

我們可以考試考試其他的測試時辰段,看看有沒有什麼時辰我們的模子給出的計策能勝過買入和持有的編制。我們的計策是鬥勁保守的,由於當我們預測市場下跌的時辰我們不息止把持,所以當股票下跌的時辰,我們等待有比持有計策更好的編制。

我用Python分析股票價格走勢,學以致用獲取第一桶金!

不息用假造貨泉考試考試

我就曉得我們的模子可以做到這一點!不外,我們的模子只需在已經有了當天的數據時才能按捺市場,也就是說還只是事後諸葛亮。

▌對股票將來價錢的預測

如今我們有了一個像樣的模子,然後就可以使用predict_future()函數來對股票將來價錢的停止預測。

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

我用Python分析股票價格走勢,學以致用獲取第一桶金!

預測接下來10天和100天的股票價錢趨向

這個模子和大多數“專業人士”一樣,總體上看好Amazon這支股票。別的,我們按照預期做出的估量,不確定性會進一步添加。實際上,若是我們使用這個模子計策停止生意,那我們天天都可以練習一個新的模子,並且提早預測最多一天的價錢。

雖然我們可能沒有從Stocker工具中獲得豐厚的收益,可是重點在於開發過程而不是終極成效! 在我們考試考試之前,我們實際上不曉得本身是否能處理如許一個問題,就算終極失敗,也好過從不考試考試!任何有樂趣搜檢代碼或使用Stocker工具的人,都可以在GitHub上找到代碼。(https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker)

好了,今天的知識就分享到這裡,歡迎關注愛編程的南風,私信關鍵詞:學習資料,獲取更多學習資源,如果文章對你有有幫助,請收藏關注,在今後與你分享更多學習python的文章。同時歡迎在下面評論區留言如何學習python。


分享到:


相關文章: