获取印度股票数据API实战指南:NSE与BSE双市场对接
一、印度股票市场核心特点
双交易所体系
- NSE(国家交易所):占全国交易量90%,Nifty 50指数为核心基准
- BSE(孟买交易所):亚洲最老交易所,Sensex 30指数代表传统企业
- 交易时段:09:15-15:30 IST(UTC+5:30),午休12:00-12:15
特色数据类型
- IPO发行文件(DRHP/Prospectus)
- 机构持仓变化(FII/DII数据)
- 期权链(Option Chain)隐含波动率
二、API对接全流程(StockTV示例)
1. 环境准备
# 安装必要库(Python示例)
pip install stocktv-sdk pandas pytz
# 初始化客户端
from stocktv import Client
client = Client(api_key="YOUR_API_KEY")
2. 基础数据获取
- 获取NSE/BSE股票列表
# 获取NSE全部股票
nse_stocks = client.get_stocks(exchange="NSE")
# 获取BSE Sensex30成分股
sensex30 = client.get_index_constituents(index_code="SENSEX")
- 解析返回数据(JSON结构示例)
{
"symbol": "RELIANCE",
"name": "Reliance Industries Ltd",
"exchange": "NSE",
"isin": "INE002A01018",
"industry": "Oil & Gas",
"last_price": 2856.15,
"currency": "INR"
}
3. 实时行情获取
# 单只股票实时报价(支持NSE/BSE双市场)
reliance_quote = client.get_quote(symbol="RELIANCE", exchange="NSE")
print(f"信实工业实时价: {reliance_quote['last_price']} INR")
# 批量获取报价(最多50只)
symbols = ["TCS", "INFY", "HDFCBANK", "ICICIBANK"]
quotes = client.get_batch_quotes(symbols=symbols, exchange="NSE")
4. 历史K线获取
// Java示例(需SDK 3.1+)
import com.stocktv.client.StockClient;
import com.stocktv.model.HistoricalData;
public class NseDataFetcher {
public static void main(String[] args) {
StockClient client = new StockClient("YOUR_API_KEY");
HistoricalData data = client.getHistoricalData(
"RELIANCE",
"NSE",
"2025-01-01",
"2025-07-10",
"1d" // 日线数据
);
// 转换为DataFrame
System.out.println(data.toDF().show());
}
}
5. 实时行情订阅(WebSocket)
# WebSocket实时推送(Nifty 50成分股)
def on_message(message):
print(f"实时更新: {message['symbol']} @ {message['price']}")
client.subscribe_realtime(
symbols=["^NSEI", "RELIANCE", "HDFCBANK"],
callback=on_message,
data_type="quote" # 可选trade/quote/option_chain
)
三、高级数据场景实现
1. 印度期权链获取
# 获取Nifty期权链数据
option_chain = client.get_option_chain(index="NIFTY", expiry="2025-07-25")
# 解析关键数据
put_call_ratio = option_chain["PCR"] # 沽购比
iv = option_chain["strikes"][18000]["call_iv"] # 行权价18000的看涨隐含波动率
2. 机构持仓数据
# 获取外国机构投资者(FII)持仓变化
fii_data = client.get_institutional_holding(
symbol="RELIANCE",
period="q", # 季度数据
holder_type="fii"
)
# 最近季度增持比例
last_q_change = fii_data["holdings"][-1]["change_pct"]
3. IPO数据获取
# 获取近期IPO列表
ipos = client.get_ipos(country="IN", status="upcoming")
# 提取关键信息
for ipo in ipos:
print(f"{ipo['company_name']}: {ipo['price_range_low']}-{ipo['price_range_high']} INR")
四、避坑指南与最佳实践
关键参数说明
参数 必填 示例值 注意事项 exchange
是 NSE
或BSE
BSE股票需加 .BO
后缀currency
否 INR
默认返回印度卢比计价 adjust_splits
否 true
自动复权除息数据 时区处理规范
# 所有时间戳转换为IST时区 from pytz import timezone ist = timezone('Asia/Kolkata') trade_time = data["timestamp"].astimezone(ist)
错误处理示例
try: data = client.get_quote("INVALID_SYMBOL", "NSE") except StockTVError as e: if e.code == 404: print("股票代码不存在") elif e.code == 429: print("请求超频,等待60秒重试")
五、应用场景扩展
量化交易信号生成
# 计算Nifty50 RSI指标 from stocktv.ta import rsi nifty_data = client.get_historical_data("^NSEI", "NSE", period="1y") rsi_values = rsi(nifty_data["close"], window=14)
跨市场套利监控
# 监控ADR与本地股溢价 infy_nse = client.get_quote("INFY", "NSE")["last_price"] infy_nyse = client.get_quote("INFY", "NYSE")["last_price"] * 82 # 汇率换算 premium = (infy_nyse - infy_nse) / infy_nse
资源汇总:
注:本文代码基于StockTV API v3.2(2025-07),实际开发请以最新文档为准。遇到技术问题可在官方论坛提问,平均响应时间<2小时。