使用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判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
python+pygame简单画板实现代码实例
Dec 13 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
Django stark组件使用及原理详解
Aug 22 Python
python线程定时器Timer实现原理解析
Nov 30 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
python文件和文件夹复制函数
Feb 07 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
python内置模块之上下文管理contextlib
Jun 14 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
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
简单的js表单验证函数
2013/10/28 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
js 调用百度分享功能
2017/02/27 Javascript
vue-axios使用详解
2017/05/10 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
使用Python设计一个代码统计工具
2018/04/04 Python
Linux下多个Python版本安装教程
2018/08/15 Python
python selenium firefox使用详解
2019/02/26 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
树莓派升级python的具体步骤
2020/07/05 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
致裁判员加油稿
2014/02/08 职场文书
我爱我校演讲稿
2014/05/21 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
PyMongo 查询数据的实现
2021/06/28 Python
SQL注入详解及防范方法
2021/12/06 MySQL