Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
Scratch,是抓取的意思,这个Python的爬虫框架叫Scrapy,大概也是这个意思吧,就叫它:小刮刮吧。
Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下
爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
注:想学习Python的小伙伴们进群:984632579领取从0到1完整学习资料 视频 源码 精品书籍 一个月经典笔记和99道练习题及答案
下面用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则将第一列数据指定为索引。
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列,并列出了每一列的名称和数据格式,并且没有缺失值。
1stock.info()
Python
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得到该数据所有的列名如下:
1stock.columns
Index([’ open’,‘high’,‘close’,‘low’,‘volume’,‘price_change’,
‘p_change’,‘ma5’,‘ma10’,‘ma20’,‘v_ma5’,‘v_ma10’,‘v_ma20’,
‘turnover’],
dtype=‘object’)
于是发现’open’列名前存在多余的空格,我们使用如下方法修正列名。
1stock.rename(columns={’ open’:‘open’},inplace=True)
至此,我们完成了股票数据的导入和清洗工作,接下来将使用可视化的方法来观察这些数据。
数据观察
首先,我们观察数据的列名,其含义对应如下:
openhighcolselowvolumeprice_changep_change
开盘价最高价收盘价最低价成交量价格变动涨跌幅
ma5ma10ma20v_ma5v_ma10v_ma20turnover
5日均价10日均价20日均价5日均量10日均量20日均量换手率
这些指标总体可分为两类:
价格相关指标
当日价格:开盘、收盘价,最高、最低价
价格变化:价格变动和涨跌幅
均价:5、10、20日均价
成交量相关指标
成交量
换手率:成交量/发行总股数×100%
成交量均量:5、10、20日均量
由于这些指标都是随时间变化的,所以让我们先来观察它们的时间序列图。
相对变化量
股票中关注的不是价格的绝对值,而是相对变化量。有多种方式可以衡量股价的相对值,最简单的方法就是将股价除以初始时的价格。
stock[‘return’]=stock[‘close’]/stock.close.iloc[0]
stock[‘return’].plot(grid=True)
第二种方法是计算每天的涨跌幅,但计算方式有两种:
这两者可能导致不同的分析结果,样例数据中的涨跌幅使用的是第一个公式,并乘上了100%。
给大家整理了Python很全面的资料和教程可以下载,加群943752371即可
1stock[‘p_change’].plot(grid=True).axhline(y=0,color=‘black’,lw=2)
为了解决第二种方法中的两难选择,我们引入第三种方法,就是计算价格的对数之差,公式如下:
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
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] 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) 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() 1pandas_candlestick_ohlc(stock) 这里红色代表上涨,绿色代表下跌。 相关关系 在观察了价格的走势之后,我们来看看各指标之间的关系。下面挑选了部分代表性的指标,并使用pandas.scatter_matrix()函数,将各项指标数据两两关联做散点图,对角线是每个指标数据的直方图。 small=stock[[‘close’,‘price_change’,‘ma20’,‘volume’,‘v_ma20’,‘turnover’]] _=pd.scatter_matrix(small) 图中可以明显发现成交量(volume)和换手率(turnover)有非常明显的线性关系,其实换手率的定义就是:成交量除以发行总股数,再乘以100%。所以下面的分析中我们将换手率指标去除,这里使用了相关性关系来实现数据降维。 上面的散点图看着有些眼花缭乱,我们可以使用numpy.corrcof()来直接计算各指标数据间的相关系数。 small=stock[[‘close’,‘price_change’,‘ma20’,‘volume’,‘v_ma20’]] cov=np.corrcoef(small.T) cov 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。这两个强烈正相关的指标是收盘价和成交量。 img=plt.matshow(cov,cmap=plt.cm.winter) plt.colorbar(img,ticks=[-1,0,1]) plt.show() 以上我们用矩阵图表的方式在多个指标中迅速找到了强相关的指标。接着做出收盘价和成交量的折线图,因为它们的数值差异很大,所以我们采用两套纵坐标体系来做图。 1stock[[‘close’,‘volume’]].plot(secondary_y=‘volume’,grid=True) 观察这两个指标的走势,在大部分时候股价上涨,成交量也上涨,反之亦然。但个别情况下则不成立,可能是成交量受到前期的惯性影响,或者还有其他因素。 推荐一下我建的python学习交流qun:850973621,群里有免费的视频教程,开发工具、 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7CsvYjM-1607771266063)(https://upload-images.jianshu.io/upload_images/25205170-3e26de6162725f62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)] 作者:编程新视野创建K线图
可同时绘制其他折线图
电子书籍、项目源码分享。一起交流学习,一起进步!
链接:https://www.jianshu.com/p/00cddd6ce53e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。