怎么用tushare同时获取多支股票的交易数据
摘要:
tushare批量获取多股票交易数据,使用pro_bar接口配合循环或批量参数,提升期货和股票数据获取效率。

用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同样支持期货合约的批量获取。期货代码格式为品种代码+合约月份,如CU2405.SHF、AU2406.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_code、trade_date、open、high、low、close、vol、amount等,期货还包括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积分,批量获取多标的不会额外消耗积分,但高频调用会触发限流。合理设计批量大小和请求间隔,可以稳定获取多支股票和期货合约的交易数据。
声明
转载声明:欢迎分享本文,转载请注明出处!
点击复制: