如何遍历Alpha Vantage接口slice参数拉取多期分钟数据并存入DataFrame
问题原因
- 变量覆盖逻辑错误:你最初将
df定义为存储数据的空列表,但循环内直接将pd.read_csv()返回的单月DataFrame赋值给df,直接覆盖了原来的列表对象,每次循环都会清空之前存储的所有数据,最终只会保留最后一次请求成功的结果。你后续调用的df.append(period)是在给单月DataFrame追加行,而非把单月数据存入总列表,完全不符合预期逻辑。 - 请求频率未做限制:Alpha Vantage接口对普通用户有每分钟最多5次请求的频率限制,未做间隔的连续循环会触发限流,导致中间请求被拦截返回错误数据,这也是你只能拿到部分月份数据的核心原因之一。
- 变量名不一致:代码开头定义的标的变量为
symbol,但请求链接中使用的是ticker,若你没有在其他位置提前定义ticker会直接触发变量未定义报错。
修正后代码
import pandas as pd import time # 配置参数 apiKey = "替换为你自己的API密钥" symbol = 'pltr' periods=['year1month1','year1month2','year1month3','year1month4','year1month5', 'year1month6','year1month7','year1month8','year1month9','year1month10', 'year1month11','year1month12','year2month1','year2month2','year2month3', 'year2month4','year2month5','year2month6','year2month7','year2month8', 'year2month9','year2month10','year2month11','year2month12'] # 存储所有单月数据的列表 df_list = [] for period in periods: # 拼接请求链接 url = f'https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY_EXTENDED&symbol={symbol}&interval=15min&slice={period}&apikey={apiKey}&datatype=csv&outputsize=full' try: # 请求单月数据 month_df = pd.read_csv(url) # 可选:新增字段标识数据所属周期 month_df['period'] = period df_list.append(month_df) print(f"{period} 数据拉取成功,共{len(month_df)}条") except Exception as e: print(f"{period} 数据拉取失败,错误信息:{e}") # 加13秒间隔,确保每分钟请求不超过5次 time.sleep(13) # 合并所有数据为一个DataFrame full_df = pd.concat(df_list, ignore_index=True) # 输出结果 print(full_df)
注意事项
- 若你需要拉取全部24个月的数据,全程需要大概5分钟左右的时间,请耐心等待不要中断运行。
- 若拉取过程中出现失败,可以手动调整
sleep的秒数,或者针对失败的周期单独重新拉取。
内容的提问来源于stack exchange,提问作者DayTrader
相关产品推荐
相关产品推荐

