You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将脚本中mini_df的输出作为a的输入获取股票历史数据?

问题解决:无法获取NSE股票期货历史数据

问题描述

编写了一段Python代码,从NSE India接口获取股票标的列表并存入mini_df,希望将mini_df输出的股票符号作为输入,调用importdata函数获取对应股票的3天历史期货数据,但目前无法得到历史数据输出。

问题根源

  1. 错误清空数据:获取到有效股票标的列表mini_df后,立刻执行mini_df = [],导致原本的股票符号数据被清空,无法传递给后续逻辑。
  2. 循环触发条件失效:代码中a = []定义为空列表,后续遍历空列表的循环根本不会执行,自然不会调用importdata函数。
  3. 到期日已过期: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:55:17