内容摘要:使用Baostock的API获取股票行情数据;格式化获得的股票行情数据。
关键模块是: ①numpy、pandas:用来处理数据 ②baostock:用来获取股票数据
# 处理数据
import numpy as np
import pandas as pd
# 获取股票数据
import baostock as bs
我们利用baostock获取股票数据。为什么用baostock,而不用tushare?
因为baostock是一个免费、开源的证券数据平台(无需注册)。 提供大量准确、完整的证券历史行情数据、上市公司财务数据等。 通过python API获取证券数据信息,满足量化交易投资者、数量金融爱好者、计量经济从业者数据需求。
下载安装 方式1: pip install baostock
使用国内源安装:
pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
方式2:访问 https://pypi.python.org/pypi/baostock 下载安装
python setup.py install或pip install xxx.whl
baostock的数据范围
股票数据
指数数据
季频财务数据
季频公司报告
我们把获取数据的相关代码,封装成函数,以方便重复调用。
函数的参数,分别为股票代码、数据开始时间、数据结束时间以及频率。 默认获取的数据项为:
date,code,open,high,low,close,volume
相关代码如下:
# 获取股票数据,并将数据规范化
def get_data(
code="sh.600000", start_date="2020-06-01", end_date="2021-03-26", frequency="d"
):
#### 登陆baostock系统 ####
lg = bs.login()
# 显示登陆返回信息
print("登录响应代码:" + lg.error_code)
print("登录响应信息:" + lg.error_msg)
data = bs.query_history_k_data_plus(
code,
fields="date,code,open,high,low,close,volume",
start_date=start_date,
end_date=end_date,
frequency="d",
adjustflag="3",
)
data_list = []
while (data.error_code == "0") & data.next():
# 获取一条记录,将记录合并在一起
data_list.append(data.get_row_data())
# 转为dataframe
result = pd.DataFrame(data_list, columns=data.fields)
# 警惕:数据全是字符串:<class 'str'>
# 把字符串转为数值
result.open = result.open.astype("float64").round(2)
result.close = result.close.astype("float64").round(2)
result.high = result.high.astype("float64").round(2)
result.low = result.low.astype("float64").round(2)
result.volume = result.volume.astype("int")
# date列转为时间类型
result.date = pd.DatetimeIndex(result.date)
# dataframe规范化
data2 = pd.DataFrame(
{
"open": result["open"].values,
"close": result["close"].values,
"high": result["high"].values,
"low": result["low"].values,
"volume": result["volume"].values,
},
index=result["date"].values
)
#### 登出系统 ####
bs.logout()
return data2
这里有几点,需要特别注意的。
- 使用baostock获取数据前,需要先登录。
- baostock不能直接返回dataframe类型的数据,需要进行相应处理,并转化。
- baostock获取的数据,都是字符串类型的。如:open 的值的类型是:<class 'str'>。因此需要将其转换为float64等类型。
比如,我们要获取格力电器的日线数据: 格力电器的代码是:000651。属于深交所的股票,因此在其代码前加sz.
,即sz.000651
data1 = get_data(code="sz.000651", start_date="2020-06-01", end_date="2021-03-26", frequency="d")
open close high low volume
2020-06-01 57.51 57.97 58.26 57.19 57925071
2020-06-02 58.88 58.09 58.98 57.71 46837490
2020-06-03 58.10 58.02 58.49 57.51 45819960
2020-06-04 58.60 59.65 59.69 58.40 65622849
2020-06-05 60.00 60.17 61.01 59.89 58536642
... ... ... ... ... ...
2021-03-22 60.05 60.94 61.19 59.60 39575697
2021-03-23 60.85 61.41 62.00 60.28 38481259
2021-03-24 61.40 61.35 62.00 61.07 32399326
2021-03-25 60.86 61.38 61.63 60.70 25338726
2021-03-26 62.60 61.62 62.93 61.18 37839591
[201 rows x 5 columns]
又如,我们要获取中国平安的1小时数据: 中国平安的代码是:601318。属于上交所的股票,因此在其代码前加sh.
,即sh.601318
data2 = get_data(code="sh.601318", start_date="2020-06-01", end_date="2021-03-26", frequency="60m")
open close high low volume
2020-06-01 71.40 72.16 72.23 71.23 45767284
2020-06-02 72.02 74.28 74.53 72.01 81052327
2020-06-03 75.00 75.01 76.69 75.00 99148840
2020-06-04 75.42 75.14 75.71 74.58 45388022
2020-06-05 75.14 75.30 75.44 74.40 34980754
... ... ... ... ... ...
2021-03-22 79.99 79.82 80.27 79.53 54273091
2021-03-23 79.89 80.05 80.60 79.12 51116947
2021-03-24 79.99 79.01 80.30 78.71 63315814
2021-03-25 79.23 79.20 79.66 78.99 43650615
2021-03-26 79.58 80.01 80.30 79.56 45348477
[201 rows x 5 columns]
我们成功地获取了股票的数据,数据是量化交易的基础,有了数据,我们就可以愉快地进行数据分析了!
# 处理数据
import numpy as np
import pandas as pd
# 获取股票数据
import baostock as bs
# 获取股票数据,并将数据规范化
def get_data(
code="sh.600000", start_date="2020-06-01", end_date="2021-03-26", frequency="d"
):
#### 登陆baostock系统 ####
lg = bs.login()
# 显示登陆返回信息
print("登录响应代码:" + lg.error_code)
print("登录响应信息:" + lg.error_msg)
data = bs.query_history_k_data_plus(
code,
fields="date,code,open,high,low,close,volume",
start_date=start_date,
end_date=end_date,
frequency="d",
adjustflag="3",
)
data_list = []
while (data.error_code == "0") & data.next():
# 获取一条记录,将记录合并在一起
data_list.append(data.get_row_data())
# 转为dataframe
result = pd.DataFrame(data_list, columns=data.fields)
# 警惕:数据全是字符串:<class 'str'>
# 把字符串转为数值
result.open = result.open.astype("float64").round(2)
result.close = result.close.astype("float64").round(2)
result.high = result.high.astype("float64").round(2)
result.low = result.low.astype("float64").round(2)
result.volume = result.volume.astype("int")
# date列转为时间类型
result.date = pd.DatetimeIndex(result.date)
# dataframe规范化
data2 = pd.DataFrame(
{
"open": result["open"].values,
"close": result["close"].values,
"high": result["high"].values,
"low": result["low"].values,
"volume": result["volume"].values,
},
index=result["date"].values
)
#### 登出系统 ####
bs.logout()
return data2
# 获取格力电器的日线数据
data1 = get_data(code="sz.000651", start_date="2020-06-01", end_date="2021-03-26", frequency="d")
print(data1)
# 获取中国平安的1小时数据
data2 = get_data(code="sh.601318", start_date="2020-06-01", end_date="2021-03-26", frequency="60m")
print(data2)
print('执行完毕!')