【Python量化金融实战】第2章:金融市场数据获取与处理——数据源概览:Tushare、AkShare、Baostock与通联数据(DataAPI详解)

本章将详细介绍四大主流金融数据源(Tushare、AkShare、Baostock、通联数据(DataAPI)),分析其特点与适用场景,并通过实战案例展示数据获取与处理的全流程。

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 2.1.1 Tushare
  • 2.1.2 AkShare
  • 2.1.3 Baostock
  • 2.1.4 通联数据(Data API)
  • 2.1.5 选择建议与注意事项
  • 2.1.6 常见问题解决方案

  • 2.1.1 Tushare

    Tushare 是国内最知名的开源金融数据接口之一,提供股票、期货、基金、外汇、数字货币等多种数据。其特点包括:

  • 高频数据:提供Level2行情、资金流向等特色数据

  • 数据覆盖广:支持A股、港股、美股的历史行情、财务数据、市场新闻等。

  • 易用性高:返回数据格式为Pandas DataFrame,便于直接分析与可视化。

  • 免费与付费结合:基础数据(如日线行情)免费,但部分高频数据需通过积分或付费获取。

  • 实战案例:获取A股行情与资金流分析

  • 运行效果展示:


  • 2.1.2 AkShare

    AkShare 是完全开源且免费的金融数据接口库,数据源涵盖东方财富、新浪财经等多个平台,特点包括:

  • 多维度数据:提供股票、期货、期权、宏观经济、区块链等数据,支持实时和历史行情。

  • 社区活跃:通过官方微信群和文档持续更新,适合需要灵活爬取数据的用户。

  • 局限性:部分高频数据(如分钟级)获取有限,需结合其他工具补充。
    示例代码:

    import akshare as ak
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 获取 A 股日线数据,以平安银行(000001.SZ)为例
    stock_daily = ak.stock_zh_a_daily(symbol="sz000001", start_date="20230101", end_date="20231231", adjust="qfq")
    
    # 数据统计:计算收盘价的均值、最大值和最小值
    close_stats = stock_daily['close'].describe()[['mean', 'max', 'min']]
    print("收盘价统计信息:")
    print(close_stats)
    
    # 可视化:绘制收盘价折线图
    plt.figure(figsize=(12, 6))
    plt.plot(stock_daily['date'], stock_daily['close'], label='Close Price')
    plt.title('Ping An Bank Daily Close Price in 2023')
    plt.xlabel('Date')
    plt.ylabel('Close Price')
    plt.legend()
    plt.xticks(rotation=45)
    plt.show()
    
    # 可视化:绘制收盘价的箱线图
    plt.figure(figsize=(8, 6))
    sns.boxplot(y=stock_daily['close'])
    plt.title('Box Plot of Ping An Bank Daily Close Price in 2023')
    plt.ylabel('Close Price')
    plt.show()
    
  • 2.1.3 Baostock

    Baostock 是一个专注于国内证券数据的开源平台,无需注册即可使用,特点包括:

  • 分钟级数据:免费提供股票、指数的分钟线数据,适合高频策略研究。
  • 数据质量高:数据经过清洗和标准化,可直接用于回测和建模。
  • 接口简洁:支持Python直接调用,返回结构清晰的DataFrame。
  • 示例代码:

    import baostock as bs
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 登陆系统
    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()
    hs300_stocks = []
    while (rs.error_code == '0') & rs.next():
        # 获取一条记录,将记录合并在一起
        hs300_stocks.append(rs.get_row_data())
    hs300_df = pd.DataFrame(hs300_stocks, columns=rs.fields)
    
    # 选择其中一只股票,如中国平安(601318.SH)
    stock_code = 'sh.601318'
    start_date = '2023-01-01'
    end_date = '2023-12-31'
    
    # 获取股票历史 K 线数据
    rs = bs.query_history_k_data_plus(stock_code,
                                      "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
                                      start_date=start_date, end_date=end_date,
                                      frequency="d", adjustflag="3")
    data_list = []
    while (rs.error_code == '0') & rs.next():
        # 获取一条记录,将记录合并在一起
        data_list.append(rs.get_row_data())
    df = pd.DataFrame(data_list, columns=rs.fields)
    
    # 数据类型转换
    df['date'] = pd.to_datetime(df['date'])
    df[['open', 'high', 'low', 'close', 'preclose', 'volume', 'amount', 'turn', 'pctChg']] = df[
        ['open', 'high', 'low', 'close', 'preclose', 'volume', 'amount', 'turn', 'pctChg']].astype(float)
    
    # 数据统计:计算收盘价的均值、最大值、最小值
    close_stats = df['close'].describe()[['mean', 'max', 'min']]
    print("收盘价统计信息:")
    print(close_stats)
    
    # 可视化:绘制收盘价折线图
    plt.figure(figsize=(12, 6))
    plt.plot(df['date'], df['close'], label='Close Price')
    plt.title('Ping An Bank Daily Close Price in 2023')
    plt.xlabel('Date')
    plt.ylabel('Close Price')
    plt.legend()
    plt.xticks(rotation=45)
    plt.show()
    
    # 可视化:绘制收盘价的箱线图
    plt.figure(figsize=(8, 6))
    sns.boxplot(y=df['close'])
    plt.title('Box Plot of Ping An Bank Daily Close Price in 2023')
    plt.ylabel('Close Price')
    plt.show()
    
    # 可视化:绘制成交量柱状图
    plt.figure(figsize=(12, 6))
    plt.bar(df['date'], df['volume'], label='Volume')
    plt.title('Ping An Bank Daily Volume in 2023')
    plt.xlabel('Date')
    plt.ylabel('Volume')
    plt.legend()
    plt.xticks(rotation=45)
    plt.show()
    
    # 可视化:绘制收盘价和成交量的散点图
    plt.figure(figsize=(8, 6))
    sns.scatterplot(x=df['close'], y=df['volume'])
    plt.title('Scatter Plot of Ping An Bank Close Price and Volume')
    plt.xlabel('Close Price')
    plt.ylabel('Volume')
    plt.show()
    
    # 登出系统
    bs.logout()
    




    2.1.4 通联数据(Data API)

    通联数据通过优矿(UQER)等平台提供API接口,特点包括:

  • 专业级数据:涵盖股票、因子、财报、行业大数据等,适合深度量化研究。
  • 免费与开放:注册优矿账号后可免费获取大部分基础数据,部分高频数据需企业合作。
  • 集成工具链:支持数据清洗、合并、标准化等操作,可直接在Notebook中分析。
  • 示例代码(优矿平台):

    import datapipe
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 替换为你自己的 API Token
    token = "your_api_token"
    client = datapipe.DatapipeClient(token)
    
    # 获取某只股票(如 000001.SZ 平安银行)在指定日期范围的日线数据
    symbol = "000001.SZ"
    start_date = "2023-01-01"
    end_date = "2023-12-31"
    
    try:
        df = client.get_historical_bars(symbol, start_date=start_date, end_date=end_date)
        print("成功获取股票日线数据:")
        print(df.head())
    except Exception as e:
        print(f"获取数据时出错:{e}")
    
    # 计算收盘价的基本统计信息
    close_stats = df['close'].describe()
    print("收盘价的基本统计信息:")
    print(close_stats)
    
    # 计算成交量的总和与平均值
    volume_sum = df['volume'].sum()
    volume_mean = df['volume'].mean()
    print(f"成交量总和: {volume_sum}")
    print(f"成交量平均值: {volume_mean}")
    
    # 设置图片清晰度
    plt.rcParams['figure.dpi'] = 300
    
    # 绘制收盘价折线图
    plt.figure(figsize=(12, 6))
    plt.plot(df['date'], df['close'], label='Close Price')
    plt.title(f'{symbol} 收盘价走势 ({start_date} - {end_date})')
    plt.xlabel('日期')
    plt.ylabel('收盘价')
    plt.legend()
    plt.xticks(rotation=45)
    plt.show()
    
    # 绘制成交量柱状图
    plt.figure(figsize=(12, 6))
    plt.bar(df['date'], df['volume'], label='Volume')
    plt.title(f'{symbol} 成交量走势 ({start_date} - {end_date})')
    plt.xlabel('日期')
    plt.ylabel('成交量')
    plt.legend()
    plt.xticks(rotation=45)
    plt.show()
    
    # 绘制收盘价的箱线图
    plt.figure(figsize=(8, 6))
    sns.boxplot(y=df['close'])
    plt.title(f'{symbol} 收盘价箱线图')
    plt.ylabel('收盘价')
    plt.show()
    
    # 绘制收盘价和成交量的散点图
    plt.figure(figsize=(8, 6))
    sns.scatterplot(x=df['close'], y=df['volume'])
    plt.title(f'{symbol} 收盘价与成交量散点图')
    plt.xlabel('收盘价')
    plt.ylabel('成交量')
    plt.show()
    

    2.1.5 选择建议与注意事项

  • 1. 免费性与适用场景:
  • TushareAkShare适合基础研究,Baostock 适合高频数据需求,通联数据适合专业因子分析。
  • 2. 数据更新与稳定性:
  • TushareAkShare 依赖社区维护,可能存在接口变动风险;Baostock 和通联数据由官方维护,稳定性更高。
  • 3. 合规与限制:
  • 部分接口(如Tushare)需遵守数据调用频率限制,避免因超额请求被封禁。

  • 2.1.6 常见问题解决方案

  • API限制报错:
  • 使用time.sleep(60)在循环中增加延迟
  • 升级付费套餐或切换备用API密钥
  • 时区不一致:
      # 统一为北京时间
    data = data.tz_localize('UTC').tz_convert('Asia/Shanghai')
    
  • 中文乱码处理:
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
    plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题
    

  • 学习路径建议
    1. 新手阶段:从Yahoo Finance开始练习基础数据处理
    1. 进阶阶段:通过Alpha Vantage学习实时数据接口调用
    1. 专业阶段:使用Tushare+Quandl构建A股多因子模型
    1. 高阶应用:结合多源数据进行宏观经济与市场的联动分析
  • 通过灵活运用不同数据源,开发者可以构建覆盖全球市场的量化分析系统。实际应用中需特别注意数据授权协议与更新频率,确保策略的合规性与时效性。

    作者:言析数智

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python量化金融实战】第2章:金融市场数据获取与处理——数据源概览:Tushare、AkShare、Baostock与通联数据(DataAPI详解)

    发表回复