印度股票数据API对接指南:从基础到高阶实战(2025最新版)

📊 印度股票数据API对接指南:从基础到高阶实战(2025最新版)

适用场景:量化交易、金融数据监控、投资分析系统开发
技术栈:Python + StockTV API + Pandas + WebSocket


🔍 一、印度股市数据特点与难点
  1. 双交易所体系

    • NSE(国家交易所):占全印交易量90%,核心指数Nifty 50
    • BSE(孟买交易所):亚洲最老交易所,代表指数Sensex 30
    • 交易时段09:15-15:30 IST(UTC+5:30),含午休12:00-12:15
  2. 数据特殊性

    • 期权链(Option Chain):隐含波动率计算需特殊处理
    • 机构持仓:FII(外国机构)/DII(本土机构)数据需独立接口
    • 时区问题:所有时间戳需转换为Asia/Kolkata时区

官方文档

⚙️ 二、环境准备与API初始化
1. 安装依赖库
pip install requests websocket-client pandas pytz
2. 获取API Key
  1. 访问 https://api.stocktv.top 注册账号
  2. 在开发者中心获取API Key(格式:MY4b781f618e3f43c4b055f25fa61941ad
3. 初始化工具类(utils.py)
import requests

class StockTVAPI:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = "https://api.stocktv.top"
    
    def _get(self, endpoint, params=None):
        params = params or {}
        params['key'] = self.api_key
        response = requests.get(f"{self.base_url}/{endpoint}", params=params)
        response.raise_for_status()  # 自动抛出HTTP错误
        return response.json()

💻 三、核心接口调用实战
1. 获取印度股票列表(含NSE/BSE)
from utils import StockTVAPI

class IndiaStockAPI(StockTVAPI):
    def get_stock_list(self, country_id=14, page_size=50):
        """国家ID固定14=印度"""
        return self._get("stock/stocks", params={
            "countryId": country_id, 
            "pageSize": page_size
        })

# 示例:获取NSE全部股票
api = IndiaStockAPI("YOUR_API_KEY")
nse_stocks = api.get_stock_list()
print(nse_stocks["data"]["records"][0]["symbol"])  # 输出:RELIANCE
2. 实时行情批量获取(最多50只)
def get_batch_quotes(self, symbols: list, exchange="NSE"):
    """支持NSE/BSE双市场"""
    return self._get("stock/batchQuotes", params={
        "symbols": ",".join(symbols),
        "exchange": exchange
    })

# 示例:获取Sensex30成分股实时价
sensex_symbols = ["RELIANCE", "TCS", "HDFCBANK", "INFY"]
quotes = api.get_batch_quotes(sensex_symbols)
for stock in quotes["data"]:
    print(f"{stock['symbol']}: {stock['last_price']} INR")
3. 历史K线数据获取(支持多粒度)
def get_historical_kline(self, pid, interval="P1D"):
    """
    pid: 股票唯一ID(通过股票列表接口获取)
    interval: PT1M(1分钟)/PT15M(15分钟)/P1D(日线)
    """
    return self._get("stock/kline", params={"pid": pid, "interval": interval})

# 示例:获取TATA Motors(pid=7310)日线数据
tata_kline = api.get_historical_kline(7310, "P1D")
df = pd.DataFrame(tata_kline["data"])
df["time"] = pd.to_datetime(df["time"], unit="ms").dt.tz_localize("Asia/Kolkata")
4. WebSocket实时行情订阅
import asyncio
import websockets

async def subscribe_realtime():
    uri = f"wss://ws-api.stocktv.top/connect?key=YOUR_API_KEY"
    async with websockets.connect(uri) as ws:
        while True:
            data = await ws.recv()
            print(f"实时行情: {json.loads(data)['symbol']} @ {data['price']}")

# 订阅Nifty50指数和头部个股
asyncio.get_event_loop().run_until_complete(subscribe_realtime())

🚀 四、高阶功能实现
1. 印度期权链数据解析(Nifty指数)
def get_nifty_option_chain(self, expiry="2025-12-25"):
    """获取指定到期日的期权链"""
    return self._get("option/chain", params={
        "index": "NIFTY", 
        "expiry": expiry
    })

# 分析沽购比(PCR)与隐含波动率
chain = api.get_nifty_option_chain()
pcr = chain["PCR"]  # 沽购比
call_iv = chain["strikes"][18000]["call_iv"]  # 看涨隐含波动率
2. 监控机构持仓变化
def get_institutional_holding(self, symbol, holder_type="fii"):
    """holder_type: fii(外国机构)/dii(本土机构)"""
    return self._get("institutional/holding", params={
        "symbol": symbol, 
        "holder_type": holder_type,
        "period": "q"  # 季度数据
    })

# 获取信实工业FII持仓变化
reliance_fii = api.get_institutional_holding("RELIANCE")
last_q_change = reliance_fii["holdings"][-1]["change_pct"]

⚠️ 五、避坑指南与最佳实践
  1. 高频请求优化

    • 连接池配置:使用requests.Session()复用连接
    • 熔断机制:当HTTP状态码=429(限流)时自动休眠重试
    from time import sleep
    try:
        response = self._get(endpoint, params)
    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 429:
            sleep(60)  # 等待1分钟后重试
    
  2. 数据完整性校验

    • 时区转换:所有时间戳必须转印度时区
    from pytz import timezone
    ist = timezone('Asia/Kolkata')
    df["trade_time"] = df["timestamp"].dt.tz_convert(ist)
    
    • 交易日历对齐:对比https://www.nseindia.com/holiday-calendar补缺失数据
  3. 安全加固措施

    • API密钥管理:环境变量存储密钥(非代码硬编码)
    • 传输加密:强制使用HTTPS + TLS 1.3协议

💎 六、完整实战案例:Nifty50成分股分析
# 获取Nifty50成分股实时数据
nifty_stocks = api.get_index_constituents("NIFTY_50")  # 指数ID通过get_indices获取
symbols = [stock["symbol"] for stock in nifty_stocks["data"]]
quotes = api.get_batch_quotes(symbols)

# 计算当日涨跌幅TOP10
top_gainers = sorted(quotes["data"], key=lambda x: x["chgPct"], reverse=True)[:10]
print("当日涨幅榜:")
for stock in top_gainers:
    print(f"{stock['name']}({stock['symbol']}): {stock['chgPct']}%")

# 保存到CSV
pd.DataFrame(top_gainers).to_csv("nifty_top_gainers.csv", index=False)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值