手记

日本股票 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 有限免费额度,数据覆盖范围广。 免费。 教学演示、简单的数据查询,不适合对稳定性要求高的生产环境。

二、实战:使用 iTick 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 开发更动态的交易策略。

温馨提示:本文仅供参考,不构成任何投资建议。市场有风险,投资需谨慎

0人推荐
随时随地看视频
慕课网APP