更多精彩內容,歡迎關注公眾號:數量技術宅,也可添加技術宅個人微信號:sljsz01,與我交流。
免費、開源的股票爬蟲Python庫:Easyquotation
我們在此前的文章中,向大家分享了如何用Python爬蟲,從新浪財經獲取實時的股票數據:(文章鏈接)。本期文章,我們將介紹一個股票數據爬蟲的進階工具:一個叫做Easyquotation的Python三方庫,這個py三方庫內置了爬取多個不同的股票數據源的功能,數據源包括:
-
新浪財經:全部A股實時行情(snapshot)
-
集思錄:分級基金、ETF、QDII實時數據
-
新浪財經的實時行情,我們不再贅述。對於集思錄,這是一個提供側重債息相關的投資品種,例如新股、可轉債、分級基金、債券、封閉基金、QDII、ETF、LOF 等資產標的數據的專業平台,投資者可以通過集思錄數據,分析理論價值及其偏差,找到各種低風險的套利機會,而Easyquotation支持我們從集思錄上爬取其公布的數據,進而可以使用Python跟蹤套利機會。對於騰訊財經,它不僅提供A股的日內行情,還提供港股的日K線數據以及實時行情數據,對於有港股交易需求的朋友來說,爬取騰訊財經的免費港股數據,不失為一個經濟的方案。
使用准備
接下來,我們介紹在使用Easyquotation前,需要做的准備工作,大致可以分為兩步:
首先,我們需要安裝Requests三方庫。Requests庫可以說是所有爬蟲的”標配“,Requests是用python語言基於urllib編寫的,采用的是Apache2 Licensed開源協議的HTTP庫。與urllib相比,Requests更加方便,可以節約我們大量的工作。由於easyquotation的爬蟲依賴Requests庫,所以我們必須先確保電腦中安裝好Requests庫。
第二步,安裝Easyquotation。Easyquotation有兩種安裝方式,我們既可以通過pip install的方式進行一鍵安裝,也可也從github上clone對應的庫文件,進行手工安裝。安裝完Easyquotation庫,我們就可以開始使用它了。
簡要介紹
在實測代碼使用Easyquotation之前,我們先對其主體邏輯,做一個簡單介紹:
首先,Easyquotation的Api提供了一個入口,允許我們在使用時,選擇爬取哪個數據源,Easyquotation支持的數據源包括:新浪、集思錄、騰訊以及中國銀行(匯率),中國銀行的數據源主要為了讀取美元人民幣等主流外匯的匯率,我們平時用的比較少,所以文章重點介紹前3個爬蟲數據源的使用:新浪財經、集思錄、騰訊財經。
其次,Easyquotation有一個名為Basequotation基類,這個基類大家不需要特別理解它的技術細節,只需要知道它的總體功能,包括兩方面:一是定義爬蟲獲取數據的基礎函數,二是創建查詢線程池。
最后,是各個擴展子類,子類有三大功能:繼承基類函數、重載自定義行情源、接收數據的處理函數。而我們后續要做的實測,就是將子類進行實例化。比如我們用新浪財經的爬蟲數據,就是實例化Sina的子類,而如果我們用集思錄的爬蟲數據,就是實例化jsl的子類,其他子類,皆可以此類推。
實測:新浪財經爬蟲
示例1:新浪財經爬取全市場股票實時數據(snapshot)。Easyquotation中有一個好用的方法market_snapshot,可以用一個函數爬取到滬深兩市所有股票的實時數據(snapshot)。
import easyquotation
quotation = easyquotation.use('sina')
Res_Sina_AllSnap = quotation.market_snapshot(prefix=True)
示例2:獲取交易所上市ETF的實時Ticker數據,調用real方法,我們以513050中概互聯為例,獲取到該ETF相應的Ticker,具體字段參見運行結果截圖。
Res_Sina_stock = quotation.real('513050')
示例3:獲取個股實時Ticker數據,調用stocks方法,該方法支持同時獲取多個個股,采用逗號分隔的形式,例如我們同時獲取600519、601888的實時Ticker數據,返回的字段與ETF的Ticker數據字段相同。
Res_Sina_stocks = quotation.stocks(['600519', '601888'])
示例4:獲取交易所指數的實時Ticker數據,同樣調用stocks方法,同樣支持同時獲取多個指數,仍采用逗號分隔的形式,我們這里實時獲取sh000001上證指數、sz000001深圳綜指的Ticker數據。需要注意的是,由於指數不存在盤口,所以此時返回的bid、ask數據都為0。
Res_Sina_index = quotation.stocks(['sh000001', 'sz000001'], prefix=True)
實測:集思錄爬蟲
分級B數據字段
ETF數據字段
QDII數據字段
實測:騰訊財經爬蟲
示例1:A股日內分時圖
我們通過騰訊財經,可以獲取到A股個股當日的完整分時數據,從而畫出該股票的日內分時圖,有了分時數據,我們可以利用分時數據,做我們想要的日內指標、進出場點位的計算。
在下面的代碼中,我們仍然以600519貴州茅台為例,通過real方法獲取股票日內分時數據,並將分時圖用Python繪圖工具繪制出來。
quotation = easyquotation.use("timekline")
querycode = '600519'
Res_tx_mindata = quotation.real([querycode], prefix=True)
querykey = 'sh' + querycode + '.js'
mindata = pd.DataFrame(Res_tx_mindata[querykey]['time_data'], columns=['time', 'close', 'volume'])
mindata['close'] = mindata['close'].map(lambda x: float(x))
mindata['volume'] = mindata['volume'].map(lambda x: int(x))
fig, ax = plt.subplots(1, 1)
ax_sub = ax.twinx() # 共享x軸,生成次坐標軸
l1, = ax.plot(mindata.time, mindata.close, 'r-', label='price')
l2, = ax_sub.plot(mindata.time, mindata.volume, 'b-', label='volume')
plt.legend(handles=[l1, l2], labels=['price', 'volume'], loc=0)
ax.set_ylabel('price')
ax_sub.set_ylabel('volume')
ax.set_xlabel('time')
ax.set_title('stock realtime')
x_major_locator = MultipleLocator(10)
ax.xaxis.set_major_locator(x_major_locator)
示例2:港股日線數據
除了A股的日內分時數據外,我們還可以通過real方法,獲取到港股的日k線數據,只需要向該方法的參數中,傳入5位數的港股股票代碼,即可調用該部分數據。獲取數據后,我們仍然用Python繪圖,將示例股票00700騰訊控股的日k線數據量、價數據,繪制出來。
querycode = '00700'
Res_tx_hk_dailydata = quotation.real([querycode])
hk_dailydata = pd.DataFrame(Res_tx_hk_dailydata[querycode],
columns=['Date', 'Open', 'Close', 'High', 'Low', 'volume', 'divi', 'none', 'amount'])
hk_dailydata['Close'] = hk_dailydata['Close'].map(lambda x: float(x))
hk_dailydata['volume'] = hk_dailydata['volume'].map(lambda x: float(x))
fig, ax = plt.subplots(1, 1)
ax_sub = ax.twinx() # 共享x軸,生成次坐標軸
l1, = ax.plot(hk_dailydata.Date, hk_dailydata.Close, 'r-', label='price')
l2, = ax_sub.plot(hk_dailydata.Date, hk_dailydata.volume, 'b-', label='volume')
plt.legend(handles=[l1, l2], labels=['price', 'volume'], loc=0)
ax.set_ylabel('price')
ax_sub.set_ylabel('volume')
ax.set_xlabel('time')
ax.set_title(querycode + ' stock daily')
x_major_locator = MultipleLocator(120)
ax.xaxis.set_major_locator(x_major_locator)
示例3:港股實時行情
quotation = easyquotation.use("hkquote")
Res_tx_hk_Snap = quotation.real(['00001', '00700'])
往期干貨分享推薦閱讀
Omega System Trading and Development Club內部分享策略Easylanguage源碼
【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略
AMA指標原作者Perry Kaufman 100+套交易策略源碼分享
【數量技術宅|金融數據系列分享】套利策略的價差序列計算,恐怕沒有你想的那么簡單
【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略
【數量技術宅|金融數據分析系列分享】為什么中證500(IC)是最適合長期做多的指數
商品現貨數據不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享
【數量技術宅|金融數據分析系列分享】如何正確抄底商品期貨、大宗商品