手把手教你如何用Python和数据科学赚钱?

金融领域或许是数据科学应用场景中最充满想象力的部分,毕竟它跟财富结合地无比紧密。

不管是否是经济达人,数据科学都是一种帮你了解一支股票的高效方式。本文作者把数据科学和机器学习技术应用到金融领域中,向你展示如何通过数据分析的方式驰骋股市,搭建自己的金融模型!

让我们先了解一些基本定义。

定义和假设

什么是交易算法?

Quantopian定义:

交易算法是一种计算机程序,它定义了一套买卖资产的规则。大多数交易算法基于研究历史数据得出的数学或统计模型来做出决策。

我们使用什么平台?

我使用Anaconda, Jupyter Notebooks, 和 PyCharm实现Python建模,使用这些工具非常容易。但是,你也可以使用Quantopian平台内置内核工具,或者甚至可以根据需要将代码修改为R或者其他语言。

我使用Mac系统,并将全程分享所用的UNIX命令。Windows用户请自行搜索答案!

我们关注哪些资产?

Apple苹果(AAPL)是一支很好的股票,因为目前为止(2018年9月)它已经是世界上价值最高的公司,不仅拥有相对稳定的股票价格,而且拥有足够多与品牌相关的体量、新闻和人气。

需要提醒:此处涵盖的原则对于较小的公司股本,或不同的行业等的适用性有所不同。

环境搭建

要在本地电脑上获取Quantopian平台,请在终端执行以下命令:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

create conda py35 since that's the newest version that works

conda create -n py35 python=3.5

conda install -c quantopian/label/ci -c quantopian zipline

</pre>

为了确保Quandl正常运行,请根据账号创建说明和API文档加载金融数据。另外,请保存好你的API key,因为需要用到它来加载所有重要数据。

加载数据

让我们开始使用代码库:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

import pandas as pd
import numpy as np
import patsy

pd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data
import quandl
quandl.ApiConfig.api_key = "##############"

</pre>

现在让我们来拉取些Apple股票数据:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

df = quandl.get("WIKI/" + 'AAPL', start_date="2014-01-01")

</pre>

注意观察这些列,注意其中一个名为“分割比例”的列。这是一个非常重要的指标;它标志着股票拆分发生。在2014年,Apple决定采用7:1进行股票分割,我们可以使用Python 和pandas 来查询发生的日期:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

len(df)
df['Split Ratio'].value_counts()
df[df['Split Ratio'] == 7.0]

</pre>

我们从而找到了2014-06-09。让我们拉取这个日期后的股票价格信息:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

aapl_split = quandl.get("WIKI/" + 'AAPL', start_date="2014-06-10")
aapl_split.head()

</pre>

顺便说一句,我在GitHub上找到了所有财富500强的股票代码清单。如果你想将自己的分析扩展到股票集,可以像这样将它们加载到列表中:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

f500 = pd.read_csv('https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv')

tickers = f500.Symbol.tolist()

</pre>

关键统计数据

增广迪基-福勒检验(Augmented Dickey-Fuller test),简称ADF检验。

我们需要检验单位根是否存在,可以使用ADF测试完成检验。简而言之,单位根存在则预示存在驱动AAPL的潜在趋势,从而我们可以提取模式并用于预测。

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

run ADF to determine unit root

import statsmodels.tsa.stattools as ts
cadf = ts.adfuller(aapl_split.Close)

print('Augmented Dickey Fuller:')
print('Test Statistic =',cadf[0])
print('p-value =',cadf[1])
print('Critical Values =',cadf[4])

Augmented Dickey Fuller:
Test Statistic = -0.731194982176
p-value = 0.838503045276
Critical Values = {‘1%’: -3.4372231474483499, ‘5%’: -2.8645743628401763, ‘10%’: -2.5683856650361054}

</pre>

我们将上面的测试统计值与临界值进行比较;如果它低于我们选择的阈值,则拒绝存在单位根的零假设。正如你所见,p-value比较大,所以我们必须接受原假设(Ho):即AAPL存在单位根。这个结果很好,因为我们可以利用潜在的趋势和模式进行预测。

