当前位置: 首页 > 工具软件 > BaoStock > 使用案例 >

如何使用python获取免费的股票行情数据?使用Baostock的API获取股票数据

后星河
2023-12-01

如何获取免费的股票行情数据?

内容摘要:使用Baostock的API获取股票行情数据;格式化获得的股票行情数据。


1.导入必要的模块

关键模块是: ①numpy、pandas:用来处理数据 ②baostock:用来获取股票数据



# 处理数据
import numpy as np
import pandas as pd

# 获取股票数据
import baostock as bs

2.获取股票数据

我们利用baostock获取股票数据。为什么用baostock,而不用tushare?


因为baostock是一个免费、开源的证券数据平台(无需注册)。 提供大量准确、完整的证券历史行情数据、上市公司财务数据等。 通过python API获取证券数据信息,满足量化交易投资者、数量金融爱好者、计量经济从业者数据需求。

  • 返回的数据格式:
  • pandas DataFrame类型,以便于用pandas/NumPy/Matplotlib进行数据分析和可视化。
  • 同时支持通过BaoStock的数据存储功能,将数据全部保存到本地后进行分析。
  • 支持语言:目前版本BaoStock.com目前只支持Python3.5及以上(暂不支持python 2.x)。

下载安装 方式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的数据范围


股票数据

  • 日、周、月K线数据,时间范围:1990-12-19至今。
  • 5、15、30、60分钟K线数据,时间范围:1999-07-26至今。

指数数据

  • 日、周、月K线已经包含指数:综合指数,规模指数,一级行业指数,二级行业指数,策略指数,成长指数,价值指数,主题指数,基金指数,债券指数。
  • 时间范围:2006-01-01至今。

季频财务数据

  • 已经包含的财务数据:部分上市公司资产负债信息、上市公司现金流量信息、上市公司利润信息、上市公司杜邦指标信息。
  • 时间范围:2007年至今。

季频公司报告

  • 上市公司业绩预告信息,时间范围:2003年至今。
  • 上市公司业绩快报信息,时间范围:2006年至今。

我们把获取数据的相关代码,封装成函数,以方便重复调用。


函数的参数,分别为股票代码、数据开始时间、数据结束时间以及频率。 默认获取的数据项为:

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

这里有几点,需要特别注意的。

  1. 使用baostock获取数据前,需要先登录。
  2. baostock不能直接返回dataframe类型的数据,需要进行相应处理,并转化。
  3. 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]

我们成功地获取了股票的数据,数据是量化交易的基础,有了数据,我们就可以愉快地进行数据分析了!

3.全部代码如下:


# 处理数据
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('执行完毕!')
 类似资料: