教程| 如何用Python和機器學習炒股賺錢?

2021-01-08 機器之心Pro

作者:Gatan Rickter

機器之心編譯參與:熊貓

相信很多人都想過讓人工智慧來幫你賺錢,但到底該如何做呢?瑞士日內瓦的一位金融數據顧問 Gatan Rickter 近日發表文章介紹了他利用 Python 和機器學習來幫助炒股的經驗,其最終成果的收益率跑贏了長期處於牛市的標準普爾 500 指數。雖然這篇文章並沒有將他的方法完全徹底公開,但已公開的內容或許能給我們帶來如何用人工智慧炒股的啟迪。機器之心對本文進行了編譯介紹,代碼詳情請訪問原文。

我終於跑贏了標準普爾 500 指數 10 個百分點!聽起來可能不是很多,但是當我們處理的是大量流動性很高的資本時,對衝基金的利潤就相當可觀。更激進的做法還能得到更高的回報。

這一切都始於我閱讀了 Gur Huberman 的一篇題為《Contagious Speculation and a Cure for Cancer: A Non-Event that Made Stock Prices Soar》的論文。該研究描述了一件發生在 1998 年的涉及到一家上市公司 EntreMed(當時股票代碼是 ENMD)的事件:

「星期天《紐約時報》上發表的一篇關於癌症治療新藥開發潛力的文章導致 EntreMed 的股價從周五收盤時的 12.063 飆升至 85,在周一收盤時接近 52。在接下來的三周,它的收盤價都在 30 以上。這股投資熱情也讓其它生物科技股得到了溢價。但是,這個癌症研究方面的可能突破在至少五個月前就已經被 Nature 期刊和各種流行的報紙報導過了,其中甚至包括《泰晤士報》!因此,僅僅是熱情的公眾關注就能引發股價的持續上漲,即便實際上並沒有出現真正的新信息。」

在研究者給出的許多有見地的觀察中,其中有一個總結很突出:

「(股價)運動可能會集中於有一些共同之處的股票上,但這些共同之處不一定要是經濟基礎。」

我就想,能不能基於通常所用的指標之外的其它指標來劃分股票。我開始在資料庫裡面挖掘,幾周之後我發現了一個,其包含了一個分數,描述了股票和元素周期表中的元素之間的「已知和隱藏關係」的強度。

我有計算基因組學的背景,這讓我想起了基因和它們的細胞信號網絡之間的關係是如何地不為人所知。但是,當我們分析數據時,我們又會開始看到我們之前可能無法預測的新關係和相關性。

選擇出的涉及細胞可塑性、生長和分化的信號通路的基因的表達模式

和基因一樣,股票也會受到一個巨型網絡的影響,其中各個因素之間都有或強或弱的隱藏關係。其中一些影響和關係是可以預測的。

我的一個目標是創建長的和短的股票聚類,我稱之為「籃子聚類(basket clusters)」,我可以將其用於對衝或單純地從中獲利。這需要使用一個無監督機器學習方法來創建股票的聚類,從而使這些聚類之間有或強或弱的關係。這些聚類將會翻倍作為我的公司可以交易的股票的「籃子(basket)」。

首先我下載了一個數據集:http://54.174.116.134/recommend/datasets/supercolumns-elements-08.html,這個數據集基於元素周期表中的元素和上市公司之間的關係。

然後我使用了 Python 和一些常用的機器學習工具——scikit-learn、numpy、pandas、matplotlib 和 seaborn,我開始了解我正在處理的數據集的分布形狀。為此我參考了一個題為《Principal Component Analysis with KMeans visuals》的 Kaggle Kernel:https://www.kaggle.com/arthurtok/principal-component-analysis-with-kmeans-visuals

import numpy as np

import pandas as pd

from sklearn.decomposition

import PCA

from sklearn.cluster

import KMeans

import matplotlib.pyplot as plt

import seaborn as sb np.seterr(divide='ignore', invalid='ignore')

# Quick way to test just a few column features

# stocks = pd.read_csv('supercolumns-elements-nasdaq-nyse-otcbb-general-UPDATE-2017-03-01.csv', usecols=range(1,16))

