印度金融市场数据全指南:K线、实时行情与IPO新股对接
一、印度金融市场特色与数据价值
印度作为全球增长最快的主要经济体之一,其金融市场具有独特优势:
- 市场规模庞大
NSE(国家证券交易所)日均交易量超5000亿卢比,BSE(孟买交易所)拥有百年历史 - 指数多样性
- Nifty 50:印度蓝筹股基准指数
- Nifty Bank:银行板块风向标
- Nifty IT:全球IT服务公司聚集地
- 高成长性行业
IT服务、制药、消费金融板块年增长率超15% - 独特交易机制
交易时段:9:15-15:30(IST),含盘前竞价(9:00-9:15) - IPO热潮
2023年印度IPO数量全球第三,新兴科技公司占比40%
二、环境配置与基础对接
# 基础配置 - 印度市场专用
API_KEY = "IN_3a8b7c2d4e5f6a7b8c9d0e" # 替换为实际密钥
BASE_URL = "https://api.stocktv.top"
INDIA_ID = 14 # 印度国家代码(文档确认值)
# 时区设置
from datetime import datetime
import pytz
ist = pytz.timezone('Asia/Kolkata') # 印度标准时区
# 安装依赖
# pip install requests websocket-client pandas plotly
三、K线数据专业对接方案
1. 多周期K线获取
def get_india_kline(pid, interval="PT15M"):
"""
获取印度股票K线
:param pid: 股票唯一ID(从市场列表获取)
:param interval: 时间间隔(PT5M/PT15M/PT1H/P1D)
"""
url = f"{BASE_URL}/stock/kline"
params = {
"pid": pid,
"interval": interval,
"key": API_KEY
}
response = requests.get(url, params=params)
data = response.json()
# 转换时间戳到IST时区
df = pd.DataFrame(data['data'])
df['time'] = pd.to_datetime(df['time'], unit='ms').dt.tz_localize('UTC').dt.tz_convert(ist)
return df
# 获取信实工业(RELIANCE)15分钟K线
reliance_kline = get_india_kline(pid=12345, interval="PT15M")
2. 专业K线可视化(印度特色)
def plot_indian_stock(df, title):
fig = make_subplots(rows=2, cols=1, shared_xaxes=True,
row_heights=[0.7, 0.3])
# 印度常用绿色表示上涨
fig.add_trace(go.Candlestick(
x=df['time'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
increasing_line_color='green',
decreasing_line_color='red'
), row=1, col=1)
# 添加20日EMA(印度分析师常用)
df['EMA20'] = df['close'].ewm(span=20).mean()
fig.add_trace(go.Scatter(
x=df['time'],
y=df['EMA20'],
name='EMA20',
line=dict(color='blue', width=2)
), row=1, col=1)
# 成交量(印度以卢比计价)
fig.add_trace(go.Bar(
x=df['time'],
y=df['volume'],
name='成交量(₹)',
marker_color='#7f7f7f'
), row=2, col=1)
# 设置印度交易时段标记
fig.update_xaxes(
rangebreaks=[
{'bounds': ['sat', 'mon']}, # 隐藏周末
{'pattern': 'hour', 'bounds': [15.5, 9]}, # 非交易时段
]
)
fig.update_layout(
title=f'{title} - NSE印度市场',
yaxis_title='价格(₹)',
template="plotly_dark",
height=600
)
fig.show()
plot_indian_stock(reliance_kline, "信实工业(RELIANCE)")
四、实时行情数据对接
1. WebSocket实时行情订阅
class IndiaRealtime:
def __init__(self):
self.stock_map = {
"RELIANCE": "信实工业",
"HDFCBANK": "HDFC银行",
"TCS": "塔塔咨询"
}
def on_message(self, ws, message):
data = json.loads(message)
if 'pid' in data:
symbol = self.get_symbol_by_pid(data['pid'])
trend = "🟢" if data['chgPct'] >=0 else "🔴"
print(f"{trend} {symbol}: {data['last']} ₹ "
f"({data['chgPct']:.2f}%) 量: {data['turnover_numeric']/1e6:.2f}M")
def start(self):
ws = websocket.WebSocketApp(
f"wss://ws-api.stocktv.top/connect?key={API_KEY}",
on_message=self.on_message
)
threading.Thread(target=ws.run_forever).start()
def get_symbol_by_pid(self, pid):
# 根据PID获取股票代码(需预先缓存映射关系)
return self.stock_map.get(str(pid), f"UNKNOWN_{pid}")
# 启动实时服务
india_rt = IndiaRealtime()
india_rt.start()
五、IPO新股数据对接
1. IPO日历与详情获取
def get_india_ipo(status="upcoming"):
"""获取印度IPO列表"""
url = f"{BASE_URL}/stock/getIpo"
params = {
"countryId": INDIA_ID,
"status": status,
"key": API_KEY
}
response = requests.get(url, params=params)
return response.json()['data']
# 获取近期IPO
ipos = get_india_ipo()
print("印度即将上市IPO:")
for ipo in ipos[:3]:
print(f"- {ipo['company']} ({ipo['symbol']})")
print(f" 交易所: {ipo['exchange']}")
print(f" 发行价: {ipo['ipoPrice']} ₹")
print(f" 市值: {ipo['ipoValue']} | 日期: {ipo['date']}")
2. IPO数据分析
def analyze_ipo_performance():
ipos = get_india_ipo("recent")
df = pd.DataFrame(ipos)
# 计算首日收益率
df['return_pct'] = (df['last'] - df['ipoPrice']) / df['ipoPrice'] * 100
# 按交易所分析
exchange_perf = df.groupby('exchange')['return_pct'].agg(['mean', 'count'])
# 可视化
fig = px.bar(df, x='symbol', y='return_pct',
color='exchange',
title="印度IPO首日收益率",
labels={'symbol':'股票代码', 'return_pct':'收益率(%)'})
fig.show()
return df
ipo_df = analyze_ipo_performance()
六、生产环境最佳实践
1. 印度市场特殊处理
# 印度市场假期(2023年示例)
IN_HOLIDAYS = ['2023-01-26', '2023-03-07', '2023-04-04', '2023-08-15']
def is_trading_day(date):
"""检查是否为印度交易日"""
return date.weekday() < 5 and date.strftime('%Y-%m-%d') not in IN_HOLIDAYS
def is_trading_time(dt):
"""检查交易时段"""
if not is_trading_day(dt): return False
hour, minute = dt.hour, dt.minute
# 主交易时段: 9:15-15:30 IST
return (9,15) <= (hour,minute) <= (15,30)
2. 性能优化策略
import redis
from functools import lru_cache
# 初始化Redis缓存
redis_pool = redis.ConnectionPool(host='localhost', port=6379, db=3)
redis_client = redis.Redis(connection_pool=redis_pool)
@lru_cache(maxsize=100)
def get_stock_detail(pid):
"""带缓存的股票详情查询"""
cache_key = f"in:stock:{pid}"
if redis_client.exists(cache_key):
return json.loads(redis_client.get(cache_key))
url = f"{BASE_URL}/stock/queryStocks"
params = {"id": pid, "key": API_KEY}
response = requests.get(url, params=params)
data = response.json()
# 缓存15分钟
redis_client.setex(cache_key, 900, json.dumps(data))
return data
七、总结与资源
核心价值点:
- 实时获取NSE/BSE双交易所数据
- 支持中小板(SME)IPO数据
- 卢比(Rupee)计价精准处理
印度市场注意事项:
- 价格单位:1手=1股(不同于多数市场)
- 涨跌幅限制:各板块不同(主板块±20%)
- 结算周期:T+2交割制度
- 特色板块:
- Nifty IT:Infosys、TCS等IT巨头
- Nifty Pharma:太阳制药等全球供应商
扩展资源:
重要提示:印度股市数据需遵守SEBI的《市场数据政策》,商业用途需获取授权
# 示例密钥生成代码(实际使用需官网申请)
import secrets
api_key = "IN_" + secrets.token_hex(12).upper()
print(f"生成印度专用API密钥: {api_key}")