博客 / 詳情

返回

日本股票 API 對接,接入東京證券交易所(TSE)實現 K 線 MACD 指標

如何通過股票 API 接入東京證券交易所(TSE)的日本股市行情,實現股票行情的實時監控和歷史數據分析。利用股票API、高頻股票實時報價 API 和股票行情 API,我們可以輕鬆獲取日本金融行情數據 API 提供的股票實時行情、股票實時報價 API 等信息,並結合 MACD 指標進行技術分析。這不僅適用於金融 API 的開發,還能幫助投資者更好地理解市場動態。

本文將首先橫向對比幾款支持日本市場的 API,然後以 iTick API 為例,演示如何獲取數據並實現技術分析中經典的 MACD 指標,供你快速開始你的量化項目。

一、日本股票 API 橫向對比

市面上有多款提供 日本股票 API 服務的供應商,它們在數據質量、實時性、成本和適用場景上各有側重。

為了方便選擇,下表對比了四款較主流的 API,它們都支持獲取東京證券交易所的 股票實時報價 API股票歷史數據

API 名稱 核心功能與特點 成本模式 適用場景
iTick API 提供統一請求頭,規範友好。覆蓋股票實時行情(Tick/Quote)、多週期 K 線及 WebSocket 推送。數據全面,延遲較低。 提供免費套餐。 個人開發、量化交易、對數據規範性要求高的項目。
StockTV API 支持全球多市場整合,內置 SMA、RSI 等技術指標可直接返回計算結果。 有限免費額度 + 按量計費。 需要進行跨市場數據整合或希望 API 直接提供技術指標的中小型團隊。
Alpha Vantage 有限免費額度,支持全球主要市場的基礎實時行情與歷史數據。 完全免費,但調用頻率限制嚴格(如 5 次/分鐘)。 個人學習、非高頻的策略原型驗證。
Yahoo Finance API 有限免費額度,數據覆蓋範圍廣。 免費。 教學演示、簡單的數據查詢,不適合對穩定性要求高的生產環境。

二、實戰:使用 API 獲取數據與計算 MACD

以下我們以 iTick 為例,演示從環境準備到數據獲取,再到計算 MACD 指標的全過程。

第一步:準備環境與獲取密鑰

  1. 註冊與獲取 Token:訪問 iTick 官網註冊賬號,即可在控制枱獲取你的專屬 API Token。
  2. 安裝 Python 庫:在命令行中使用 pip 安裝必要的庫。

    pip install requests pandas numpy

第二步:獲取日本股票 K 線數據

我們需要歷史 K 線數據來計算 MACD。iTick 的 K 線接口非常靈活,支持從 1 分鐘到月線的多種週期。

下面的代碼演示如何獲取豐田汽車(代碼: 7203)的 50 條 5 分鐘 K 線數據。

import requests
import pandas as pd

# 1. 設置API請求頭(所有iTick接口通用)
headers = {
    "accept": "application/json",
    "token": "your_token_here"  # 請替換為你的實際Token
}

# 2. 構建請求URL
# 參數説明:
# region=JP 表示日本市場
# code=7203 是豐田汽車的代碼
# kType=2 代表5分鐘K線 (1:1分, 2:5分, ..., 8:日K)
# limit=50 獲取50條數據
url = "https://api.itick.org/stock/kline?region=JP&code=7203&kType=2&limit=50"

# 3. 發送請求並處理響應
response = requests.get(url, headers=headers)
data = response.json()

if data["code"] == 0:  # 請求成功
    kline_list = data["data"]
    # 將數據轉換為Pandas DataFrame,便於分析
    df = pd.DataFrame(kline_list)
    # 重命名列,使其更易讀
    df.rename(columns={'t': 'timestamp', 'o': 'open', 'h': 'high',
                       'l': 'low', 'c': 'close', 'v': 'volume'}, inplace=True)
    # 將時間戳轉換為datetime格式
    df['datetime'] = pd.to_datetime(df['timestamp'], unit='s')
    df.set_index('datetime', inplace=True)

    print(f"成功獲取{len(df)}條K線數據")
    print(df[['open', 'high', 'low', 'close', 'volume']].head())
