最近在做一个跨市场数据看板的小项目,需要接入韩国KOSPI和KOSDAQ的实时行情。本以为只是个普通的HTTP请求调用,结果在联调阶段接连踩了几个坑,花了不少时间排查。今天把这些经验整理出来,希望对正在做类似对接的朋友有所帮助。
需求其实很简单:拉取三星电子(005930)、SK海力士等几只热门标的的实时价格和日K线数据,再挂一个KOSPI指数作为大盘参考。初期尝试了直接对接韩国本土券商提供的Open API,但遇到几个比较棘手的问题:
后来换用了某海外聚合行情服务商提供的接口,整体对接成本降低了不少,但依然有一些细节需要注意。
这是第一个遇到的坑。韩国采用UTC+9时区,交易时间为当地时间09:00至15:30。接口返回的tick数据中,时间戳字段是以毫秒为单位返回的。但在进行历史K线分页查询时,翻页参数要求的却是秒级时间戳。
如果直接把毫秒值传给翻页参数,查询起点会直接跳到1970年,导致数据全部错乱。
建议封装一个统一的时间转换工具函数:
from zoneinfo import ZoneInfo
from datetime import datetime
KST = ZoneInfo("Asia/Seoul")
def ts_ms_to_kst(ts_ms: int) -> datetime:
"""将毫秒时间戳转换为韩国时区datetime对象"""
return datetime.fromtimestamp(ts_ms / 1000, tz=KST)
def ts_to_pagination_param(ts_ms: int) -> int:
"""将毫秒时间戳转换为分页参数所需的秒级时间戳"""
return int(ts_ms / 1000)
# 使用示例
tick_time = ts_ms_to_kst(1736000000000)
print(tick_time.strftime("%Y-%m-%d %H:%M:%S %Z"))经验总结: 所有从接口获取的时间字段,一定要先打印确认其单位,再编写转换逻辑。不要凭经验猜测。
韩国股票代码是固定6位的纯数字字符串,例如三星电子的正式代码是005930。如果在代码中将这个值转为整型(int),前导的00就会被丢弃,变成5930。后续用这个错误的ID去请求数据,自然什么都查不到。
更需要注意的是,这套行情系统的底层使用的是产品ID(PID)体系,并非直接使用股票代码。查询K线数据和订阅WebSocket推送时,都需要先用股票代码查到对应的PID,再用PID进行操作:
# 第一步:通过股票代码查询PID
curl "https://api.example.com/stock/queryStocks?symbol=005930&market=KR"
# 第二步:用PID拉取日K线
curl "https://api.example.com/stock/kline?pid=953367&interval=P1D"经验总结: 股票代码始终以字符串形式存储和处理;同时注意区分不同接口的参数体系,有的用symbol,有的用pid,混用会导致404。
韩国主板和KOSDAQ的单日涨跌停限制均为±30%,比A股的±10%宽松得多。如果你的监控策略里写死了abs(changePercent) > 15就触发告警,那么在韩股开盘的第一分钟,警报可能会响个不停。
另一个容易忽视的问题是非交易时段的数据表现。在15:30收盘后以及周末,接口对于实时行情字段的处理方式是不返回数据,或者返回空数组。此时不能假设返回结果的顺序与请求顺序一致,必须通过返回数据中的s或id字段进行重新索引匹配。
# 错误做法:依赖返回顺序
for item in response_data:
print(item['price']) # 可能拿到其他标的的数据
# 正确做法:建立ID映射
price_map = {item['id']: item['price'] for item in response_data}
target_price = price_map.get(target_id)实时行情推送采用的是WebSocket协议。有两个细节特别重要:
import time
import random
def connect_with_retry(url, max_retries=5):
for attempt in range(max_retries):
try:
ws = create_websocket(url)
return ws
except ConnectionError:
wait_time = min(2 ** attempt + random.uniform(0, 1), 30)
time.sleep(wait_time)
raise Exception("WebSocket connection failed after retries")经过这段时间的对接实践,总结几点核心体会:
关注点 | 直接对接本土券商API | 使用第三方聚合接口 |
|---|---|---|
Token管理 | 需自行实现刷新 | URL挂Key即可 |
限流策略 | 较为严格 | 相对宽松 |
非交易时段 | 返回None | 返回昨收或静默 |
WS重连 | 需自行实现 | 同样需自行实现 |
如果你的项目也是做跨境行情展示或量化回测,不妨考虑使用聚合类数据源来降低对接成本。官方技术文档和社区支持可以通过以下渠道获取:
官方入口:pao.stocktv.top
技术支持:t.me/stocktvpaopao
下一篇计划聊聊如何利用这些数据做一个简单的KOSPI指数与韩元汇率的联动分析,敬请期待。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。