获取印度股票数据API实例:NSE与BSE双市场对接指南
📈 获取印度股票数据API实例:NSE与BSE双市场对接指南
适用场景:量化交易、金融数据分析、实时监控系统开发
技术栈:Python/Java + StockTV API + 多线程/WebSocket
🔍 一、印度股票市场核心特点
-
双交易所体系
- NSE(国家交易所):占全印交易量90%,核心指数Nifty 50
- BSE(孟买交易所):亚洲最老交易所,代表指数Sensex 30
- 交易时段:
09:15-15:30 IST
(UTC+5:30),含午休12:00-12:15
-
特色数据类型
- 期权链(Option Chain)隐含波动率
- 外国机构持仓(FII/DII数据)
- IPO发行文件(DRHP/Prospectus)
⚙️ 二、环境准备与依赖安装
Python环境(推荐)
# 安装依赖库
pip install requests websocket-client pandas pytz
Java环境(Maven依赖)
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version>
</dependency>
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version>
</dependency>
注:通过https://api.stocktv.top申请API Key(测试KEY格式:
MY4b781f618e3f43c4b055f25fa61941ad
)
💻 三、核心接口实现(Python示例)
1. 获取印度股票列表
import requestsdef get_indian_stocks(api_key, page_size=20):url = "https://api.stocktv.top/stock/stocks"params = {"key": api_key,"countryId": 14, # 印度国家ID固定为14"pageSize": page_size}response = requests.get(url, params=params)data = response.json()# 提取关键字段stocks = [{"symbol": item["symbol"], "name": item["name"], "last_price": item["last"]} for item in data["data"]["records"]]return stocks
输出字段:
symbol
(股票代码),name
(公司名),last_price
(最新价)
2. 查询K线数据(支持15分钟/日线等粒度)
def get_kline(api_key, pid=7310, interval="PT15M"):"""获取股票历史K线pid: 股票唯一ID(如TATA Motors为7310)interval: PT5M(5分钟)/PT1H(小时线)/P1D(日线)"""url = "https://api.stocktv.top/stock/kline"params = {"key": api_key, "pid": pid, "interval": interval}response = requests.get(url, params=params)kline_data = response.json()["data"]# 转换为DataFrame并处理时间戳df = pd.DataFrame(kline_data)df["time"] = pd.to_datetime(df["time"], unit="ms") # 时间戳转IST时区return df[["time", "open", "high", "low", "close", "volume"]]
关键参数说明:
pid
通过股票列表接口获取- 时区陷阱:需转换到印度时区(
Asia/Kolkata
)
3. WebSocket实时行情订阅
import websocketdef on_message(ws, message):data = json.loads(message)print(f"[{data['symbol']}] 价格: {data['last_numeric']} 涨跌幅: {data['pcp']}%")# 建立实时连接
api_key = "YOUR_API_KEY"
ws_url = f"wss://ws-api.stocktv.top/connect?key={api_key}"
ws = websocket.WebSocketApp(ws_url, on_message=on_message)
ws.run_forever() # 需在独立线程运行
支持同时订阅多只股票(如Nifty50成分股)
🚀 四、高级功能实现
1. 获取期权链数据(Nifty指数)
def get_nifty_option_chain(api_key, expiry="2025-07-25"):params = {"key": api_key, "index": "NIFTY", "expiry": expiry}response = requests.get("https://api.stocktv.top/option/chain", params=params)chain_data = response.json()# 分析沽购比(PCR)pcr = chain_data["PCR"]print(f"Nifty期权沽购比: {pcr}")return chain_data
关键字段:
strikes
(行权价列表),call_iv
(看涨隐含波动率),put_iv
(看跌隐含波动率)
2. 监控机构持仓变化
# 获取信实工业(FII)持仓数据
fii_data = requests.get("https://api.stocktv.top/institutional/holding",params={"key": api_key, "symbol": "RELIANCE", "holder_type": "fii", "period": "q"}
).json()
last_quarter_change = fii_data["holdings"][-1]["change_pct"]
机构类型:
fii
(外国机构),dii
(本土机构)
⚠️ 五、避坑指南与最佳实践
-
参数校验规范
参数 必填 示例值 注意事项 exchange
是 NSE
/BSE
BSE股票需加 .BO
后缀adjust_splits
否 true
自动复权除息数据 -
高频请求优化方案
- 连接池管理(Java示例)
// 设置最大连接数100,单路由20连接 PoolingHttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create().setMaxConnTotal(100).setMaxConnPerRoute(20).build();
- 熔断机制:通过Resilience4j防御API过载(错误码429)
- 连接池管理(Java示例)
-
数据完整性校验
# 对比交易所官方日历补缺失数据 from pytz import timezone ist = timezone('Asia/Kolkata') df["trade_time"] = df["timestamp"].dt.tz_convert(ist) # 统一时区
💎 六、完整代码示例
# 获取Nifty50成分股实时报价
nifty_stocks = get_indian_stocks(api_key, page_size=50)
nifty_symbols = [stock["symbol"] for stock in nifty_stocks if "Nifty" in stock["name"]]
quotes = [get_quote(api_key, symbol) for symbol in nifty_symbols]# 分析TOP10涨幅股
top_gainers = sorted(quotes, key=lambda x: x["chgPct"], reverse=True)[:10]
for stock in top_gainers:print(f"{stock['symbol']}: {stock['chgPct']}%")