else:
    print(f"請求失敗: {data['msg']}")

第三步:計算 MACD 指標

MACD(Moving Average Convergence Divergence)是一個常用的趨勢動量指標,由三部分組成:DIF(差離值)DEA(信號線)MACD 柱。其標準參數為(12, 26, 9)。

我們可以用 Pandas 和 NumPy 輕鬆實現它:

import numpy as np

def calculate_ema(series, period):
    """計算指數移動平均線 (EMA)"""
    return series.ewm(span=period, adjust=False).mean()

def calculate_macd(df, fast=12, slow=26, signal=9):
    """
    計算MACD指標並添加到DataFrame
    :param df: 包含收盤價‘close’的DataFrame
    :param fast: 快線EMA週期
    :param slow: 慢線EMA週期
    :param signal: 信號線EMA週期
    """
    # 計算快慢EMA
    df['EMA_fast'] = calculate_ema(df['close'], fast)
    df['EMA_slow'] = calculate_ema(df['close'], slow)

    # 計算DIF(差離值)
    df['DIF'] = df['EMA_fast'] - df['EMA_slow']

    # 計算DEA(信號線,即DIF的EMA)
    df['DEA'] = calculate_ema(df['DIF'], signal)

    # 計算MACD柱狀圖
    df['MACD_hist'] = 2 * (df['DIF'] - df['DEA'])  # 傳統做法是乘以2以放大視覺效果

    return df

# 使用剛才獲取的K線數據計算MACD
df_with_macd = calculate_macd(df)

# 查看計算結果
print(df_with_macd[['close', 'DIF', 'DEA', 'MACD_hist']].tail())

關鍵點解讀:

  • 金叉/死叉:當 DIF 線從下往上穿過 DEA 線時,形成“金叉”,通常被視為買入信號;反之則為“死叉”,是賣出信號。
  • 零軸:當 DIFDEA 位於零軸上方時,表明市場處於多頭氛圍;下方則為空頭氛圍。
  • 柱狀圖MACD_hist 的絕對值大小代表了趨勢的強弱,其正負代表了多空方向。

第四步:一個簡單易懂的可視化

將股價和 MACD 指標畫在一張圖上,能直觀地觀察其關係。

import matplotlib.pyplot as plt

# 創建圖表和座標軸
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), gridspec_kw={'height_ratios': [3, 1]})

# 子圖1:繪製股價和移動平均線
ax1.plot(df_with_macd.index, df_with_macd['close'], label='Close Price', linewidth=1.5, color='black')
ax1.plot(df_with_macd.index, df_with_macd['EMA_fast'], label=f'EMA{12}', alpha=0.7)
ax1.plot(df_with_macd.index, df_with_macd['EMA_slow'], label=f'EMA{26}', alpha=0.7)
ax1.set_title('Toyota Motor (7203.T) - Price & MACD')
ax1.set_ylabel('Price')
ax1.legend()
ax1.grid(True, alpha=0.3)

# 子圖2:繪製MACD的DIF、DEA和柱狀圖
ax2.plot(df_with_macd.index, df_with_macd['DIF'], label='DIF', color='blue', linewidth=1.5)
ax2.plot(df_with_macd.index, df_with_macd['DEA'], label='DEA', color='red', linewidth=1.5)
# 用柱狀圖表示MACD Hist,紅色為負,綠色為正
colors = ['green' if x >= 0 else 'red' for x in df_with_macd['MACD_hist']]
ax2.bar(df_with_macd.index, df_with_macd['MACD_hist'], color=colors, alpha=0.5, width=0.01, label='MACD Hist')
ax2.axhline(y=0, color='grey', linestyle='--', linewidth=0.8)
ax2.set_ylabel('MACD')
ax2.legend()
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

第五步:結合 WebSocket 的實時 MACD 監控

WebSocket 是一種實時數據傳輸協議,允許客户端和服務器之間進行雙向通信。通過 WebSocket,你可以實時獲取股票行情數據,並實時監控 MACD 指標。

