导言
本文简单介绍了如何从网易财经获取某支股票的价格数据,并根据价格数据画出相应的日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"color: #ff0000">定义获取数据的函数
代码如下:
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>(.*"</thead[\s\S]*</tr> </table>"之间的内容并返回,因为在这之间的内容包含了所有需要的数据,这是一个简单的正则表达式,表示返回</thead和</tr> </table>两个字符串之间的所有内容
所以定义了以上的函数后,就可以使用该函数返回特定url的数据。
获取某支股票的数据
代码如下:
def get_stock_price(code): url1 = "http://quotes.money.163.com/trade/lsjysj_" url2 = ".html" 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线也可以的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Python,K线图
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]