如何将脚本中mini_df的输出作为a的输入获取股票历史数据?
问题解决:无法获取NSE股票期货历史数据
问题描述
编写了一段Python代码,从NSE India接口获取股票标的列表并存入mini_df,希望将mini_df输出的股票符号作为输入,调用importdata函数获取对应股票的3天历史期货数据,但目前无法得到历史数据输出。
问题根源
- 错误清空数据:获取到有效股票标的列表
mini_df后,立刻执行mini_df = [],导致原本的股票符号数据被清空,无法传递给后续逻辑。 - 循环触发条件失效:代码中
a = []定义为空列表,后续遍历空列表的循环根本不会执行,自然不会调用importdata函数。 - 到期日已过期:
importdata函数里硬编码的到期日date(2022,9,29)早已过期,NSE不会提供过期合约的历史数据。
修复后的代码
from datetime import timedelta, date from nsepy import get_history from nsepy.derivatives import get_expiry_date import requests import json import codecs import pandas as pd baseurl = "https://www.nseindia.com/" url = f'https://www.nseindia.com/api/live-analysis-oi-spurts-underlyings' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br' } # 获取NSE的cookie和股票标的列表 session = requests.Session() request = session.get(baseurl, headers=headers, timeout=30) cookies = dict(request.cookies) res = session.get(url, headers=headers, timeout=30, cookies=cookies) df = pd.DataFrame(json.loads(codecs.decode(bytes(res.text, 'utf-8'), 'utf-8-sig'))['data']) mini_df = df['symbol'].tolist() # 转换为列表方便后续遍历 # 打印获取到的股票标的 print("获取到的股票标的:") for symbol in mini_df: print(symbol) def importdata(stock): # 获取当前月份的期货到期日(自动适配,避免硬编码过期日期) expiry = get_expiry_date(year=date.today().year, month=date.today().month) stock_fut = get_history( symbol=stock, start=date.today() - timedelta(days=3), end=date.today(), futures=True, expiry_date=expiry ) # 处理无数据的情况 if stock_fut.empty: print(f"股票 {stock} 无对应期货数据") else: print(f"\n{stock} 的期货数据:") print(stock_fut[["Underlying","Change in OI","Open Interest"]]) # 使用mini_df的股票标的作为输入,遍历调用函数 for stock in mini_df: importdata(stock)
关键修改说明
- 保留股票标的数据:移除
mini_df = [],并将mini_df转换为列表tolist(),确保数据能被后续逻辑使用。 - 简化循环逻辑:直接遍历
mini_df,无需额外定义空列表a,避免无效循环。 - 自动获取到期日:使用
nsepy的get_expiry_date函数自动获取当前月份的期货到期日,避免硬编码过期日期导致无数据。 - 增加异常提示:当某只股票没有对应期货数据时,打印明确提示,避免输出空表格造成混淆。
内容的提问来源于stack exchange,提问作者Brijesh Chaurasia
相关产品推荐
相关产品推荐

