使用Python画股票的K线图的方法步骤


Posted in Python onJune 28, 2019

导言

本文简单介绍了如何从网易财经获取某支股票的价格数据,并根据价格数据画出相应的日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,是按照年度和季度来构成的,我们发现搜索数据也是用年度和季度来搜索的。

使用Python画股票的K线图的方法步骤

招商银行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模块的数据对抓取的网页内容进行初步的处理,分为了三个过程

  1. 首先匹配"</thead[\s\S]*</tr>    </table>"之间的内容并返回,因为在这之间的内容包含了所有需要的数据,这是一个简单的正则表达式,表示返回</thead和</tr>    </table>两个字符串之间的所有内容
  2. 匹配<td class='cGreen'>、<td class='cRed'>并使用<td>替换,因为这两个字符串会影响后续的匹配数据,现行替换掉可以更方便的匹配到需要的数据
  3. 替换到千分位","号,因为Python和R并不会识别有千分位号的数据,所以我们要将数据转换为非千分位的数据。
  4. tab是按照要求最后获取的包含数据和文本的原始内容
  5. 用if函数来获取除文本的数据,因为如果year和season超过了当前的界限,会返回空的tab,所以我们在这里进行判断,如果少了这个判断,会报出index error。这个if函数表示了如果tab为空,data也是个空的列表,如果tab不为空,那么根据pattern3返回需要的数据至data列表
  6. 用一个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以及其它)思路很简单:

  1. 根据code构建其股票数据的页面的url列表
  2. 使用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()

做出的图片效果如下:

 使用Python画股票的K线图的方法步骤

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线效果图如下:

使用Python画股票的K线图的方法步骤

使用matplotlib的candlestick_ohlc的参考文档,但是目前有一些问题,比如会将非交易日期也置放在x轴,会到至K线出现断裂,等待下一步的解决方法吧。

相关的代码已经同步到最大的同性交友网站我的Github上了,可以参考,其中stock.py是主要程序。

写在最后:因为我有近5年没使用过python了,所有代码可能不太简练。我也旨在解决问题,当然解决问题的方法千万种,比如这个例子,最直接的办法就是使用网易的下载所有(或者特定时间段)的数据为csv格式,然后用Excel画K线也可以的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python yield使用方法示例
Dec 04 Python
Python求两个list的差集、交集与并集的方法
Nov 01 Python
Python中自定义函数的教程
Apr 27 Python
独特的python循环语句
Nov 20 Python
Python3安装Pymongo详细步骤
May 26 Python
Python和Go语言的区别总结
Feb 20 Python
Python3中列表list合并的四种方法
Apr 19 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
详解python tcp编程
Aug 24 Python
连接pandas以及数组转pandas的方法
Jun 28 #Python
python3实现猜数字游戏
Dec 07 #Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 #Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 #Python
使用Python中的reduce()函数求积的实例
Jun 28 #Python
centos 安装Python3 及对应的pip教程详解
Jun 28 #Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 #Python
You might like
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
python实现百度关键词排名查询
2014/03/30 Python
Python合并多个装饰器小技巧
2015/04/28 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
学校党员对照检查材料
2014/08/28 职场文书
大学迎新生标语
2014/10/06 职场文书
教师节班会主持词
2015/07/06 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
python获取带有返回值的多线程
2022/05/02 Python