需求是下載比如從2020-01-01到2022-12-31區(qū)間的滬深300成分股每支股票的日K線數(shù)據(jù),沒錯這是個面板數(shù)據(jù),原本以為直接通過Python接口可以直接下載到,因為之前找的上證綜指啥的用R的pedquant都是直接獲取的(看來因為是單支)。
搗鼓了半天,還是我想的簡單了……
試過Akshare、Tushare、Baostock以及聚寬量化平臺下載,下面總結(jié)一下下載心得 o_0
1、Baostock
那就先說最后選用的這個開源的證券數(shù)據(jù)平臺Baostock
鏈接附此 www.baostock.com
通過python API獲取證券數(shù)據(jù)信息
# 豆瓣源下載包
pip install -i https://pypi.douban.com/simple baostock
首先獲取滬深300成分股每支股票的code和code_name
日期這里就不做額外的要求了,默認更新到的哪天
import pandas as pd
import numpy as np
import baostock as bs
# 登陸系統(tǒng)
lg = bs.login()
# 顯示登陸返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 獲取滬深300成分股
rs = bs.query_hs300_stocks()
print('query_hs300 error_code:'+rs.error_code)
print('query_hs300 error_msg:'+rs.error_msg)
# 打印結(jié)果集
hs300_stocks = []
while (rs.error_code == '0') & rs.next():
# 獲取一條記錄,將記錄合并在一起
hs300_stocks.append(rs.get_row_data())
result = pd.DataFrame(hs300_stocks, columns=rs.fields)
# 結(jié)果集輸出到csv文件
result.to_csv("D:/hs300_stocks.csv", encoding="gbk", index=False)
print(result)
# 登出系統(tǒng)
bs.logout()
獲取到的300支股票名
login success!
login respond error_code:0
login respond error_msg:success
query_hs300 error_code:0
query_hs300 error_msg:success
updateDate code code_name
0 2023-03-20 sh.600000 浦發(fā)銀行
1 2023-03-20 sh.600009 上海機場
2 2023-03-20 sh.600010 包鋼股份
3 2023-03-20 sh.600011 華能國際
4 2023-03-20 sh.600015 華夏銀行
.. ... ... ...
295 2023-03-20 sz.300896 愛美客
296 2023-03-20 sz.300919 中偉股份
297 2023-03-20 sz.300957 貝泰妮
298 2023-03-20 sz.300979 華利集團
299 2023-03-20 sz.300999 金龍魚
[300 rows x 3 columns]
logout success!
接著我們導入獲取的股票名csv
hs=pd.read_csv('D:/hs300_stocks.csv',encoding='gbk')
通過循環(huán)300次code進行日K線數(shù)據(jù)獲取
#### 登陸系統(tǒng) ####
lg = bs.login()
# 顯示登陸返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 詳細指標參數(shù),參見“歷史行情指標參數(shù)”章節(jié);“分鐘線”參數(shù)與“日線”參數(shù)不同?!胺昼娋€”不包含指數(shù)。
# 分鐘線指標:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月線指標:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
for i in range(300):
rs = bs.query_history_k_data_plus(hs['code'][i],
"date,code,open,high,low,close,preclose,volume,amount,turn,tradestatus,pctChg,isST",
start_date='2021-01-01', end_date='2023-07-01',
# 日K線,adjustflag="3"不復權(quán)
frequency="d", adjustflag="3")
print(f'query_history_k_data_plus respond error_code{i}:'+rs.error_code)
print(f'query_history_k_data_plus respond error_msg{i}:'+rs.error_msg)
#### 打印結(jié)果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 獲取一條記錄,將記錄合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# to_csv中 mode='a'進行數(shù)據(jù)追加,去掉索引和表頭
result.to_csv("D:\hs300.csv",mode='a',index=False,header=False)
#### 登出系統(tǒng) ####
bs.logout()
來看一下運行情況
login success!
login respond error_code:0
login respond error_msg:success
query_history_k_data_plus respond error_code0:0
query_history_k_data_plus respond error_msg0:success
query_history_k_data_plus respond error_code1:0
query_history_k_data_plus respond error_msg1:success
query_history_k_data_plus respond error_code2:0
query_history_k_data_plus respond error_msg2:success
......
query_history_k_data_plus respond error_code299:0
query_history_k_data_plus respond error_msg299:success
logout success!
300支已就位,數(shù)據(jù)還是比較多的,除了常見的open、high、low、close等,還有turn換手率、tradestatus交易狀態(tài)(1:正常交易 0:停牌)、pctChg漲跌幅、isST是否ST股(1是,0否)
想要其他指標還可以自己加,比如peTTM滾動市盈率、pbMRQ市凈率等;
或者分鐘線、周月線,通過frequency=" "修改,默認為d,日k線;w=周、m=月、5=5分鐘、60=60分鐘k線數(shù)據(jù)等
Baostock真的是很良心了,相比之下其余三個總是缺胳膊少腿
2、Tushare pro版
其實一開始比較想用的是Tushare,因為相對來說Tushare獲取同樣數(shù)據(jù)的代碼量比Baostock少多了,也不用登錄退出啥的,直接一步到位
鏈接附此 Tushare數(shù)據(jù)平臺
需要先注冊個賬號,獲取個人Token
在上述已經(jīng)獲得滬深300成分股的code條件下,以獲取兩支股票為例,代碼量是相當?shù)纳?/p>
import tushare as ts
pro = ts.pro_api('your token') # 復制上面的接口token就好
df1=pro.daily(ts_code='600000.sh,600009.sh', start_date='20220101', end_date='20220701')
df1
獲取到的數(shù)據(jù)也是比較齊全的,排列跟Baostock不同,按同一時間的所有股票先排
但是這個平臺特別坑的一點就是……我就下載了沒幾次怎么就下不下來了?。?!
后面換了好幾個時間繼續(xù)下也還是空的,不知道是積分不夠還是咋滴,還是棄了……
3、AKshare
這個接口的代碼量也很少,少的我心動,獲取到的數(shù)據(jù)名還都是中文的
import akshare as ak
df = ak.index_zh_a_hist(symbol = "000905", period = "daily", start_date = "20200101", end_date = "20221231" )
df
然而……
一時間沒找到股票code在這里對應(yīng)的symbol,沒后綴名,連前綴的都不一樣,統(tǒng)一code麻煩,還是算了
4、聚寬量化平臺
鏈接附此 聚寬Join Quant
本來都已經(jīng)注冊好了,看著代碼量也不是很多,最重要的是它可以動態(tài)地獲取滬深300每一天包括的成分股,然后根據(jù)獲取到的code下載數(shù)據(jù),也免了上面這一頓code_name獲取操作
可申請一年試用,就可以獲取數(shù)據(jù),但是好像數(shù)據(jù)種類不是很多,示例只看到常規(guī)的open、close那6個,不知道能否改參數(shù)
遍歷日期,通過動態(tài)獲取滬深300成分股code來獲取數(shù)據(jù),有需要的可以試試文章來源:http://www.zghlxwxcb.cn/news/detail-842136.html
#導入聚寬數(shù)據(jù)的sdk
import jqdatasdk as jd
from datetime import date,timedelta
jd.auth("賬號","密碼")
#數(shù)據(jù)儲存路徑
filename='D:\jukuan.csv'
#遍歷歷史日期,并逐步導入數(shù)據(jù)到csv文件
for i in range(30):
trade_date=date(2020,1,2)+timedelta(days=i)
stocks=jd.get_index_stocks('000300.XSHG', date=trade_date)
df=jd.get_price(stocks,start_date=trade_date, end_date=trade_date,
frequency='daily',skip_paused=False).to_frame()
df.to_csv(filename,mode='a',header=None)
總的來看還是選擇了Baostock,對這些平臺也不是很了解,可能有些參數(shù)沒注意到,如果有更好獲取股票數(shù)據(jù)的方法,望留言分享一起學習,不勝感激!文章來源地址http://www.zghlxwxcb.cn/news/detail-842136.html
到了這里,關(guān)于Python獲取股票數(shù)據(jù)——以滬深300成分股為例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!