stocks = pd.read_csv('supercolumns-elements-nasdaq-nyse-otcbb-general-UPDATE-2017-03-01.csv') print(stocks.head()) str_list = []

for colname, colvalue in stocks.iteritems():

if type(colvalue[1]) == str: str_list.append(colname)

# Get to the numeric columns by inversion

num_list = stocks.columns.difference(str_list) stocks_num = stocks[num_list] print(stocks_num.head())

輸出:簡單看看前面 5 行:

概念特徵的皮爾遜相關性(Pearson Correlation)。在這裡案例中,是指來自元素周期表的礦物和元素:

stocks_num = stocks_num.fillna(value=0, axis=1) X = stocks_num.values

from sklearn.preprocessing import StandardScaler X_std = StandardScaler().fit_transform(X) f, ax = plt.subplots(figsize=(12, 10)) plt.title('Pearson Correlation of Concept Features (Elements & Minerals)')

# Draw the heatmap using seaborn

sb.heatmap(stocks_num.astype(float).corr(),linewidths=0.25,vmax=1.0, square=True, cmap="YlGnBu", linecolor='black', annot=True) sb.plt.show()

輸出:(這個可視化例子是在前 16 個樣本上運行得到的)。看到元素周期表中的元素和上市公司關聯起來真的很有意思。在某種程度時,我想使用這些數據基於公司與相關元素或材料的相關性來預測其可能做出的突破。

測量「已解釋方差(Explained Variance)」和主成分分析(PCA)

已解釋方差=總方差-殘差方差(explained variance = total variance - residual variance)。應該值得關注的 PCA 投射組件的數量可以通過已解釋方差度量(Explained Variance Measure)來引導。Sebastian Raschka 的關於 PCA 的文章對此進行了很好的描述,參閱:http://sebastianraschka.com/Articles/2015_pca_in_3_steps.html

# Calculating Eigenvectors and eigenvalues of Cov matirx

mean_vec = np.mean(X_std, axis=0) cov_mat = np.cov(X_std.T) eig_vals, eig_vecs = np.linalg.eig(cov_mat)

# Create a list of (eigenvalue, eigenvector) tuples

eig_pairs = [ (np.abs(eig_vals[i]),eig_vecs[:,i]) for i in range(len(eig_vals))]

# Sort from high to low

eig_pairs.sort(key = lambda x: x[0], reverse= True)

# Calculation of Explained Variance from the eigenvaluestot = sum(eig_vals) var_exp = [(i/tot)*100 for i in sorted(eig_vals, reverse=True)] cum_var_exp = np.cumsum(var_exp)

# Cumulative explained variance# Variances plot

max_cols = len(stocks.columns) - 1plt.figure(figsize=(10, 5)) plt.bar(range(max_cols), var_exp, alpha=0.3333, align='center', label='individual explained variance', color = 'g') plt.step(range(max_cols), cum_var_exp, where='mid',label='cumulative explained variance') plt.ylabel('Explained variance ratio') plt.xlabel('Principal components') plt.legend(loc='best') plt.show()

輸出:

從這個圖表中我們可以看到大量方差都來自於預測主成分的前 85%。這是個很高的數字,所以讓我們從低端的開始,先只建模少數幾個主成分。更多有關分析主成分合理數量的信息可參閱:http://setosa.io/ev/principal-component-analysis

使用 scikit-learn 的 PCA 模塊,讓我們設 n_components = 9。代碼的第二行調用了 fit_transform 方法,其可以使用標準化的電影數據 X_std 來擬合 PCA 模型並在該數據集上應用降維(dimensionality reduction)。

pca = PCA(n_components=9) x_9d = pca.fit_transform(X_std) plt.figure(figsize = (9,7)) plt.scatter(x_9d[:,0],x_9d[:,1], c='goldenrod',alpha=0.5) plt.ylim(-10,30) plt.show()

輸出:

這裡我們甚至沒有真正觀察到聚類的些微輪廓,所以我們很可能應該繼續調節 n_component 的值直到我們得到我們想要的結果。這就是數據科學與藝術(data science and art)中的「藝術」部分。

