股票数据的获取与预处理

在这一章,我们介绍如何获取股票数据,并进行一些简单的分析。作为最基本也是最常见的金融数据,股票价格数据的分析不仅仅出现在各种研究报告、分析文章中,也可以实实在在地应用于交易中,带来或丰厚的回报或巨额的亏损。了解股票数据的基本形式是接下来进行进一步分析和量化投资的基础。在这一章,我们会简介中国的股票市场现状,通过Tushare提供的接口下载具体的个股数据,并通过K线图的形式让大家了解基本的股票数据可视化的方式,然后演示如何通过TA-Lib这个工具计算技术指标和识别K线图的特定形态。

1 中国股票市场简介

股票是上市的股份公司发行的所有权凭证,是股份公司为筹集资金而发行给各股东作为持股凭证并借以取得股息和红利的一种有价证券。作为一种投资工具,股票价格的波动比其他理财产品更大,风险更高。为此国内的股票市场引入了涨跌停等机制来减小股票价格的波动。

国外的股票市场发展远远早于国内市场。早在物理学家牛顿的时代就已经有股票的发行和流通,著名的南海股票泡沫骗局的受害者中,就有牛顿这位大物理学家的身影。时至今日,股票投资中仍然有着“八亏一平一盈”的说法,可见股票投资的高风险性从牛顿那个时代一直延续至今不曾改变。国人对于国外的股票市场的了解更多地是来自于国内的互联网公司最近几年扎堆到美国和香港的股票市场上进行IPO,即首次公开募股(Initial Public Offerings),例如港交所,纽交所和纳斯达克等。选择这些交易所上市不仅是因为上市门槛低、筹资速度快等上市程序上的优势,更是因为上市带来的国际声誉,这对于一些想要拓展海外市场的国内互联网公司而言是非常有吸引力的。

自从上世纪90年代上海证券交易所和深圳证券交易所开业至今,在短短30年内,中国股票市场形成了包含主板、中小板、创业板、科创板、新三板、四板在内的股票市场格局。

  • 主板市场:随着1990年末上海和深圳证券交易所开业,我国A股市场正式起步,也标志着股票主板市场的建立。申请主板上市的公司有着很严格的财务要求,对盈利、现金流或收入、净资产和股本总额都有着明确的要求。截止到2020年2月10日,上交所主板上市公司为1506家,深交所主板上市公司为470家。
  • 中小企业板市场:2004年5月,深圳证券交易所在主板市场内设立中小企业板块,简称中小板,为拓宽中小企业的直接融资渠道。申请在中小板上市的公司财务标准与主板相同。截止到2020年2月10日,深交所中小板上市公司为946家。
  • 创业板市场:2009年10月,深圳证券交易所推出了创业板,为高科技企业提供融资渠道,促进知识和资本的结合,推动知识经济的发展。相比主板和中小板,在创业板申请上市的公司要求相对宽松。截止到2020年2月10日,深交所创业板上市公司为795家。
  • 科创板市场:2019年7月科创板正式开市,服务于符合国家战略、突破关键核心技术、市场认可度高的科技创新企业,重点支持高新技术和战略性新兴产业,并且在审批机制、上市要求以及交易机制等方面均有一系列突破的举措。截止到2020年2月10日,上交所科创板上市公司为80家。
  • 新三板市场:2001年“股权代(dai)办(ban)转让系统”最早承接包括退市公司等企业,称为“旧三板”。2006年,中关村科技园区非上市股份公司进入代(dai)办(ban)转让系统进行股份报价转让,称为“新三板”。
  • 四板市场:四板市场是区域性股权交易市场,为特定区域内的企业提供股权、债权转让和融资服务的私募市场。

2 股票数据获取

目前网络上有很多获取股票数据的公开接口和软件,包括但不限于Yahoo Finance、新浪财经、东方财富客户端等。这里我们主要使用TuShare为工具,获取我们接下来要使用的股票价格数据。TuShare是一个著名的免费、开源的python财经数据接口包,主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。TuShare也推出了Pro新版,我们会使用TuShare Pro版提供的接口。

