18910140161

Python与股市数据分析

顺晟科技

2021-06-16 10:43:18

161

写在前面

在上一篇文章中,边肖与大家谈论了机器学习中的朴素贝叶斯算法,并对该算法在文档分类中的作用和步骤有了一个大致的了解。在离开上一期和本期之后,边肖将和大家谈谈如何使用python处理股市数据,这可以作为投资分析系列的篇文章。本期节目中,边肖将和大家一起探讨如何使用python获取股市数据,如何将这些数据可视化,最后谈一个经典的投资策略——均线策略。另外,这里需要特别强调的一点是:边肖未来的投资分析将主要使用国外的股票数据,当然这里的国外主要是指美国。这个选择是从两个方面考虑的:一是国外股市数据比较长,市场比较成熟,股市数据比较有代表性;第二,基于国外股票数据的策略只有在国内股市数据测试成功后才能使用,促进了大家自己的动手实践。当然,边肖不应为任何投资行为承担责任。我们开始吧。

使用python获取股市数据

python中获取股市数据的方法有很多。可以用python在各大金融网站上抓取股票数据,也可以通过一些现成的数据包获取相应的股市数据。如果你对股市数据的兴趣不是高频数据,那么使用这些现成的数据包会非常方便(当然这些第三方库目前也可以提供获取高频数据的途径)。边肖背后的分析是基于美国的股票数据,所以边肖选择使用python中的熊猫_datareader库来获取股票市场数据。至于国内股市数据的获取,边肖在之前的文章里已经介绍过了,这里就不解释了。

因为边肖在分析时会主要使用苹果(股票代码AAPL)、谷歌(代码GOOG)和微软(代码MSFT)的股票数据,边肖首先需要获取这些公司的股市数据,边肖的代码用来获取这些公司的数据。

#导入必要的库

将numpy导入为np

将熊猫作为pd导入

从熊猫_数据阅读器导入数据为web

导入日期时间

#设置开始时间

start=datetime.datetime(2016,1,1)

end=datetime.date.today()

#分别获取苹果、谷歌、微软在起始时间的股价数据

apple=web。数据阅读器(' AAPL ','雅虎',开始,结束)

google=web。DataReader('GOOG ',' yahoo ',开始,结束)

microsoft=web。数据阅读器(' MSFT ','雅虎',开始,结束)

#看看谷歌股价数据的特点

google.head()

谷歌股价数据

代码的部分是用来导入必要的python库的,使用熊猫_datareader得到的数据是熊猫数据帧的形式,所以更好在此之前导入熊猫库,而边肖习惯在导入熊猫库之前导入numpy库,所以不用导入这个库,而导入datetime库主要用于处理时间。代码的第二部分主要用来设置股票价格获取的开始时间。句把股票价格获取的初始时间设置为2006年1月1日,第二行把引入时间设置为今天。代码的第三部分主要用于获取三家公司的股价数据,主要通过web实现。DataReader函数。这个函数的基本参数有四个:个是股票代码,第二个是收购来源,通常是雅虎或谷歌,第三个和第四个参数分别是开始和结束时间。最后一行代码用来显示谷歌股价的前几行,如图。

可以看出,利用web获得的股价数据。数据阅读器功能主要包括六个指标。其中,开盘价是当天的开盘价;高是当天股票的更高价;低是当天股票的更低价;收盘价是当天的收盘价;量是婚姻的量;调整收盘价调整收盘价(调整股价的原因是为了消除股权分置和分红的影响)。

获得股价数据后,下一部分主要用于可视化。毕竟人类最喜欢的阅读方式永远是图形,所以下面的主题部分会包含各种图形。

股票市场数据的可视化

既然有了股市数据,那么可以根据自己的想法进行可视化,这自然离不开我们的老朋友绘制精美的图表库。小编在这一部分将介绍两种可视化思路,种是对单只股票股价数据的展示,第二种是对多只股票的对比展示,下面先开始单只股票的展示,这里小编以谷歌的股价为例进行展示。

# 导入必要的库

