Python中文社区(ID:python-china)本文将展示如何使用Python的第三方库Stocker进行股票分析和预测。安装第三方库安装所需的库后,我们需要做的第一件事是将Stocker类导入我们的Python代码中。我们可以使用在脚本目录中启动的JupyterNotebook来完成此操作。!pipinstallquandl!pipinstallfbprophet!pipinstallplotlyfromstockerimportStocker现在在Python代码中有Stocker类,我们可以使用它来创建该类的实例。在Python中,类的实例称为对象,创建对象的行为有时称为实例化或构造。为了创建一个Stocker对象,我们需要传入一个有效股票代号的名称。#MSFTStockerInitialized.Datacovers1986-03-13to2018-01-16.microsoft=Stocker('MSFT')MSFTStockerInitialized.Datacovers1986-03-1300:00:00to2018-03-2700:00:00。现在,我们有一个包含所有属性的Microsoft对象的Stocker类。Stocker建立在quandlWIKI数据库之上,该数据库使我们可以访问3000多只美国股票以及多年的每日价格数据(完整列表)。对于此示例,我们将坚持使用Microsoft数据。因为微软正在拥抱开源社区(包括Python)。Python中的类由两个主要部分组成:属性和方法。无需赘述,属性是与整个类或类的特定实例(对象)关联的值或数据。方法是包含在可以作用于该数据的类中的函数。Stocker对象的一个??属性是特定公司的股票数据,当我们构造它时,它与该对象相关联。我们可以访问该属性并将其分配给另一个变量以进行检查:#Stockisanatributeofthemicrosoftobjectstock_history=microsoft.stockstock_history.head()Python类的好处在于方法(或函数)及其作用的数据与同一个对象相关联.我们可以使用Stocker对象的方法来绘制股票的整个历史。#Amethod(函数)需要括号microsoft.plot_stock()MaximumAdj.Close=96.77on2018-03-1200:00:00.MinimumAdj.Close=0.06on1986-03-2400:00:00.CurrentAdj.Close=89.47on2018-03-2700:00:00。提取的默认值是调整后的收盘价,它考虑了股票拆分(当一只股票被拆分成多只股票时,比如2只,每只新股票的价值是原价的1/2)。这是我们可以从Google搜索中找到的一个非常基本的图表,但是我们自己用几行Python来完成它是令人满意的!plot_stock函数有许多可选参数。默认情况下,此方法绘制整个日期范围的调整后收盘价,但我们可以选择范围、要绘制的统计数据和绘制类型。例如,如果我们想将每日价格变化与调整后的交易量(股数)进行比较,我们可以在函数调用中指定这些。microsoft.plot_stock(start_date='2000-01-03',end_date='2018-01-16',stats=['DailyChange','Adj.Volume'],plot_type='pct')MaximumDailyChange=2.08on2008-10-1300:00:00.MinimumDailyChange=-3.34on2017-12-0400:00:00.CurrentDailyChange=-5.47on2018-03-2700:00:00.MaximumAdj.Volume=591052200.00on2006-04-2800:00:00。MinimumAdj.Volume=7425503.00on2017-11-2400:00:00.CurrentAdj.Volume=53704562.00on2018-03-2700:00:00。请注意,y轴是相对于统计平均值的百分比变化。这个单位是必要的,因为每天的交易量本来就是股票,几亿不等,每天的价格变化通常是几块钱!通过转换为百分比变化,我们可以以相似的比例查看这两个数据集。该图显示交易的股票数量与每日价格变化之间没有相关性。这是令人惊讶的,因为我们可能预计在价格变化较大的日子里会有更多股票交易,因为人们急于利用波动性。然而,唯一真正的趋势似乎是交易量随着时间的推移而减少。2017年12月4日也出现了大幅降价,我们可以尝试将其与有关微软的新闻报道联系起来。使用plot_stock我们可以调查任何日期范围内数据中的任何数量,并寻找与现实世界事件的相关性。现在,我们将继续讨论Stocker中更有趣的部分之一:赚取假钱!让我们暂时假设我们有信心在公司的首次公开募股(IPO)中投资100股Microsoft股票。我们现在有多富有?microsoft.buy_and_hold(start_date='1986-03-13',end_date='2018-01-16',nshares=100)MSFTTotalbuyandholdprofitfrom1986-03-13to2018-01-16for100shares=$8829.11使用这些结果将使我们能够调整我们的计划利润最大化。加法模型加法模型是分析和预测时间序列的强大工具,时间序列是现实世界中最常见的数据类型之一。这个概念很简单:将时间序列表示为不同时间尺度上的模式和总体趋势的组合。我们知道,微软股票的长期趋势是稳步上涨,但也可能存在对经济有利的年度或每日模式,例如每周二上涨。Prophet由Facebook开发,是一个第三方库,用于从股票等日常观察中分析时间序列。Stocker在后台使用Prophet为我们完成所有建模工作,因此我们可以通过简单的方法调用来创建和检查模型。model,model_data=microsoft.create_prophet_model()加法模型从数据中去除噪声,这就是模型线与观察结果不完全一致的原因。Prophet模型还考虑了不确定性,这是建模的重要组成部分,因为在处理波动的现实世界过程时,我们永远无法确定预测的结果。我们也可以使用先知模型对未来进行预测,但现在我们更关心过去的数据。请注意,此方法调用返回两个对象,一个模型和一些我们分配给变量的数据。我们现在使用这些变量来绘制时间序列组件。model.plot_components(model_data)plt.show()总体趋势是近三年明显增加。似乎也有明显的年度模式,价格在9月和10月触底,在11月和1月达到顶峰。随着时间尺度的减小,数据变得更加嘈杂。在一个典型的月份里,信号多于噪音!如果我们认为可能存在每周模式,我们可以通过更改Stocker对象的weekly_seasonality属性将其添加到Prophet模型:print(microsoft.weekly_seasonality)microsoft.weekly_seasonality=Trueprint(microsoft.weekly_seasonality)False是False,但我们更改了此值以在我们的模型中包含每周模式。然后我们再次调用create_prophet_model并绘制结果组件。我们可以忽略周末,因为价格只在一周内变化(实际上在下班后价格变化很小,但这不影响我们的分析)。不幸的是,我们没有可用的每周趋势,我们将在继续建模之前关闭每周季节性。这种行为是预期的:对于股票数据,随着时间尺度的减小,噪声开始冲淡信号。在日常基础上,股票走势本质上是随机的,只有当我们缩小到年度范围时,我们才能看到趋势。变化点变化点发生在时间序列从增加到减少或从增加到减少时(从严格意义上讲,它们位于时间序列的速率变化最大的地方)。这些时间很重要,因为知道股票何时达到顶峰或即将起飞可以带来显着的经济效益。确定变化点的原因可以让我们预测股票价值的未来波动。Stocker对象可以自动帮我们找到10个最大的变化点。microsoft.changepoint_date_analysis()Changepointssortedbysloperateofchange(2ndderivative):DateAdj.Closedelta4102016-09-0855.811396-1.3780933382016-05-2650.1134531.1167202172015-12-0252.572008-0.8823594582016-11-1557.5898190.603127482015-04-0237.6125900.442776变化点往往与股价的高峰与低谷一致。Prophet仅在前80%的数据中发现变化点,但尽管如此,这些结果还是很有用的,因为我们可以尝试将它们与现实世界的事件相关联。WecouldrepeatwhatwedidbeforeandmanuallysearchGoogleNewsaroundthesedates,butIthinkitwouldbebetterifStockerdiditforus.YoumayhaveseentheGoogleSearchTrendstool,whichallowsyoutoseehowpopularanysearchtermhasbecomeinGoogleSearchovertime.Stockercanautomaticallyretrievedataforanysearchtermwespecifyandplottheresultsovertherawdata.Inordertofindandplotthefrequencyofthesearchterm,wemodifythepreviousmethodcall.microsoft.changepoint_date_analysis(search='Microsoftprofit')TopRelatedQueries:queryvalue0microsoftnonprofit1001microsoftoffice602appleprofit403microsoft365404apple35RisingRelatedQueries:queryvalue0applestock1701microsoft3651302appleprofit50除了绘制相对搜索频率的图形之外,Stocker还显示了图表日期范围内相关度最高的查询和上升最快的查询。Intheplot,they-axisisnormalizedbetween0and1bydividingthevaluebyitsmaximumvalue,allowingustocomparetwovariableswithdifferentscales.Ascanbeseenfromthegraph,thereappearstobenocorrelationbetweenthesearchfor"Microsoftprofit"andtheMicrosoftstockprice.Ifwefindacorrelation,thenthereisstillthequestionofcausation.Wedon'tknowwhetherthesearchorthenewscausedthepricechange,orthepricechangecausedthesearch.Mightfindsomeusefulinformation,butalsolotsofchancecorrelations.随意尝试几个不同的搜索词,看看您是否发现任何有趣的趋势!microsoft.changepoint_date_analysis(search='MicrosoftOffice')TopRelatedQueries:queryvalue0microsoftofficedownload1001microsoftoffice2010902office2010853microsoftoffice2013754office201370RisingRelatedQueries:queryvalue0microsoftoffice2016key803001office2016732002downloadmicrosoftoffice2016721503microsoftoffice2016mac693504microsoftoffice201667650看起来对MicrosoftOffice的搜索量下降会导致股价上涨。MaybesomeoneshouldletMicrosoftknow.预测我们只探索了Stocker功能的前半部分。后半部分用于预测,或者预测未来的股票价格。如下图所示:model,future=microsoft.create_prophet_model(days=180)PredictedPriceon2018-07-21=$102.40
