Python抓取股票数据,如何用python编程赚取第一桶金?
Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
Scratch,是抓取的意思,这个Python的爬虫框架叫Scrapy,大概也是这个意思吧,就叫它:小刮刮吧。
Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下
爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
下面用python用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系最后使用移动平均线方法初探投资策略。
数据导入
这里将股票数据存储在
stockData.txt
文本文件中,我们使用pandas.read_table()
函数将文件数据读入成DataFrame格式。其中参数
usecols=range(15)
限制只读取前15列数据,parse_dates=[0]
表示将第一列数据解析成时间格式,index_col=0
则将第一列数据指定为索引。
其中参数usecols=range(15)
限制只读取前15列数据,parse_dates=[0]
表示将第一列数据解析成时间格式,index_col=0
则将第一列数据指定为索引。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pandas aspd import numpy asnp import matplotlib.pyplot asplt %matplotlibinline %configInlineBackend.figure_format='retina' %pylabinline pylab.rcParams['figure.figsize']=(10,6)#设置绘图尺寸 #读取数据 stock=pd.read_table('stockData.txt',usecols=range(15),parse_dates=[0],index_col=0) stock=stock[::-1]#逆序排列 stock.head() |
以上显示了前5行数据,要得到数据的更多信息,可以使用.info()
方法。它告诉我们该数据一共有20行,索引是时间格式,日期从2015年1月5日到2015年1月30日。总共有14列,并列出了每一列的名称和数据格式,并且没有缺失值。
1 | stock.info() |
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <class'pandas.core.frame.DataFrame'> DatetimeIndex:20entries,2015-01-05to2015-01-30 Data columns(total14columns): open20non-null float64 high20non-null float64 close20non-null float64 low20non-null float64 volume20non-null float64 price_change20non-null float64 p_change20non-null float64 ma520non-null float64 ma1020non-null float64 ma2020non-null float64 v_ma520non-null float64 v_ma1020non-null float64 v_ma2020non-null float64 turnover20non-null float64 dtypes:float64(14) memory usage:2.3KB |
在观察每一列的名称时,我们发现’open’的列名前面似乎与其它列名不太一样,为了更清楚地查看,使用.columns
得到该数据所有的列名如下:
1 | stock.columns |
1 2 3 4 | Index([' open','high','close','low','volume','price_change', 'p_change','ma5','ma10','ma20','v_ma5','v_ma10','v_ma20', 'turnover'], dtype='object') |
于是发现’open’列名前存在多余的空格,我们使用如下方法修正列名。
1 | stock.rename(columns={' open':'open'},inplace=True) |
至此,我们完成了股票数据的导入和清洗工作,接下来将使用可视化的方法来观察这些数据。
数据观察
首先,我们观察数据的列名,其含义对应如下:
open | high | colse | low | volume | price_change | p_change |
---|---|---|---|---|---|---|
开盘价 | 最高价 | 收盘价 | 最低价 | 成交量 | 价格变动 | 涨跌幅 |
ma5 | ma10 | ma20 | v_ma5 | v_ma10 | v_ma20 | turnover |
---|---|---|---|---|---|---|
5日均价 | 10日均价 | 20日均价 | 5日均量 | 10日均量 | 20日均量 | 换手率 |
这些指标总体可分为两类:
价格相关指标
当日价格:开盘、收盘价,最高、最低价
价格变化:价格变动和涨跌幅
均价:5、10、20日均价
成交量相关指标
成交量
换手率:成交量/发行总股数×100%
成交量均量:5、10、20日均量
由于这些指标都是随时间变化的,所以让我们先来观察它们的时间序列图。
相对变化量
股票中关注的不是价格的绝对值,而是相对变化量。有多种方式可以衡量股价的相对值,最简单的方法就是将股价除以初始时的价格。
1 2 | stock['return']=stock['close']/stock.close.iloc[0] stock['return'].plot(grid=True) |
第二种方法是计算每天的涨跌幅,但计算方式有两种:
这两者可能导致不同的分析结果,样例数据中的涨跌幅使用的是第一个公式,并乘上了100%。
1 | stock['p_change'].plot(grid=True).axhline(y=0,color='black',lw=2) |
为了解决第二种方法中的两难选择,我们引入第三种方法,就是计算价格的对数之差,公式如下:
1 2 3 | close_price=stock['close'] log_change=np.log(close_price)-np.log(close_price.shift(1)) log_change.plot(grid=True).axhline(y=0,color='black',lw=2) |
K线图
相传K线图起源于日本德川幕府时代,当时的商人用此图来记录米市的行情和价格波动,后来K线图被引入到股票市场。每天的四项指标数据用如下蜡烛形状的图形来记录,不同的颜色代表涨跌情况。
图片来源:http://wiki.mbalib.com/wiki/K线理论
Matplotlib.finance模块提供了绘制K线图的函数candlestick_ohlc()
,但如果要绘制比较美观的K线图还是要下点功夫的。下面定义了pandas_candlestick_ohlc()
函数来绘制适用于本文数据的K线图,其中大部分代码都是在设置坐标轴的格式。
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | frommatplotlib.finance importcandlestick_ohlc frommatplotlib.dates importDateFormatter,WeekdayLocator,DayLocator,MONDAY defpandas_candlestick_ohlc(stock_data,otherseries=None): # 设置绘图参数,主要是坐标轴 mondays=WeekdayLocator(MONDAY) alldays=DayLocator() dayFormatter=DateFormatter('%d') fig,ax=plt.subplots() fig.subplots_adjust(bottom=0.2) ifstock_data.index[-1]-stock_data.index[0]<pd.Timedelta('730 days'): weekFormatter=DateFormatter('%b %d') ax.xaxis.set_major_locator(mondays) ax.xaxis.set_minor_locator(alldays) else: weekFormatter=DateFormatter('%b %d, %Y') ax.xaxis.set_major_formatter(weekFormatter) ax.grid(True) # 创建K线图 stock_array=np.array(stock_data.reset_index()[['date','open','high','low','close']]) stock_array[:,0]=date2num(stock_array[:,0]) candlestick_ohlc(ax,stock_array,colorup="red",colordown="green",width=0.4) # 可同时绘制其他折线图 ifotherseries isnotNone: foreach inotherseries: plt.plot(stock_data[each],label=each) plt.legend() ax.xaxis_date() ax.autoscale_view() plt.setp(plt.gca().get_xticklabels(),rotation=45,horizontalalignment='right') plt.show() |
1 | pandas_candlestick_ohlc(stock) |
这里红色代表上涨,绿色代表下跌。
相关关系
在观察了价格的走势之后,我们来看看各指标之间的关系。下面挑选了部分代表性的指标,并使用pandas.scatter_matrix()
函数,将各项指标数据两两关联做散点图,对角线是每个指标数据的直方图。
1 2 | small=stock[['close','price_change','ma20','volume','v_ma20','turnover']] _=pd.scatter_matrix(small) |
图中可以明显发现成交量(volume)和换手率(turnover)有非常明显的线性关系,其实换手率的定义就是:成交量除以发行总股数,再乘以100%。所以下面的分析中我们将换手率指标去除,这里使用了相关性关系来实现数据降维。
上面的散点图看着有些眼花缭乱,我们可以使用numpy.corrcof()
来直接计算各指标数据间的相关系数。
1 2 3 | small=stock[['close','price_change','ma20','volume','v_ma20']] cov=np.corrcoef(small.T) cov |
1 2 3 4 5 | array([[1.,0.30308764,0.10785519,0.91078009,-0.37602193], [0.30308764,1.,-0.45849273,0.3721832,-0.25950305], [0.10785519,-0.45849273,1.,-0.06002202,0.51793654], [0.91078009,0.3721832,-0.06002202,1.,-0.37617624], [-0.37602193,-0.25950305,0.51793654,-0.37617624,1.]]) |
如果觉得看数字还是不够方便,我们继续将上述相关性矩阵转换成图形,如下图所示,其中用颜色来代表相关系数。我们发现位于(0,3)位置的相关系数非常大,查看数值达到0.91。这两个强烈正相关的指标是收盘价和成交量。
1 2 3 | img=plt.matshow(cov,cmap=plt.cm.winter) plt.colorbar(img,ticks=[-1,0,1]) plt.show() |
以上我们用矩阵图表的方式在多个指标中迅速找到了强相关的指标。接着做出收盘价和成交量的折线图,因为它们的数值差异很大,所以我们采用两套纵坐标体系来做图。
1 | stock[['close','volume']].plot(secondary_y='volume',grid=True) |
观察这两个指标的走势,在大部分时候股价上涨,成交量也上涨,反之亦然。但个别情况下则不成立,可能是成交量受到前期的惯性影响,或者还有其他因素。
区块链】中国区块链研究全球领先 有待龙头技术企业崛起
近日,IPRdaily中文网与incoPat创新指数研究中心联合发布“2017全球区块链企业专利排行榜(前100名)”显示,中国在区块链研究方面全球领先。
“区块链技术要大规模发展,在底层技术上还要进一步发展,就像移动互联网一样,它就有IOS和安卓两套强大的基础系统。虽然区块链的基础技术研究投入很多,但目前许多研发团队都是各自为战,还未有真正的龙头技术企业崛起。”
未来发展或是局部突破
基于政策鼓励,区块链行业如今迎来了快速发展的风口,各类区块链公司如雨后春笋般纷纷借力生长。同时,区块链概念股开始集体大涨。暴风集团、美图、迅雷等上市公司趁机搭上区块链的风口,其中大多数公司连业务还未落地,股价就已“起飞”。
不久前,真格基金掌舵者徐小平在其内部微信群中表示,“区块链革命已经到来,这是一场顺之者昌、逆之者亡的伟大技术革命。要主动拥抱区块链技术,不要临渊羡鱼,也不要隔岸观火,要冲到这个行业里面去,赶紧研究赶紧行动。”
不过,在众多业内人士看来,目前区块链技术的发展仍然处于初期阶段,它的去中心化特点涉及对传统商业逻辑的颠覆,并非朝夕之间就能实现。余林民向记者表示,“我觉得,区块链要像互联网一样改变人类的生活,需要比较长的时间。未来区块链应用最可能的发展,还是先在局部获得突破。”
2月6日,一份名为《2017全球区块链企业专利排行榜》,让国内BAT的区块链势能浮出水面。前100名中,中国入榜的企业占比49%,其次才是美国,占比33%;其中国内阿里巴巴以49件的总量排名第一,腾讯科技为11件。
这份报告,让阿里在区块链上的占位一时风头无两。阿里巴巴集团学术委员会主席曾鸣此前谈及阿里巴巴的区块链之路时称,早在2015年蚂蚁金服内部便形成一个区块链兴趣小组,2016年开始在公益项目上做尝试。截至目前,阿里的区块链围绕着其电商和新零售业务的优势,布局已经涉及公益、商品溯源、租房场景等领域。
好了,今天的知识就分享到这里,想学习python爬虫的欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。