将绘制精美的图表导入为数学编程语言(Mathematical Programming Language)

将matplotlib.pyplot导入为血小板计数

# 设置相关的绘图环境

%matplotlib内联

PLT。rcparam[' font。sans-serif ']=[' SimHei ']

PLT。rcparams[' fig . fig size ']=(16,9)

# 绘图

谷歌['调整关闭']。绘图(网格=真)

' plt.xlabel('时间)

plt.ylabel('调整后收盘价)

' plt.title('谷歌股价走势图)

这里主要解释一下代码的二三部分。第二部分主要用来设置作图的环境,因为小编是在jupyter笔记本中进行程序撰写与调试的,因此第二部分的句代码主要是用来让绘制的图形直接在此页面进行显示,而第二行代码则用来设置中文字体,第三行代码用来设置图形的大小。而第三部分的代码主要用来作图,行是作图必须,后面三行主要用来设置图形格式。从作出的图形中可以看出,谷歌的股价基本呈现上升趋势,现在的股价水平已经接近1200美元,小编是真的一手都买不起呀。

然而股价的数据一般表现为四个值:开盘、收盘、更高以及更低。所以使用线形图无法完整展示出股价的特征,这种情况下K线图就主要派上用场了。小编前面已经介绍了怎么使用大蟒绘制K线图了,这里小编以原来的代码为基础重新构造一个更加便利的绘制K线图的函数,见下面代码。

来自matplotlib.dates导入DateFormatter,WeekdayLocator,dayLocator,MOHAMMED

来自matplotlib.finance import烛台_ohlc

来自matplotlib.pylab导入日期2num

def df _烛台_ohlc(dat,stick='day ',otherseries=None):

星期一=工作日定位器(星期一)

alldays=DayLocator()

day formatter=date formatter(“% d”)

transdat=dat.loc[:['打开','高','低','关闭']]

if(type(stick)=str):

if stick=='day':

plotdat=transdat

stick=1

否则如果粘在['周','月','年']:

if stick=='week':

trans dat[' week ']=PD。to _ datetime(trans dat。索引).map(lambda x : x . isocalendar()[1])#确定周

elif stick=='month':

trans dat[' month ']=PD。to _ datetime(trans dat。索引).地图(lambda x: x.month) #确定月份

trans dat[' year ']=PD。to _ datetime(trans dat。索引).map(lambda x : x . isocalendar()[0])#识别年份

Group=transdat。分组依据(列表(集合(['年,棒])#分组依据年份和其他适当的变量

plotdat=pd .数据框({ '打开' : [],'高' : [],'低' : [],'关闭' : []}) #创建包含将要绘制的内容的空数据框

对于名称,group in grouped:

plotdat=plotdat.append(pd .数据帧({'Open': group.iloc[0,0],

更高' :(组。高),

低' :分钟(组。低),

Close': group.iloc[-1,3]},

index=[group.index[0]]))

if stick=='week': stick=5

elif stick==' month ' : stick=30

elif stick==' year ' : stick=365

elif(type(stick)=int,stick=1):

trans dat[' stick ']=[NP。地板(我/棍子)为I范围内(len(transdat.index))]

group=transdat。分组依据(“棒”)

plotdat=pd .数据框({ '打开' : [],'高' : [],'低' : [],'关闭' : []}) #创建包含将要绘制的内容的空数据框

对于名称,group in grouped:

plotdat=plotdat.append(pd .数据帧({'Open': group.iloc[0,0],

更高' :(组。高),

低' :分钟(组。低),

Close': group.iloc[-1,3]},

index=[group.index[0]]))

else:

引发值错误(“参数‘stick’的有效输入包括字符串‘day’、‘week’、‘month’、‘year’或正整数”)

#设置绘图参数,包括用于绘图的轴对象ax

图,ax=plt .支线剧情()

图.子图_调整(底部=0.2)

if plot dat . index[-1]-plot dat . index[0]PD。时差(' 915天'):

周格式化程序=日期格式化程序(“% b % d”)#例如,1月12日

ax . xaxis . set _ main _ locator(星期一)

ax.xaxis.set_minor_locator(全天)

else:

weekFormatter=date formatter(' % b % d,%Y ')

ax . xaxis . set _ major _ formatter(Weekformatter)

网格(真)

#创建烛光图表

烛台_ohlc(ax,list(zip)(list(date 2 num(plot dat . index . tolist())),plotdat['Open'])。tolist(),plotdat['High']。tolist(),

plotdat['Low']。tolist(),plotdat['Close']。tolist())),

colorup='红色',colordown='绿色',width=stick * .4)

Plt.xlabel('日期')

Plt.ylabel('股价')

Plt.title('谷歌股价k线图')

#将其他系列(如移动平均线)绘制成线条

如果其他系列!=None:

if类型(其他系列)!=list:

其他系列=[其他系列]

dat.loc[:otherseries]。绘图(ax=ax,lw=1.3,网格=真)

ax.xaxis_date()

ax.autoscale_view()

plt.setp(plt.gca()。get_xticklabels(),rotation=45,horizontalalignment='right ')

plt.show()

以上小系列创建了绘制k线图的快捷程序。之所以重写k线图的绘制程序,是因为原库中k线图的绘制方法存在诸多不便,每次都要整理数据。所以为了方便绘制,这里重新设计了k线图的绘制方法,包括日、周、月、年k线图的绘制,在绘制时只需要指定相应的绘制参数即可。鉴于程序比较长,这里就不一一讲解命令了,有疑问的朋友可以给我留言。让我们用这个程序画出谷歌2016年以来的每日k线图。

df _烛台_ohlc(谷歌)

谷歌股价k线图

边肖在绘制k线图时重置了图片的格式,隐藏了图片的行标题、列标题和图片标题,所以它与功能略有不同,但这不是一个大问题,所以不需要太多注意。

以上小系列分别画出了单只股票的趋势图和k线图,但往往需要比较不同的股票数据,所以需要将这些股价数据整合成一张图。这个时候k线图很不方便,还是要用线性图来对比。这里小序列以三家公司调整后的收盘价为例绘制相关图表,如下。

closePrice=pd。数据帧({'AAPL': apple['Adj Close'],

MSFT':微软['可调关闭'],

GOOG': google['Adj Close']})

关闭价格图(网格=真)

Plt.xlabel ('time ')

Plt.ylabel('调整收盘价')

《股价趋势对比图》

三家公司股价走势对比图

上面的程序画出了三家公司的股价图。程序中的句话主要用来创建调整三家公司收盘价的数据框,接下来的四句话分别用来绘制图形和设置相应的图片格式。但是,从这张图可以看出;Google的股价远高于其他两家公司,所以如果放在一张图片的同一个坐标系中,就会出现其他两家公司的股价相对没有走势的情况。要解决这个问题,可以采用两种思路:一是设置双坐标轴;第二,使用收益率数据。首先考虑用双轴来解决这个问题。

closePrice=pd。数据帧({'AAPL': apple['Adj Close'],

MSFT':微软['可调关闭'],

GOOG': google['Adj Close']})

closeprice . plot(secondary _ y=[' AAPL ',' MSFT'],grid=True)

Plt.xlabel ('time ')

Plt.ylabel('调整收盘价')

《股价趋势对比图》

双坐标股价图

虽然这种方式使得苹果和微软的股价走势相对明显,但在一定程度上,双坐标的存在造成了一些绘制上的麻烦,所以下面的小数列会用收益率数据来绘制图形。请注意,这种方式也是比较不同时间序列数据时最常用的方式。抽取会用到两种收益率数据,一种是基准收益率(即所有数据相对于初始价格的收益率),另一种是常用的日收益率,即环收益率。

基准回报率(边肖采用的总回报率)取决于初始股价水平。这个收益率可以清晰的看到股价的走势,所以这个方法在考察时间序列的走势时是一个比较好的选择。这个收益率的计算方法是:

returnt=pricetprice0

下面这个小数列根据这个收益率画出相应的图。

stock _ return=ClosePrice . apply(lambda x : x/x[0])

stock_return.plot(网格=True)。axhline(y=1,color='black ',lw=2)

Plt.xlabel ('time ')

Plt.ylabel('基准收益率')

Plt.title('股票价格收益率')

股票价格基准收益率

可以看出,这种方法和直接画股价对比图有同样的问题,就是数据范围差异大,小尺度的数据显示不明显。所以进一步用日收益率来解决这个问题,T期收益率可以由以下公司来计算:

returnt=price t 1 price t 1

当然也可以由以下公司计算:

returnt=price tpricet 1 1

这两种计算方法还是有一定差距的。因此,为了避免这种影响,边肖用对数收益率来计算,公式是:

returnt=log(ptpt 1)

下面给出了基于该回报率的程序的图形显示。

将numpy导入为np

stock _ return=ClosePrice . apply(lambda x : NP . log(x)-NP . log(x . shift(1)))

stock_return.plot(网格=True)。axhline(y=0,color='black ',lw=2)

Plt.xlabel ('time ')

Plt.ylabel(“产量”)

Plt.title('股票价格收益率')

股票价格对数收益率的比较

可以看出,三只股票的收益有趋同的趋势,远比单纯使用价格有用。以上,边肖先后介绍了各种绘制对比图的方法。这里总结一下。如果要比较趋势,最后用基准收益率,如果要平均比较各个公司的股价,最后用对数收益率。到目前为止,边肖介绍了单股和多股的绘制方法。下面边肖将在本文最后部分介绍均线,均线与均线策略密切相关,需要注意。

移动平均线图表

对于t期,n天的移动平均值计算如下:

mant=1nI=0n 1xt I

均线可以让一系列数据更平滑,有助于发现趋势。n值越大,移动平均线对短期波动越不敏感。移动平均线的基本目的是从噪音中识别趋势。快速移动平均线的n较小,更接近股价;然而,慢速移动平均线具有较大的N值,这使得它们对波动不敏感,因此更稳定。对于均线的计算,python的熊猫库中有一个field方法。下面的小系列介绍并绘制了这个方法。首先,边肖计算苹果股价的20天移动平均线,并在k线图上画出这个移动平均线。

Google[' 20d ']=NP . round(Google[' Close '])。滚动(窗口=20,中心=假)。平均值(),2)

df _烛台_ ohlc(Google . loc[' 2017-10-01 ' : ' 2018-06-30 ',],otherseries='20d ')

可以看出,移动平均线比真实的股价数据平滑得多。而这个指数是很难改变的:一只股票的价格需要在tie值以上或以下改变,才能改变均线的方向。所以均线的交点代表一个潜在的趋势变化,需要注意。交易者往往对不同的均线感兴趣,比如7天,20天,200天。同时生成多个均线并不难:

Google[' 7d ']=NP . round(Google[' Close '])。滚动(窗口=7,中心=假)。平均值(),2)

Google[' 20d ']=NP . round(Google[' Close '])。滚动(窗口=20,中心=假)。平均值(),2)

Google[' 200d ']=NP . round(Google[' Close '])。滚动(窗口=200,中心=假)。平均值(),2)

df _烛台_ ohlc(Google . loc[' 2017-10-01 ' : ' 2018-06-30 ',],otherseries=['7d ',' 20d ',' 200d'])

7日均线和20日均线对小变动非常敏感,200日均线波动最小。200点均线显示整体牛市趋势:股票价值总体上一直在上升。20日均线代表的信息是熊市和牛市交替,牛市次之。这些均线的交点就是交易信息点,预示着股价的走势会发生变化,所以你需要做出有利可图的决策。这些投资决策将在后续文章中描述。

附言

本文暂时告一段落。这篇文章跟大家讲了如何用python处理股市数据,学会了如何用python获取股市数据,可视化个股和多只股票。本文可以作为投资分析的篇文章,以后会不断更新。再次感谢大家的支持和鼓励。贵公司是边肖进步的动力。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航