爬取股票歷史數據並繪製K線圖
來自專欄 Python程序員
作者:簡單的happy Python愛好者社區專欄作者
博客專欄:簡單的happy
有時候我們爬下股票數據後想在自己平台上顯示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 requestsfrom lxml import etreeheaders = { 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 Falsedef 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_datedef 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.htmlresponse = 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 pdstock = 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 Klinestock_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 Lineline = Line(stock_name+(+stock_code+)+收盤價日折線圖)close = stock_new_sorted[收盤價]line.add("收盤價日折線圖", index, close,is_datazoom_show=True)line
如要在同一張圖上顯示兩個圖,可用Overlap
from pyecharts import Kline,Line,Overlapoverlap = Overlap()overlap.add(kline)overlap.add(line)overlap
同樣的,也在繪製5日均線,10日均線等。
推薦閱讀:
※python with提前退出:坑與解決方案
※python基礎-def
※Python—PIL基本概念介紹
※通俗的講,網路爬蟲到底是什麼?
※Python每日一練0002