義大利股票 API 接入指南:使用 iTick 獲取即時行情與歷史資料

  1. iTick
  2. 教程
義大利股票 API 接入指南:使用 iTick 獲取即時行情與歷史資料 - iTick
義大利股票 API 接入指南:使用 iTick 獲取即時行情與歷史資料

在全球資產配置需求日益增長的 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 支援義大利米蘭證券交易所全部股票的即時與歷史資料,無論藍籌股還是中小型股票,皆可透過統一的 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()

    

四、歷史資料接入(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 官網 註冊帳號,開始您的義大利股市資料之旅吧!


延伸閱讀: