Python玩转股票数据以及简单交易策略

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python 玩转股票数据以及简单交易策略前面的文档《Python获取股票历史数据并分析》详细说明如何获取股票数据,并进行了简单的分布分析。今天我们将详细讲解如何玩转历史数据,基础数据来源于《Python获取股票历史数据并分析》。为了取数和查询方便,我把所有的历史交易数据放在了sqlite3数据库文件中,这也是python自带的数据库,操作很方便。当然你也可以把数据放在其他数据库中。本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略。下面开始玩转数据,

数据导入

为了数据的存储和读取方便,我们预先把历史数据存在路径为'E:\myprog\TestData.db的sqlite文件中。要分析先从这个数据文件中读取。

我们把股票编码为600866的2017-02-01至2017-06-01的交易数据读取到stdata中。

以上显示了前9行数据,要得到数据的更多信息,可以使用.info()方法。它告诉我们该数据一共有72行,索引是时间格式,日期从2017-02-01至2017-06-01。总共有16列,并列出了每一列的名称和数据格式,并且没有缺失值。

除了index,code是object类型外,其他的都是float型。我们可以将index转化为datetime类型

stdata.index= pd.to_datetime(stdata.index) 变化后如下:

至此,我们完成了股票数据的导入和清洗工作,接下来将使用可视化的方法来观察这些数据。

数据观察

首先,我们观察数据的列名,其含义对应如下:

这些指标总体可分为两类:

●价格相关指标

⏹当日价格:开盘、收盘价,最高、最低价

⏹价格变化:价格变动和涨跌幅

⏹均价:5、10、20日均价

●成交量相关指标

⏹成交量

⏹换手率:成交量/发行总股数×100%

⏹成交量均量:5、10、20日均量

由于这些指标都是随时间变化的,所以让我们先来观察它们的时间序列图。

时间序列图

以时间为横坐标,每日的收盘价为纵坐标,做折线图,可以观察股价随时间的波动情况。这里直接使用DataFrame数据格式自带的做图工具,其优点是能够快速做图,并自动优化图形输出形式。

stdata[['close','turnover']].plot(figsize=(33,8),secondary_y='close',grid=True)

这是换手率、收盘价的时间序列图,右轴是收盘价,左轴是换手率,随着股价的从7.5跌倒4.8,换手率也下降了很多。

如果我们将每日的开盘、收盘价和最高、最低价以折线的形式绘制在一起,难免显得凌乱,也不便于分析。那么有什么好的方法能够在一张图中显示出这四个指标?这就是K线图。

K线图

相传K线图起源于日本德川幕府时代,当时的商人用此图来记录米市的行情和价格波动,后来K线图被引入到股票市场。每天的四项指标数据用如下蜡烛形状的图形来记录,不同的颜色代表涨跌情况。

Matplotlib.finance模块提供了绘制K线图的函数candlestick_ohlc(),但如果要绘制比较美观的K线图还是要下点功夫的。下面定义了pandas_candlestick_ohlc()函数来绘制适用于本文数据的K线图,其中大部分代码都是在设置坐标轴的格式。这里可以画日K线,周K线、月K线、年K线等4中K线图

下为日K线:

周K线:

这里红色代表上涨,绿色代表下跌。

股票中关注的不是价格的绝对值,而是相对变化量。有多种方式可以衡量股价的相对值,最简单的方法就是将股价除以初始时的价格。

stdata['return'] = stdata['close'] / stdata.close.iloc[0]

stdata['return'].plot(grid=True)

第二种方法是计算每天的涨跌幅,但计算方式有两种:

这两者可能导致不同的分析结果,样例数据中的涨跌幅使用的是第一个公式,并乘上了100%。

stdata['p_change'].plot(grid=True,figsize=(12,7)).axhline(y=0, color='black', lw=2)

为了解决第二种方法中的两难选择,我们引入第三种方法,就是计算价格的对数之差,公式如下:

close_price = stdata['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)

相关关系

在观察了价格的走势之后,我们来看看各指标之间的关系。下面挑选了部分代表性的指标,并使用

pandas.scatter_matrix()函数,将各项指标数据两两关联做散点图,对角线是每个指标数据的直方图。

small = stdata[['close','price_change','ma20','volume','v_ma20','turnover']]

pd.scatter_matrix(small)

如下图,图中可以明显发现成交量(volume)和换手率(turnover)有非常明显的线性关系,其实换手率的定义就是:成交量除以发行总股数,再乘以100%。所以下面的分析中我们将换手率指标去除,这里使用了相关性关系来实现

数据降维

上面的散点图看着有些眼花缭乱,我们可以使用numpy.corrcof()来直接计算各指标数据间的相关系数。

small = stdata[['close','price_change','ma20','volume','v_ma20','turnover']]

cov = np.corrcoef(small.T)

cov

如果觉得看数字还是不够方便,我们继续将上述相关性矩阵转换成图形,如下图所示,其中用颜色来代表相关系数。我们发现位于(0,2)位置的相关系数非常大,查看数值达到0.89。这两个强烈正相关的指标是收盘价和

相关文档
最新文档