问题描述
/
解决方案
这个报错是因为您当前 Tushare 账号的积分对应的接口访问权限达到了上限(每分钟 600 次)。在量化策略编写中,频繁在循环中调用网络 API 很容易触发此类限制。以下是几种有效的解决方案,特别是如果您正在使用 Ptrade 量化平台,我们强烈建议您使用平台自带的本地数据接口。
方案一:代码层面优化(继续使用 Tushare)
如果您必须使用 Tushare,可以通过以下方式优化代码:
1. 增加请求延时 (Sleep)
在循环请求中加入 time.sleep(),强制降低请求频率。
import tushare as ts
import time
pro = ts.pro_api('your_token')
stock_list = ['000001.SZ', '000002.SZ', ...] # 假设有1000只股票
for stock in stock_list:
df = pro.daily(ts_code=stock, start_date='20230101', end_date='20231001')
# 每次请求后暂停 0.11 秒,确保每分钟请求不超过 600 次 (60秒 / 600次 = 0.1秒/次)
time.sleep(0.11)
2. 批量获取代替单只获取
Tushare 很多接口支持一次性获取多只股票或整个市场某一天的数据。尽量按天获取全市场数据,然后在本地进行筛选,而不是按股票代码循环获取。
# 推荐:一次性获取某一天全市场的日线数据(仅消耗1次请求)
df = pro.daily(trade_date='20231010')
3. 本地缓存数据
将获取到的数据保存到本地(如 CSV、SQLite、HDF5),下次使用时先读取本地文件,避免重复请求。
方案二:使用 Ptrade 平台自带数据接口(强烈推荐)
如果您是在 Ptrade 量化交易平台 上运行策略,完全不需要依赖 Tushare。Ptrade 平台内置了极速的本地金融数据库,不仅数据全面,而且没有类似 Tushare 这样严格的分钟级网络请求限制(尽管也有防滥用的流控,但额度极大且速度极快)。
以下是 Tushare 常用功能在 Ptrade 中的完美替代方案:
1. 获取历史 K 线数据
替代 Tushare 的 pro.daily。Ptrade 提供 get_history 和 get_price。
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 获取股票池中股票过去 5 天的收盘价,直接从本地内存/数据库读取,极快
his = get_history(5, '1d', 'close', security_list=g.security)
log.info(his)
2. 获取财务数据
替代 Tushare 的 pro.fina_indicator 等。Ptrade 提供 get_fundamentals。
def before_trading_start(context, data):
# 获取恒生电子的资产负债表数据
# 注意:Ptrade 财务接口单次最大调用量是500条,每秒不超过100次,远比 Tushare 宽松
funda_data = get_fundamentals('600570.SS', 'balance_statement', 'total_assets')
log.info(funda_data)
3. 获取股票列表
替代 Tushare 的 pro.stock_basic。Ptrade 提供 get_Ashares、get_index_stocks 等。
def before_trading_start(context, data):
# 获取当前所有 A 股代码
all_stocks = get_Ashares()
# 获取沪深300成分股
hs300_stocks = get_index_stocks('000300.SS')
总结
- 短期应急:在 Tushare 请求代码中加入
time.sleep(0.11)。 - 长期最优:如果您在 Ptrade 环境中,请全面迁移至 Ptrade 原生 API(如
get_history,get_fundamentals)。这不仅能彻底解决频率限制问题,还能大幅提升策略的回测和实盘运行速度,避免因外部网络波动导致的策略异常。