現在,我們來試試 K-均值,看看我們能不能在下一章節可視化任何明顯的聚類。

K-均值聚類(K-Means Clustering)

我們將使用 PCA 投射數據來實現一個簡單的 K-均值。

使用 scikit-learn 的 KMeans() 調用和 fit_predict 方法,我們可以計算聚類中心並為第一和第三個 PCA 投射預測聚類索引(以便了解我們是否可以觀察到任何合適的聚類)。然後我們可以定義我們自己的配色方案並繪製散點圖,代碼如下所示:

# Set a 3 KMeans clustering

kmeans = KMeans(n_clusters=3)

# Compute cluster centers and predict cluster indices

X_clustered = kmeans.fit_predict(x_9d)# Define our own color map

LABEL_COLOR_MAP = {0 : 'r',1 : 'g',2 : 'b'} label_color = [LABEL_COLOR_MAP[l] for l in X_clustered]

# Plot the scatter digram

plt.figure(figsize = (7,7)) plt.scatter(x_9d[:,0],x_9d[:,2], c= label_color, alpha=0.5) plt.show()

輸出:

這個 K-均值散點圖看起來更有希望,好像我們簡單的聚類模型假設就是正確的一樣。我們可以通過這種顏色可視化方案觀察到 3 個可區分開的聚類。

當然,聚類和可視化數據集的方法還有很多,參考:https://goo.gl/kGy3ra

使用 seaborn 方便的 pairplot 函數,我可以以成對的方式在數據框中自動繪製所有的特徵。我們可以一個對一個地 pairplot 前面 3 個投射並可視化:

# Create a temp dataframe from our PCA projection data "x_9d"

df = pd.DataFrame(x_9d) df = df[[0,1,2]] df['X_cluster'] = X_clustered

# Call Seaborn's pairplot to visualize our KMeans clustering on the PCA projected data

sb.pairplot(df, hue='X_cluster', palette='Dark2', diag_kind='kde', size=1.85) sb.plt.show()

輸出:

構建籃子聚類(Basket Clusters)

你應該自己決定如何微調你的聚類。這方面沒有什麼萬靈藥,具體的方法取決於你操作的環境。在這個案例中是由隱藏關系所定義的股票和金融市場。

一旦你的聚類使你滿意了,你就可以設置分數閾值來控制特定的股票是否有資格進入一個聚類,然後你可以為一個給定的聚類提取股票,將它們作為籃子進行交易或使用這些籃子作為信號。你可以使用這種方法做的事情很大程度就看你自己的創造力以及你在使用深度學習變體來進行優化的水平,從而基於聚類或數據點的概念優化每個聚類的回報,比如 short interest 或 short float(公開市場中的可用股份)。

你可以注意到了這些聚類被用作籃子交易的方式一些有趣特徵。有時候標準普爾和一般市場會存在差異。這可以提供本質上基於「信息套利(information arbitrage)」的套利機會。一些聚類則和谷歌搜索趨勢相關。

看到聚類和材料及它們的供應鏈相關確實很有意思,正如這篇文章說的一樣:https://www.fairphone.com/en/2017/05/04/zooming-in-10-materials-and-their-supply-chains/

我僅僅使用該數據集操作了 Cobalt(鈷)、Copper(銅)、Gallium(鎵)和 Graphene(石墨烯)這幾個列標籤,只是為了看我是否可能發現從事這一領域或受到這一領域的風險的上市公司之間是否有任何隱藏的聯繫。這些籃子和標準普爾的回報進行了比較。

通過使用歷史價格數據(可直接在 Quantopian、Numerai、Quandl 或 Yahoo Finance 使用),然後你可以匯總價格數據來生成預計收益,其可使用 HighCharts 進行可視化:

我從該聚類中獲得的回報超過了標準普爾相當一部分,這意味著你每年的收益可以比標準普爾還多 10%(標準普爾近一年來的漲幅為 16%)。我還見過更加激進的方法可以淨掙超過 70%。現在我必須承認我還做了一些其它的事情,但因為我工作的本質,我必須將那些事情保持黑箱。但從我目前觀察到的情況來看,至少圍繞這種方法探索和包裝新的量化模型可以證明是非常值得的,而其唯一的缺點是它是一種不同類型的信號,你可以將其輸入其它系統的流程中。

