企业微信

用tushare批量拉取多股票交易数据的方法

tushare pro提供了pro_bar接口,支持同时传入多个股票代码来获取交易数据。pro_bar是tushare中专门用于获取行情数据的函数,它可以接收股票、指数、期货等标的的代码。

调用方式为:


import tushare as ts

pro = ts.pro_api('your_token')

df = ts.pro_bar(ts_code='000001.SZ,600000.SH', adj='qfq', start_date='20240101', end_date='20240301')

ts_code参数接受逗号分隔的多个代码。返回的DataFrame中会包含ts_code列,用于区分不同标的。这种批量获取的方式比循环单次请求效率更高,因为减少了网络请求次数。

需要注意的是,pro_bar对单次请求的标的数量有限制,通常建议不超过50个。如果超过限制,接口会报错或返回空数据。实际使用中可以将股票列表分批,每批50个,循环调用。

怎么用tushare同时获取多支股票的交易数据

期货合约的批量获取

tushare同样支持期货合约的批量获取。期货代码格式为品种代码+合约月份,如CU2405.SHFAU2406.SHF。同样使用pro_bar接口,传入多个期货代码。


futures_codes = 'CU2405.SHF,AL2405.SHF,AU2406.SHF'

df_futures = ts.pro_bar(ts_code=futures_codes, asset='FT', start_date='20240101', end_date='20240301')

asset参数需要设置为FT表示期货。返回的数据包含开高低收、成交量、持仓量等字段。期货数据获取时要注意主力合约换月问题,批量获取历史数据时最好指定具体合约而非主力连续合约。

批量获取的代码实现

以下代码演示如何批量获取多支股票和多支期货合约的交易数据,并合并为一个DataFrame。


import tushare as ts

import pandas as pd

import time

ts.set_token('your_token')

pro = ts.pro_api()

def batch_get_trade_data(codes, asset='E', start_date='20240101', end_date='20240301', batch_size=50):

    """

    批量获取交易数据

    codes: 列表,如 ['000001.SZ', '600000.SH']

    asset: 'E'股票, 'FT'期货

    """

    all_data = []

    for i in range(0, len(codes), batch_size):

        batch = codes[i:i+batch_size]

        code_str = ','.join(batch)

        try:

            df = ts.pro_bar(ts_code=code_str, asset=asset, start_date=start_date, end_date=end_date)

            if df is not None and not df.empty:

                all_data.append(df)

        except Exception as e:

            print(f'批次 {i} 获取失败: {e}')

        time.sleep(0.5)  # 避免请求过于频繁

    if all_data:

        return pd.concat(all_data, ignore_index=True)

    return pd.DataFrame()

# 股票批量获取

stock_codes = ['000001.SZ', '600000.SH', '000002.SZ', '600036.SH']

df_stock = batch_get_trade_data(stock_codes, asset='E')

print(df_stock.head())

# 期货批量获取

futures_codes = ['CU2405.SHF', 'AL2405.SHF', 'AU2406.SHF', 'RB2405.SHF']

df_futures = batch_get_trade_data(futures_codes, asset='FT')

print(df_futures.head())

该函数将代码列表按50个一组分批,避免单次请求过大。time.sleep(0.5)用于控制请求频率,防止触发tushare的限流。获取到的数据通过pd.concat合并,最终得到一个包含所有标的交易数据的DataFrame。

数据存储与后续处理

批量获取的数据通常需要存储到本地数据库或CSV文件。推荐使用parquet格式存储,读取速度快且占用空间小。


df_stock.to_parquet('stock_trade_data.parquet')

df_futures.to_parquet('futures_trade_data.parquet')

存储后可以按标的代码分组,分别读取。tushare返回的字段包括ts_codetrade_dateopenhighlowclosevolamount等,期货还包括oi持仓量)。后续做量化回测或因子计算时,直接读取parquet文件即可。

如果需要对多个标的做统一时间对齐,可以使用pivot方法将长格式转为宽格式:


pivot_df = df_stock.pivot(index='trade_date', columns='ts_code', values='close')

这样每列是一个标的的收盘价,便于计算相关性、协整关系或构建多标的策略。期货数据同样可以这样处理,但要注意不同合约的到期日不同,对齐后会有大量缺失值,需要向前填充或剔除。

常见问题与限制

tushare免费账户对pro_bar的调用频率有限制,每分钟最多调用一定次数。批量获取时尽量合并请求,减少调用次数。付费账户频率更高,可以适当增大batch_size

pro_bar对股票复权支持qfq(前复权)和hfq(后复权),期货没有复权概念。批量获取时如果混合了股票和期货,需要分开调用,因为asset参数不同。

获取的数据日期范围不能超过接口限制,单次请求的日期跨度建议不超过一年。如果需要多年数据,按年份分批获取再合并。

tushare的积分制度影响接口权限。pro_bar需要至少120积分,批量获取多标的不会额外消耗积分,但高频调用会触发限流。合理设计批量大小和请求间隔,可以稳定获取多支股票和期货合约的交易数据。