基于股票历史数据进行的数值分析也被称作技术分析。股票技术分析其实可以认为是一种股票投资理论,维基百科上给出的定义是研究过去金融市场的资讯(主要是经由使用图表)来预测价格的趋势与决定投资的策略。也就是说它假设了历史会不断重演,只要我们从历史数据中挖掘中会重演的模式,就可以利用这种模式设计能够获利的策略。与技术分析相对的是基本面分析,技术分析着重于分析股票价格的波动规律,更多的是基于股票的供需表现、市场价格和交易数量等市场因素;基本面分析侧重于研究股票的长期投资价值,基于决定企业价值和影响股票价格的宏观经济形势、行业发展前景、企业经营状况等。

大家在网上看到的股票数据经常以K线图的形式给出,如下图所示:
图片说明

K线图(Candlestick Charts)又被称为“蜡烛图”、“阴阳线”等,是一种盒图,主要通过开盘价(Open Price)、最高价(High Price)、最低价(Low Price)和收盘价(Close Price)这四个数据值来勾勒交易市场的轮廓,其中实体上下对应收盘价和开盘价,而上下影线两端对应最高价和最低价。在K线图的下方,还可以画出交易量等信息。K线图最早在18世纪由日本的本间宗久在进行大米期货交易时使用,记录并研究大米期货的价格历史信息,19世纪时由美国的K线大师Steve Nison引进西方,引起普遍的注意。

K线图最常见的基本形态是阳线和阴线,如下图所示。按照惯例会用红色蜡烛线和绿色蜡烛线表示阳线和阴线,当然也可以按照大家个人的习惯对颜色进行修改,只要自己能看懂不产生误解就行。阳线和阴线相同的地方在于,最上面那点是最高价,最下面那点是最低价,而不同的地方在于,对于阳线而言,由于开盘价低于收盘价,因此矩形部分的上边缘是收盘价,下边缘是开盘价。阴线刚好反过来。

图片说明

获取股票历史价格数据是技术分析的第一步,然后我们会基于K线图对获取到的历史价格数据进行可视化。我们首先注册TuShare的账号,这一步与一般的网站注册无异。注册完成登录之后,进入个人主页,注意这里有一栏“接口TOKEN”,我们在获取数据时会用到这个密令。

图片说明

然后我们需要在本地安装TuShare,官网上介绍了有如下三种安装方式:

一般而言通过pip进行安装即可。

要获取每天的股票价格数据,通过TuShare提供的日线行情接口即可:

import tushare as ts
pro = ts.pro_api('')  # 填入你们在TuShare上申请的token字符串
df = pro.daily(ts_code='000001.SZ', start_date='20100101', end_date='20191231')
df.to_csv('1.csv', index=None)

基本的输入参数包括股票代码ts_code和起止日期。这里我们以平安银行(000001.SZ)为例。需要注意的是代码中需要填入你们在TuShare上申请的token字符串。我们会把获取到的数据写入csv文件,这样就不需要重复调用。

图片说明

我们获取的股票数据如上图所示,其中每一列的说明如下:
图片说明

可以看到这里涨跌幅一列中说明了此时为未复权的数据。在未复权的情况下,由于送股、配股等原因发生的股票价格,计算涨跌幅时会出现大于10%或小于-10%的情况,因此我们最好使用复权后的数据。具体来说,复权就是对股价和成交量进行权息修复,按照股票的实际涨跌绘制股价走势图,并把成交量调整为相同的股本口径。股票除权、除息之后,股价随之产生了变化,但实际成本并没有变化,如下图所示:

图片说明

一般有两种复权方式。

  • 前复权:向前复权,就是保持现有价位不变,将以前的价格缩减,将除权前的K线向下平移,使图形吻合,保持股价走势的连续性。便于K线图的流畅性,从而方便技术分析。复权后价格=(复权前价格-现金红利)/(1+流通股份变动比例)。
  • 后复权:就是在K线图上以除权前的价格为基准来测算除权后股票的市场成本。复权后价格=复权前价格×(1+流通股份变动比例)+现金红利。

3 股票数据可视化

接下来我们利用mpl_finance对我们获取的股票历史价格数据进行可视化。在Matplotlib 2.2版本之前,Matplotlib中finance模组中有一些绘制K线图的相关函数。2.2版本及之后,这个模组被剥离出来,形成了单独的mplfinance,所以大家如果在看一些参考书中提到Matplotlib的finance模块提供的功能,可以通过mplfinance实现。我们可以使用pip命令安装mplfinance: pip install --upgrade mplfinance

安装完成之后查看mplfinance的版本:

import mplfinance as mpf
print(mpf.__version__)

我使用的版本为0.12.3a0。

当我们利用mplfinance的plot函数绘制K线图时,默认的type为ohlc。目前mplfinance接受的输入数据为一个具有DatetimeIndex的DataFrame,而且列名必须为'Open', 'High', 'Low', 'Close'和'Volume'(可选)。因此我们首先要把我们从TuShare获取的数据整理为mplfinance要求的格式:

# 以平安银行股票数据为例
df = pd.read_csv('1.csv', dtype={'trade_date': str})
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
# 按日期从前到后排序
df = df.sort_values(by=['trade_date'])
df = df.set_index('trade_date')
# 取最后的一个月进行K线图的演示
df = df.iloc[df.index >= '20191201', :]

df_to_plot = df[['open', 'high', 'low', 'close', 'vol']]
df_to_plot = df_to_plot.rename(columns={'open': 'Open', 'high': 'High', 'low': 'Low', 'close': 'Close', 'vol': 'Volume'})
df_to_plot.head()

输出为:
图片说明

接下来我们就可以利用mplfiance绘制K线图。mplfinance直接传入要绘图的DataFrame作为参数(这里即我们构建的df_to_plot),类型type为蜡烛图candle,style来调整样式(可以用mpf.available_styles()查看),figratio调整大小,然后savefig来指明保存的文件名。

mpf.available_styles()

输出为:

['blueskies',
 'brasil',
 'charles',
 'checkers',
 'classic',
 'default',
 'mike',
 'nightclouds',
 'sas',
 'starsandstripes',
 'yahoo']

绘制的代码如下:

mpf.plot(df_to_plot, type='candle', style='charles', figratio=(12, 9), savefig='candle.png')

结果如下图所示:
图片说明

我们也可以叠加交易量:

mpf.plot(df_to_plot, type='candle', volume=True, style='charles', figratio=(12, 9), savefig='candle_volume.png')

如下图所示:
图片说明

我们也可以定制自己想要的style。最基本的定制化是指明阴线和阳线的颜色,这里up和down的参数是必须的:

mc = mpf.make_marketcolors(up='g',down='r')
s  = mpf.make_mpf_style(marketcolors=mc)
mpf.plot(df_to_plot, type='candle', volume=True, style=s, figratio=(12, 9), savefig='candle_volume.png')

结果如下图所示:
图片说明

然后我们也可以使用edge来指明实体部分边框的颜色,wick来指明上下影线的颜色(可以分别指明阴线和阳线),volume来指明交易量的颜色:

mc = mpf.make_marketcolors(up='g',down='r',
                           edge='lime',
                           wick={'up':'blue','down':'orange'},
                           volume='gray')
s  = mpf.make_mpf_style(marketcolors=mc)
mpf.plot(df_to_plot, type='candle', volume=True, style=s, figratio=(12, 9), savefig='candle_volume.png')

结果如下图所示:
图片说明

edge,wick,volume的可取值范围为:

  • matplotlib中的基本颜色,如blue
  • 一个字典,分别指明up和down的颜色,如{'up':'blue','down':'orange'}
  • 字符串'inherit' (或 'i', 'in', 'inh'),此时edge,wick,volume会直接使用up和down这两个参数的设置
mc = mpf.make_marketcolors(up='g',do

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> 在这个专刊中,我们会学习Python在金融中的应用: ·掌握Python进行数据分析和处理的方法; ·了解Python在量化投资中的应用; ·转行到金融数据分析和量化交易领域的基础等内容。 这个专刊适合: ·想要学习Python编程的在校学生; ·想要转行到金融领域的在职人士; ·想要利用业余时间进行量化投资的在职人士等。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p>

全部评论
对于新手而言,实在是解释的不够详细😭;
1 回复 分享
发布于 2020-11-05 09:52
mplfinance画不出图是怎么回事呀
点赞 回复 分享
发布于 2022-07-08 14:58
旧版本的接口,现在运行有很多错误哎,请问可以更新最新版本的教程吗?
点赞 回复 分享
发布于 2021-04-15 15:51

相关推荐

04-17 10:16
门头沟学院 Java
不河狸啊:为什么我的是已送达,连已读都没有
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务