与其他股票的相关性

Apple被认为是一个巨头技术品牌。假如我们能够计算与其他股票的强相关性会怎么样?

请注意相关性并不意味着因果关系,并且可能存在着哪个股票是先行者的问题,但是模式和关系对于提高模型性能总是一件好事。

我建议你查看三支股票,以及AAPL如何与它们关联:

  • 微软Microsoft (MSFT)

  • 因特尔Intel (INTC)

  • 蒂芙尼Tiffany & Co. (TIF)

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

MSFT = quandl.get("WIKI/" + 'MSFT', start_date="2014-06-10")
INTC = quandl.get("WIKI/" + 'INTC', start_date="2014-06-10")
TIF = quandl.get("WIKI/" + 'TIF', start_date="2014-06-10")

</pre>

时间缘故,我们在这里只关注Intel数据;让我们绘制AAPL与INTC的收盘价:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

sns.jointplot(INTC.Close, aapl_split.Close, kind="reg");

</pre>

image

Intel vs. Apple

我们还可以看看相关值数据( correlation value ):

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

np.corrcoef(INTC.Close, aapl_split.Close)

</pre>

我们注意到r-value为0.7434;就预测来说不错,但我们需要记住一个重要的事实:如果我们知道INTC的收盘价,我们也可以看查AAPL的收盘价。所以让我们查看下INTC七天前的收盘价的相关性,来获得更可行的指标:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

seven day lead

np.corrcoef(INTC.Close[:-7], aapl_split.Close[7:])

</pre>

这次我们得到r-value为0.7332;还是很不错的!

谷歌趋势(Google Trends)

我们可以比较Twitter和其他社交网络人气数据如何影响股价。现在让我们看看Google Trends是否与AAPL相关。请确保为指定时间范围,或使用此链接(https://trends.google.com/trends/explore?date=2014-06-10%202018-04-02&q=%2Fm%2F0k8z)来进行准确搜索(注意我在四月多添加了几天来处理半周问题),然后将CSV加载到Python中:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

Google Trends

aapl_trends = pd.read_csv('/Users/jb/Desktop/multiTimeline.csv', header=1)

aapl_trends.tail()

</pre>

注意每周的数据格式,因此我们需要使用 pandas.resample() 转换我们的股票价格数据集:

API链接:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

aapl_split_week = aapl_split.resample('W', convention='end').last()

</pre>

现在让我们检查相关性并绘制给定周的Google搜索请求数据总和图表,以及该周最后一个工作日的收盘价格:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.5440000295639038px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 16px; overflow-x: auto;">

trend and price corr

np.corrcoef(aapl_trends['Apple: (Worldwide)'], aapl_split_week.Close)

</pre>

哎呀!我们得到了一个微不足道的0.0454,这个数据有些道理,我们可以想一下:AAPL相关的新闻/活动/闲谈并不是影响股票价格的积极因素。像人气这种对其有重要影响应该能提供更强的信号,但我们在下次再做讨论。

结语

我们只是浅显的讨论了下部分EDA( Exploratory Data Analysis)可以做的金融分析,但是在下一篇文章中,我们将过渡到建立预测模型并通过高级软件包来为我们实现繁重的工作。

我们希望这篇文章对你有帮助,并且很乐意在评论中听到你的意见:

运行代码是否遇到任何问题?有时候环境和版本会搞砸一切……

  • 你使用什么包和技术?

  • 那些可视化工具有助于了解股票价格的变动?

  • 你认为哪些因素会最大化模型预测效果?

最后,如果你恰好知道一种持续赚大钱的建模技术,请直接告诉我们 ! 如果你们喜欢这个系列,请持续关注大数据文摘的后续文章。

最后的最后,本文提供的信息和随附材料仅供参考。本文不应被当做法律或财务建议。你应咨询律师或其他专业人士来确定什么最适合你的个人需求。

祝大家赚钱开心!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容