引言
有时候我们爬下股票数据后想在自己平台上显示K线图之类的。当然有时候嫌麻烦就直接截图了,可看图片毕竟不是很灵活,想看具体某天的无法显示,所以还是自己画比较好。今天看了pyecharts,感觉很不错。(https://github.com/pyecharts/pyecharts)
爬取某只股票的历史数据
网易财经可以下载历史交易数据,以科大讯飞为例(http://quotes.money.163.com/trade/lsjysj_002230.html)
找到历史数据下载入口链接为:
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()
取最近180天的数据,并按日期从小到大排列
stock_new = stock.iloc[:180,:]
stock_new_sorted = stock_new.sort_values('日期', ascending=True)
stock_new_sorted.head()
取日期为横坐标,绘制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
绘制收盘价的折线图
from pyecharts import Line
line = Line(stock_name+'('+stock_code+')'+'收盘价日折线图')
close = stock_new_sorted['收盘价']
line.add("收盘价日折线图", index, close,is_datazoom_show=True)
line
如要在同一张图上显示两个图,可用Overlap
from pyecharts import Kline,Line,Overlap
overlap = Overlap()
overlap.add(kline)
overlap.add(line)
overlap
同样的,也在绘制5日均线,10日均线等。