对接API库 获取印度股票历史数据

简介: 本文介绍如何通过StockTV API对接印度股市,获取NSE/BSE股票及指数的历史K线、实时行情、IPO等数据。涵盖API配置、多语言调用、数据处理与可视化,助力量化分析与投资决策。(239字)

对接API库 获取印度股票历史数据

引言:印度股市的数据价值

印度作为全球增长最快的主要经济体之一,其金融市场吸引了众多国际投资者的目光。印度股市采用双交易所体系,包括国家证券交易所(NSE)和孟买证券交易所(BSE),其中NSE占全国交易量的90%以上,Nifty 50指数是其核心基准,而BSE是亚洲最古老的交易所,Sensex 30指数代表传统企业。

对于开发者、数据分析师和量化研究人员来说,获取印度股市的高质量历史数据是进行市场分析、策略回测和投资决策的基础。本文将详细介绍如何通过API高效对接印度股票市场,获取包括K线、实时行情在内的全面金融数据。

一、环境配置与API基础

1.1 获取API密钥

首先,您需要API获取API密钥,这是调用所有数据接口的凭证。

# StockTV API基础配置
API_KEY = "your_api_key_here"  # 通过官网或客服获取
BASE_URL = "https://api.stocktv.top"

# 印度市场特定参数
INDIA_COUNTRY_ID = 14  # 印度国家代码
NSE_EXCHANGE_ID = 46   # NSE交易所代码
BSE_EXCHANGE_ID = 74   # BSE交易所代码

1.2 安装必要依赖库

根据您的开发语言选择相应的安装方式:

# Python环境安装
pip install requests websocket-client pandas pytz plotly
// Java项目依赖(Maven)
// 在pom.xml中添加HttpClient和JSON处理依赖

二、获取印度股票列表

在获取历史数据前,需要先了解印度市场的股票列表及其标识符。

2.1 获取NSE和BSE股票列表

import requests

def get_indian_stocks(page=1, page_size=50):
    """获取印度股票列表"""
    url = f"{BASE_URL}/stock/stocks"
    params = {
        "countryId": INDIA_COUNTRY_ID,  # 印度国家ID
        "pageSize": page_size,
        "page": page,
        "key": API_KEY
    }
    response = requests.get(url, params=params)
    return response.json()

# 示例调用
stocks = get_indian_stocks()
print(f"获取到{len(stocks['data']['records'])}只印度股票")

2.2 解析股票列表数据

StockTV返回的股票列表包含以下关键信息:

{
  "code": 200,
  "data": {
    "records": [
      {
        "id": 946725,        // 重要:这是PID,后续查K线要用
        "name": "Inventure Growth Securities",
        "symbol": "IGSL",
        "exchangeId": 46,    // 46代表NSE,74代表BSE
        "last": 2.46,        // 最新价
        "chgPct": -20.13,    // 涨跌幅
        "countryNameTranslated": "India"
      }
    ]
  }
}

三、获取印度股票K线数据

K线数据是历史数据分析的核心,包含开盘价、最高价、最低价、收盘价和成交量等信息。

3.1 多周期K线获取接口

import pandas as pd
import requests

def get_india_kline(pid, interval="15m"):
    """
    获取印度股票K线数据
    :param pid: 股票ID(从股票列表中获取)
    :param interval: 时间间隔(1m/5m/15m/1h/1d)
    """
    url = f"{BASE_URL}/stock/kline"
    params = {
        "pid": pid,
        "interval": interval,
        "key": API_KEY
    }
    response = requests.get(url, params=params)
    data = response.json()

    # 转换为Pandas DataFrame
    df = pd.DataFrame(data['data'])
    df['time'] = pd.to_datetime(df['time'], unit='ms')  # 转换时间戳
    return df

# 获取Reliance Industries的日线数据
reliance_kline = get_india_kline(12345, "1d")

3.2 支持的时间周期

StockTV API支持多种时间周期,满足不同分析需求:

周期参数 说明 适用场景
PT1M 1分钟K线 高频交易分析
PT5M 5分钟K线 短期趋势分析
PT15M 15分钟K线 日内交易
PT1H 1小时K线 中期趋势分析
P1D 日线数据 长期投资分析

3.3 Java语言获取K线数据示例

对于Java开发者,可以使用以下方式获取K线数据:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import org.json.JSONArray;
import org.json.JSONObject;

public class IndiaKLineFetcher {
    public static void main(String[] args) throws Exception {
        String apiUrl = "https://api.stocktv.top/stock/kline?pid=12345&interval=P1D&key=YOUR_API_KEY";

        HttpClient client = HttpClient.newBuilder()
                .connectTimeout(Duration.ofSeconds(10))
                .build();

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(apiUrl))
                .GET() 
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        JSONObject jsonResponse = new JSONObject(response.body());
        JSONArray data = jsonResponse.getJSONArray("data");

        for (int i = 0; i < data.length(); i++) {
            JSONObject item = data.getJSONObject(i);
            System.out.println("时间: " + item.getLong("time") +
                    ", 开盘价: " + item.getDouble("open") +
                    ", 最高价: " + item.getDouble("high") +
                    ", 最低价: " + item.getDouble("low") +
                    ", 收盘价: " + item.getDouble("close"));
        }
    }
}

四、高级数据获取功能

4.1 获取印度指数数据

印度市场的主要指数(如Nifty 50和Sensex)是市场风向标。

def get_indian_indices():
    """获取印度主要指数数据"""
    url = f"{BASE_URL}/stock/indices"
    params = {
        "countryId": INDIA_COUNTRY_ID,
        "key": API_KEY
    }
    response = requests.get(url, params=params)
    return response.json()

# 获取指数数据
indices = get_indian_indices()
nifty50 = next(i for i in indices['data'] if i['name'] == 'Nifty 50')
print(f"Nifty 50当前点位: {nifty50['last']}")

4.2 IPO新股数据获取

印度IPO市场活跃,StockTV API提供新股上市日历和详细信息。

def get_india_ipo_list(status="upcoming"):
    """
    获取印度IPO列表
    :param status: upcoming(即将上市)/recent(近期上市)
    """
    url = f"{BASE_URL}/stock/getIpo"
    params = {
        "countryId": INDIA_COUNTRY_ID,
        "status": status,
        "key": API_KEY
    }
    response = requests.get(url, params=params)
    return response.json()

# 获取即将上市的IPO
upcoming_ipos = get_india_ipo_list("upcoming")
print("即将上市的IPO:")
for ipo in upcoming_ipos['data'][:5]:
    print(f"{ipo['company']} ({ipo['symbol']}) - 发行价: ₹{ipo['ipoPrice']}")

五、专业级数据处理与可视化

5.1 K线数据可视化

使用Plotly等库对获取的K线数据进行可视化展示。

import plotly.graph_objects as go
from plotly.subplots import make_subplots

def plot_advanced_kline(df, title="印度股票K线图"):
    """绘制专业K线图"""
    fig = make_subplots(rows=2, cols=1, shared_xaxes=True,
                       vertical_spacing=0.03, subplot_titles=(title, '成交量'),
                       row_width=[0.2, 0.7])

    # K线主图
    fig.add_trace(go.Candlestick(x=df['time'], open=df['open'],
                                high=df['high'], low=df['low'],
                                close=df['close'], name="K线"),
                 row=1, col=1)

    # 成交量图
    fig.add_trace(go.Bar(x=df['time'], y=df['volume'], 
                        name="成交量", marker_color='rgba(100, 100, 255, 0.6)'),
                 row=2, col=1)

    fig.update_layout(xaxis_rangeslider_visible=False)
    fig.show()

# 使用示例
plot_advanced_kline(reliance_kline, "Reliance Industries K线图")

5.2 数据存储方案

对于大量历史数据,建议使用数据库进行存储管理。

from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime

Base = declarative_base()

class HistoricalData(Base):
    __tablename__ = 'india_historical_data'

    id = Column(Integer, primary_key=True)
    symbol = Column(String(20))
    exchange = Column(String(10))
    open_price = Column(Float)
    high_price = Column(Float)
    low_price = Column(Float)
    close_price = Column(Float)
    volume = Column(Integer)
    timestamp = Column(DateTime)
    created_at = Column(DateTime, default=datetime.utcnow)

