小編給大家分享一下如何使用Python畫股票的K線圖,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)雅安移動機房報價,主機托管價格性價比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。Python的優(yōu)點有哪些1、簡單易用,與C/C++、Java、C# 等傳統(tǒng)語言相比,Python對代碼格式的要求沒有那么嚴(yán)格;2、Python屬于開源的,所有人都可以看到源代碼,并且可以被移植在許多平臺上使用;3、Python面向?qū)ο?,能夠支持面向過程編程,也支持面向?qū)ο缶幊蹋?、Python是一種解釋性語言,Python寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序;5、Python功能強大,擁有的模塊眾多,基本能夠?qū)崿F(xiàn)所有的常見功能。
導(dǎo)言
第一步:從網(wǎng)易財經(jīng)獲取股票的價格數(shù)據(jù)
我一般是在網(wǎng)易財經(jīng)查看某支股票的價格和成交數(shù)據(jù),網(wǎng)易財經(jīng)可以查到任意滬深的股票,我們使用招商銀行的數(shù)據(jù)作為參考。
1、構(gòu)建爬蟲獲取股票價格數(shù)據(jù)
這里不對Python做介紹了,如果需要了解什么是Python,可以自行百度或者訪問Python官網(wǎng).
加載需要的模塊
代碼如下:
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內(nèi)容的包,主要是從url獲取網(wǎng)頁內(nèi)容;re是正則表達(dá)式包,本文會使用正則表達(dá)式來從抓取的網(wǎng)頁數(shù)據(jù)中獲取到有用的數(shù)據(jù);time和datetime是時間相關(guān)的包,主要用來設(shè)定要抓取的時間以及其它相關(guān)時間的處理;csv包是用來生成csv數(shù)據(jù)(該數(shù)據(jù)會被用于R來畫K線圖),其余的幾個包會在使用時單獨介紹,你也可以在需要的時候在程序頭部補充import。
設(shè)定時間相關(guān)
代碼如下:
t = time.localtime() # 獲取當(dāng)前的本地時間 year = range(t[0],1989,-1) # 設(shè)定年度范圍,從當(dāng)前年度至滬市開市的年份倒序生成 season = range(4,0,-1) # 生成季度的數(shù)據(jù)列表,從4季度到1季度倒序生成
為什么要這么設(shè)定時間呢?仔細(xì)的查看網(wǎng)易股票數(shù)據(jù)的url,是按照年度和季度來構(gòu)成的,我們發(fā)現(xiàn)搜索數(shù)據(jù)也是用年度和季度來搜索的。
招商銀行2017年1季度數(shù)據(jù)
其url構(gòu)成如下:http://quotes.money.163.com/trade/lsjysj_600036.html?year=2017&season=1可見可拆為6個子字符串,分別是http://quotes.money.163.com/trade/lsjysj_、600036、.html?year=、2017、&season=、1。其中第2、4、6個子串可以參數(shù)化輸入獲取特定需求的數(shù)據(jù)。
定義獲取數(shù)據(jù)的函數(shù)
代碼如下:
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>(.*?)</td>') data = re.findall(pattern3, str(tab)) for d in data: if d == '': data.remove('') return data
本段代碼定義個一個函數(shù)getDate(url),函數(shù)名為getData,參數(shù)為url。相當(dāng)于從該url獲取股票的交易數(shù)據(jù),顯然這個函數(shù)是定制的。
首先,我們用urllib2模塊的相關(guān)函數(shù)解析并獲取網(wǎng)頁的數(shù)據(jù)。第二步,使用re模塊的數(shù)據(jù)對抓取的網(wǎng)頁內(nèi)容進行初步的處理,分為了三個過程
首先匹配"</thead[\s\S]*</tr> </table>"之間的內(nèi)容并返回,因為在這之間的內(nèi)容包含了所有需要的數(shù)據(jù),這是一個簡單的正則表達(dá)式,表示返回</thead和</tr> </table>兩個字符串之間的所有內(nèi)容
匹配<td class='cGreen'>、<td class='cRed'>并使用<td>替換,因為這兩個字符串會影響后續(xù)的匹配數(shù)據(jù),現(xiàn)行替換掉可以更方便的匹配到需要的數(shù)據(jù)
替換到千分位","號,因為Python和R并不會識別有千分位號的數(shù)據(jù),所以我們要將數(shù)據(jù)轉(zhuǎn)換為非千分位的數(shù)據(jù)。
tab是按照要求最后獲取的包含數(shù)據(jù)和文本的原始內(nèi)容
用if函數(shù)來獲取除文本的數(shù)據(jù),因為如果year和season超過了當(dāng)前的界限,會返回空的tab,所以我們在這里進行判斷,如果少了這個判斷,會報出index error。這個if函數(shù)表示了如果tab為空,data也是個空的列表,如果tab不為空,那么根據(jù)pattern3返回需要的數(shù)據(jù)至data列表
用一個for循環(huán)來遍歷data列表,刪除空白的內(nèi)容(其實這一步不需要,因為在if中已經(jīng)剔除了空的內(nèi)容。
所以定義了以上的函數(shù)后,就可以使用該函數(shù)返回特定url的數(shù)據(jù)。
獲取某支股票的數(shù)據(jù)
代碼如下:
def get_stock_price(code): url1 = "http://quotes.money.163.com/trade/lsjysj_" url2 = ".html?year=" 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)函數(shù),code是指股票代碼,使用該函數(shù)可以返回該股票所有的歷史數(shù)據(jù)(OHLC以及其它)思路很簡單:
根據(jù)code構(gòu)建其股票數(shù)據(jù)的頁面的url列表
使用getData(url)函數(shù)和for循環(huán),返回所有的歷史數(shù)據(jù)
最終返回的是price的數(shù)據(jù)列表
這樣,我們就可以使用該函數(shù)獲取某支股票的所有歷史數(shù)據(jù):
# get all histrocial data include all price and others price = get_stock_price(600036)
獲取招商銀行(600036)的所有歷史數(shù)據(jù)。
2、保存數(shù)據(jù)
保存為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模塊保存數(shù)據(jù)為csv文件,用于在R中讀取并作圖,我們查看在網(wǎng)易的數(shù)據(jù)展示可以發(fā)現(xiàn),總共11個字段,所有我們在每11個切片中,返回時間、OHLC(開盤價、最高價、最低價、收盤價)和交易量的數(shù)據(jù)并保存為csv的文件格式。
處理保存數(shù)據(jù)到列表
代碼如下:
# 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])]] )
這個程序片段是用來處理和保存數(shù)據(jù)用于在pyhton中做出K線圖。
定義函數(shù)將字符串的時間處理為matplotlib中作圖使用的數(shù)值(直接獲取的數(shù)據(jù)中時間是字符串)
返回返回時間、OHLC(開盤價、最高價、最低價、收盤價)和交易量的數(shù)據(jù)并存儲在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函數(shù)畫出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線出現(xiàn)斷裂,等待下一步的解決方法吧。
相關(guān)的代碼已經(jīng)同步到大的同性交友網(wǎng)站我的Github上了,可以參考,其中stock.py是主要程序。
寫在最后:因為我有近5年沒使用過python了,所有代碼可能不太簡練。我也旨在解決問題,當(dāng)然解決問題的方法千萬種,比如這個例子,最直接的辦法就是使用網(wǎng)易的下載所有(或者特定時間段)的數(shù)據(jù)為csv格式,然后用Excel畫K線也可以的。
看完了這篇文章,相信你對“如何使用Python畫股票的K線圖”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前標(biāo)題:如何使用Python畫股票的K線圖-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://jinyejixie.com/article32/dpeopc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、小程序開發(fā)、網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、網(wǎng)站營銷、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容