使用API对接BSE交易所数据:完整技术实现指南

0 阅读7分钟

使用API对接BSE交易所数据:完整技术实现指南

引言:为什么关注印度BSE交易所?

印度孟买证券交易所(BSE)是亚洲最古老的证券交易所,也是印度两大主要证券交易市场之一。随着印度经济的快速增长,BSE市场吸引了大量全球投资者的目光。对于开发者而言,能够便捷地获取BSE的实时股票数据,是构建量化交易系统、投资分析平台或金融看板应用的关键第一步。

本文将基于一套成熟的金融数据接口,详细讲解如何快速、稳定地对接印度BSE交易所的股票数据接口,涵盖从获取API密钥、查询实时行情到订阅实时推送的全流程,并提供完整的Python代码示例。

准备工作:获取API密钥与理解关键参数

在开始调用API之前,需要完成两项准备:

  1. 获取API Key:所有接口调用都需要在请求参数中携带有效的API Key进行身份验证。你可以通过官方提供的联系方式申请密钥。密钥格式通常类似 MY4b781f618e3f43c4b055f25fa61941ad

  2. 理解关键参数:对接印度BSE市场,以下两个参数至关重要:

    • countryId=14:这代表印度市场,是几乎所有接口的必填参数
    • exchangeId=74:这是BSE(孟买证券交易所)在系统中的唯一标识符。另一个主要交易所NSE的ID是46

API基础地址为:https://api.stocktv.top

核心API接口详解

1. 获取BSE股票列表

这是获取数据的第一步,目的是得到BSE上市公司的基本信息和唯一标识符(idpid),后续查询详细行情都需要用到它。

接口地址GET /stock/stocks

请求参数

参数名必填说明
countryId印度市场ID,固定为14
exchangeIdBSE交易所ID,此处应填74
pageSize每页数量
page页码
key你的API密钥

返回示例:返回的JSON数据中,data.records数组包含了股票列表,每个股票对象都有id(后续接口中的pid)、symbol(股票代码)、name(公司名称)、last(最新价)、chgPct(涨跌幅)等关键字段。

2. 查询特定股票实时行情

接口地址GET /stock/queryStocks

请求参数

  • id:股票ID
  • symbol:股票代码如"RELIANCE"
  • name:股票名称
  • key:API密钥

3. 获取K线数据

接口地址GET /stock/kline

请求参数

  • pid:股票ID
  • interval:时间间隔,如PT5M(5分钟)、PT15M(15分钟)、PT1H(1小时)、P1D(日线)等
  • key:API密钥

4. 获取印度指数数据

接口地址GET /stock/indices

请求参数

  • countryId:印度国家ID为14
  • key: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交易所数据的核心流程可以概括为以下几步:

  1. 第一步:获取印度股票列表 - 查询印度市场的股票代码、名称及PID
  2. 第二步:获取印度指数 - 获取印度主要的Nifty 50和BSE Sensex指数行情
  3. 第三步:获取K线数据 - 使用第一步获取的id(PID)查询历史数据
  4. 第四步:涨跌排行榜(可选)- 获取印度市场的涨幅榜或跌幅榜

注意事项与最佳实践

  1. 频率限制:合理控制API调用频率,避免过度请求
  2. 错误处理:在代码中添加完善的错误处理逻辑,应对网络异常或API返回错误
  3. 密钥安全:切勿将API密钥硬编码在客户端代码中,建议通过环境变量等安全方式管理
  4. 数据缓存:对于不频繁变化的数据(如股票列表),可以考虑本地缓存以减少API调用
  5. 实时性要求:根据应用场景选择HTTP轮询或WebSocket推送

结语

通过本文介绍的API接口,开发者可以快速接入印度BSE交易所的实时行情数据,为量化交易系统、投资分析工具或金融数据应用提供可靠的数据支持。这套接口方案支持REST API和WebSocket两种接入方式,能够满足不同场景下的实时性需求。

重要声明:本文仅为技术实现指南,所有数据及接口信息来源于相关技术文档。市场有风险,投资需谨慎,本文不构成任何投资建议。

相关资源

通过合理利用这些接口,开发者可以构建出功能丰富、响应迅速的金融数据应用,为全球投资者提供优质的印度市场数据服务。