# 初始化数据库连接
engine = create_engine('sqlite:///india_market.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

六、生产环境最佳实践

6.1 错误处理与重试机制

在生产环境中,稳定的错误处理机制至关重要。

from tenacity import retry, stop_after_attempt, wait_exponential
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@retry(stop=stop_after_attempt(3), 
       wait=wait_exponential(multiplier=1, min=4, max=10))
def safe_api_call(url, params):
    """带重试机制的API调用"""
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        logger.error(f"API请求失败: {e}")
        raise

# 使用安全API调用
try:
    data = safe_api_call(f"{BASE_URL}/stock/kline", params)
except Exception as e:
    logger.error(f"获取K线数据失败: {e}")

6.2 性能优化方案

对于大量数据的获取,性能优化是必要的。

from threading import Thread
from concurrent.futures import ThreadPoolExecutor, as_completed
import redis
from functools import lru_cache

# 初始化Redis连接用于缓存
r = redis.Redis(host='localhost', port=6379, db=0)

@lru_cache(maxsize=100)
def get_stock_info(symbol):
    """缓存股票基本信息"""
    cache_key = f"stock:{symbol}:info"
    cached = r.get(cache_key)
    if cached:
        return json.loads(cached)

    # 缓存未命中时调用API
    url = f"{BASE_URL}/stock/queryStocks"
    params = {"symbol": symbol, "countryId": INDIA_COUNTRY_ID, "key": API_KEY}
    data = safe_api_call(url, params)
    r.setex(cache_key, 3600, json.dumps(data))  # 缓存1小时
    return data

# 批量获取K线数据优化
def batch_get_kline(symbols, interval):
    """批量获取K线数据,减少API调用次数"""
    results = {}
    with ThreadPoolExecutor(max_workers=5) as executor:
        future_to_symbol = {
            executor.submit(get_india_kline, sym, "NSE", interval): sym 
            for sym in symbols
        }
        for future in as_completed(future_to_symbol):
            symbol = future_to_symbol[future]
            try:
                results[symbol] = future.result()
            except Exception as e:
                logger.error(f"获取{symbol}数据失败: {e}")
    return results

七、印度市场特殊考量

7.1 时区处理

印度使用IST时区(UTC+5:30),所有时间戳需要正确转换。

from pytz import timezone
import pandas as pd

def convert_to_ist(timestamp):
    """将时间戳转换为印度标准时间"""
    utc_time = pd.to_datetime(timestamp, unit='ms', utc=True)
    ist = timezone('Asia/Kolkata')
    return utc_time.tz_convert(ist)

# 应用时区转换
df['time_ist'] = df['time'].apply(convert_to_ist)

7.2 交易时间考虑

印度股市交易时间为工作日09:15-15:30 IST(UTC+5:30),中间有12:00-12:15的午休时间,数据处理时需考虑这些非交易时段。

结语

通过StockTV API,开发者可以高效地获取印度股票市场的全面历史数据,为量化分析、策略回测和投资决策提供数据支持。本文介绍了从基础配置到高级应用的完整流程,涵盖了REST API调用、数据可视化、错误处理和性能优化等关键环节。

印度金融市场具有巨大的增长潜力和独特的特性,通过可靠的数据接口获取准确、及时的市场数据,是把握投资机会的重要基础。希望本文能为您的印度股市数据分析项目提供实用的技术参考。

本文代码示例基于StockTV API v3.2,实际开发请以最新官方文档为准。

相关文章
|
5天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
4天前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1579 6
|
6天前
|
安全 数据可视化 网络安全
安全无小事|阿里云先知众测,为企业筑牢防线
专为企业打造的漏洞信息收集平台
1322 2
|
5天前
|
缓存 算法 关系型数据库
深入浅出分布式 ID 生成方案:从原理到业界主流实现
本文深入探讨分布式ID的生成原理与主流解决方案,解析百度UidGenerator、滴滴TinyID及美团Leaf的核心设计,涵盖Snowflake算法、号段模式与双Buffer优化,助你掌握高并发下全局唯一ID的实现精髓。
346 160
|
5天前
|
人工智能 自然语言处理 API
n8n:流程自动化、智能化利器
流程自动化助你在重复的业务流程中节省时间,可通过自然语言直接创建工作流啦。
406 6
n8n:流程自动化、智能化利器
|
7天前
|
人工智能 API 开发工具
Skills比MCP更重要?更省钱的多!Python大佬这观点老金测了一周终于懂了
加我进AI学习群,公众号右下角“联系方式”。文末有老金开源知识库·全免费。本文详解Claude Skills为何比MCP更轻量高效:极简配置、按需加载、省90% token,适合多数场景。MCP仍适用于复杂集成,但日常任务首选Skills。推荐先用SKILL.md解决,再考虑协议。附实测对比与配置建议,助你提升效率,节省精力。关注老金,一起玩转AI工具。
|
14天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1544 7
|
4天前
|
Linux 数据库
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
本文介绍在CentOS 7.9环境下安装PolarDB-X单机版数据库的完整流程,涵盖系统环境准备、本地Yum源配置、RPM包安装、用户与目录初始化、依赖库解决、数据库启动及客户端连接等步骤,助您快速部署运行PolarDB-X。
246 1
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
|
8天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
670 119