爬取股票歷史數據並繪製K線圖

爬取股票歷史數據並繪製K線圖

來自專欄 Python程序員

作者:簡單的happy Python愛好者社區專欄作者

博客專欄:簡單的happy

有時候我們爬下股票數據後想在自己平台上顯示K線圖之類的。當然有時候嫌麻煩就直接截圖了,可看圖片畢竟不是很靈活,想看具體某天的無法顯示,所以還是自己畫比較好。今天看了pyecharts,感覺很不錯。(github.com/pyecharts/py

爬取某隻股票的歷史數據

網易財經可以下載歷史交易數據,以科大訊飛為例(quotes.money.163.com/tr

找到歷史數據下載入口鏈接為:

quotes.money.163.com/se

多找幾隻股票歷史數據下載鏈接後便能發現其規律:

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

TAG:股票 | Python | 數據可視化 |