接土耳其股市数据踩坑记:itick Turkey Stock API 实际使用分享

AI摘要
【知识分享】本文介绍了使用itick SDK获取土耳其BIST股市数据的实操方法,涵盖多周期K线获取、批量接口调用、WebSocket实时订阅(报价/盘口/逐笔)及限流、时区等注意事项,适合量化或宏观策略开发者参考。

做全球市场配置的朋友最近老问我土耳其股市的数据怎么拿。里拉这几年波动大,BIST(伊斯坦布尔证券交易所)反而成了不少宏观策略和新兴市场基金盯的池子。但说实话,土耳其市场的数据接口不像美股、A股那么好找,免费能用的更少。我自己试了一圈,最后用 itick 跑通了,这里把实际用法和踩过的坑记一下。

准备工作

pip install itick-sdk

itick.org 注册个账号,后台拿 token。土耳其市场的 region 代码是 TR,这个记一下,后面所有接口都要带。

from itick.sdk import Client
token = "your_api_token"
client = Client(token)

多周期K线交叉验证

土耳其股市波动比A股大,做技术分析的时候我习惯同时看几个周期交叉验证。itick 支持的周期还挺全的,从1分钟到月线都有。拿土耳其航空(THYAO)举个例子,8个周期各取5根对比一下:

# THYAO 土耳其航空,多周期K线
periods = {
    1: "1分钟",
    2: "5分钟",
    3: "15分钟",
    4: "30分钟",
    5: "1小时",
    8: "1天",
    9: "1周",
    10: "1月",
}
for k_type, label in periods.items():
    kline = client.get_stock_kline("TR", "THYAO", k_type, 5)
    print(f"{label}K线: {kline}")

分钟级的我一般用来做短线择时验证,日线周线看中长期趋势。这个多周期交叉验证的思路其实哪个市场都能用,不只是土耳其。

批量拉取权重股K线

如果要同时盯好几只权重股,一只一只请求太浪费调用次数了。itick 有批量接口,KCHOL(Koç Holding)、EREGL(Erdemir钢铁)、THYAO、GARAN(Garanti银行)这几只可以一次拉回来:

# 一次性拉取多只土耳其权重股的日K线
codes = ["KCHOL", "EREGL", "THYAO", "GARAN"]
klines_batch = client.get_stock_klines("TR", codes, 8, 30)
print("批量K线结果:", klines_batch)

免费套餐每分钟只有5次调用限额,批量接口基本是刚需——不然光拉四只股票的日K就把额度造完了。做板块轮动分析或者多标的对比图表的时候尤其好用。

WebSocket实时订阅:quote + depth + tick

做实时行情得用 WebSocket。itick 的 SDK 封装了连接逻辑,quote(报价)、depth(盘口)、tick(逐笔成交)三种类型可以同时订阅:

import time
def on_message(msg):
    print("推送:", msg)
def on_error(err):
    print("错误:", err)
client.set_message_handler(on_message)
client.set_error_handler(on_error)
client.connect_stock_websocket()
# 四只权重股,同时订阅报价、盘口、逐笔成交三种类型
client.send_websocket_message(
    '{"ac":"subscribe","params":"KCHOL$TR,EREGL$TR,THYAO$TR,GARAN$TR","types":"quote,depth,tick"}'
)
time.sleep(30)
print("连接状态:", client.is_websocket_connected())
client.close_websocket()

这里有个坑:三种数据类型同时订阅时,服务端推送的消息结构不一样,得用返回里的 type 字段区分。我一开始没注意,把所有消息都按报价处理,盘口数据进来直接报错。建议消息处理函数按类型分发:

def on_message(msg):
    import json
    data = json.loads(msg) if isinstance(msg, str) else msg
    msg_type = data.get("data", {}).get("type")
    if msg_type == "quote":
        handle_quote(data)
    elif msg_type == "depth":
        handle_depth(data)
    elif msg_type == "tick":
        handle_tick(data)
def handle_quote(data):
    print("报价更新:", data["data"]["ld"])
def handle_depth(data):
    print("盘口更新,买一价:", data["data"]["b"][0]["p"])
def handle_tick(data):
    print("成交:", data["data"]["ld"], "方向:", data["data"].get("d"))

quote 里的 ld 是最新价,depth 的 b[0].p 是买一价,tick 除了价格还有成交方向 d。字段名记得看清楚,我第一次把买一卖一搞反了,盯了半天才发现。

上线前要注意的几件事

限流保护:免费和基础套餐的 REST 调用频率有限制,客户端最好加一层简单的请求节流,短时间内打爆了会返回限流错误,影响线上服务。

异常降级:WebSocket 即使 SDK 会自动重连,重连的那几秒前端最好用最后一次收到的数据兜底,别让界面直接空白报错。

时区处理:土耳其跟北京有5小时时差(夏令时的时候是4小时),K线数据里的时间戳都是 UTC 毫秒,前端展示的时候记得按当地时区转换,不然会出现”收盘时间对不上”的困惑——我第一次就踩了这个坑。

多周期缓存:日线、周线这种变化频率低的数据,客户端可以做适当缓存,没必要每次都重新请求,减少不必要的调用消耗。

写在最后

土耳其市场因为波动性和汇率关联性,在数据消费场景上比其他市场稍微复杂一点,但 itick 的接口逻辑跟它支持的其他30多个市场是完全一致的,就是 region=TR 加上 BIST 的股票代码就行。免费套餐先跑通流程,需要更高频率和更多标的的时候再考虑升级。

如果你也在做新兴市场的数据接入,这个方案可以先试试。


项目地址:github.com/itick-org

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
84
粉丝
4
喜欢
8
收藏
8
排名:1764
访问:1535
私信
所有博文
社区赞助商