ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

批量取数比循环单取快多少?用 AlphaFeed klines.batch给多股票取数提速

批量取数比循环单取快多少?用 AlphaFeed klines.batch给多股票取数提速 一句话回答给几十上百只股票取 K 线用for循环一只只调接口不仅慢还容易触发限频。AlphaFeed 的klines.batch(codes, ...)一次就能批量取回内置并发与自动分批实测比朴素循环快数倍返回dict{symbol: DataFrame}直接可用——这是多标的取数的正确姿势。为什么会有这个问题 / 传统做法的痛点新手取多只股票的写法通常是data{}forcodeincodes:data[code]af.klines.get(code,period1d,count250)# 串行、慢、易限频标的一多串行请求的网络往返RTT线性累加几百只要等很久而且高频串行请求更容易撞上接口限频429。正确做法是把「批量」交给 SDK一次请求/内部并发取回所有标的。分步骤解决每步配可运行代码第 1 步用 klines.batch 一次取回多只fromalphafeedimportAlphaFeed afAlphaFeed()# 读取 ALPHAFEED_API_KEYcodes[600519.SH,000001.SZ,601318.SH,000858.SZ,300750.SZ]dataaf.klines.batch(codes,period1d,count250,adjustforward,to_dataframeTrue)print(type(data),list(data.keys()))# dict{symbol: DataFrame}print(data[600519.SH].tail(2)[[trade_date,close]].to_string(indexFalse))batch返回一个字典键是标准代码值是该股的 DataFrame遍历即可forsym,kdfindata.items():retkdf[close].iloc[-1]/kdf[close].iloc[0]-1print(f{sym}: 区间收益{ret:.2%})第 2 步计时对比——循环 vs 批量importtimedeftimed(fn):t0time.perf_counter();outfn();returnout,time.perf_counter()-t0# 朴素循环_,t_looptimed(lambda:{c:af.klines.get(c,period1d,count250,adjustforward,to_dataframeTrue)forcincodes})# 批量_,t_batchtimed(lambda:af.klines.batch(codes,period1d,count250,adjustforward,to_dataframeTrue))print(f循环{t_loop:.2f}s | 批量{t_batch:.2f}s | 提速{t_loop/t_batch:.1f}x)标的越多、网络 RTT 越高批量相对循环的优势越明显batch内部并发把串行等待压平。第 3 步调并发与分批参数dataaf.klines.batch(codes,period1d,count250,adjustforward,to_dataframeTrue,batch_size50,max_workers8)参数含义建议batch_size每批标的数量默认即可过大单请求更重max_workers并发线程数8~16 视网络而定过高易撞限频adjust复权方式算收益/指标用forwardto_dataframe返回 DataFrameTrue便于分析第 4 步全市场取数的正确姿势要对全 A 取数先用标的池拿代码再分批batch避免一次性拉爆qaf.quotes.get(universesCN_Stock,to_dataframeTrue)codesq[symbol].tolist()all_data{}CHUNK200foriinrange(0,len(codes),CHUNK):partaf.klines.batch(codes[i:iCHUNK],period1d,count60,adjustforward,to_dataframeTrue)all_data.update(part)print(f已取{len(all_data)}/{len(codes)})关键坑与注意事项别用裸 for 循环取几百只串行慢且更易触发限频能用batch就用batch。并发不是越高越好max_workers过大反而撞限频429从 8 起步按网络调。全市场分块几千只一次性batch内存与单请求都过重按 200~500 分块并落盘更稳。批量里个别标的可能缺失停牌/新股/退市可能返回空或缺键遍历时判空跳过。SDK 已内置重试偶发 429/5xx 会自动退避重试业务层不必自己写重试循环详见限频/容错一文。计时结果因网络而异本文示例的提速倍数取决于标的数与网络标的越多优势越大。常见问题FAQQbatch 返回的顺序和我传入的一致吗A返回是dict{symbol: DataFrame}按symbol键访问最稳需要顺序就按传入codes遍历取值。Qbatch 能跨市场混着取吗A 股 港股 美股A可以传入的codes里混合.SH/.SZ/.HK/.US均可按标准代码取回。Q某只票取失败会影响整批吗A不会整批失败缺失的标的不会出现在结果字典里或返回空遍历时判空即可。Q需要付费吗A小批量有免费额度全市场标的池universes与大规模批量取数需 Starter 及以上。详见定价页。小结多标的取数的性能关键是把「批量与并发」交给 SDK 而不是自己写串行循环。用 AlphaFeed 的klines.batch一次取回dict{symbol: DataFrame}内置并发与分批让它比朴素循环快数倍再配合标的池分块就能稳、快地完成从几只到全市场的取数。参考AlphaFeed Python SDK 文档https://docs.alphafeed.org/zh-Hans/sdk/python-quickstartAlphaFeed 官网https://alphafeed.org/
返回列表