使用Python画股票的K线图的方法步骤
作者:allenmagic 发布时间:2021-03-24 06:54:24
导言
本文简单介绍了如何从网易财经获取某支股票的价格数据,并根据价格数据画出相应的日K线图。有助于新手了解并使用Python的相关功能。包括列表、自定义函数、for循环、if函数以及如何使用matplotlib进行作图等内容。
第一步:从网易财经获取股票的价格数据
我一般是在网易财经查看某支股票的价格和成交数据,网易财经可以查到任意沪深的股票,我们使用招商银行的数据作为参考。
1、构建爬虫获取股票价格数据
这里不对Python做介绍了,如果需要了解什么是Python,可以自行百度或者访问Python官网.
加载需要的模块
代码如下:
import re,urllib2,time,csv,datetime
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
import matplotlib.dates as mpd
其中urllib2是用来解析HTML内容的包,主要是从url获取网页内容;re是正则表达式包,本文会使用正则表达式来从抓取的网页数据中获取到有用的数据;time和datetime是时间相关的包,主要用来设定要抓取的时间以及其它相关时间的处理;csv包是用来生成csv数据(该数据会被用于R来画K线图),其余的几个包会在使用时单独介绍,你也可以在需要的时候在程序头部补充import。
设定时间相关
代码如下:
t = time.localtime() # 获取当前的本地时间
year = range(t[0],1989,-1) # 设定年度范围,从当前年度至沪市开市的年份倒序生成
season = range(4,0,-1) # 生成季度的数据列表,从4季度到1季度倒序生成
为什么要这么设定时间呢?仔细的查看网易股票数据的url,是按照年度和季度来构成的,我们发现搜索数据也是用年度和季度来搜索的。
招商银行2017年1季度数据
其url构成如下:http://quotes.money.163.com/trade/lsjysj_600036.html?year=2017&season=1可见可拆为6个子字符串,分别是http://quotes.money.163.com/trade/lsjysj_、600036、.html?year=、2017、&season=、1。其中第2、4、6个子串可以参数化输入获取特定需求的数据。
定义获取数据的函数
代码如下:
def getData(url):
request = urllib2.Request(url)
response = urllib2.urlopen(request)
content = response.read()
pattern = re.compile('</thead[\s\S]*</tr> </table>')
ta = re.findall(pattern, str(content))
pattern1 = re.compile("<td class='cGreen'>")
pattern2 = re.compile("<td class='cRed'>")
pattern3 = re.compile(",")
tab1 = re.sub(pattern1,"<td>",str(ta))
tab2 = re.sub(pattern2,"<td>",str(tab1))
tab = re.sub(pattern3, "", str(tab2))
if len(tab) == 0:
data = []
else:
pattern3 = re.compile('<td>(.*?)</td>')
data = re.findall(pattern3, str(tab))
for d in data:
if d == '':
data.remove('')
return data
本段代码定义个一个函数getDate(url),函数名为getData,参数为url。相当于从该url获取股票的交易数据,显然这个函数是定制的。
首先,我们用urllib2模块的相关函数解析并获取网页的数据。第二步,使用re模块的数据对抓取的网页内容进行初步的处理,分为了三个过程
首先匹配"</thead[\s\S]*</tr> </table>"之间的内容并返回,因为在这之间的内容包含了所有需要的数据,这是一个简单的正则表达式,表示返回</thead和</tr> </table>两个字符串之间的所有内容
匹配<td class='cGreen'>、<td class='cRed'>并使用<td>替换,因为这两个字符串会影响后续的匹配数据,现行替换掉可以更方便的匹配到需要的数据
替换到千分位","号,因为Python和R并不会识别有千分位号的数据,所以我们要将数据转换为非千分位的数据。
tab是按照要求最后获取的包含数据和文本的原始内容
用if函数来获取除文本的数据,因为如果year和season超过了当前的界限,会返回空的tab,所以我们在这里进行判断,如果少了这个判断,会报出index error。这个if函数表示了如果tab为空,data也是个空的列表,如果tab不为空,那么根据pattern3返回需要的数据至data列表
用一个for循环来遍历data列表,删除空白的内容(其实这一步不需要,因为在if中已经剔除了空的内容。
所以定义了以上的函数后,就可以使用该函数返回特定url的数据。
获取某支股票的数据
代码如下:
def get_stock_price(code):
url1 = "http://quotes.money.163.com/trade/lsjysj_"
url2 = ".html?year="
url3 = "&season="
urllist = []
for k in year:
for v in season:
urllist.append(url1+str(code)+url2+str(k)+url3+str(v))
price = []
for url in urllist:
price.extend(getData(url))
return price
自定义get_stock_price(code)函数,code是指股票代码,使用该函数可以返回该股票所有的历史数据(OHLC以及其它)思路很简单:
根据code构建其股票数据的页面的url列表
使用getData(url)函数和for循环,返回所有的历史数据
最终返回的是price的数据列表
这样,我们就可以使用该函数获取某支股票的所有历史数据:
# get all histrocial data include all price and others
price = get_stock_price(600036)
获取招商银行(600036)的所有历史数据。
2、保存数据
保存为csv文件
代码如下:
writer = csv.writer(file("stock.csv",'wb'))
writer.writerow(['Date','Open','High','Low','Close','Volume'])
pr = []
for i in range(0,len(price),11):
pr.extend([[price[i],price[i+1],price[i+2],price[i+3],price[i+4],price[i+8]]])
for prl in pr:
writer.writerow(prl)
我们使用csv模块保存数据为csv文件,用于在R中读取并作图,我们查看在网易的数据展示可以发现,总共11个字段,所有我们在每11个切片中,返回时间、OHLC(开盘价、最高价、最低价、收盘价)和交易量的数据并保存为csv的文件格式。
处理保存数据到列表
代码如下:
# get the number for date by date2num
def Date_no(strdate):
t = time.strptime(strdate, "%Y-%m-%d")
y,m,d = t[0:3]
d = datetime.date(y, m, d)
n = mpd.date2num(d)
return n
# get the price data
pr = []
for i in range(0,len(price),11):
pr.extend([[
Date_no(price[i])
,float(price[i+1])
,float(price[i+2])
,float(price[i+3])
,float(price[i+4])
,float(price[i+8])]]
)
这个程序片段是用来处理和保存数据用于在pyhton中做出K线图。
定义函数将字符串的时间处理为matplotlib中作图使用的数值(直接获取的数据中时间是字符串)
返回返回时间、OHLC(开盘价、最高价、最低价、收盘价)和交易量的数据并存储在pr这个列表里
第二步:做出K线图
在R中作图
代码如下:
library(quantmod)
rm(list = ls())
setwd("~/GitHub/index/")
price <- as.xts(read.zoo("stock.csv",header=TRUE,sep=",",colClasses = c("Date", rep("numeric",5))))
n <- nrow(price)
m <- nrow(price)-100
#pdf(file = "k.pdf")
chartSeries(price[c(m:n)],theme = chartTheme("white"),up.col = "red",dn.col = "green",name = "600036",time.scale = 0.5,line.type = "l",bar.type = "ohlc",major.ticks='auto', minor.ticks=TRUE)
#dev.off()
做出的图片效果如下:
R中可以使用quantmod包中的chartSeries函数画出K线图,具体的使用方法可以参考chartSeries参考文档
在Python中使用matplotlib作图
代码如下:
quotes = pr[0:80]
print(quotes)
fig,ax = plt.subplots(figsize=(30,6))
fig.subplots_adjust(bottom=0.2)
mpf.candlestick_ohlc(ax,quotes,width=0.4,colorup='r',colordown='g')
plt.grid(False)
ax.xaxis_date()
ax.autoscale_view()
plt.setp(plt.gca().get_xticklabels(), rotation=30)
plt.show()
K线效果图如下:
使用matplotlib的candlestick_ohlc的参考文档,但是目前有一些问题,比如会将非交易日期也置放在x轴,会到至K线出现断裂,等待下一步的解决方法吧。
相关的代码已经同步到最大的同 * 友网站我的Github上了,可以参考,其中stock.py是主要程序。
写在最后:因为我有近5年没使用过python了,所有代码可能不太简练。我也旨在解决问题,当然解决问题的方法千万种,比如这个例子,最直接的办法就是使用网易的下载所有(或者特定时间段)的数据为csv格式,然后用Excel画K线也可以的。
来源:https://www.jianshu.com/p/0e846ad44b3d
猜你喜欢
- 在许多用SQL Server实现的新的企业系统设计中,系统设计师需要在给数据结构和管理应用程序逻辑的定位上做出具有关键性意义的决定。SQL
- 有时需要根据项目的实际需求向spider传递参数以控制spider的行为,比如说,根据用户提交的url来控制spider爬取的网站。在这种情
- 本文实例为大家分享了Go实现文件上传的具体代码,供大家参考,具体内容如下文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进
- 什么情况下用响应缓冲会提高运行速度?例1、脚本引擎与 HTML 之间的切换频繁,对响应流写操作太多,导致性能下降:<table>
- 本文是关于人物角色的一些简单介绍,感谢瑶芝同学提供的大力帮助! 人物角色(Personas)作为一种技术
- 1.字符串的驻留机制字符串:在Python中字符串是基本的数据类型,是一个不可变的字符序列2.什么叫字符串的驻留机制仅保存一份相同且不可变字
- 1 端口映射举个例子来说明一下端口映射的作用。有A、B、C三台计算机,A、B互通,B、C互通,但是A、C不通,这个时候在C上开了一个Web服
- 根据google最新的算法规则:用户行为模式的重视程度越来越高,这也就要求网页设计的时候应注意“合理的网页结构”,SEO业界也有个共识“网页
- 一.下载安装包官网下载:python 3.6.0打开链接滑到页面最下方二. 开始安装1.双击下载好的安装文件python-3.6.0-amd
- 最简单的php语句把数据库*.sql文件导入数据库 $sql=file_get_contents("text.sql")
- 上文:成为一个顶级设计师的第二准则英文原文成为一个顶级设计师的第三准则:对比,对比,对比在设计里面,好的对比和你对颜色选择是密切相关的。对比
- 在IE下,获取Param的时候有个诡异现象(不知道算不算bug)。为了清晰起见,下面用最简单的HTML和JavaScript来说明。有这么一
- 问题场景有时候,在编写一段http接口请求程序时,发现代码中的header头和请求体中都是原网页中一样,但是,在实际请求时,接口却返回404
- 主要利用了XMLHTTP的一些方法和属性来获取服务器的信息。 以下是全部源代码: &
- 问题:python2.7 查询或者插入中文数据在mysql中的时候出现中文乱码---可能情况:1.mysql数据库各项没有设置编码,默认为&
- Python ORM 概览作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库。在这篇文章里,我们将来看看几个流
- 好久没有更新博客了,今天看到论坛上有位朋友问起全屏布局,有点像vc的界面。来了兴趣,就写了一个。运用IE6的怪异模式,通过绝对定位来实现的。
- asyncio 是 python 力推多年的携程库,与其 线程库 相得益彰,更轻量,并且协程可以访问同一进程中的变量,不需要进程间通信来传递
- 假设mysql 安装在c:盘,mysql数据库的用户名是root,密码是123456,数据库名是database_name,在d:盘根目录下
- 说到排序,我想起一个故事,大意是说唐僧师徒西游美利坚,孙悟空买了本词典,开始逐条背诵单词。他们第一次下美国馆子的时候,不管服务员推荐什么,孙