做全球市场配置的朋友最近老问我土耳其股市的数据怎么拿。里拉这几年波动大,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":"KCHOLTR,EREGLTR,THYAOTR,GARANTR","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 的股票代码就行。免费套餐先跑通流程,需要更高频率和更多标的的时候再考虑升级。
如果你也在做新兴市场的数据接入,这个方案可以先试试。

