如何使用pandas datareader自动迭代多只股票代码批量拉取股票信息
批量获取多只股票数据的实现方案
嘿,这个需求太常见啦!既然你已经搞定了单只股票的获取,要扩展到多只股票其实很简单——核心就是遍历股票代码列表,再把每只股票的数据整合到一起。我给你两种实用方案,你可以按需选择:
方法一:基础循环(直观易上手)
先把你要获取的股票代码放到一个列表里,比如['IBM', 'AAPL', 'MSFT'],然后用循环逐个拉取数据。记得给每只股票的数据加个Ticker列,这样后续区分不同股票会很方便:
import pandas_datareader.data as web import datetime as dt import pandas as pd # 别忘了导入pandas,合并数据需要用 # 定义目标股票代码列表 tickers = ['IBM', 'AAPL', 'MSFT', 'GOOG'] start = dt.datetime(2018,3,26) end = dt.datetime(2018,3,29) # 初始化空列表,用来存每只股票的DataFrame all_stock_data = [] for ticker in tickers: # 拉取单只股票数据 stock_df = web.DataReader(ticker, 'yahoo', start, end).reset_index() # 添加股票代码列,标记数据所属股票 stock_df['Ticker'] = ticker # 将当前股票数据加入列表 all_stock_data.append(stock_df) # 把所有股票数据合并成一个大的DataFrame combined_stock_data = pd.concat(all_stock_data, ignore_index=True) print(combined_stock_data)
方法二:列表推导式(更Pythonic的简洁写法)
如果你喜欢紧凑的代码风格,用列表推导式替代循环会更高效,一行就能生成所有数据的列表,再合并:
import pandas_datareader.data as web import datetime as dt import pandas as pd tickers = ['IBM', 'AAPL', 'MSFT'] start = dt.datetime(2018,3,26) end = dt.datetime(2018,3,29) # 列表推导式生成所有股票数据,同时添加Ticker列,最后合并 combined_stock_data = pd.concat( [web.DataReader(ticker, 'yahoo', start, end).reset_index().assign(Ticker=ticker) for ticker in tickers], ignore_index=True ) print(combined_stock_data)
额外小提示
- 如果你的股票代码数量较多,建议加上异常处理,避免某一只股票拉取失败导致整个程序中断。比如这样修改循环部分:
for ticker in tickers: try: stock_df = web.DataReader(ticker, 'yahoo', start, end).reset_index() stock_df['Ticker'] = ticker all_stock_data.append(stock_df) except Exception as e: print(f"获取{ticker}数据时出错啦: {e}")
- 有时候Yahoo的数据源可能会有访问限制,如果遇到拉取失败的情况,可以试试更换其他支持的数据源(比如
'fred')。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

