📊 印度股票数据API对接指南:从基础到高阶实战(2025最新版)
适用场景:量化交易、金融数据监控、投资分析系统开发
技术栈:Python + StockTV API + Pandas + WebSocket
🔍 一、印度股市数据特点与难点
-
双交易所体系
- NSE(国家交易所):占全印交易量90%,核心指数Nifty 50
- BSE(孟买交易所):亚洲最老交易所,代表指数Sensex 30
- 交易时段:
09:15-15:30 IST(UTC+5:30),含午休12:00-12:15
-
数据特殊性
- 期权链(Option Chain):隐含波动率计算需特殊处理
- 机构持仓:FII(外国机构)/DII(本土机构)数据需独立接口
- 时区问题:所有时间戳需转换为
Asia/Kolkata时区
⚙️ 二、环境准备与API初始化
1. 安装依赖库
pip install requests websocket-client pandas pytz
2. 获取API Key
- 访问 https://api.stocktv.top 注册账号
- 在开发者中心获取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"]
⚠️ 五、避坑指南与最佳实践
-
高频请求优化
- 连接池配置:使用
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分钟后重试 - 连接池配置:使用
-
数据完整性校验
- 时区转换:所有时间戳必须转印度时区
from pytz import timezone ist = timezone('Asia/Kolkata') df["trade_time"] = df["timestamp"].dt.tz_convert(ist)- 交易日历对齐:对比https://www.nseindia.com/holiday-calendar补缺失数据
-
安全加固措施
- 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)
935

被折叠的 条评论
为什么被折叠?



