使用API对接BSE交易所数据:完整技术实现指南
引言:为什么关注印度BSE交易所?
印度孟买证券交易所(BSE)是亚洲最古老的证券交易所,也是印度两大主要证券交易市场之一。随着印度经济的快速增长,BSE市场吸引了大量全球投资者的目光。对于开发者而言,能够便捷地获取BSE的实时股票数据,是构建量化交易系统、投资分析平台或金融看板应用的关键第一步。
本文将基于一套成熟的金融数据接口,详细讲解如何快速、稳定地对接印度BSE交易所的股票数据接口,涵盖从获取API密钥、查询实时行情到订阅实时推送的全流程,并提供完整的Python代码示例。
准备工作:获取API密钥与理解关键参数
在开始调用API之前,需要完成两项准备:
获取API Key:所有接口调用都需要在请求参数中携带有效的API Key进行身份验证。你可以通过官方提供的联系方式申请密钥。密钥格式通常类似
MY4b781f618e3f43c4b055f25fa61941ad。理解关键参数:对接印度BSE市场,以下两个参数至关重要:
countryId=14:这代表印度市场,是几乎所有接口的必填参数exchangeId=74:这是BSE(孟买证券交易所)在系统中的唯一标识符。另一个主要交易所NSE的ID是46
API基础地址为:https://api.stocktv.top。
核心API接口详解
1. 获取BSE股票列表
这是获取数据的第一步,目的是得到BSE上市公司的基本信息和唯一标识符(id或pid),后续查询详细行情都需要用到它。
接口地址:GET /stock/stocks
请求参数:
| 参数名 | 必填 | 说明 |
| :--- | :--- | :--- |
| countryId | 是 | 印度市场ID,固定为14 |
| exchangeId | 否 | BSE交易所ID,此处应填74 |
| pageSize | 否 | 每页数量 |
| page | 否 | 页码 |
| key | 是 | 你的API密钥 |
返回示例:返回的JSON数据中,data.records数组包含了股票列表,每个股票对象都有id(后续接口中的pid)、symbol(股票代码)、name(公司名称)、last(最新价)、chgPct(涨跌幅)等关键字段。
2. 查询特定股票实时行情
接口地址:GET /stock/queryStocks
请求参数:
id:股票IDsymbol:股票代码如"RELIANCE"name:股票名称key:API密钥
3. 获取K线数据
接口地址:GET /stock/kline
请求参数:
pid:股票IDinterval:时间间隔,如PT5M(5分钟)、PT15M(15分钟)、PT1H(1小时)、P1D(日线)等key:API密钥
4. 获取印度指数数据
接口地址:GET /stock/indices
请求参数:
countryId:印度国家ID为14key:API密钥
响应示例:
{
"code": 200,
"data": [
{
"id": 17940,
"name": "Nifty 50",
"symbol": "NSEI",
"last": 22967.65,
"chg": 369.85,
"chgPct": 1.64
},
{
"id": 17941,
"name": "S&P BSE SENSEX",
"symbol": "BSESN",
"last": 75385.24,
"chg": 412.56,
"chgPct": 0.55
}
]
}
Python代码实战示例
以下是一个完整的Python示例,演示如何获取BSE的股票列表和实时行情:
import requests
import pandas as pd
class BSERealTimeAPI:
def __init__(self, api_key):
self.base_url = "https://api.stocktv.top"
self.api_key = api_key
self.headers = {
"Content-Type": "application/json"}
def get_bse_stocks(self, page_size=20):
"""获取BSE交易所股票列表"""
url = f"{self.base_url}/stock/stocks"
params = {
"countryId": 14, # 印度
"exchangeId": 74, # BSE
"pageSize": page_size,
"page": 1,
"key": self.api_key
}
try:
response = requests.get(url, params=params, timeout=10)
data = response.json()
if data.get('code') == 200:
stocks = data['data']['records']
# 转换为DataFrame便于分析
df = pd.DataFrame(stocks)
return df
else:
print(f"请求失败: {data.get('message')}")
return None
except Exception as e:
print(f"请求错误: {e}")
return None
def get_single_stock(self, symbol):
"""查询单只股票实时行情"""
url = f"{self.base_url}/stock/queryStocks"
params = {
"symbol": symbol,
"key": self.api_key
}
try:
response = requests.get(url, params=params, timeout=5)
data = response.json()
if data.get('code') == 200 and data['data']:
stock_info = data['data'][0]
print(f"股票: {stock_info['name']} ({stock_info['symbol']})")
print(f"最新价: {stock_info['last']}")
print(f"涨跌幅: {stock_info['chgPct']}%")
print(f"成交量: {stock_info['volume']}")
return stock_info
else:
print(f"未找到股票: {symbol}")
return None
except Exception as e:
print(f"请求错误: {e}")
return None
def get_kline_data(self, pid, interval="P1D"):
"""获取K线数据"""
url = f"{self.base_url}/stock/kline"
params = {
"pid": pid,
"interval": interval,
"key": self.api_key
}
try:
response = requests.get(url, params=params, timeout=10)
data = response.json()
if data.get('code') == 200:
kline_data = data['data']
return kline_data
else:
print(f"获取K线失败: {data.get('message')}")
return None
except Exception as e:
print(f"请求错误: {e}")
return None
# 使用示例
if __name__ == "__main__":
# 初始化API客户端
api = BSERealTimeAPI(api_key="YOUR_API_KEY") # 替换为你的实际API密钥
# 1. 获取BSE股票实时列表
bse_stocks = api.get_bse_stocks(10)
if bse_stocks is not None:
print("\n--- BSE股票实时行情 ---")
print(bse_stocks[['symbol', 'name', 'last', 'chgPct', 'volume']].head())
# 2. 获取单只股票实时行情
api.get_single_stock("RELIANCE")
# 3. 获取K线数据(需要先获取股票的pid)
if bse_stocks is not None and not bse_stocks.empty:
sample_pid = bse_stocks.iloc[0]['id']
kline_data = api.get_kline_data(sample_pid, "PT1H") # 获取1小时K线
if kline_data:
print(f"\n--- K线数据示例(共{len(kline_data)}条)---")
print(kline_data[:3]) # 显示前3条
WebSocket实时数据订阅
对于需要实时监控价格变动的应用场景,HTTP轮询可能不够高效。此时可以使用WebSocket协议实现毫秒级的数据推送。
import websocket
import json
import threading
import time
class BSEWebSocketClient:
def __init__(self, api_key):
self.ws_url = f"wss://ws-api.stocktv.top/connect?key={api_key}"
self.ws = None
self.connected = False
def on_message(self, ws, message):
"""处理接收到的消息"""
try:
data = json.loads(message)
if data.get('type') == 'stock':
symbol = data.get('symbol', 'N/A')
last_price = data.get('last', 0)
change_pct = data.get('chgPct', 0)
print(f"[实时] {symbol}: {last_price} ({'+' if change_pct >= 0 else ''}{change_pct}%)")
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}")
def on_error(self, ws, error):
print(f"WebSocket错误: {error}")
def on_close(self, ws, close_status_code, close_msg):
print(f"连接关闭: {close_status_code} - {close_msg}")
self.connected = False
def on_open(self, ws):
print("WebSocket连接已建立")
self.connected = True
# 订阅BSE Sensex指数和几只代表性股票
subscribe_msg = {
"action": "subscribe",
"symbols": ["BSESN", "RELIANCE", "TCS", "INFY"],
"countryId": 14
}
ws.send(json.dumps(subscribe_msg))
print("已订阅BSE实时行情")
def connect(self):
"""建立WebSocket连接"""
self.ws = websocket.WebSocketApp(
self.ws_url,
on_open=self.on_open,
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close
)
# 在后台线程中运行WebSocket
wst = threading.Thread(target=self.ws.run_forever)
wst.daemon = True
wst.start()
# 等待连接建立
for _ in range(10):
if self.connected:
break
time.sleep(0.5)
return self.connected
def disconnect(self):
"""断开连接"""
if self.ws:
self.ws.close()
# 使用示例
if __name__ == "__main__":
ws_client = BSEWebSocketClient(api_key="YOUR_API_KEY")
if ws_client.connect():
try:
# 保持连接运行一段时间
time.sleep(30) # 运行30秒
except KeyboardInterrupt:
print("\n用户中断")
finally:
ws_client.disconnect()
else:
print("连接失败")
核心对接流程总结
根据搜索结果,对接BSE交易所数据的核心流程可以概括为以下几步:
- 第一步:获取印度股票列表 - 查询印度市场的股票代码、名称及PID
- 第二步:获取印度指数 - 获取印度主要的Nifty 50和BSE Sensex指数行情
- 第三步:获取K线数据 - 使用第一步获取的id(PID)查询历史数据
- 第四步:涨跌排行榜(可选)- 获取印度市场的涨幅榜或跌幅榜
注意事项与最佳实践
- 频率限制:合理控制API调用频率,避免过度请求
- 错误处理:在代码中添加完善的错误处理逻辑,应对网络异常或API返回错误
- 密钥安全:切勿将API密钥硬编码在客户端代码中,建议通过环境变量等安全方式管理
- 数据缓存:对于不频繁变化的数据(如股票列表),可以考虑本地缓存以减少API调用
- 实时性要求:根据应用场景选择HTTP轮询或WebSocket推送
结语
通过本文介绍的API接口,开发者可以快速接入印度BSE交易所的实时行情数据,为量化交易系统、投资分析工具或金融数据应用提供可靠的数据支持。这套接口方案支持REST API和WebSocket两种接入方式,能够满足不同场景下的实时性需求。
重要声明:本文仅为技术实现指南,所有数据及接口信息来源于相关技术文档。市场有风险,投资需谨慎,本文不构成任何投资建议。
相关资源:
通过合理利用这些接口,开发者可以构建出功能丰富、响应迅速的金融数据应用,为全球投资者提供优质的印度市场数据服务。