← 博客

怎么用日本行情数据API接口获取历史K线

做日本股票的 K 线图、技术指标或者策略回测,第一步都是把历史 K 线取回来。这篇教学方案用我们的日本行情数据API接口,以东京证券交易所(TSE)的丰田汽车(7203)为例,三步取到日线的历史 K 线,文末有可以直接运行的完整代码。

怎么用日本行情数据API接口获取历史K线:以东京证券交易所的丰田汽车 7203 为例,按页或按时间范围取日线
怎么用日本行情数据API接口获取历史K线:以东京证券交易所的丰田汽车 7203 为例,按页或按时间范围取日线

一根 K 线里有什么

K 线接口返回的 data 是一个字符串:多根 K 线用英文分号隔开,最新的在前;一根里面用英文逗号隔开,7 项的顺序固定:

  1. 时间:Unix 秒,这根 K 线的开始时间;日线、周线、月线是那一天的 UTC 零点
  2. 收盘价:还没走完的那一根是最新价
  3. 开盘价
  4. 最高价
  5. 最低价
  6. 备用
  7. 成交量

准备工作

  • 一把密钥。能用哪些市场是开通账号时确定的,申请时说明要用日本的行情。
  • 接入地址。HTTP 的接入地址写在开发文档的通用规则里,下文用「HTTP 接入地址」代替。
  • 三个参数:市场代码 market=TSE,产品代码 symbol=7203,K 线周期 interval=1day。产品代码用产品列表接口返回的原值;周期可以写 1min、5min、10min、15min、30min、1h、1day、1week、1month。

第一步:取最新的一页

用到的接口是单个产品实时 / 历史 K 线。请求头带 Authorization: 你的密钥:

GET /api/mini_list?market=TSE&symbol=7203&interval=1day

返回(data 里共 510 根,这里只列出前 3 根):

{
  "status": 0,
  "interval": "1day",
  "market": "TSE",
  "code": "7203",
  "message": "SUCCESS",
  "data": "1791504000,2910.5,2936,2936.5,2891,0,17845800;1791417600,2902,2900,2923,2889,0,21975200;1791331200,2900.5,2930.5,2944.5,2900.5,0,21035200;…"
}

第一根 1791504000,2910.5,2936,2936.5,2891,0,17845800 读出来就是:2026 年 10 月 9 日,收盘 2910.5、开盘 2936、最高 2936.5、最低 2891,成交量 17845800。第 1 页的第一根是正在走的那一根,这一天收盘之前它的收盘价就是最新价,会一直变。

第二步:往前翻页

加上 page 参数就能往更早取。第 1 页是最新的,页码越大越早:

GET /api/mini_list?market=TSE&symbol=7203&interval=1day&page=2

第 2 页起每页正好 500 根,紧接在上一页之前。实测丰田的日线:第 1 页最早到 2024 年 9 月 4 日,第 2 页从 2024 年 9 月 3 日到 2022 年 8 月 23 日。一页一页往前取,直到 data 是空字符串,就是全部历史。

第三步:按时间范围取

只想要某一段时间的 K 线,用 from、to(都是 Unix 秒)。例如取 2026 年 9 月 28 日到 10 月 9 日的日线:

GET /api/mini_list?market=TSE&symbol=7203&interval=1day&from=1790553600&to=1791504000

返回这两周的 10 根日线,写法和上面一样。几条规则:

  • 可以只传一个:只传 from 取到最新,只传 to 取 to 之前的。
  • 一次最多 500 根。范围里超过 500 根时返回其中最新的 500 根,响应头 X-Has-More 是 true,X-Next-To 给出下一次该传的 to,照着它继续取就能把整段取完。
  • 传了 from 或 to 时 page 不起作用。

完整示例代码

下面的代码用 Node.js 18 及以上版本可以直接运行(自带 fetch),把开头两项换成自己的即可。它从最新一页往前取 3 页日线,并把每一根拆成开、高、低、收、量。

// 运行:node kline.js(Node.js 18 及以上)
const KEY = '你的密钥';
const HTTP_BASE = 'HTTP 接入地址';   // 见开发文档「概览 · 通用规则」,以 /api/ 结尾

// 取一页 K 线,拆成一根一个对象(最新的在前)
async function klinePage(market, symbol, interval, page) {
  const query = new URLSearchParams({ market, symbol, interval, page });
  const res = await fetch(`${HTTP_BASE}mini_list?${query}`, { headers: { Authorization: KEY } });
  const text = await res.text();
  const body = JSON.parse(text);
  if (body.status !== 0) throw new Error(`取不到 ${market}:${symbol} 的 K 线:${body.message || text}`);
  return body.data.split(';').filter(Boolean).map((row) => {
    const [time, close, open, high, low, , volume] = row.split(',').map(Number);
    return { time, open, high, low, close, volume };
  });
}

// 从最新一页往前取 pages 页;中途取到空的一页说明历史已经取完
async function history(market, symbol, interval, pages) {
  const all = [];
  for (let page = 1; page <= pages; page++) {
    const bars = await klinePage(market, symbol, interval, page);
    if (!bars.length) break;
    all.push(...bars);
  }
  return all;
}

const day = (time) => new Date(time * 1000).toISOString().slice(0, 10);

history('TSE', '7203', '1day', 3).then((bars) => {
  if (!bars.length) return console.log('没有数据,请核对市场代码和产品代码');
  console.log(`共 ${bars.length} 根日线:${day(bars[bars.length - 1].time)} ~ ${day(bars[0].time)}`);
  for (const b of bars.slice(0, 3)) console.log(day(b.time), '开', b.open, '高', b.high, '低', b.low, '收', b.close, '量', b.volume);
}).catch((e) => console.error(e.message));

运行后的输出:

共 1510 根日线:2020-08-05 ~ 2026-10-09
2026-10-09 开 2936 高 2936.5 低 2891 收 2910.5 量 17845800
2026-10-08 开 2900 高 2923 低 2889 收 2902 量 21975200
2026-10-07 开 2930.5 高 2944.5 低 2900.5 收 2900.5 量 21035200

常见问题

分钟线怎么取? 把 interval 换成 1min、5min 等即可,翻页和按时间范围取的写法不变。

产品代码写错了会报错吗? 不会。产品不存在时 status 仍是 0,data 是空字符串,所以拿到空字符串要先核对产品代码。

日线的时间为什么是 UTC 零点? 日线、周线、月线的时间只表示是哪一天,显示时取日期即可,不用再按时区换算成几点。

能一次取多个产品的 K 线吗? 这个接口一次只能传一个产品。只要每个产品最近的若干根(最多 30 根),可以用多个产品最新 K 线接口。

其它国家和市场

K 线接口不分市场,把 market 换成对应的市场代码即可,例如美国 NASDAQ、香港 HK、韩国 KRX、印度 NSE。全部取值见国家与市场参数。想让最新的一根 K 线跟着行情实时跳动,可以接着看使用美国行情数据API接口怎么合成动态K线;只要最新报价,看怎么用香港行情数据API接口获取实时报价。

下一步