意大利股票API接入指南:如何获取米兰证券交易所实时行情与历史数据

在全球资产配置需求日益增长的 2026 年,意大利作为欧元区第三大经济体,其股市价值愈发凸显。米兰证券交易所(Borsa Italiana)汇聚了众多全球知名企业,从轮胎巨头倍耐力到豪华汽车品牌法拉利,从能源龙头埃尼到银行翘楚联合圣保罗,意大利股票正成为量化交易者和跨境投资者的重要配置标的。
本文将为您详细讲解如何通过iTick API一站式接入意大利股票市场,获取实时行情、历史 K 线及深度盘口数据,并提供完整的 Python 实战代码,助您快速构建意大利股市数据分析系统。
一、为什么选择 iTick 接入意大利股市?
在对比了主流金融数据 API 服务后,iTick 凭借以下优势成为接入意大利市场的理想选择:
| 对比维度 | iTick API | 传统数据源 | 免费公共接口 |
|---|---|---|---|
| 意大利市场覆盖 | 米兰交易所全部股票 | 通常仅指数成分股 | 极少或无 |
| 实时延迟 | <50ms (WebSocket) | 100-500ms | 15 分钟延时 |
| 历史数据长度 | 超 15 年 | 10 年左右 | 仅 1-2 年 |
| 协议支持 | REST + WebSocket + FIX | 通常仅 REST | 仅 REST |
| 免费套餐 | 基础行情无限调用 | 无免费套餐 | 有次数限制 |
| 多资产支持 | 股票/外汇/期货/基金一站式 | 通常仅股票 | 仅股票 |
iTick 的核心优势
- 真正的欧洲市场覆盖:iTick 支持意大利米兰证券交易所(Borsa Italiana)全部股票的实时与历史数据,无论是蓝筹股还是中小盘股票,均可通过统一的 API 接口获取。
- 开发者友好设计:提供标准易用的 REST API 和 WebSocket 协议,文档简洁清晰,配有各类语言的示例代码,帮助开发者快速接入。
- 超低延迟实时数据:专业级数据流,延迟<50ms,支持 WebSocket 协议实现真正的实时推送,每秒更新频率,捕捉每一个市场波动。
- 灵活的数据类型:支持成交(tick)、报价(quote)、盘口(depth)等多种数据类型,满足量化交易的不同需求。
- 免费套餐够用:新用户可享受免费套餐,包含基础行情无限调用和 WebSocket 连接支持,足以满足个人学习和轻量级开发需求。
二、环境准备
在开始接入之前,需要完成以下准备工作:
1. 注册 iTick 账号并获取 API Token
访问 iTick 官网 注册账号,30 秒完成注册,无需信用卡。在控制台即可找到您的专属 API Token。
2. 安装 Python 依赖库
本教程需要安装requests和websocket-client库:
pip install requests websocket-client pandas matplotlib
三、意大利股票实时行情接入(WebSocket)
对于量化交易系统,实时性是关键。WebSocket 协议能够实现低延迟的数据推送,是构建高频交易系统的理想选择。
WebSocket API 参数说明
WebSocket 连接地址:wss://api.itick.org/stock
连接认证:在 HTTP Header 中传递 token 参数
订阅请求格式:
| 参数 | 描述 | 类型 | 必填 | 示例 |
|---|---|---|---|---|
| ac | 操作类型,固定为"subscribe" | String | 是 | "subscribe" |
| params | 标的代码,支持多个,用逗号分隔。格式:code$IT | String | 是 | "ENI$IT,FERR$IT,ISP$IT" |
| types | 订阅类型,支持"tick"(成交)、"quote"(报价)、"depth"(盘口) | String | 是 | "tick,quote,depth" |
Python 实战:订阅意大利股票实时数据
以下代码示例订阅意大利三家代表性公司的实时行情:
- Eni (ENI$IT) - 意大利能源巨头
- Ferrari (FERR$IT) - 豪华跑车制造商
- Intesa Sanpaolo (ISP$IT) - 意大利最大银行之一
import websocket
import json
import threading
import time
# WebSocket 连接地址和 token
WS_URL = "wss://api.itick.org/stock"
API_TOKEN = "your_api_token_here" # 替换为您的实际Token
def on_message(ws, message):
"""处理接收到的消息"""
data = json.loads(message)
# 处理连接成功的消息
if data.get("code") == 1 and data.get("msg") == "Connected Successfully":
print("✅ WebSocket连接成功,等待认证...")
# 处理认证结果
elif data.get("resAc") == "auth":
if data.get("code") == 1:
print("✅ 认证成功,准备订阅数据...")
subscribe(ws)
else:
print("❌ 认证失败")
ws.close()
# 处理订阅结果
elif data.get("resAc") == "subscribe":
if data.get("code") == 1:
print("✅ 订阅成功")
else:
print(f"❌ 订阅失败: {data.get('msg')}")
# 处理市场数据
elif data.get("data"):
market_data = data["data"]
data_type = market_data.get("type")
symbol = market_data.get("s")
if data_type == "quote":
print(f"[{symbol}] 最新价: {market_data.get('ld')} EUR | "
f"涨跌幅: {market_data.get('chp')}% | "
f"成交量: {market_data.get('v')}")
elif data_type == "tick":
print(f"[{symbol}] 成交: {market_data.get('ld')} EUR | "
f"时间: {time.strftime('%H:%M:%S', time.localtime(market_data.get('t')/1000))}")
elif data_type == "depth":
bids = market_data.get("b", [])[:3] # 买三档
asks = market_data.get("a", [])[:3] # 卖三档
print(f"[{symbol}] 买盘: {bids} | 卖盘: {asks}")
def on_error(ws, error):
"""处理错误"""
print(f"❌ WebSocket错误: {error}")
def on_close(ws, close_status_code, close_msg):
"""连接关闭回调"""
print(f"🔌 WebSocket连接关闭: {close_msg}")
def on_open(ws):
"""连接建立后的回调"""
print("🌐 WebSocket连接已打开")
def subscribe(ws):
"""订阅意大利股票行情数据"""
subscribe_msg = {
"ac": "subscribe",
"params": "ENI$IT,FERR$IT,ISP$IT", # 意大利股票代码:埃尼、法拉利、联合圣保罗银行
"types": "tick,quote,depth" # 订阅成交、报价和盘口数据
}
ws.send(json.dumps(subscribe_msg))
print(f"📤 订阅请求已发送: {subscribe_msg['params']}")
def send_ping(ws):
"""定期发送心跳包保持连接"""
while True:
time.sleep(30) # 每30秒发送一次心跳
ping_msg = {
"ac": "ping",
"params": str(int(time.time() * 1000))
}
ws.send(json.dumps(ping_msg))
print("💓 心跳已发送")
if __name__ == "__main__":
# 创建 WebSocket 连接,通过header传递token
ws = websocket.WebSocketApp(
WS_URL,
header={"token": API_TOKEN},
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
# 在单独的线程中启动心跳机制
ping_thread = threading.Thread(target=send_ping, args=(ws,))
ping_thread.daemon = True
ping_thread.start()
print("🚀 启动WebSocket连接...")
# 启动 WebSocket 连接
ws.run_forever()
响应数据解析
当收到数据时,不同 type 字段对应不同的数据结构:
成交(tick)响应示例:
{
"code": 1,
"data": {
"s": "ENI",
"ld": 18.578,
"t": 1771605302200, // 2026-02-20 16:35:02 UTC
"v": 2297193,
"type": "tick"
}
}
报价(quote)响应示例:
{
"code": 1,
"data": {
"s": "ENI",
"ld": 18.578,
"p": 18.638,
"o": 18.636,
"h": 18.684,
"l": 18.498,
"t": 1771605302200, // 2026-02-20 16:35:02 UTC
"v": 7382614,
"tu": 137141238.336,
"ch": -0.06,
"chp": -0.32,
"ts": 0,
"type": "quote",
"r": "IT"
}
}
盘口(depth)响应示例:
{
"code": 1,
"data": {
"s": "ENI",
"r": "IT",
"a": [
{ "po": 1, "p": 18.24, "v": 15000 },
{ "po": 2, "p": 18.245, "v": 23000 }
],
"b": [
{ "po": 1, "p": 18.23, "v": 12000 },
{ "po": 2, "p": 18.225, "v": 18000 }
],
"type": "depth"
}
}
四、历史数据接入(REST API)
历史数据是策略回测的基础。iTick 提供 REST API 查询 K 线数据,支持从分钟线到月线的多周期。
REST API 参数说明
请求 URL:GET https://api.itick.org/stock/kline
| 参数 | 描述 | 类型 | 必填 | 示例 |
|---|---|---|---|---|
| region | 市场代码,意大利为"IT" | String | 是 | "IT" |
| code | 股票代码 | String | 是 | "ENI" |
| kType | K 线类型:1-分钟,2-5 分钟,3-15 分钟,4-30 分钟,5-60 分钟,8-日线,9-周线,10-月线 | Integer | 是 | 8 |
| limit | 获取 K 线数量 | Integer | 是 | 100 |
| et | 截止时间戳(毫秒),默认为当前时间 | Integer | 否 | 1741680000000 |
Python 实战:获取意大利股票历史 K 线
以下代码获取意大利埃尼公司(ENI)的日线历史数据,并进行简单可视化:
import requests
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
def get_italian_stock_kline(symbol, ktype=8, limit=100):
"""
获取意大利股票历史K线数据
:param symbol: 股票代码,如"ENI"
:param ktype: K线类型,8为日线
:param limit: 获取K线数量
:return: DataFrame格式的K线数据
"""
url = "https://api.itick.org/stock/kline"
params = {
"region": "IT", # 意大利市场代码
"code": symbol,
"kType": ktype,
"limit": limit
}
headers = {
"accept": "application/json",
"token": "your_api_token_here" # 替换为您的实际Token
}
try:
response = requests.get(url, params=params, headers=headers)
result = response.json()
if result.get("code") == 0: # 0表示成功
kline_data = result.get("data", [])
if not kline_data:
print(f"❌ 未获取到{symbol}的数据")
return None
# 转换为DataFrame
df = pd.DataFrame(kline_data)
# 转换时间戳并设置索引
df['datetime'] = pd.to_datetime(df['t'], unit='ms')
df.set_index('datetime', inplace=True)
# 重命名列
df.rename(columns={
'o': 'open', 'h': 'high', 'l': 'low',
'c': 'close', 'v': 'volume', 'tu': 'turnover'
}, inplace=True)
# 转换为数值类型
for col in ['open', 'high', 'low', 'close', 'volume', 'turnover']:
if col in df.columns:
df[col] = pd.to_numeric(df[col])
print(f"✅ 获取到 {len(df)} 条K线数据")
print(f"数据范围: {df.index[0]} 至 {df.index[-1]}")
# 显示最新5条数据
print("\n📊 最新5条K线数据:")
print(df[['open', 'high', 'low', 'close', 'volume']].tail())
return df
else:
print(f"❌ API错误: {result.get('msg', '未知错误')}")
return None
except Exception as e:
print(f"❌ 请求异常: {str(e)}")
return None
def plot_stock_data(df, symbol):
"""绘制股票K线收盘价走势"""
if df is None or df.empty:
return
plt.figure(figsize=(14, 7))
plt.plot(df.index, df['close'], 'b-', linewidth=1.5, label='收盘价')
plt.title(f'{symbol} 收盘价走势图', fontsize=16)
plt.xlabel('日期')
plt.ylabel('价格 (EUR)')
plt.grid(True, alpha=0.3)
plt.legend()
# 格式化x轴日期
plt.gcf().autofmt_xdate()
# 添加简单的移动平均线
df['MA20'] = df['close'].rolling(window=20).mean()
plt.plot(df.index, df['MA20'], 'r--', linewidth=1, label='20日均线')
plt.legend()
plt.tight_layout()
plt.show()
# 获取埃尼公司最近100个交易日数据
eni_df = get_italian_stock_kline("ENI", ktype=8, limit=100)
if eni_df is not None:
# 绘制走势图
plot_stock_data(eni_df, "ENI (埃尼)")
# 计算简单统计指标
print(f"\n📈 统计指标:")
print(f"最新收盘价: {eni_df['close'].iloc[-1]:.3f} EUR")
print(f"期间最高价: {eni_df['high'].max():.3f} EUR")
print(f"期间最低价: {eni_df['low'].min():.3f} EUR")
print(f"平均成交量: {eni_df['volume'].mean():.0f} 股")
print(f"期间涨跌幅: {((eni_df['close'].iloc[-1] / eni_df['close'].iloc[0] - 1) * 100):.2f}%")
五、意大利市场实用指南
1. 股票代码格式
意大利市场股票代码采用本地代码,iTick API 中通过region=IT参数指定市场。WebSocket 订阅时,格式为代码$IT。
2. 主要意大利股票代码参考
| 公司名称 | 股票代码 | 所属板块 | ISIN(用于参考) |
|---|---|---|---|
| Eni (埃尼) | ENI | 能源 | IT0003132476 |
| Ferrari (法拉利) | FERR | 汽车 | NL0011585146 |
| Intesa Sanpaolo (联合圣保罗银行) | ISP | 金融 | IT0000072618 |
| Unicredit (裕信银行) | UCG | 金融 | IT0005239360 |
| Enel (意大利国家电力) | ENEL | 公用事业 | IT0003128367 |
| Stellantis | STLA | 汽车 | NL00150001Q9 |
| Generali (忠利保险) | G | 保险 | IT0000062072 |
3. 交易时间
意大利股市交易时间(米兰证券交易所):
- 开盘时间:当地时间 9:00
- 收盘时间:当地时间 17:30
- 对应北京时间:
- 夏令时(3 月底-10 月底):15:00 - 23:30
- 冬令时:16:00 - 00:30(次日)
4. 常见问题
Q: 免费套餐有哪些限制?
A: 免费套餐包含基础实时行情无限调用、历史日线数据访问和 WebSocket 连接支持,对于个人学习和轻量级开发完全够用。
Q: 如何获取更长时间的歷史数据?
A: 付费套餐支持超 15 年的完整历史数据,适合专业回测需求。
Q: WebSocket 连接不稳定怎么办?
A: 代码中已包含心跳机制(每 30 秒发送 ping),可有效保持连接稳定。如仍遇断开,可实现自动重连逻辑。
六、总结与下一步
通过本文的详细教程,您已经掌握了如何使用 iTick API 接入意大利股票市场的完整流程:
- WebSocket 实时行情:低延迟订阅意大利股票的成交、报价和盘口数据,适用于高频交易和实时监控
- REST API 历史数据:获取多周期 K 线数据,支持策略回测和趋势分析
iTick 的意大利股票数据服务具有以下核心优势:
- 全面覆盖:支持米兰证券交易所全部股票
- 低延迟:WebSocket 延迟<50ms,满足量化交易需求
- 开发者友好:官方文档完善,对接极简
- 性价比高:免费版够用,付费版实惠
现在就访问 iTick 官网 注册账号,开始您的意大利股市数据之旅吧!
延伸阅读: