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

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

在全球资产配置需求日益增长的 2026 年,意大利作为欧元区第三大经济体,其股市价值愈发凸显。米兰证券交易所(Borsa Italiana)汇聚了众多全球知名企业,从轮胎巨头倍耐力到豪华汽车品牌法拉利,从能源龙头埃尼到银行翘楚联合圣保罗,意大利股票正成为量化交易者和跨境投资者的重要配置标的。

本文将为您详细讲解如何通过iTick API一站式接入意大利股票市场,获取实时行情、历史 K 线及深度盘口数据,并提供完整的 Python 实战代码,助您快速构建意大利股市数据分析系统。

一、为什么选择 iTick 接入意大利股市?

在对比了主流金融数据 API 服务后,iTick 凭借以下优势成为接入意大利市场的理想选择:

对比维度iTick API传统数据源免费公共接口
意大利市场覆盖米兰交易所全部股票通常仅指数成分股极少或无
实时延迟<50ms (WebSocket)100-500ms15 分钟延时
历史数据长度超 15 年10 年左右仅 1-2 年
协议支持REST + WebSocket + FIX通常仅 REST仅 REST
免费套餐基础行情无限调用无免费套餐有次数限制
多资产支持股票/外汇/期货/基金一站式通常仅股票仅股票

iTick 的核心优势

  1. 真正的欧洲市场覆盖:iTick 支持意大利米兰证券交易所(Borsa Italiana)全部股票的实时与历史数据,无论是蓝筹股还是中小盘股票,均可通过统一的 API 接口获取。
  2. 开发者友好设计:提供标准易用的 REST API 和 WebSocket 协议,文档简洁清晰,配有各类语言的示例代码,帮助开发者快速接入。
  3. 超低延迟实时数据:专业级数据流,延迟<50ms,支持 WebSocket 协议实现真正的实时推送,每秒更新频率,捕捉每一个市场波动。
  4. 灵活的数据类型:支持成交(tick)、报价(quote)、盘口(depth)等多种数据类型,满足量化交易的不同需求。
  5. 免费套餐够用:新用户可享受免费套餐,包含基础行情无限调用和 WebSocket 连接支持,足以满足个人学习和轻量级开发需求。

二、环境准备

在开始接入之前,需要完成以下准备工作:

1. 注册 iTick 账号并获取 API Token

访问 iTick 官网 注册账号,30 秒完成注册,无需信用卡。在控制台即可找到您的专属 API Token。

2. 安装 Python 依赖库

本教程需要安装requestswebsocket-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$ITString"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"
kTypeK 线类型:1-分钟,2-5 分钟,3-15 分钟,4-30 分钟,5-60 分钟,8-日线,9-周线,10-月线Integer8
limit获取 K 线数量Integer100
et截止时间戳(毫秒),默认为当前时间Integer1741680000000

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
StellantisSTLA汽车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 接入意大利股票市场的完整流程:

  1. WebSocket 实时行情:低延迟订阅意大利股票的成交、报价和盘口数据,适用于高频交易和实时监控
  2. REST API 历史数据:获取多周期 K 线数据,支持策略回测和趋势分析

iTick 的意大利股票数据服务具有以下核心优势:

  • 全面覆盖:支持米兰证券交易所全部股票
  • 低延迟:WebSocket 延迟<50ms,满足量化交易需求
  • 开发者友好:官方文档完善,对接极简
  • 性价比高:免费版够用,付费版实惠

现在就访问 iTick 官网 注册账号,开始您的意大利股市数据之旅吧!


延伸阅读: