教程|怎样用Python和呆板学习炒股赢利?
作者:Gatan Rickter呆板之心编译到场:熊猫
信赖许多人都想过让人工智能来帮你赢利,但到底该怎样做呢?瑞士日内瓦的一位金融数据顾问Gatan Rickter 克日发表文章先容了他使用 Python和呆板学习来资助炒股的履历,其终极结果的收益率跑赢了恒久处于牛市的尺度普尔 500指数。固然这篇文章并没有将他的方法完全彻底公然,但已公然的内容大概能给我们带来怎样用人工智能炒股的启示。呆板之心对本文举行了编译先容,代码详情请访问原文。
我终于跑赢了尺度普尔 500 指数 10 个百分点!听起来大概不是许多,但是当我们处置惩罚的是大量活动性很高的资源时,对冲基金的利润就相称可观。更激进的做法还能得到更高的回报。
这统统都始于我阅读了Gur Huberman 的一篇题为《Contagious Speculation and a Cure for Cancer: ANon-Event that Made Stock Prices Soar》的论文。该研究形貌了一件发生在 1998 年的涉及到一家上市公司EntreMed(其时股票代码是 ENMD)的变乱:
「星期天《纽约时报》上发表的一篇关于癌症治疗新药开辟潜力的文章导致EntreMed 的股价从周五收盘时的 12.063 飙升至 85,在周一收盘时靠近 52。在接下来的三周,它的收盘价都在 30以上。这股投资热情也让别的生物科技股得到了溢价。但是,这个癌症研究方面的大概突破在至少五个月前就已经被 Nature期刊和各种盛行的报纸报道过了,此中乃至包罗《泰晤士报》!因此,仅仅是热情的公众关注就能引发股价的连续上涨,即便现实上并没有出现真正的新信息。」
在研究者给出的很多有看法的观察中,此中有一个总结很突出:
「(股价)活动大概会合中于有一些共同之处的股票上,但这些共同之处不肯定要是经济底子。」
我就想,能不能基于通常所用的指标之外的别的指标来分别股票。我开始在数据库内里发掘,几周之后我发现了一个,其包罗了一个分数,形貌了股票和元素周期表中的元素之间的「已知和隐蔽关系」的强度。
我有盘算基因组学的配景,这让我想起了基因和它们的细胞信号网络之间的关系是怎样地不为人所知。但是,当我们分析数据时,我们又会开始看到我们之前大概无法猜测的新关系和相干性。
http://f11.baidu.com/it/u=1122254515,875499501&fm=173&s=27A5BF0E630772FA4446177D0300A079&w=600&h=523&img.JPEG&access=215967316
选择出的涉及细胞可塑性、生长和分化的信号通路的基因的表达模式
和基因一样,股票也会受到一个巨型网络的影响,此中各个因素之间都有或强或弱的隐蔽关系。此中一些影响和关系是可以猜测的。
我的一个目的是创建长的和短的股票聚类,我称之为「篮子聚类(basket clusters)」,我可以将其用于对冲或单纯地从中赢利。这必要利用一个无监视呆板学习方法来创建股票的聚类,从而使这些聚类之间有或强或弱的关系。这些聚类将会翻倍作为我的公司可以生意业务的股票的「篮子(basket)」。
起首我下载了一个数据集:http://54.174.116.134/recommend/datasets/supercolumns-elements-08.html,这个数据集基于元素周期表中的元素和上市公司之间的关系。
然后我利用了Python 和一些常用的呆板学习工具——scikit-learn、numpy、pandas、matplotlib 和seaborn,我开始相识我正在处置惩罚的数据集的分布外形。为此我参考了一个题为《Principal Component Analysis withKMeans visuals》的 KaggleKernel:http://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 sbnp.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) == str: str_list.append(colname)
# Get to the numeric columns by inversion
num_list = stocks.columns.difference(str_list)stocks_num = stocksprint(stocks_num.head())
输出:简朴看看前面 5 行:
http://f12.baidu.com/it/u=3574066001,847338607&fm=173&s=80926C33494FC0CC4ADD44CB000080B2&w=640&h=733&img.JPEG&access=215967316
概念特性的皮尔逊相干性(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 个样本上运行得到的)。看到元素周期表中的元素和上市公司关联起来真的很故意思。在某种水平时,我想利用这些数据基于公司与相干元素或质料的相干性来猜测其大概做出的突破。
http://f12.baidu.com/it/u=272055113,1908283763&fm=173&s=0EF16096E08778EB1ADC4657030040F7&w=640&h=629&img.JPEG&access=215967316
丈量「已表明方差(Explained Variance)」和主身分分析(PCA)
已表明方差=总方差-残差方差(explainedvariance = 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),eig_vecs[:,i]) for i in range(len(eig_vals))]
# Sort from high to low
eig_pairs.sort(key = lambda x: x, 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()
输出:
http://f10.baidu.com/it/u=1515369714,461774593&fm=173&s=88295D301F0261665E7110DA0300C0B1&w=640&h=320&img.PNG&access=215967316
从这个图表中我们可以看到大量方差都来自于猜测主身分的前 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()
输出:
http://f11.baidu.com/it/u=3579337111,2451368218&fm=173&s=00166F320B025764107DADDA0000D0B3&w=640&h=498&img.JPEG&access=215967316
这里我们乃至没有真正观察到聚类的些微表面,以是我们很大概应该继承调治 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 = 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()
输出:
http://f11.baidu.com/it/u=2845812805,1554055951&fm=173&s=0B63CC12190A54475A51A8D2000040B3&w=640&h=600&img.JPEG&access=215967316
这个 K-均值散点图看起来更有盼望,似乎我们简朴的聚类模子假设就是精确的一样。我们可以通过这种颜色可视化方案观察到 3 个可区分开的聚类。
固然,聚类和可视化数据集的方法另有许多,参考:http://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[] 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()
输出:
http://f10.baidu.com/it/u=463222317,2475013803&fm=173&s=00535D324D466D4F5C6460DE0100A0B3&w=640&h=579&img.JPEG&access=215967316
构建篮子聚类(Basket Clusters)
你应该本身决定怎样微调你的聚类。这方面没有什么万仙丹,详细的方法取决于你操纵的情况。在这个案例中是由隐蔽关系所界说的股票和金融市场。
一旦你的聚类使你满足了,你就可以设置分数阈值来控制特定的股票是否有资格进进一个聚类,然后你可以为一个给定的聚类提取股票,将它们作为篮子举行生意业务或利用这些篮子作为信号。你可以利用这种方法做的事变很大水平就看你本身的创造力以及你在利用深度学习变体来举行优化的程度,从而基于聚类或数据点的概念优化每个聚类的回报,好比short interest 或 short float(公然市场中的可用股份)。
你可以留意到了这些聚类被用作篮子生意业务的方式一些风趣特性。有时间尺度普尔和一样平常市场会存在差别。这可以提供本质上基于「信息套利(information arbitrage)」的套利时机。一些聚类则和谷歌搜刮趋势相干。
http://f12.baidu.com/it/u=475058555,3458095901&fm=173&s=A6F4EC3217385C2252F46DDE000050B0&w=640&h=255&img.JPEG&access=215967316
看到聚类和质料及它们的供给链相干确实很故意思,正如这篇文章说的一样:http://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 举行可视化:
http://f10.baidu.com/it/u=303567528,625050452&fm=173&s=2750C1331738442056DDB5CE0200C0B1&w=640&h=262&img.JPEG&access=215967316
我从该聚类中得到的回报凌驾了尺度普尔相称一部门,这意味着你每年的收益可以比尺度普尔还多10%(尺度普尔近一年来的涨幅为 16%)。我还见过更加激进的方法可以净挣凌驾70%。如今我必须认可我还做了一些别的的事变,但由于我工作的本质,我必须将那些事变保持黑箱。但从我现在观察到的环境来看,至少围绕这种方法探索和包装新的量化模子可以证实黑白常值得的,而其唯一的缺点是它是一种差别范例的信号,你可以将其输进别的体系的流程中。
天生卖空篮子聚类(short basket clusters)大概比天生买空篮子聚类(long basket clusters)更有利可图。这种方法值得再写一篇文章,最好是在下一个黑天鹅变乱之前。
http://f10.baidu.com/it/u=3353626560,2713261126&fm=173&s=3A1201C7081313DC04953DBF0300F001&w=352&h=272&img.JPEG&access=215967316
假如你利用呆板学习,就大概在具有已知和隐蔽关系的上市公司的寄生、共生和共情关系之上抢占先机,这是很风趣而且可以红利的。末了,一个人的红利本领好像完全关乎他在天生这些种别的数据时想出特性标签(即概念(concept))的强盛组合的本领。
我在这类模子上的下一次迭代应该会包罗一个用于主动天生特性组合或独特列表的单独算法。大概会基于近乎及时的变乱,这大概会影响那些具有只有配备了无监视学习算法的人类才气猜测的隐蔽关系的股票组。
原文链接:http://hackernoon.com/unsupervised-machine-learning-for-fun-profit-with-basket-clusters-17a1161e7aa1
http://www.fyguaji.com
页:
[1]