生成賣空籃子聚類(short basket clusters)可能比生成買空籃子聚類(long basket clusters)更有利可圖。這種方法值得再寫一篇文章,最好是在下一個黑天鵝事件之前。

如果你使用機器學習,就可能在具有已知和隱藏關係的上市公司的寄生、共生和共情關係之上搶佔先機,這是很有趣而且可以盈利的。最後,一個人的盈利能力似乎完全關乎他在生成這些類別的數據時想出特徵標籤(即概念(concept))的強大組合的能力。

我在這類模型上的下一次迭代應該會包含一個用於自動生成特徵組合或獨特列表的單獨算法。也許會基於近乎實時的事件,這可能會影響那些具有隻有配備了無監督學習算法的人類才能預測的隱藏關係的股票組。

原文連結:https://hackernoon.com/unsupervised-machine-learning-for-fun-profit-with-basket-clusters-17a1161e7aa1

相關焦點

  • ...請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    在今年秋季開始準備博士項目的時候,我已經精選了一些有關機器學習和NLP的優質網絡資源。一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。
  • 乾貨 | 請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    在今年秋季開始準備博士項目的時候,我已經精選了一些有關機器學習和NLP的優質網絡資源。一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。
  • 乾貨| 請收下這份2018學習清單:150個最好的機器學習,NLP和Python...
    在今年秋季開始準備博士項目的時候,我已經精選了一些有關機器學習和NLP的優質網絡資源。一般我會找一個有意思的教程或者視頻,再由此找到三四個,甚至更多的教程或者視頻。猛回頭,發現標收藏夾又多了20個資源待我學習(推薦提升效率工具Tab Bundler)。
  • 收藏 | 機器學習、NLP、Python和Math最好的150餘個教程
    最近,我一直在網上尋找關於機器學習和NLP各方面的好資源,為了幫助到和我有相同需求的人,我整理了一份迄今為止我發現的最好的教程內容列表。通過教程中的簡介內容講述一個概念。避免了包括書籍章節涵蓋範圍廣,以及研究論文在教學理念上做的不好的特點。我把這篇文章分成四個部分:機器學習、NLP、Python和數學。
  • 200個精選ML、NLP、Python及數學最佳教程(附連結)
    [ 導讀 ]近年來,機器學習等新最新技術層出不窮,如何跟蹤最新的熱點以及最新資源,作者Robbie Allen列出了一系列相關資源教程列表,包含四個主題:機器學習,自然語言處理,Python和數學,建議大家收藏學習!
  • 中科大統計學python_python 中科大 - CSDN
    python 模塊教程。正則化、Batch歸一化、梯度檢驗;能夠實現並應用各種優化算法,例如mini-batch、Momentum、RMSprop和Adam,並檢查它們的收斂程度;理解深度學習時代關於如何構建訓練/開發/測試集以及偏差/方差分析最新最有效的方法;能夠用TensorFlow實現一個神經網絡。
  • 如何自學成 Python 大神?這裡有些建議
    如果你真的想要高效地學習 Python,那就需要掌握如何過濾網上的垃圾教程資源的技能,並從其他有經驗的程式設計師或在線編程社區中獲得幫助。倘若你沒有任何編程知識,或者知之甚少,從一張白紙起步,或許會更容易一些。
  • 這個開源項目太神了,找工作,炒股和賺錢就靠它了
    從金融角度上,它涵蓋了全面的股票數據,做數據分析和排行,並給出購買參考建議。雖然市面上專業的App也有這些數據和功能,但這可是你自己用代碼運行的項目。你可以在此基礎上,實踐你的想法,修改代碼,做你的分析,建立自己的優勢。如果只是會用App和街上的大媽有什麼區別?那個金融從業者不會自己做數據分析?
  • 微軟再推免費在線 Python 教程,面向數據科學和機器學習初學者
    去年九月,微軟曾面向 Python 初學者,推出了一套免費的教程視頻。從基本介紹和 VS Code 的配置講起,循序漸進語法概念等基礎內容講解。目前為止,該系列視頻播放量已達到將近 180 萬次。近日,微軟在此基礎上,再度更新兩個針對 Python 初學者的系列教程,作為對之前教程的補充,或者說是進階。因此,這兩個新的系列面向的不完全是純粹的 Python 新手,而是對 Python 稍有了解,並可能有其他語言的編碼經驗的人。
  • Python機器學習7:如何保存、加載訓練好的機器學習模型
    本文將介紹如何使用scikit-learn機器學習庫保存Python機器學習模型、加載已經訓練好的模型。學會了這個,你才能夠用已有的模型做預測,而不需要每次都重新訓練模型。本文將使用兩種方法來實現模型的保存和加載:Pickle和joblib。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • python機器學習:常用庫的介紹及安裝
    現在,隨著人工智慧的興起,機器學習越來越被各行業看重,從而使得人工智慧的需求會越來越大。今天,我們就從零基礎開始學習人工智慧的基礎篇——機器學習。工欲善其事必先利其器,所以,我們首先來看一下,我們要學習這些東西,需要準備些什麼!首先電腦一臺,這是必備的。下面我們來看一下需要安裝些什麼軟體到電腦上!
  • 大數據分析Python NumPy庫使用教程
    大數據分析Python NumPy庫使用教程為數據工程師提供有關NumPy的從零開始的培訓。這意味著您不需要具有NumPy的任何經驗,也不會浪費任何時間學習與數據工程工作無關的東西。 在瀏覽了基礎知識之後,您將快速開始使用NumPy來構建和操作二維和三維數組。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?
  • 為什麼炒股「過滿則虧」,不滿倉才能賺錢?
    將這個詞用在炒股的倉位安排上,道理也是一樣的,倉位太滿了反倒是容易侵蝕利潤和本金。當然,關於是否滿倉的探討並沒有一個定論,但是主流的觀點還是認為炒股不滿倉才能賺錢,是何道理看一看,你可能就能體悟了。技術操作上需要空間炒股的人都應該知道「補倉」和「加倉」這兩個基本操作,下跌過程中的補倉能夠通過平攤成本拉低持股的價格,上漲過程中加倉能夠通過擴大倉位來擴大利潤。然而,在滿倉的情況下,這兩個基本操作是無法進行的。
  • 基礎| 機器學習入門必備:如何用Python從頭實現感知器算法
    在本教程中,你將了解到如何利用 Python 從頭開始實現感知器算法。在完成本教程後,你將學會:如何訓練感知器的網絡權重如何利用感知器做出預測如何對於現實世界的分類問題實現感知器算法讓我們開始吧。概述本節簡要介紹了感知器算法和 Sonar 數據集,我們將會在後面應用。
  • 推薦| 關於Python的20個關鍵詞和45個最佳案例
    這是一份具有十分競爭力的榜單。根據機器學習所實踐的內容質量和各種人為因素(包括共享量和閱讀量)進行排名。這份表單旨在讓人們生活更便捷,整理了最有用的20個關鍵話題,其中包括經驗豐富的程式設計師分享有關Python的課程。
  • Python零基礎入門教程,如何使用lambda、filter和map函數?
    大綱函數類型定義及特性lambda函數定義及使用filter函數定義及使用map函數定義及使用引入函數類型概念函數類型定義:python中任意一個函數都有數據類型,這種數據類型是function(函數類型)
  • 如何入門Python與機器學習
    具體而言,本章主要涉及的知識點有:  機器學習的定義及重要性;  Python在機器學習領域的優異性;  如何在電腦上配置Python機器學習的環境;  機器學習一般性的步驟。  機器學習緒論  正如前言所說,由於近期的各種最新成果,使得「機器學習」成為了非常熱門的詞彙。
  • 小白學數據小抄放送 Python,R,大數據,機器學習
    在Python中做探索性數據分析 在Python中進行探索性數據分析的最佳包是NumPy, Pandas和Matplotlib。通過它們,你將學會如何在python中加載文件,轉換變量,分類數據,繪圖,創建樣本數據集,處理缺損數據等等。這張表總結了三個庫中常用的語句,這是用於探索性數據分析的最簡單的小抄本之一。