使用Python对接全球金融市场API:获取多国实时数据
一、StockTV API简介
StockTV API提供全球股票、外汇、期货、加密货币的实时行情数据,覆盖多个国家市场,包括马来西亚、印度、越南、日本、美国等。其核心优势如下:
- 不限请求次数,适合高频数据抓取与监控
- WebSocket低延迟推送,毫秒级实时行情更新
- REST API响应快,平均响应时间小于200ms
- 多国数据支持,新兴市场数据覆盖全面
二、准备工作
1. 获取API Key
联系Telegram客服获取测试Key,免费试用期内包含所有接口权限。
2. Python环境配置
pip install requests websockets pandas
三、HTTP API对接示例
1. 获取马来西亚股票列表
import requests
import pandas as pd
API_KEY = "YOUR_KEY"
url = "https://api.stocktv.top/stock/stocks"
params = {
"countryId": 42, # 马来西亚countryId
"pageSize": 10,
"page": 1,
"key": API_KEY
}
response = requests.get(url, params=params)
data = response.json()
# 转换为DataFrame
df = pd.DataFrame(data['data']['records'])
print(df[['symbol', 'name', 'last', 'chgPct']])
2. 查询印度Nifty50指数
url = "https://api.stocktv.top/stock/indicesById"
params = {
"id": 17940, # Nifty50指数ID
"key": API_KEY
}
data = requests.get(url, params).json()
index_data = data['data'][0]
print(f"{index_data['name']} 最新价: {index_data['last']} 涨跌幅: {index_data['chgPct']}%")
3. 获取越南股票历史K线
url = "https://api.stocktv.top/stock/kline"
params = {
"pid": 7310, # 股票产品ID
"interval": "PT1H", # 1小时粒度
"key": API_KEY
}
klines = requests.get(url, params).json()['data']
df_kline = pd.DataFrame(klines)
df_kline['time'] = pd.to_datetime(df_kline['time'], unit='ms') # 时间戳转换
四、WebSocket实时推送
import asyncio
import websockets
import json
async def stock_websocket():
uri = f"wss://ws-api.stocktv.top/connect?key={API_KEY}"
async with websockets.connect(uri) as ws:
# 心跳维持(每30秒)
asyncio.create_task(send_heartbeat(ws))
while True:
msg = await ws.recv()
data = json.loads(msg)
handle_realtime_data(data)
async def send_heartbeat(ws):
while True:
await asyncio.sleep(30)
await ws.send('{"action":"ping"}')
def handle_realtime_data(data):
print(f"""实时行情更新:
代码: {data['pid']}
最新价: {data['last_numeric']}
涨跌幅: {data['pcp']}%
成交量: {data['turnover_numeric']}""")
# 启动监听
asyncio.get_event_loop().run_until_complete(stock_websocket())
五、高级技巧
1. 多国数据并行获取
from concurrent.futures import ThreadPoolExecutor
countries = [
{'name': 'Malaysia', 'id': 42},
{'name': 'India', 'id': 14},
{'name': 'Vietnam', 'id': 58}
]
def fetch_market(country_id):
params = {'countryId': country_id, 'key': API_KEY}
return requests.get("https://api.stocktv.top/stock/stocks", params).json()
with ThreadPoolExecutor() as executor:
results = executor.map(fetch_market, [c['id'] for c in countries])
2. 数据存储方案
import sqlite3
def save_to_db(data):
conn = sqlite3.connect('stocktv.db')
df = pd.DataFrame(data)
df.to_sql('realtime_quotes', conn, if_exists='append', index=False)
3. 异常处理
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def safe_api_call(url, params):
try:
return requests.get(url, params, timeout=5)
except requests.exceptions.RequestException as e:
print(f"API请求失败: {str(e)}")
raise
六、应用场景
- 量化交易系统:实时获取东南亚新兴市场数据
- 跨市场监控看板:同时展示多国指数行情
- 财经APP开发:快速搭建行情模块
- 基本面分析:获取公司财务数据接口
七、常见问题
Q1 如何获取其他国家countryId?
- 调用
/stock/stocks
接口查看返回的countryId字段
Q2 WebSocket如何订阅特定股票?
- 连接后发送格式:
{"action":"subscribe", "pid":[股票ID列表]}
Q3 历史数据获取限制?
- K线数据默认返回最近3个月,可通过start/end参数指定时间范围