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

简介: 本文是对接印度BSE交易所数据的完整技术指南,涵盖API密钥获取、关键参数(countryId=14, exchangeId=74)、股票列表/实时行情/K线/指数等核心接口调用,并提供Python REST请求与WebSocket实时订阅的完整代码示例,助开发者快速构建量化分析或金融看板应用。(239字)

使用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 |
| exchangeId | 否 | BSE交易所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两种接入方式,能够满足不同场景下的实时性需求。

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

相关资源

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

相关文章
|
8天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
5272 9
|
16天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
21324 116
|
13天前
|
人工智能 安全 前端开发
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
HiClaw 基于 OpenClaw、Higress AI Gateway、Element IM 客户端+Tuwunel IM 服务器(均基于 Matrix 实时通信协议)、MinIO 共享文件系统打造。
8143 7

热门文章

最新文章