爬取股票历史数据并绘制K线图

浏览: 4204

引言

有时候我们爬下股票数据后想在自己平台上显示K线图之类的。当然有时候嫌麻烦就直接截图了,可看图片毕竟不是很灵活,想看具体某天的无法显示,所以还是自己画比较好。今天看了pyecharts,感觉很不错。(https://github.com/pyecharts/pyecharts

爬取某只股票的历史数据

网易财经可以下载历史交易数据,以科大讯飞为例(http://quotes.money.163.com/trade/lsjysj_002230.html

image.png

image.png

找到历史数据下载入口链接为:

http://quotes.money.163.com/service/chddata.html?code=1002230&start=20080425&end=20180105&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP

多找几只股票历史数据下载链接后便能发现其规律:

download_url = "http://quotes.money.163.com/service/chddata.html?code="+code+"&start="+start_date+"&end="+end_date+
    "&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"

url中的参数code,start和end的值会变,其他参数值固定。

其中code的参数值为该股票所属沪市(0)或深市(1)的代码+股票代码,

start参数为要下载的日期期间的开始值(默认为上市日),

end参数为要下载的日期期间的截至值(默认为下载当天,即今日)。

这里我们暂时指定要爬的股票为深市,取上市日截至到今日的历史数据。

import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
}
def parse_url(url):
response = requests.get(url,headers=headers)
if response.status_code == 200:
return etree.HTML(response.content)
return False
def get_date(response):
# 得到股票代码,开始和结束的日期
start_date = ''.join(response.xpath('//input[@name="date_start_type"]/@value')[0].split('-'))
end_date = ''.join(response.xpath('//input[@name="date_end_type"]/@value')[0].split('-'))
code = response.xpath('//h1[@class="name"]/span/a/text()')[0]
return code,start_date,end_date
def download(code,start_date, end_date):
download_url = "http://quotes.money.163.com/service/chddata.html?code=1"+code+"&start="+start_date+"&end="+end_date+\
"&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"
print(download_url)
data = requests.get(download_url,headers=headers)
f = open(code + '.csv', 'wb')
for chunk in data.iter_content(chunk_size=10000):
if chunk:
f.write(chunk)
print('股票---',code,'历史数据正在下载')

url = 'http://quotes.money.163.com/trade/lsjysj_002230.html'
response = parse_url(url)
code,start_date,end_date = get_date(response)
download(code,start_date, end_date)

用pyecharts绘制K线图

使用pandas读入下载好的数据,绘制K线图只需要日期,开盘价,收盘价,最高价和最低价,就只读入前7列即可。

import pandas as pd
stock = pd.read_csv(code + '.csv',usecols=[0,1,2,3,4,5,6],encoding='gbk')
stock.head()

image.png

取最近180天的数据,并按日期从小到大排列

stock_new = stock.iloc[:180,:]
stock_new_sorted = stock_new.sort_values('日期', ascending=True)
stock_new_sorted.head()

image.png

取日期为横坐标,绘制K线图

from pyecharts import Kline
stock_code = stock_new_sorted['股票代码'][0]
stock_name = stock_new_sorted['名称'][0]
index = stock_new_sorted['日期']
v = [[o,close,lowest,highest] for o,close,lowest,highest in
zip(stock_new_sorted['开盘价'],stock_new_sorted['收盘价'],stock_new_sorted['最低价'],stock_new_sorted['最高价'])]
kline = Kline()
kline.add(stock_name+'('+stock_code+')'+'日K线图', index, v,mark_point=["max"], is_datazoom_show=True)
kline

image.png

绘制收盘价的折线图

from pyecharts import Line
line = Line(stock_name+'('+stock_code+')'+'收盘价日折线图')
close = stock_new_sorted['收盘价']
line.add("收盘价日折线图", index, close,is_datazoom_show=True)
line

image.png

如要在同一张图上显示两个图,可用Overlap

from pyecharts import Kline,Line,Overlap
overlap = Overlap()
overlap.add(kline)
overlap.add(line)
overlap

image.png


同样的,也在绘制5日均线,10日均线等。

推荐 7
本文由 _缘君_ 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册