class RealTimeMACDMonitor:
    """實時MACD監控器"""
    def __init__(self, stock_codes, token, fast_period=12, slow_period=26, signal_period=9):
        self.stock_codes = stock_codes if isinstance(stock_codes, list) else [stock_codes]
        self.token = token
        self.fast_period = fast_period
        self.slow_period = slow_period
        self.signal_period = signal_period

        # 存儲歷史數據
        self.historical_data = {code: pd.DataFrame() for code in stock_codes}

        # MACD狀態
        self.macd_states = {code: {
            'dif': None,
            'dea': None,
            'histogram': None,
            'signal': 0  # 0:無信號, 1:金叉, -1:死叉
        } for code in stock_codes}

    def update_data(self, stock_code, new_price_data):
        """更新股票數據並重新計算MACD"""
        if stock_code not in self.historical_data:
            return

        # 添加新數據
        df = self.historical_data[stock_code]
        new_df = pd.DataFrame([new_price_data])

        if len(df) == 0:
            self.historical_data[stock_code] = new_df
        else:
            self.historical_data[stock_code] = pd.concat([df, new_df])

        # 保持數據長度(例如最近100條)
        if len(self.historical_data[stock_code]) > 100:
            self.historical_data[stock_code] = self.historical_data[stock_code].iloc[-100:]

        # 計算MACD(當數據足夠時)
        if len(self.historical_data[stock_code]) >= self.slow_period + 10:
            df_with_macd = calculate_macd(
                self.historical_data[stock_code],
                self.fast_period,
                self.slow_period,
                self.signal_period
            )

            # 更新MACD狀態
            last_row = df_with_macd.iloc[-1]
            prev_row = df_with_macd.iloc[-2] if len(df_with_macd) > 1 else None

            self.macd_states[stock_code]['dif'] = last_row['dif']
            self.macd_states[stock_code]['dea'] = last_row['dea']
            self.macd_states[stock_code]['histogram'] = last_row['macd_hist']

            # 檢測信號變化
            if prev_row is not None:
                # 金叉檢測
                if last_row['dif'] > last_row['dea'] and prev_row['dif'] <= prev_row['dea']:
                    self.macd_states[stock_code]['signal'] = 1
                    print(f"⚠️ {stock_code} MACD金叉信號!DIF={last_row['dif']:.2f}, DEA={last_row['dea']:.2f}")

                # 死叉檢測
                elif last_row['dif'] < last_row['dea'] and prev_row['dif'] >= prev_row['dea']:
                    self.macd_states[stock_code]['signal'] = -1
                    print(f"⚠️ {stock_code} MACD死叉信號!DIF={last_row['dif']:.2f}, DEA={last_row['dea']:.2f}")

    def get_macd_summary(self):
        """獲取所有監控股票的MACD狀態摘要"""
        summary = []
        for code, state in self.macd_states.items():
            if state['dif'] is not None:
                signal_text = "無信號"
                if state['signal'] == 1:
                    signal_text = "金叉買入"
                elif state['signal'] == -1:
                    signal_text = "死叉賣出"

                summary.append({
                    '股票代碼': code,
                    'DIF': state['dif'],
                    'DEA': state['dea'],
                    '柱狀圖': state['histogram'],
                    '信號': signal_text
                })

        return pd.DataFrame(summary)

三、總結與建議

通過本文的對比和實戰,你可以看到,接入 東京證券交易所 的數據並進行 量化分析 並非難事。

  • API 選型:先從免費低成本的方案(如 iTick 免費套餐)開始驗證你的想法和策略邏輯。待策略成熟、對數據頻率和穩定性有更高要求時,再考慮升級到付費服務。
  • 數據是基礎:無論選擇哪個 股票行情 API,穩定、準確的數據都是量化策略成功的基石。建議在關鍵決策點,對數據源進行交叉驗證。
  • MACD 僅是開始:本文實現的 MACD 是指標分析世界的一扇門。你可以在此基礎上,嘗試將其與 RSI、布林帶等其他指標結合,或接入 股票實時報價 API 開發更動態的交易策略。
温馨提示:本文僅供參考,不構成任何投資建議。市場有風險,投資需謹慎

GitHub:https://github.com/itick-org/

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.