最近做亚洲市场量化的朋友越来越多,日本股市是绕不开的一个——东证一部(TSE Prime)有2000多家上市公司,日均成交额排全球前三。跟美股、港股比起来,日本市场的代码体系和交易规则都不太一样,接数据的时候容易踩坑。 这篇记录一下接入日本股票行情的全过程,重点讲日本市场的代码体系和跟其他市场的差异。 日本市场的基本情况 日本主要的交易所是东京证券交易所(TSE),现在分三个板块:Prime(主板)、Standard(标准)、Growth(成长)。我们平时说的日经225指数和东证股价指数(TOPIX)都是从Prime板块里选的。 跟其他市场比起来,日本市场有几个特点: 第一,代码是4位数字。 跟美股的字母代码(AAPL)、港股的5位数字代码(00700)都不一样,日本股票代码是4位数字,比如7203是丰田、9984是软银、6758是索尼。 第二,交易时间是日本标准时间(JST)。 比北京时间早1小时,开盘时间是东京时间9:00-11:30(午盘前)和12:30-15:00(午盘后)。做实时监控的时候要注意时区转换。 第三,region代码是 JP。 不是US、HK那种,日本市场传 JP。 日本股票代码速查 先整理一下日本常见大盘股的代码,接数据的时候直接用: 代码 公司名 行业 7203 丰田汽车 汽车 9984 软银集团 综合商社 6758 索尼集团 电子 8306 三菱UFJ金融集团 银行 6861 基恩士 工业自动化 6098 Recruit Holdings 人力资源 7974 任天堂 游戏 4063 信越化学 化工 这些都是日经225指数的成分股,流动性好,数据也稳定。 REST拉取日本股票报价 先从REST开始,确认数据格式。 import requests API_BASE = "https://api.itick.org" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} # 拉日本股票的实时报价 def get_jp_stock_quote(code): resp = requests.get( f"{API_BASE}/stock/quote", headers=headers, params={ "region": "JP", "code": code } ) return resp.json()["data"] # 拉几只日本大盘股 stocks = ["7203", "9984", "6758"] for code in stocks: q = get_jp_stock_quote(code) sign = "+" if q["chp"] >= 0 else "" print(f"{code}: {q['ld']} ({sign}{q['chp']}%)") 返回字段跟其他市场基本一致:ld最新价、chp涨跌幅、o/h/l开高低、v成交量。做行情看板这些字段够用了。 注意:日本股票代码是4位数字,传参数的时候要传字符串形式("7203"),不要传数字。 WebSocket订阅日本股票 WebSocket订阅格式跟美股一样,是两个参数:代码$市场。 import json import threading import time import websocket WS_URL = "wss://api.itick.org/stock" TOKEN = "your_token_here" authenticated = False def on_message(ws, message): global authenticated payload = json.loads(message) # 先等鉴权成功 if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated: authenticated = True # 日本股票订阅格式:代码$市场 ws.send(json.dumps({ "ac": "subscribe", "params": "7203$JP,9984$JP", "types": "quote" })) return if payload.get("resAc") == "pong": return data = payload.get("data") or {} if data.get("type") == "quote": sign = "+" if data["chp"] >= 0 else "" print(f"{data['s']}: {data['ld']} ({sign}{data['chp']}%)") 跟印度市场不一样——日本是两个参数(7203$JP),不是三个参数。因为日本主要就是东证一个交易所,不需要像印度那样指定NSE/BSE。 K线数据获取 K线接口跟其他市场一样,只是region传 JP。 def get_jp_kline(code, k_type=8, limit=100): """ k_type: 1=1分钟 2=5分钟 5=1小时 8=日K 9=周K 10=月K """ resp = requests.get( f"{API_BASE}/stock/kline", headers=headers, params={ "region": "JP", "code": code, "kType": k_type, "limit": limit } ) return resp.json()["data"] # 拉丰田汽车近100根日K daily = get_jp_kline("7203", k_type=8, limit=100) closes = [bar["c"] for bar in daily] # 算20日均线 ma20 = sum(closes[-20:]) / 20 print(f"7203最新收盘: {closes[-1]}, 20日均线: {ma20:.2f}") K线返回标准OHLCV:t时间戳、o/h/l/c开高低收、v成交量。做技术分析直接用这些字段。 日本市场接入的注意事项 代码是4位数字。 日本股票代码是4位数字(7203、9984),跟港股的5位数字(00700)、美股的字母代码(AAPL)都不一样。一开始我传了"07203"(带前导零),结果返回空数据。 交易时间跟国内差1小时。 日本标准时间(JST)比北京时间早1小时。东证开盘时间是东京时间9:00-11:30和12:30-15:00,对应北京时间8:00-10:30和11:30-14:00。做实时监控的时候要注意时区。 午间休市。 日本股市中午有1小时休市(东京时间11:30-12:30),这个时间段没有成交数据。做策略回测的时候要注意,别把午休时间当成流动性枯竭。 订阅格式是两个参数。 日本跟美股一样是两个参数(7203$JP),不是印度那种三个参数。因为日本主要就是东证一个交易所。 时间戳是毫秒。 所有返回的时间戳都是毫秒,直接当秒数处理会得到一个很远的未来时间,记得除以1000。 完整脚本:日本股票行情监控 把前面几块拼起来,最终的完整脚本: import json, time, threading, requests, websocket API_BASE = "https://api.itick.org" WS_URL = "wss://api.itick.org/stock" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} # 日本股票监控列表 watchlist = ["7203", "9984", "6758"] # 启动时拉快照 print("=== 日本股票快照 ===") for code in watchlist: r = requests.get(f"{API_BASE}/stock/quote", headers=headers, params={"region": "JP", "code": code}).json()["data"] sign = "+" if r["chp"] >= 0 else "" print(f" {code}: {r['ld']} ({sign}{r['chp']}%)") # WebSocket实时推送 authenticated = False def on_message(ws, message): global authenticated payload = json.loads(message) if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated: authenticated = True params = ",".join(f"{c}$JP" for c in watchlist) ws.send(json.dumps({ "ac": "subscribe", "params": params, "types": "quote" })) threading.Thread(target=heartbeat, args=(ws,), daemon=True).start() return if payload.get("resAc") == "pong": return data = payload.get("data") or {} if data.get("type") == "quote": sign = "+" if data["chp"] >= 0 else "" print(f"[实时] {data['s']}: {data['ld']} ({sign}{data['chp']}%)") def heartbeat(ws): while True: time.sleep(30) ws.send(json.dumps({"ac": "ping", "params": str(int(time.time() * 1000))})) ws = websocket.WebSocketApp(WS_URL, header=[f"token: {TOKEN}"], on_message=on_message) ws.run_forever() 这个脚本跑起来之后,开盘前先看到一组日本股票的快照,盘中实时更新价格和涨跌幅。 小结 接日本股票数据的技术框架跟美股差不多——REST做快照和历史数据,WebSocket做实时推送。主要区别在代码体系(4位数字)、交易时间(比国内早1小时)和午间休市。这些细节不踩一遍坑很容易忽略。 参考文档:https://docs.itick.org/websocket/stocks GitHub:https://github.com/itick-org/ 最近不少朋友在做新兴市场的量化策略,印度股市是绕不开的一个。NSE(印度国家证券交易所)和BSE(孟买证券交易所)的市值加起来排全球前列,而且增长速度快,很多策略在印度市场的表现跟美股完全不一样。 但接印度股票数据的时候,有几个跟美股、港股都不一样的地方——尤其是订阅格式和交易所指定。这篇记录一下接入印度股票行情的全过程。 印度市场跟其他市场有什么不一样 刚开始接的时候我以为跟美股一样,直接传个代码和region就行,结果发现根本不是那么回事。 第一,印度有两个主要交易所:NSE和BSE。 同一只股票在两个交易所都可能上市,代码一样但交易所不同。所以接印度股票的时候,必须指定交易所,不然返回的数据可能不是你想要的那个。 第二,WebSocket订阅格式不一样。 美股是两个参数:AAPL$US(代码市场)。印度是三个参数:`RELIANCENSEIN`(代码交易所$市场)。一开始我按美股的格式传,结果订阅一直失败。 第三,region代码是 IN。 不是 US、HK 那种,印度市场传 IN。 REST拉取印度股票报价 先从REST开始,确认数据格式对不对。 import requests API_BASE = "https://api.itick.org" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} # 拉印度股票的实时报价 def get_india_stock_quote(code, exchange="NSE"): resp = requests.get( f"{API_BASE}/stock/quote", headers=headers, params={ "region": "IN", "code": code, "exchange": exchange } ) return resp.json()["data"] # 拉几只印度大盘股 stocks = [ ("RELIANCE", "NSE"), # 信实工业 ("TCS", "NSE"), # 塔塔咨询 ("INFY", "NSE"), # 印孚瑟斯 ] for code, exchange in stocks: q = get_india_stock_quote(code, exchange) sign = "+" if q["chp"] >= 0 else "" print(f"{code}({exchange}): {q['ld']} ({sign}{q['chp']}%)") 返回字段跟其他市场基本一致:ld最新价、chp涨跌幅、o/h/l开高低、v成交量。做行情看板这些字段够用了。 注意:印度股票的代码是字母形式(RELIANCE、TCS),不是数字。跟港股的数字代码(700)不一样。 WebSocket订阅印度股票(重点) 这是印度市场最容易踩坑的地方——订阅格式跟其他市场不一样。 其他市场(美股、港股、外汇)都是两个参数:代码$市场,比如 AAPL$US。 印度市场是三个参数:代码$交易所$市场,比如 RELIANCE$NSE$IN。 import json import threading import time import websocket WS_URL = "wss://api.itick.org/stock" TOKEN = "your_token_here" authenticated = False def on_message(ws, message): global authenticated payload = json.loads(message) # 先等鉴权成功 if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated: authenticated = True # 印度股票订阅格式:代码$交易所$市场 ws.send(json.dumps({ "ac": "subscribe", "params": "RELIANCE$NSE$IN,TCS$NSE$IN", "types": "quote" })) return if payload.get("resAc") == "pong": return data = payload.get("data") or {} if data.get("type") == "quote": sign = "+" if data["chp"] >= 0 else "" print(f"{data['s']}: {data['ld']} ({sign}{data['chp']}%)") 为什么印度要多一个交易所参数? 因为同一只股票在NSE和BSE都可能上市,价格可能不一样。指定交易所才能确保你拿到的是你想要的那个交易所的数据。 K线数据获取 K线接口跟其他市场一样,只是多了个exchange参数。 def get_india_kline(code, exchange="NSE", k_type=8, limit=100): """ k_type: 1=1分钟 2=5分钟 5=1小时 8=日K 9=周K 10=月K """ resp = requests.get( f"{API_BASE}/stock/kline", headers=headers, params={ "region": "IN", "code": code, "exchange": exchange, "kType": k_type, "limit": limit } ) return resp.json()["data"] # 拉RELIANCE最近100根日K daily = get_india_kline("RELIANCE", "NSE", k_type=8, limit=100) closes = [bar["c"] for bar in daily] # 算20日均线 ma20 = sum(closes[-20:]) / 20 print(f"RELIANCE最新收盘: {closes[-1]}, 20日均线: {ma20:.2f}") K线返回标准OHLCV:t时间戳、o/h/l/c开高低收、v成交量。做技术分析直接用这些字段。 印度市场接入的特殊注意事项 订阅格式别搞错。 这是最容易踩的坑。印度是三个参数:RELIANCE$NSE$IN,不是两个参数。一开始我按美股格式传 RELIANCE$IN,结果订阅一直失败。 交易所要指定。 印度有NSE和BSE两个交易所,同一只股票在两个交易所都可能上市。REST接口要传 exchange=NSE 或 exchange=BSE,WebSocket订阅要在params里带上交易所代码。 交易时间跟国内不一样。 印度股市的交易时间是印度标准时间(IST),比北京时间晚2.5小时。做实时监控的时候要注意时区转换。 股票代码是字母。 印度股票代码是字母形式(RELIANCE、TCS、INFY),不是数字。跟港股的数字代码(700)不一样。 时间戳是毫秒。 所有返回的时间戳都是毫秒,直接当秒数处理会得到一个很远的未来时间,记得除以1000。 完整脚本:印度股票行情监控 把前面几块拼起来,最终的完整脚本: import json, time, threading, requests, websocket API_BASE = "https://api.itick.org" WS_URL = "wss://api.itick.org/stock" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} # 印度股票监控列表 watchlist = [ ("RELIANCE", "NSE"), ("TCS", "NSE"), ("INFY", "NSE"), ] # 启动时拉快照 print("=== 印度股票快照 ===") for code, exchange in watchlist: r = requests.get(f"{API_BASE}/stock/quote", headers=headers, params={"region": "IN", "code": code, "exchange": exchange}).json()["data"] sign = "+" if r["chp"] >= 0 else "" print(f" {code}({exchange}): {r['ld']} ({sign}{r['chp']}%)") # WebSocket实时推送 authenticated = False def on_message(ws, message): global authenticated payload = json.loads(message) if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated: authenticated = True # 印度股票订阅格式:代码$交易所$市场 params = ",".join(f"{c}${e}$IN" for c, e in watchlist) ws.send(json.dumps({ "ac": "subscribe", "params": params, "types": "quote" })) threading.Thread(target=heartbeat, args=(ws,), daemon=True).start() return if payload.get("resAc") == "pong": return data = payload.get("data") or {} if data.get("type") == "quote": sign = "+" if data["chp"] >= 0 else "" print(f"[实时] {data['s']}: {data['ld']} ({sign}{data['chp']}%)") def heartbeat(ws): while True: time.sleep(30) ws.send(json.dumps({"ac": "ping", "params": str(int(time.time() * 1000))})) ws = websocket.WebSocketApp(WS_URL, header=[f"token: {TOKEN}"], on_message=on_message) ws.run_forever() 这个脚本跑起来之后,开盘前先看到一组印度股票的快照,盘中实时更新价格和涨跌幅。 小结 接印度股票数据的技术框架跟美股、港股差不多——REST做快照和历史数据,WebSocket做实时推送。但有几个特殊点:订阅格式是三个参数(代码交易所市场)、必须指定NSE或BSE交易所、交易时间跟国内有时差。这些细节不踩一遍坑很容易忽略。 参考文档:https://docs.itick.org/websocket/stocks GitHub:https://github.com/itick-org/ 同一只苹果股票,同一个周六中午,三个“最新价”,1万股持仓估值差出 9,500 美元。12月6日起,美股将进入近23小时交易:夜盘数据的5个口径不说清,日K线、收益率、风控和对账都会悄悄算错。本文依据纳斯达克、SEC、DTCC、FINRA 等一手文件,加上30只美股(含9只中概股)的实测数据,给你四样东西: 一张“北京时间 × 美股夜盘”全景图(含11月1日夏令时切换前后) 5个口径逐条拆解:钱在哪里算错、为什么会错 一份可直接发给数据供应商的8问清单 3段可运行的 Python 代码 北京时间10月10日周六中午,我调了一次美股快照。苹果(AAPL)同时给了三个“最新价”: 336.64:周五常规盘16:00的收盘价 336.05:周五盘后19:59的最后一笔 337:夜盘价。听起来最新,其实最旧。它停在美东周五凌晨4点,也就是周四晚那段夜盘收尾的时刻;周五晚上没有夜盘,到我查询时它已经停了约20小时。 差几毛钱,有什么关系?换成钱看: 你的看板或系统取的是 1万股持仓的估值 当日涨跌幅(前收 340.42) 常规盘收盘价 336.64 3,366,400 美元 −1.11% 盘后价 336.05 3,360,500 美元 −1.28% 夜盘价 337 3,370,000 美元 −1.00% 同一只票、同一个周六,估值差出 9,500 美元,涨跌幅有三个答案。三个数都没错,错的是不知道自己用的是哪一个。 (价格为作者实测,北京时间2026年10月10日11:55;估值按1万股假设持仓计算。) 取错价还算小事,更贵的是“算了不该算的数”。 2024年8月5日,美股夜盘成交激增。Blue Ocean 方面表示,取消了美东01:45至03:06之间的成交。据 Korea Times 援引韩国金融监督院的数据,被撤销的成交约6,300亿韩元,涉及约9万个账户。韩国券商随后暂停美股日间交易服务,18家券商到2025年11月4日才恢复,停了将近15个月。 这类问题,正在从少数人的问题变成所有人的问题。按计划,纳斯达克12月6日起开设美东21:00至次日04:00的交易时段。从那天起,周一晚上10点成交的一笔交易,要记到周二。 12月6日之后,美股的“一天”会变长。一个夜盘价格要进入你的收益率、估值、风控和对账,必须先答对5个问题,也就是标题里的5个口径(口径,即“这个数按什么规则算”)。答错任何一个,钱就会算错一次,而且系统不会报错。 下文分三部分:为什么是现在 → 5个问题逐个拆 → 怎么办。不写代码的读者,每节读到“先问供应商的一句话”就够了,技术细节可以直接转给技术同事。 第一部分|为什么是现在:美股交易所的一天,计划从16小时延长到近23小时 1. 一天被切成五段,“夜盘”有两个起点 很多数据系统里,美股的一天还是三段:盘前、常规盘、盘后,从美东凌晨4点到晚上8点,共16小时。 但夜盘早就在跑了。Blue Ocean 这类 ATS(另类交易系统)的官方 FAQ 写明,它的时段是周日到周四的美东20:00至次日04:00。按计划,纳斯达克从12月6日起开设21:00至04:00的时段;NYSE Arca、24X National Exchange、Cboe EDGX 也公布了夜盘计划。 于是一天变成五段,“夜盘”有两个起点:ATS 从20:00开始,交易所从21:00开始,中间这一小时是 SIP(美股合并行情)的暂停窗口。 时段 美东时间 北京时间(11月1日前 → 后) 状态 盘前 04:00–09:30 16:00–21:30 → 17:00–22:30 已运行 常规盘 09:30–16:00 21:30–次日04:00 → 22:30–次日05:00 已运行 盘后 16:00–20:00 04:00–08:00 → 05:00–09:00 已运行 ATS 夜盘 20:00–次日04:00 08:00–16:00 → 09:00–17:00 已运行 SIP 暂停窗口 周一至周四 20:00–21:00 — → 09:00–10:00 12月6日起 交易所夜盘 21:00–次日04:00 — → 10:00–17:00 12月6日起(计划) 读法:前四段今天就在你的数据里;后两段从12月6日开始,那时美国已结束夏令时,所以“11月1日前”一栏为空。(来源:Blue Ocean 官方 FAQ、纳斯达克通告 ETA2026-46、SEC 批准令 34-105779 / 34-105780;北京时间由作者换算,11月1日起美东比北京晚13小时,此前晚12小时。) “夜盘”不是一个时段,是几个场所的几套规则。说“夜盘价格”之前,先说清是哪个场所、哪段时间。 对中国读者,这张表还有一层更直接的意思: A股(09:30–11:30、13:00–15:00)和港股(09:30–12:00、13:00–16:00)的整个交易日,都落在美股夜盘里。你盯A股、看港股的时候,美股夜盘正开着。 我把港股阿里和美股阿里放在一起看过:同一次实测里,BABA.US 的夜盘数据停在北京时间10月9日16:00:00,9988.HK 的快照时间是16:08:08,只差8分8秒。 但它们是两套规则。BABA.US 的名称里写着“每份 ADS 代表8股普通股”,港股快照里则没有盘前、盘后、夜盘这类子对象。币种、交易日归属,甚至“一股”的含义都不一样。(这里只讲规则差异,不比较价格。) 2. 三块多米诺:清算已经倒了,行情和交易所定在同一天 美股延长交易时间,要倒三块多米诺:清算、行情、交易所。 清算:已上线。DTCC 2026年6月29日的新闻稿写明,旗下 NSCC 的24×5清算已经上线,运行时间为周日20:00至周五20:00(美东)。 行情:已批准,计划12月6日实施。SEC 在2026年6月发布批准令 34-105779(CTA/CQ)和 34-105780(UTP):SIP 周日21:00至周五20:00运行,周一至周四20:00至21:00暂停,前提是市场准备就绪。届时,夜盘将第一次有合并的最优报价和最新成交价;据行业分析,SIP 每天会多出约7小时数据。 交易所:计划12月6日。纳斯达克在 ETA2026-46 和之后的 ETA2026-56 中表示,计划开设21:00至04:00时段,目标是一周5天、每天近23小时;其 FAQ 也说明,实际上线取决于 SIP 准备情况和监管变更。 日期也可能会变。Risk.net 在2026年5月报道,LSEG 尚未收到 SIP 最终规格,有业内人士预计可能推迟到2027年初,年底代码冻结期也是原因之一;同一篇报道里,Cboe、纳斯达克、NYSE 对12月6日保持信心。 **日期可能会变,但规则问题不会跟着推迟。**ATS 夜盘今天就在跑,它的数据今天就在你的系统里。12月6日改变的,只是规模和复杂度。 3. 量不大,但离中国团队最近 最可能出现的反对意见是:夜盘量那么小,值得折腾吗? NSCC 表示,夜间交易量目前约占其总量的1%,确实不大。但“不大”不等于“不重要”。我拿30只标的做了一次样本,用夜盘成交量除以日成交量: 分组 中位数 区间 例子 中概股 9 只 约 0.96% 0.39%–3.30% 理想 3.30%,百度 2.90%,阿里 2.65% ETF 6 只 约 0.89% 0.11%–1.56% QQQ 1.29%,GLD 1.56% 科技股 10 只 约 0.23% 0.10%–0.69% AAPL 0.21% 中小盘 5 只 约 0.07% 0.05%–0.25% LCID 0.05% 读法:组与组之间的差距比单个数字更有意义。这次样本里,中概股夜盘份额的中位数约是科技股的4倍。(作者2026年10月10日实测;夜盘成交量属于10月8日晚至9日凌晨,日成交量属于10月9日,两者不是同一会话,只看量级,不代表全市场。) 换成钱看:这30只票那一晚的夜盘成交额合计约7.2亿美元,其中 QQQ 约2亿美元,阿里约3,500万美元。 需求在哪里?据 Blue Ocean 的 CEO 表示,其日均成交约1.3亿股、约35亿美元,一年前日均约3,000万股;韩国占其业务的比例从约65%降到约35%,仍是亚洲最大市场;公司已设东京办公室,计划设香港办公室。 夜盘的时间,正是亚洲的白天,也是中国团队上班、盯A股和港股的时候。 近期值得放进日历的时间点:Netflix 10月20日、Tesla 10月21日均在美股收盘后发布财报;美联储10月27日至28日开会,28日公布决议;微软10月28日发布财报。这些事件之后的市场反应,会延续到盘后和夜盘,也就是北京时间的白天。(只说时间,不说方向。) 小结:不管12月6日是否如期,夜盘已经在你的数据里了;做中概股、做亚洲用户产品的团队,离它更近。下面看它会在哪5个地方把钱算错。 第二部分|5个问题逐个拆:钱在哪里算错 口径① 这笔成交算哪一天?同一笔夜盘成交,可能有两个日期 日期不是成交自带的,是规则给的。不同系统给同一笔成交的日期,可能差一天。 场景:美东周一22:00,夜盘里成交了一笔。你的日K线、日收益率、持仓日报,要把它归到周一还是周二? 日期规则 周一22:00这笔成交算哪天 依据 TRF 日期 周一 按美东实际成交时刻的日历日期 Blue Ocean 会话日期(FIX Tag 75) 周二 跨过午夜的会话,按结束那天算 纳斯达克(12月6日起,计划) 周二 21:00 至午夜的成交,归下一交易日 SIP 处理边界 周二 前一日 20:00 至当日 20:00 算一天 读法:TRF 日期和会话日期差一天,不是谁错了,是规则不同。(来源:Blue Ocean 官方 FAQ、纳斯达克 ETA2026-46、SEC 34-105779,核验日期2026年10月10日。) 钱怎么算错:前面那一晚,30只票的夜盘成交额约7.2亿美元。这些钱记在周一还是周二,决定了两天的成交额、收益率和持仓盈亏。日期错一天,日收益、日报、对账就整体错一天,而且不会报错:数据看起来是连续的,只是日期标签和你的交易系统对不上。 先问供应商:“你们返回的日期,是 TRF 日期、会话日期,还是 SIP 的处理边界?” 给技术同事:来源方的日期字段和自己计算的会话日期都要存,不要互相覆盖;日K线用哪套规则写成明确配置,同一指标里不混用。交易日历要把常规交易日和半日市合并:我实测的交易日历接口把11月27日(半日市)放在单独的 half_trade_days 列表里,11月26日(感恩节)不在交易日里,漏掉半日市,日期归属又会错一次。 口径② “最新价”是哪个价?周六看到的夜盘价,是三个里最旧的 字段里有价格,不等于此刻有成交。判断新鲜度,要看每个价格自己的时间戳。 场景:我又拿30只标的检查了一遍:30只全部返回了夜盘数据,价格都不为空;但夜盘时间戳全部是同一刻,美东10月9日04:00,距离查询约20小时。同一批数据里,盘前价停在09:30前后,盘后价停在19:59前后,常规盘停在16:00。每个时段的价格,都停在自己那段时间的最后一刻。 钱怎么算错:开篇已经算过,同一只票、同一个周六,1万股估值能差出9,500美元。看板取错价,用户看到的盈亏就错了;风控取错价,止损线就画错了地方。 为什么:官方收盘价、基金净值和指数再平衡,仍以常规盘的9:30开盘和16:00收盘为准(FactSet 分析;纳斯达克 FAQ 也说明开盘、收盘竞价继续承担官方定价作用)。夜盘价再“新”,也不是官方定价。而一条行情记录里往往同时装着几个时段的数据,系统只取一个“最新价”字段,就会把它们混在一起。 先问供应商:“快照里夜盘价格的时间戳,是最后一笔成交的时刻,还是这个时段结束的时刻?” 给技术同事:价格、成交量、时间必须取自同一个时段对象;判断新鲜度看对象自己的时间戳。第三部分的代码2就是做这件事的。 口径③ 价格来自哪个场所?对不上时,先查场所,再谈对错 两个数据源的夜盘价格不一样,很可能不是谁错了,而是取自不同场所。 场景:你接了两家数据源,凌晨同一时刻两边的夜盘价格对不上,你先怀疑哪一家? 钱怎么算错:这里的钱是人力和时间。你可能花一整天排查,最后发现两个价格来自不同场所;更糟的是,把某一家 ATS 的价格当成“美股夜盘价”写进了对账文件。 为什么:现在美东夜里成交的主要是 Blue Ocean 等 ATS,12月6日以后纳斯达克等交易所计划加入。FINRA 的风险披露写明,延长时段流动性低、波动大、价差宽,不同交易系统显示的价格可能不同;FactSet 也指出,SIP 升级前盘后没有合并行情,ATS 的成交在合并行情之外。在合并行情覆盖夜盘之前,拿两个场所的价格互相对账,本身就不成立。 先问供应商:“这个夜盘价格来自哪个场所?是某一家 ATS、交易所,还是合并行情?” 给技术同事:每条夜盘价格都带上来源场所标签,不同场所的价格不直接比较。12月6日之后如果需要合并行情,先确认 SIP 是否已实际覆盖该时段。 口径④ 这笔成交算不算数?夜盘成交可以被撤销 数据层要能处理“成交了,又没了”。 场景:开篇的2024年8月5日就是例子:约9万个账户的夜盘成交被撤销,金额约6,300亿韩元。 钱怎么算错:如果数据层只会往上累加,撤销消息来了不处理,那笔“已经没了”的成交会一直留在成交量、VWAP(成交量加权均价)和交易信号里,下游的收益率、风控、对账全都带着它继续算。 为什么:迟到成交、撤销和更正都会改变结果,累计成交量还会在时段之间清零;没有修订消息时,聚合结果只能算“暂定”。去重也有坑:两笔真实成交完全可能时间、价格、数量一模一样,去重要靠稳定的事件 ID 或序列号。 先问供应商:“撤销和更正消息怎么发?我能不能在数据里看到一笔成交被撤销?” 给技术同事:区分“新增、撤销、更正”三类消息,聚合结果要能回滚;供应商不提供修订消息的,在报表上标“暂定”。 口径⑤ 时间有没有写死?11月1日起,北京时间的夜盘整体后移一小时 美东时间不是固定的“北京时间减12小时”。夏令时一切换,所有和北京时间挂钩的东西都会错一小时。 场景:你设了个定时任务,每天北京时间08:05抓一次“夜盘开盘后”的数据。11月1日前,ATS 夜盘北京时间08:00开始,没问题;11月1日后,夜盘09:00才开始,任务就抓到了开盘之前。 钱怎么算错:定时任务、看板刷新、值班排班全部错一小时,你还以为是数据源出了问题。 为什么:2026年11月1日美国结束夏令时,美东从比北京晚12小时变为晚13小时。例如:10月30日21:00(美东)是北京时间10月31日09:00;11月2日21:00(美东)是北京时间11月3日10:00。 先问供应商:“你们的时间戳是 UTC,还是带时区的本地时间?” 给技术同事:原始时间统一按 UTC 存,用 America/New_York 切分时段,区间左闭右开,并接交易日历(周末和休市日没有夜盘)。我用交易日历跑了13个边界用例,全部符合规则,例如: 周五21:00 → 休市(周六不是交易日) 感恩节前夜(11月25日)21:00 → 休市 感恩节当晚(11月26日)21:00 → 夜盘,会话日期为11月27日 纳斯达克规则下的20:30 → 暂停窗口 ATS 规则下的20:00 → 夜盘,会话日期是第二天,日历日期是当天 给风控的附加题:没有新价格,有4种原因 价格偏离只进复核队列;“没有新价格”比“价格偏离”更容易误判。 夜里看到一个价格离收盘价很远,先别急着报警。按纳斯达克的计划,12月6日后它的夜盘有一道价格带:订单价格超出参考价上下20%会被拒绝,带宽最小3美元(股价不低于1美元时)或1美元(股价低于1美元时)。这是交易所拒单的边界,不是你的报警阈值。 更容易误判的是“没有新价格”。它在数据上长得一模一样,原因却有好几种: 休市:如11月26日感恩节。按纳斯达克规则,周一至周四的法定休市日当晚21:00,可以开启下一交易日的夜盘。 暂停窗口:12月6日起,SIP 在周一至周四20:00至21:00暂停。 停牌:部分公司行动会触发停牌,纳斯达克用代码“M1”标注。 断流:问题出在你自己的连接上。 没有成交:排除以上之后剩下的情况,市场开着,只是没人成交。 先问供应商:“停牌、暂停窗口、休市和没有成交,在你们的数据里分别怎么表示?” 给技术同事:先用交易日历和时段标签排除休市、暂停窗口,再看停牌标记,剩下的才是“没有成交”。“无更新”和“断流”要结合连接状态和其他活跃标的分开判断,别把市场的沉默当成自己的断线。 5个问题,一张表收齐 问题 一句话答案 先问供应商 ① 算哪一天 同一笔成交可能有两个日期 返回的是哪种日期? ② 哪个最新价 看每个价格自己的时间戳 时间戳是最后成交还是时段结束? ③ 哪个场所 对不上先查场所 价格来自哪个场所? ④ 算不算数 要能处理撤销和更正 撤销消息怎么发? ⑤ 时间写死没 UTC 存储,按美东时区切分 时间戳是不是 UTC? 第三部分|怎么办:12月6日前要做完的三件事 1. 每个角色要做的决定不一样 角色 12月6日前要决定的事 老板 现有行情合同是否覆盖延长时段;数据量怎么扩容(SIP 每天多出约7小时数据);夜间值班人力怎么排;按“可能推迟”准备两套计划 产品经理 看板“最新价”显示哪一个;夜盘价要不要标时间;非夜盘时段显示旧值还是留空 量化和投研 日K线用哪套日期规则;收益率按哪个收盘价算;回测交易日历是否包含半日市和节假日前夜 风控 夜盘价格偏离怎么复核;撤销和更正怎么进监控;休市、暂停窗口、停牌、没有成交怎么区分 商务和采购 供应商能否讲清日期规则和来源场所;合同里的时段覆盖写到什么程度;答不清的条款能否进生产环境 读法:找到自己那一行,每一行都是一个要拍板的决定。(依据:纳斯达克 ETA2026-46、SEC 34-105779 / 34-105780、DTCC 新闻稿、Risk.net 报道,核验日期2026年10月10日。) 老板那一行最容易漏的是“两套计划”。12月6日可能如期,也可能推迟;按推迟准备不是悲观,而是让数据系统在日期变化时不用推倒重来。 还要算一笔账。自己搭一套能区分时段的数据系统,要持续维护这些事: 两种夜盘起点(20:00 和 21:00),以及 SIP 的 20:00 日界 交易日历,包括节假日前夜和半日市 每年两次的夏令时切换 撤销和更正消息 每个时段各自的时间戳和成交量 12月6日之后还会继续变化的规则和场所 这不是写一次就完的代码。规则还在变,场所还在加,日期还可能推迟,每一次变化都要有人跟。 2. 发给供应商的8个问题:答不清的条款不进生产环境 合同里写一句“覆盖美股行情”,不等于写清了夜盘怎么算。下面8个问题,可以直接复制给供应商: 要问的方面 我会这样问 答不清的后果 标的范围 夜盘覆盖哪些标的?全部美股,还是部分? 以为全覆盖,实际有一批标的没有夜盘数据 夜盘起点和节假日 夜盘从20:00还是21:00开始?节假日前夜怎么安排? 日期归属错一天,节假日出现空数据 日期规则 返回的是 TRF 日期、会话日期,还是 SIP 处理边界? 日K线、日收益率、对账整体错一天 来源场所 夜盘价格来自哪个 ATS、哪个交易所,还是合并行情? 拿不同场所的价格对账,排查方向全错 快照还是逐笔 给的是快照还是逐笔成交?时间戳代表哪一刻? 把旧值当最新价 撤销和更正 撤销和更正消息怎么发?能否看到一笔成交被撤销? 成交量、VWAP、信号里留着已撤销的成交 非夜盘时段 非夜盘时段返回旧值、空值,还是不返回? 缺失被当成零成交,覆盖率虚高 合同覆盖 现有合同是否覆盖延长时段?扩容怎么计费? 上线后才发现合同不覆盖,临时补条款 读法:答不清的那一行,就是你的风险点。不要求每项都答“支持”,但要求每项都答得清楚。(依据:FINRA 延长时段风险披露、Blue Ocean 官方 FAQ、纳斯达克 ETA2026-46、SEC 34-105779 / 34-105780。) 验收时可以用一个覆盖率公式:预期有夜盘数据的标的集合记为 U,实际通过检查的集合记为 V,覆盖率 = U∩V ÷ U。没有可靠的预期清单时,覆盖率应显示“不可计算”,而不是默认100%。 3. 三段代码,把时段、日期和新鲜度写进数据系统 以下内容建议转给技术同事。 TickDB 为开发者和 AI 应用提供统一的全球行情数据接口,让团队通过一套接入获取多市场实时与历史数据,更快构建行情、分析和监控产品。 前面这些检查,我用 TickDB 的快照接口跑了一遍。快照返回的 data 是列表;美股的盘前、盘后、夜盘数据分别在 pre_market_quote、post_market_quote、overnight_quote 三个对象里。夜盘对象的子字段有 last_done(字符串)、timestamp(13位毫秒整数)、volume(整数)、quote_volume(字符串)、high、low、prev_close。顶层没有标注时段的字段,不能靠顶层判断一条数据属于哪个时段。 能做到的 / 边界 怎么验证 盘前、盘后、夜盘分成三个独立对象,各带自己的时间戳 周六调一次美股快照,看三个对象的时间 美股夜盘和港股用同一个快照接口 分别调用 BABA.US 和 9988.HK,对比时间戳 边界:这次30只标的的夜盘时间戳全部精确等于美东 04:00:00.000,连当晚只成交3,324股的 LCID 也一样(盘前、盘后时间戳则各不相同)。夜盘时间戳更像时段结束时刻,而非最后一笔成交时刻 用它判断新鲜度可以;推断最后成交时间前,先向供应商确认 边界:文档未说明夜盘数据来自哪个场所;本文只验证了快照接口 — 读法:前两行是这次实测能证明的,后两行是边界;不要据此推断全市场、全时段的数据完整,也不要据此判断价格最优。(作者2026年10月10日实测,标的包括 AAPL、BABA.US、9988.HK 等30余只。) 做与不做的差别:不做,日K线错一天、白查一个不存在的故障、错误日期流进收益、风控和对账;做了,代码2用对象自己的时间戳判断新鲜度,代码3把时段标签和会话日期写进信号层,上一节的8个问题让每家供应商按同一套标准回答。 一个场景:一位做中概股看板的产品经理,工作日北京时间晚上11点多(美股常规盘正在交易)用代码2一查,发现看板上的“夜盘价”还停在下午4点,已经是将近8小时前的数,于是把显示改成“夜盘(截至16:00)”。这个场景来自2026年10月9日23:48的一次实测:夜盘对象停在北京时间16:00,比顶层时间早约7.8小时。 代码1:拉取美股快照,同时检查 HTTP 状态和业务返回码 import os import requests API_KEY = os.environ["TICKDB_API_KEY"] # 不要把 key 写死在代码里 resp = requests.get( "https://api.tickdb.ai/v1/market/ticker", params={"symbols": "AAPL.US,MSFT.US,NVDA.US", "type": "stock"}, # 单次最多50个 headers={"X-API-Key": API_KEY}, timeout=10, ) resp.raise_for_status() body = resp.json() if body.get("code") != 0: raise RuntimeError(f"业务返回异常: {body}") items = body.get("data") or [] 代码2:区分“不存在、为空、为零”,并算出夜盘数据距今多少小时 import time OVERNIGHT_FIELDS = {"price": "last_done", "time": "timestamp", "volume": "volume"} def read_field(obj, key): if not isinstance(obj, dict) or key not in obj: return "MISSING", None value = obj[key] if value is None or value == "": return "EMPTY", None try: if float(value) == 0: # last_done 是字符串,volume 是整数 return "ZERO", value except (TypeError, ValueError): return "INVALID", value return "VALUE", value def age_hours(obj, now_ms): state, ts = read_field(obj, "timestamp") return round((now_ms - ts) / 3_600_000, 1) if state == "VALUE" else None now_ms = int(time.time() * 1000) for item in items: overnight = item.get("overnight_quote") for name, key in OVERNIGHT_FIELDS.items(): print(item.get("symbol"), name, *read_field(overnight, key)) print(item.get("symbol"), "夜盘数据距今(小时)", age_hours(overnight, now_ms)) 代码3:按场所打时段标签,同时给出“会话日期”和“日历日期” from datetime import datetime, time, timedelta, timezone from zoneinfo import ZoneInfo NY = ZoneInfo("America/New_York") # 不同场所的夜盘起点不同:ATS 常见 20:00,纳斯达克计划 21:00 VENUE_OVERNIGHT_START = {"ATS_2000": time(20, 0), "NASDAQ_2100": time(21, 0)} def label(ts_ms, venue, trading_days): """返回 (时段, 会话日期, 日历日期)。 trading_days:按交易日历生成的日期集合(常规交易日和半日市要合并)。 半日市提前收盘未处理,生产环境需补上。""" t = datetime.fromtimestamp(ts_ms / 1000, tz=timezone.utc).astimezone(NY) c, d = t.time(), t.date() if c >= VENUE_OVERNIGHT_START[venue]: nd = d + timedelta(days=1) # 晚间这段属于"下一个日历日"的夜盘 return ("OVERNIGHT", nd, d) if nd in trading_days else ("CLOSED", None, d) if d not in trading_days: return ("CLOSED", None, d) if c < time(4, 0): return ("OVERNIGHT", d, d) if c < time(9, 30): return ("PRE", d, d) if c < time(16, 0): return ("REGULAR", d, d) if c < time(20, 0): return ("POST", d, d) return ("GAP", None, d) # 例如纳斯达克规则下的 20:00–21:00 暂停窗口 以上代码只检查接入层行为,结果只说明本次调用的情况,不代表全市场、全时段的数据完整,也不代表价格最优;代码3是示范,不是交易所、SIP、TRF、ATS 通用的正式算法。 常见问题 1. 美股夜盘是北京时间几点? ATS 夜盘为美东20:00至次日04:00,11月1日前对应北京时间08:00–16:00,之后对应09:00–17:00。纳斯达克计划的21:00至04:00,12月6日起对应北京时间10:00–17:00。具体以各场所规则为准。 2. 12月6日以后,美股是24小时交易吗? 不是。纳斯达克计划的是一周5天、每天近23小时:周一至周四20:00至21:00是 SIP 暂停窗口,周末不交易。实际上线取决于 SIP 准备情况和监管变更。 3. 夜盘成交算哪一天的交易? 看规则。纳斯达克计划把21:00至午夜的成交归下一交易日;TRF 日期按美东实际成交时刻算;Blue Ocean 会话日期按会话结束那天算;SIP 处理边界是前一日20:00至当日20:00。 4. 夜盘价格可以当收盘价用吗? 不建议。官方收盘价、基金净值和指数再平衡,仍以常规盘16:00收盘为准。夜盘价格可能来自不同场所,流动性低、价差宽,不同系统显示的价格可能不同。 5. 选美股夜盘数据,要先问供应商什么? 先问六件事:日期规则、来源场所、快照还是逐笔、撤销和更正怎么处理、非夜盘时段返回什么、合同是否覆盖延长时段。答不清的条款,不进生产环境。 最后一个问题 12月6日也许会推迟,但“一个交易日是什么”这个问题,不会再回到过去。 你们团队现在的日K线,切在哪个时间点? 今天就能做的一件事:找一个工作日,北京时间上午10点和晚上11点各调一次你们数据源的美股快照,看看两次的“夜盘价”,时间戳分别是哪一刻。 参考资料 访问日期均为2026年10月9–10日。 Nasdaq Trader,ETA2026-46、ETA2026-56 Nasdaq,23/5 Trading FAQ SEC,Release 34-105779(CTA/CQ)、34-105780(UTP) DTCC,NSCC 延长清算时间新闻稿(2026-06-29) Blue Ocean,官方 FAQ(运行时段;除息日前后的会话日期与 TRF 日期) FINRA,延长时段交易风险披露 FactSet,24/5 交易对数据系统的影响 Risk.net,关于24小时交易上线日期的报道(2026年5月) Korea Times,2024年8月8日、2025年11月4日相关报道;Markets Media,2024年8月相关报道 美联储2026年议息日历;Netflix、Tesla、微软投资者关系页 TickDB,行情快照接口文档及作者实测记录 摆脱追涨杀跌的困局 在股市的博弈中,许多散户投资者常常深陷“一买就跌、一卖就涨”的怪圈。面对盘面的剧烈波动,缺乏系统交易框架的投资者极易被短期情绪左右,在盲目的追涨杀跌中不断蚕食本金,甚至错失原本可以解套回本的良机。 作为在市场中摸爬滚打多年的投资顾问,我常向客户强调:股市交易不是凭感觉的赌博,而是一场关于概率、纪律与人性掌控的博弈。 那些能在多次牛熊交替中生存并实现稳定盈利的老股民,无一不拥有自己的一套避险与买卖法则。 事实上,有8条被95%的散户所忽略的避险与回本口诀,凝结了数十年盘面博弈的核心逻辑。本文将为你系统拆解这8条口诀背后的资金意图与盘面语言,帮助你理清看盘思路,建立严密的交易纪律,真正看清股市的买卖时机。 核心干货:老股民降低亏损风险的8大交易法则 法则一:看清阶段趋势,决不盲目死扛与追高 股价的运行并非无序,不同阶段的涨跌背后对应着主力资金不同的试探与出货节奏。盲目死扛或盲目追高,是导致深度套牢与严重亏损的根本原因。 【口诀一】:“一级跌必会反弹;不跑,跌还要下跌,要跑。” 【实战逻辑与投顾解析】**: 在我们的实战观盘中,所谓的“一级跌”通常对应着股价打破上升趋势后的初跌段(或主跌浪前夕)。在此阶段,盘面由于技术性超跌往往会产生一次弱势反抽。投资者必须清醒地认识到,这种无量反弹并非见底信号,而是给套牢盘最后的离场窗口。若不及时止损离场,随之而来的将是破坏力极强的“主跌浪”。因此,见反弹不跑,后市必将承受更深的跌幅。 【口诀二】:“二级涨必会回落,要跑;涨还要上涨,不跑。” 【实战逻辑与投顾解析】: “二级涨”往往对应着反弹浪末端或主升浪冲高后的末升阶段。此时动能衰竭,股价冲高后极易迎来大幅回落,投资者应果断逢高卖出、锁定利润。但需要重点留意的是,如果盘面呈现量价齐升、主力资金持续流入,且形成了明确的向上突破突破形态(即“涨还要上涨”),则说明上涨趋势完好,此时则应耐住性子,让利润奔跑。 法则二:掌握早晚盘交易时机,拒绝盲目追高 早盘与午盘的剧烈波动,反映的是截然不同的市场心理与资金博弈逻辑。 【口诀三】:“早上大涨要清仓,下午大涨不追高;” 【实战逻辑与投顾解析】: 从博弈论的角度来看,早盘(特别是开盘半小时内)的大涨,往往伴随着隔夜情绪的过度发酵,甚至有可能是主力资金利用拉高手段进行的“冲高诱多”与派发。此时盲目追入极易买在全天最高点,因此及时清仓或减仓观望是明智之举。而下午的大涨,虽然说明多头占据优势,但日内涨幅已大,此时追高留给日内及次日的溢价空间极其有限,性价比极低。 【口诀四】:“早上大跌要卖股,下午大跌测日买。” 【实战逻辑与投顾解析】: 早盘出现剧烈下挫,表明市场抛压异常沉重,主力资金甚至在不惜代价地离场,这种跌势往往会贯穿全天,早盘果断卖股能有效避免日内亏损的扩大。反之,若股价到了临近尾盘的下午才出现大跌(即常说的“尾盘杀”),往往意味着日内的恐慌盘已集中释放完毕。 注:口诀中的“测日买”在超短线实战中即指“次日**/**择日买入”的博弈逻辑。尾盘恐慌盘出尽后,次日早盘极易触发修复性反弹,因此尾盘或次日开盘反而是超短线低吸博弈的优质买点。 法则三:解读量价关系,高低位操作截然不同 成交量是资金动向的“晴雨表”。然而,同样的量能形态在不同的价格位置,其代表的主力资金意图截然相反。 【口诀五】:“低位放量大胆买,高位放量赶紧跑;” 【实战逻辑与投顾解析】: 股价经历长期下跌后在低位出现放量,无论阴阳,大多是主力资金建仓吸筹、大举入场的信号,此时跟进胜率极高。然而,在股价已有较大涨幅的高位出现放量,哪怕是放量大阳线,也往往代表着筹码剧烈松动与主力资金的高位派发(换手)。散户投资者看到的是“交投火爆”,实则是主力将筹码转移给散户的陷阱,必须果断离场。 【口诀六】:“低位无量心等,高位无量莫心慌。” 【实战逻辑与投顾解析】: 低位无量说明市场观望情绪浓厚,主力尚未发动行情,此时投资者需要保持耐心,等待量能激活与确立信号。而投资者常困惑的“高位无量”又该如何理解?为什么说“高位无量莫心慌”? 从主力筹码锁定的角度来看,高位放量代表资金分歧与派发,而高位缩量盘整或顺势推升,反而说明主力控盘度极高、筹码锁定良好,资金并未大举出逃。只要关键均线与上涨趋势线未被跌破,投资者就无需过分恐慌,继续安心持股即可。 法则四:顺应大势,识别通道中的“诱空”与“诱多” 趋势是股票交易的生命线。只有顺应大势,才能在盘面的假动作中看清资金的真实意图。 【口诀七】:“上升趋势中小跌要买,下跌趋势中小涨要卖;” 【实战逻辑与投顾解析】: 在明确的上升趋势中,股价的回踩小跌往往是资金洗盘或技术性修正,提供了绝佳的顺势加仓买点。而在明确的下跌趋势中,任何没有量能支撑的小幅上涨,都只是“死水微澜”式的超跌反弹,非但不是见底信号,反而提供了减仓与解套离场的黄金窗口。 【口诀八】:“上升通道中下跌是诱空,下降通道中上涨是诱多。” 【实战逻辑与投顾解析】: 在上升通道中,主力常常利用战术性的快速下挫打破短轨,制造破位假象,其真实目的是洗洗不坚定的散户筹码(即“诱空”),随后便会快速拉回;而在下降通道中,主力则习惯利用突发反弹制造“见底反转”的幻象,吸引抄底资金接盘(即“诱多”)。分清通道属性,才能避免在上升趋势中错失牛股,在下降趋势中屡屡被套。 将口诀转化为交易纪律 老股民总结的这8条口诀,其背后的底层逻辑可以提炼为三点:顺应大势、看重量价与把控节奏。无论是对早晚盘分时 timing 的选择,还是对高低位量价结构与趋势通道的研判,本质上都是为了帮助投资者建立客观的盘面参照系。 然而,在投资咨询的实践中,我发现大多数投资者并非“不懂”这些道理,而是“做不到”。股市交易真正的难点,从来不在于口诀本身多么深奥,而在于执行时能否克服人性深处的贪婪与恐惧。 当盘面剧烈波动、市场情绪极度亢奋或恐慌时,你是否能摒弃主观偏见,严格执行止损止盈纪律?在未来的交易中,面对诱人的涨幅与刺眼的亏损,你是否能真正做到知行合一? 为什么震荡行情总让你“被洗出局”? 在股票交易中,震荡行情往往是散户投资者最难驾驭的“杀手锏”。股价上下剧烈拉锯、拉高又迅速回落,许多人在缺乏明确择时与信号指引的情况下,频繁在主力洗盘时盲目割肉,又在诱多高位冲动追高,最终遗憾地被淘汰出局。 “现在这种震荡行情里最容易把人洗出去,七句口诀你一定要记牢……” 想要在复杂的震荡博弈中站稳脚跟,建立清晰直观的K线判断逻辑至关重要。本文为你深度拆解7句实战K线口诀,从多空资金博弈的角度看清主力意图,助你建立敏锐的择时直觉与交易纪律。 规避陷阱与离场法则:何时果断减仓别硬扛? 在震荡市中,防范风险与保住本金永远是第一位的。当盘面释放出多头衰竭或诱多信号时,果断离场才是防范深套的明智之举。 1. “三阳不破阴,仓位果断清” **●**口诀展示:三阳不破阴,仓位果断清。 **●**现象解析:股价在遭遇一根放量大阴线杀跌后,随后的三个交易日连续拉出阳线反弹,但三根阳线的累计涨幅却始终无法收复或突破前期那根大阴线的开盘价或最高价。这表明多头反攻仅为极弱势的缩量超跌修复,缺乏主动买盘跟进。 **●**交易启示:反弹无力意味着下跌趋势未尽,多头动能已然竭尽,盘面随时可能面临空头的二次回踩下杀。此时切勿抱有侥幸心理,应果断清仓离场或大幅减仓规避风险。 2. “一阳通三阴,诱多要当心” **●**口诀展示:一阳通三阴,诱多要当心。 **●**现象解析:股价在连续经历三根阴线阴跌后,盘中忽然拉出一根看似强劲的大阳线,单日便将前三根阴线的失地全部收复。然而在震荡市背景下,这种无前期筑底过程的突发长阳,往往缺乏持续的资金跟进,极有可能是主力资金利用对倒手段制造的“一日游”假突破,旨在拉高股价诱骗散户追高接盘。 **●**交易启示:面对突如发起的长阳,切忌盲目兴奋追高。必须观察后续资金跟进的持续性,若无量能二次放量配合,应将此类阳线视为拉高减仓的诱多陷阱,保持观望为上。 3. “阴加一阳,离场别硬扛” **●**口诀展示:阴加一阳,离场别硬扛。 **●**现象解析:大阴线杀跌后仅跟随一根缩量小阳线,或者弱势反弹阳线刚出现便被紧随其后的阴线迅速吞没。这种典型的“弱势反弹+快速压制”组合,折射出卖方抛压异常沉重,多头买盘毫无抵抗之力,任何微弱的反弹都是空头继续释放杀伤力的跳板。 **●**交易启示:当盘面出现此类阴强阳弱的K线组合时,说明下行通道已打开,盲目死扛只会陷入深套泥潭。投资者应严格执行交易纪律,果断止损割肉离场,将本金安全置于首位。 捕捉买点与看涨信号:何时迎来的看涨曙光? 震荡行情不仅充满陷阱,同样蕴含着蓄势启动的良机。通过以下四句口诀,能够帮助投资者识别多头建仓与底部反转的信号。 1.“三阴不破阳,后市有望强” **●**口诀展示:三阴不破阳,后市有望强。 **●**现象解析:股价在放量拉出一根大阳线后,连续三个交易日呈阴线回踩,但三根阴线的下跌幅度极小,且成交量呈现明显缩量形态,其低点始终坚守在前期大阳线的开盘价或实体底部之上。这充分表明主力资金并未出逃,三连阴仅仅是主力为了清洗浮筹、沉淀筹码而进行的震荡洗盘。 **●**交易启示:洗盘结束即是起飞之日。当确定回调缩量且守住大阳线基准支撑时,说明下方承接资金极为坚决,投资者可在第三根缩量阴线企稳时逢低分批建仓,等待多头爆发。 2.“两阴加一阳,多头往上顶” **●**口诀展示:两阴加一阳,多头往上顶。 **●**现象解析:股价在震荡上行或回调企稳阶段,呈现“两根回踩阴线后接一根强劲阳线”或“两阴夹一阳”的震荡推升形态。尽管空头两次尝试回踩向下打压,但多头资金迅速入场承接,并用强有力的阳线重新向上拉升,形成一底比一底高的向上推升格局。 **●**交易启示:两阴夹一阳是主力资金震荡换手、筹码不断抬升的典型特征。实战中,一旦确认阳线反弹能够收复阴线失地,即表明多头已重新掌控主动权,投资者可逢低加仓或跟进持有,顺应资金向上推升的趋势。 3.“底部起明星,上涨以线行” **●**口诀展示:底部起明星,上涨以线行。 **●**现象解析:股价经过深度回调后,在底部区域形成典型的“启明星”反转形态(长阴线 + 十字星/小K线 + 长阳线)。反转确立后,股价不再维持无序震荡,而是沿着均线系统或上升趋势线呈现线性、单边且连续的强劲拉升。 **●**交易启示:底部启明星标志着空头力量彻底耗尽、多头强势逆转局势。而“上涨以线行”则是主线资金控盘度高、拉升意愿极强的信号。遇到此类形态,应在启明星确认后第一时间右侧建仓,并紧抱趋势线持股,享用单边主升浪收益。 4.“底部三连,向上扬” **●**口诀展示:底部三连,向上扬。 **●**现象解析:股价在底部经历反复磨底后,连续出现三个小阳线企稳或连续三个低点抬高的筑底信号(“底部三连”形态)。这代表底部筹码结构已极其坚固,多空博弈的平衡被彻底打破,多头资金已完成建仓并开始由防守全面转入向上发散进攻。 **●**交易启示:底部连续企稳是趋势确立的重要风向标。当“底部三连”信号出现且均线开始抬头向上发散时,意味着右侧买点已经成立,投资者应敢于在底部启动初期果断布局,锁定趋势扭转的红利。 在不确定性中建立你的交易纪律 震荡行情考验的不仅是对K线形态的识别能力,更是对交易纪律的执行力。本文总结的7句口诀(“三阳不破阴”、“三阴不破阳”、“一阳通三阴”、“两阴加一阳”、“阴加一阳”、“底部起明星”、“底部三连”),是帮助大家看清主力意图、提高交易胜率的有效辅助工具。 然而,口诀只是工具,真正的关键在于面对市场波动时的执行力与心态控制。只有将口诀融会贯通,严格执行止损与建仓纪律,才能在不确定的市场中建立属于自己的确定性。 研究了两年,终于研究出来一个无敌策略,不惧牛熊,各种行情都是稳定盈利!! 有感兴趣的朋友欢迎留言,短周期策略。持仓数量十只 为什么大多数人在股市中沦为“燃料”? 在资本博弈的修罗场,大多数投资者就像是蒙眼行走在刀尖之上。他们日复一日地在波动中焦虑,在涨跌间迷茫,却从未意识到一个残酷的真相:如果你没有一套极致的生存逻辑,你的本金就只是市场流动性的“燃料”,是为那些顶级掠食者准备的饕餮盛宴。 股市的长期盈利从来不靠运气,而是归属于那些在人性幽微处完成自我进化的“狠人”。这些赢家或许风格迥异,但骨子里都刻着一种共同的特质:极其纯粹的自律。本文将拆解这六种能在市场长久生存的顶级物种,看清他们是如何在这个充满诱惑的丛林中克敌制胜的。 第一种:极致冷静的“空仓狠人” 在绝大多数人看来,不操作就是虚度光阴;但在真正的猎手眼中,等待才是最高级的劳动。 核心特质: 耐心与克制。 策略逻辑: 他们是潜伏在暗处的狙击手,常年持币观望,冷眼看众生喧哗。他们拒绝参与任何无效的震荡,一年或许只出手少数几次捕捉确定性的大级别波段。一旦利润落袋,便迅速撤离,绝不恋战。 “一年只捕捉那几次大波段机会,赚了就走,不留一丝念想。” 心理护城河: 这种“空仓”能力是投资者的最高门槛。它要求你必须战胜对“错过行情”的原始恐惧。对他们而言,错失不是风险,本金的无谓损耗才是。 第二种:与时间为友的“长线玩家” 他们是市场的“潜伏者”,用极度的孤独换取最丰厚的溢价。 核心特质: 长期主义。 策略逻辑: 持股周期通常跨越 3 到 5 年。他们对日内的闪崩、月线的调整表现出近乎冷酷的漠视。这种“笨办法”本质上是利用时间作为过滤器,筛掉所有的市场噪音,只收割企业成长的终极红利。 心理护城河: “不理会短期涨跌”说来容易,但在信息大爆炸的今天,能守住初心不被舆论裹挟,需要极强的认知定力。 . 第三种:深耕单股的“作手高手” 他们不看大盘的脸色,只在自己的一亩三分地里反复耕耘。 核心特质: 极致专注。 策略逻辑: 长期锁定一两只熟悉的标的,通过日复一日的高抛低吸(做T)反复套利。他们的目标不是追求翻倍牛股,而是通过复利降低持仓成本,直到将成本做成负数。 心理护城河: 这种打法在震荡市中堪称无敌。他们与个股的股性达成了一种“共生关系”,波动对他人是折磨,对他们而言则是能源。 第四种:雷霆万钧的“龙头选手” 他们是嗅觉最灵敏的鲨鱼,永远只出现在水温最高、血腥味最浓的地方。 核心特质: 敏锐度与执行力。 策略逻辑: 视平庸为耻,目光永远锁定在市场的主线龙头上。他们的战术手册里只有八个字:纪律严明,雷霆万钧。入场即是巅峰,一旦逻辑证伪或趋势走弱,撤离速度之快,绝不拖泥带水。 心理护城河: 龙头选手的生命线是“纪律”。他们能承受极高的波动,因为他们有壮士断腕的果敢,这种非凡的执行力是普通人无法企及的。 第五种:莫得情感的“交易机器” 在他们眼中,K线不是图表,而是逻辑触发的开关。 核心特质: 系统性与非人性。 策略逻辑: 这一类投资者已经屏除了人性中贪婪与恐惧的生理干扰。他们只看买点和卖点,不看利好或小道消息。 “买点不到,即便涨停也与我无关;卖点一到,哪怕割肉也像机器一样执行。” 心理护城河: 这种“隧道视野”是一种保护。当市场情绪狂热或绝望时,他们依然能通过非人性的执行力,精准地避开系统性崩溃。 第六种:知足常乐的“聪明人” 他们深谙博弈论中的“二八原则”,从不奢求吃干抹净。 核心特质: 审时度势与不贪婪。 策略逻辑: 奉行“鱼头鱼尾不吃”原则。他们只收割行情中段最肥美、确定性最高的那部分收益。当大众还在幻想翻倍时,他们往往在狂欢的末尾提前离场,保住利润。 心理护城河: 放弃最后的涨幅需要极大的智慧。他们明白,绝大部分的利润回撤,都发生在贪恋最后那一口“鱼尾”的时候。 警示:最可怕的“第七种人” 相比前六种各具神通的“狠人”,市场中 90% 的投资者其实属于第七种。 样样通,样样松,终成他人嫁衣。 这类人的典型画像是: 策略混乱: 听了长线好就去建仓,套了 5% 就想割肉;想学龙头战法,结果在山顶成了站岗者;想做 T 降低成本,结果越 T 成本越高。 认知碎片: 今天钻研短线技术,明天打听超跌反弹,后天又去研究价值投资。他们的“灵活性”本质上是缺乏底层逻辑的随波逐流。 前六种人赚的是**“纯粹”的钱,而第七种人则是前六种人共同的“自动取款机”****。** 股市里从不比谁在某一天赚得快,而是比谁在残酷的洗牌中活得久。 结语:你选择成为哪一种? 成功的路径各有千秋,但失败的死穴惊人一致——那就是策略的混乱与贪婪的失控。 股市是一个会被无限放大性格缺陷的实验场。如果你不能在上述六种“狠人”中找到自己的生态位,那么你大概率就是那个为他人提供流动性的“牺牲品”。 亲测最好用的AI编写量化策略工具,可以让 AI 直接生成同花顺Supermind上可运行的策略代码,代码质量远高于直接使用 DeepSeek、GPT等平台。 😃Supermind AI工具入口:https://easyquant.ai/ 大家可以直接向AI描述策略,然后一键生成可运行的完整策略代码,也可以把它当做一个API 查询工具。 回测里某个港股策略表现稳定,实盘跑了一个月,收益差了将近一半。 不是完全对不上,是那种“差异不大但一直在”的偏差。团队排查了三周——策略逻辑、滑点模型、手续费、执行延迟,全部查过。最后发现问题在数据层:数据源返回的港股代码是“700”,而团队数据库里存的是“00700”。两个格式查出来的数据,部分重叠,部分不重叠。回测用的样本,比实际可交易的样本少了一批。 这不是某个操作失误,是港股数据接入的通用问题。 四个坑,一条链,你的回测从第一步就已经偏了。 这条链长什么样 你想要的:全市场标的 │ ▼ ┌───────────────────┐ │ 第一坑:代码格式 │ 代码格式错 → 样本少了一批 └────────┬──────────┘ │ 起点偏了 ▼ ┌───────────────────┐ │ 第二坑:成交量单位 │ 量纲不统一 → 流动性判断反 └────────┬──────────┘ │ 分母错了 ▼ ┌───────────────────┐ │ 第三坑:时间断点 │ 时段未对齐 → 幻影K线 └────────┬──────────┘ │ 时间错了 ▼ ┌───────────────────┐ │ 第四坑:前复权 │ 复权口径乱 → 信号含未来信息 └────────┬──────────┘ │ 信号脏了 ▼ 回测结论不可信 每一环的错误,都是下一环的输入。 第一坑让样本有偏,第二坑在偏的样本上判断流动性,第三坑在错的量纲上做时间对齐,第四坑在错的时间上算复权信号。四个坑不是四个独立的小问题,是一条流水线——起点偏了,后面每一步都在偏的基础上运行。 这篇文章要回答三个问题 港股数据源的四个坑,底层逻辑是什么? 这些坑怎么影响你的回测和实盘? 你怎么验证自己的数据源有没有踩坑? 这篇文章写给三类人 读者类型 你的核心任务 这篇文章帮你解决什么 量化团队PM/数据选型决策者 为团队选数据源、管风险 四个坑的风险有多大,怎么在采购合同里写清楚 投资研究员/策略开发者 跑回测、做因子、做策略 为什么回测和实盘对不上,怎么排查数据层的定义问题 金融产品应用团队 做看盘、做数据产品 怎么判断数据源的字段口径是否可靠,怎么验收 第一坑:港股代码不是数字,但所有工具都想把它当数字 链条的起点,是你看到的是哪些股票。 你的回测跑出来年化30%,实盘亏了12%。你以为是策略过拟合。回头排查数据,发现腾讯(0700)的代码在CSV里变成了整数700。用“700”查接口,部分数据回来,部分回不来——不是全错,是部分对、部分错。 港股代码是港交所2008年4月7日起规定的五位数字证券代码。腾讯在港交所系统里是00700,不是700。Excel把它变成整数700,不是“格式不美观”,是代码已经不是港交所规定的那个标识符了。全错你会立刻发现,部分对你以为自己在正常工作。 更隐蔽的是代码复用:有行业观察指出,港股除牌后代码可能在12个月后被另一家公司使用。如果你的数据源只按代码拼接历史行情,旧公司的历史数据可能被错误地拼接到新公司上——你的回测里,一家已经退市的公司“借尸还魂”了。 验证动作:用Python读入港股代码列表,检查代码长度是否保持5位;如果被转成整数,能否用str(int_code).zfill(5)还原。两个都通不过的存储方案,全部废弃。 这件事的代价是什么:你向老板汇报“港股全市场策略”,但你的数据基础并不完整。那些“消失”的股票,你从来没机会看到它们。当老板问“为什么我们错过了那只涨了三倍的股票”时,你的回答是“策略没选中”,而不是“策略根本没看到它”。这个区别,决定了别人是质疑你的策略,还是质疑你的数据。 起点偏了,后面每一步都在偏的基础上运行。 第二坑:港股成交量是“手”,每只股票每手股数不一样 第一环已经让你的样本有偏了。第二环决定,你能不能正确判断这些股票的交易活跃度。 你的策略判断某只港股“放量突破”,实盘买入后发现根本买不进去——日成交量比你想象的小得多。为什么回测里能买的量,实盘买不到? 腾讯(0700)一手=100股。但港股其他标的每手股数不同,有200股、500股、甚至1000股一手。成交量字段“1000手”,不同标的代表完全不同的实际股数。港交所正在咨询改革:把超过40种每手股数简化至8种。这意味着历史数据里存在超过40种每手股数,数据源必须维护“历史每手股数表”,不能用今天的值去换算三年前的成交量。 更隐蔽的是:每手股数是时变的。公司可能因股份合并、拆分调整每手股数。同一个标的在改革前后的每手股数可能不同。跨市场比较更危险:美股成交量单位是股,港股是手,直接对比等于关公战秦琼。 验证动作:取同一只标的同一天的成交量,从两个不同接口获取,比较数值。如果差了一个数量级,检查单位。然后做换算测试:手数×每手股数,结果必须是整数;出现浮点数,说明某一步数据来源有问题。 这件事的代价是什么:你的策略告诉你某只股票“放量突破”,你按回测的仓位买入。实盘中,市场容量只有你计算值的十分之一。你的仓位管理规则,建立在一个错误的分母上。这个问题在回测中不会报错——数字看起来都很合理。等到实盘,你的买入指令只成交了一小部分,成本远超预期。 量纲错了,你对这些股票的所有判断都建立在错误的分母上。 第三坑:港股时间序列有三个断点,当连续处理会产生幻影K线 样本偏了、量纲错了,第三环决定你的策略在什么时间做决策。 你的日内策略在回测里每天中午都能抓住一个“交易机会”,实盘中午却什么都没发生。为什么回测里中午有交易信号,实盘没有? 港股每天12:00-13:00午间休市,全年有若干半日市(圣诞前夕、新年前夕、农历新年前夕),还有开盘和收盘的集合竞价阶段。如果把港股时间序列当连续处理,会在午间休市缺口产生“幻影K线”——策略在一个不存在成交的时段触发信号。 2024年9月23日之前,八号台风或黑色暴雨可能导致全日停市或半日交易;之后港交所实施SWT,恶劣天气照常交易。数据源日历如果不区分这个分界,回测里会出现虚假缺失或虚假交易日。 验证动作:调一次港股分钟K线,取一天的完整数据。检查:12:00-13:00之间是否有K线返回;K线的时间戳是区间起点还是终点;下一个交易日的第一个K线时间戳是否连续。 这件事的代价是什么:你的日内策略在回测中每天中午都能“抓住一个机会”。实盘中,中午什么都没发生。你以为策略失灵了,其实那段时间市场根本没开门。你的风控系统把午休当成了停牌,每天中午触发一次警报。你花了两周排查系统bug,最后发现是数据源没标清楚——市场在休息,不是系统在出错。 时间错了,你的策略在不存在的时间段做决策。 第四坑:港股复权是“偷看未来”——前复权的隐形陷阱 前三环都错了,信号本身也不会干净。第四环决定你的信号是不是在偷看答案。 你的策略在回测里精准地在一只港股分红前买入,实盘却总是买在高点。为什么回测里能“精准抄底”,实盘不行? 港股股票除权后,历史价格会调整(复权)。前复权是把历史价格调成“现在的样子”——但“现在的样子”,是用你今天才知道的除权因子算出来的。假设某港股在回测区间里有过一次每股送0.5港元的分红。前复权因子会把这次分红之前的所有历史价格都向下调整。你的策略看到“历史价格更低”,判断“当时是买入机会”——但在那个时间点,分红还没发生,那个价格根本不存在。 不同数据源的复权算法不同。有开发者反馈,Wind与东方财富的后复权涨跌幅存在约千分之一误差。千分之一在单日看似微小,但在多年复利后可能显著影响净值曲线。 验证动作:连续三天拉取同一只标的、同一历史区间的日K线,指定adjust=none。检查三次返回的原始价格是否完全一致。然后拉取前复权,检查前复权价格是否一致。如果前复权价格不一致,说明因子在变——你的回测不可复现。 这件事的代价是什么:你的策略在回测中“精准抄底”某只分红前的股票,实盘中却总是买在高点。你以为是执行延迟,其实是你用今天才知道的除权因子,在回测里“偷看”了未来的答案。你的年化收益里,有一部分只存在于回测报告中。向投资者展示这部分收益时,你无法解释为什么实盘跟踪不了。 信号脏了,回测里的收益有一部分根本不存在。 三家横评:能力边界与适合场景 三家都能给你港股数据。选错的代价不是多付服务费,是你的策略在用一份存在上述四个问题的数据做决策。 为什么选这六个维度:符号规范化决定样本是否有偏,成交量口径决定流动性判断是否可信,时间一致性决定信号是否在正确时段触发,复权可审计性决定回测是否可复现,历史数据覆盖决定样本存活偏差,生产可靠性决定上线后是否稳定。 评估维度 为什么这个维度重要 TickDB(实测) 富途OpenAPI 盈透IBKR 符号规范化 代码格式错→样本有偏 700.HK规范;0700.HK实测兼容但未文档化 SDK处理,格式以开发者文档为准 conid识别,需额外合约查询 成交量口径 单位错→流动性判断反 实测与Yahoo Finance股数一致;文档未明确标注 以官方文档为准,接入前需确认 以官方文档为准,接入前需确认 时间一致性 时段错→幻影K线 实测12:00-12:59:59无K线;半日市至12:00 需核验午休/半日市处理 需核验午休/半日市处理 复权可审计性 复权错→信号含未来信息 none/forward/backward实测有效 默认AuType.QFQ,需显式指定NONE TRADES/MIDPOINT/BID_ASK需区分 历史数据覆盖 退市股缺失→样本存活偏差 退市股实测样本未通过,需逐只确认 分钟≈8年/日线≈20年(需逐券核验) 30秒以下≤6个月;退市股不可获取 生产可靠性 静默失败→不可复现 REST快照/WebSocket流需区分 行情互踢限制(一个OpenD最高权限) 需管理TWS会话 TickDB:对主要需求是行情入库、大规模订阅、数据服务对接的团队更匹配。实测覆盖了午间休市、半日市、复权参数、symbol兼容性。需要注意:volume文档未明确标注单位,退市股覆盖需逐只确认。 富途OpenAPI:对已有富途账户、想快速验证港股看板或研究工具的小团队最友好。需要注意:App里能看的行情,API不一定有相同权限;存在行情互踢限制。 盈透IBKR:对已经在用盈透做跨市场程序化交易、需要港股和其他市场共用一套工作流的机构最合适。需要注意:30秒以下K线只有6个月,退市股不可获取。做多年全市场回测的团队,这一条可能直接排除它作为唯一数据源。 表格中TickDB的实测数据来自Codex验证报告(2026-10-08);富途和IBKR的复权参数、历史数据限制来自各自官方文档(访问日期2026-10-08);成交量单位、午间休市处理等未明确项,标注为“以官方文档为准”或“需逐只确认”。 我们用代码验证了什么(可直接带走) 上面表格中TickDB的实测数据,来自以下可运行的验证代码。你可以直接复制到本地,换成自己的API Key跑一遍。 import requests API_KEY = "your_api_key" BASE_URL = "https://api.tickdb.ai/v1" headers = {"X-API-Key": API_KEY} # 验证1:代码格式——700.HK 和 0700.HK 是否都能命中 print("=== 验证1:代码格式兼容性 ===") for symbol in ["700.HK", "0700.HK"]: resp = requests.get( f"{BASE_URL}/market/ticker", params={"symbols": symbol}, headers=headers ) data = resp.json() print(f"{symbol}: code={data.get('code')}, symbol={data.get('data', {}).get('symbol')}") # 验证2:复权参数——none / forward / backward 是否有效 print("\n=== 验证2:复权参数 ===") for adjust in ["none", "forward", "backward", "qfq", "hfq"]: resp = requests.get( f"{BASE_URL}/market/kline", params={"symbol": "700.HK", "interval": "1d", "adjust": adjust, "limit": 1}, headers=headers ) data = resp.json() print(f"adjust={adjust}: code={data.get('code')}, adjust={data.get('data', {}).get('adjust')}") # 验证3:午间休市——12:00-12:59:59 是否有K线 print("\n=== 验证3:午间休市 ===") resp = requests.get( f"{BASE_URL}/market/kline", params={ "symbol": "700.HK", "interval": "1m", "adjust": "none", "limit": 1000, "start_time": 1791336600000, # 2026-10-07 09:30 HKT "end_time": 1791360000000, # 2026-10-07 16:00 HKT }, headers=headers ) klines = resp.json()["data"]["klines"] noon_klines = [k for k in klines if "12:00:00" <= k["time_hkt"][11:19] <= "12:59:59"] print(f"总K线数: {len(klines)}") print(f"午间休市K线数量: {len(noon_klines)}") # 验证4:半日市——2025-12-24 返回多少根 print("\n=== 验证4:半日市 ===") resp = requests.get( f"{BASE_URL}/market/kline", params={ "symbol": "700.HK", "interval": "1m", "adjust": "none", "limit": 1000, "start_time": 1766539800000, # 2025-12-24 09:30 HKT "end_time": 1766563200000, # 2025-12-24 16:00 HKT }, headers=headers ) klines = resp.json()["data"]["klines"] print(f"半日市K线数: {len(klines)}") if klines: print(f"第一根: {klines[0]['time_hkt']}") print(f"最后一根: {klines[-1]['time_hkt']}") # 验证5:历史可复现——两次查询结果是否一致 print("\n=== 验证5:历史可复现 ===") params = {"symbol": "700.HK", "interval": "1d", "adjust": "none", "limit": 10} resp1 = requests.get(f"{BASE_URL}/market/kline", params=params, headers=headers) resp2 = requests.get(f"{BASE_URL}/market/kline", params=params, headers=headers) print(f"两次查询结果一致: {resp1.json() == resp2.json()}") 实测结果摘要(Codex,2026-10-08): 验证项 实测结果 700.HK 和 0700.HK 均返回200,除回显symbol外数据相同 adjust=none/forward/backward 均返回200 adjust=qfq/hfq 返回400,错误码2001 午间休市12:00-12:59:59 K线数量为0 半日市2025-12-24 返回151根,09:30-12:00,12:00后无K线 两次查询结果 完全一致 说明:TickDB 的 REST 接口是按需快照,不是实时流;如果你需要逐 tick 的实时更新,应该改用 WebSocket 订阅。bid_price、ask_price、spread 这些字段来自 depth 接口,不在 ticker 接口里。 验收清单(可直接发给供应商) 把这张表填完,发给数据源供应商,把回答写进采购文档或接入文档。问不清楚的条款,视为未确认,不能进生产环境。 验收维度 你应该问供应商的问题 对应哪个坑 代码格式 symbol格式是否支持带前导零的港股代码?700.HK和0700.HK哪种能命中? 坑一 成交量口径 成交量字段的单位是手还是股?每手股数在哪里取? 坑二 时间序列 午间休市(12:00-13:00)段有无K线数据返回?半日市如何标注? 坑三 复权控制 默认返回复权价还是原始价?能否显式指定复权方式? 坑四 可复现性 两次调用同一历史区间,结果是否完全一致? 全局 退市股覆盖 历史回测范围内的退市股,历史数据是否可获取? 全局 这张清单的价值不在“问什么”,在“你敢不敢问”。 如果你把这些问题发给供应商,对方回答“这些不重要”,那你已经知道答案了。 常见问题(FAQ) Q1:港股数据源怎么选? A:核心是确认四个坑的约定:代码格式、成交量单位、时间断点、复权方式。这四个不确认,回测和实盘对不上只是时间问题。 Q2:港股代码是四位还是五位? A:港交所2008年4月7日起采用五位数字证券代码。腾讯在港交所系统里是00700。如果你的数据源返回“700”,需要确认它是否规范化为五位字符串。 Q3:港股成交量单位是手还是股? A:取决于数据源。港交所规定“手”是最低交易股数单位,每手股数因标的不同。接入前必须确认:你的数据源返回的volume字段,单位是手还是股。用成交额÷成交量=均价做一次校验。 Q4:港股午间休市怎么处理? A:午间休市12:00-13:00,期间无K线。如果数据源返回了午休时段的K线,需要排查。半日市下午无K线,不能用插值填补。 Q5:前复权在回测中有什么问题? A:前复权用今天才知道的除权因子调整历史价格,构成未来函数。信号生成建议用后复权或原始价格,模拟成交用原始价格。不同数据源的复权算法不同,跨源对账时必须约定相同口径。 Q6:退市股数据要不要覆盖? A:做多年全市场回测,退市股覆盖直接影响样本存活偏差。IBKR官方文档明确退市股不可获取;TickDB实测海通国际665.HK返回symbol not found,需逐只确认。采购时把退市股覆盖写进验收清单。 TickDB 是什么,在数据源选型中有什么优势 上面这些验证,我用 TickDB 的接口跑了一遍。 TickDB 为开发者和 AI 应用提供统一的全球行情数据接口,让团队通过一套接入获取多市场实时与历史数据,更快构建行情、分析和监控产品。 TickDB覆盖A股、港股、美股、期货、外汇、加密货币、贵金属,支持免费开始使用。 在数据源选型这个场景中,TickDB 有三个可验证的优势: 优势 具体表现 多市场统一 一套 API 覆盖上述市场,标的目录可查询、可分类 字段结构确定 停牌、集合竞价等边界状态有明确字段行为,不是“看起来有数据” 复权逻辑透明 复权因子有独立接口,公式可验证,不依赖数据源黑箱 如果你用的是支持 MCP 的工具(比如 Cursor、Claude Code),也可以直接让 Agent 调用 TickDB 的行情工具: # 在支持 MCP 的 AI 工具中,配置 TickDB 的 MCP 服务后 # 可以直接用自然语言调用行情工具,例如: # "帮我拉取 AAPL.US 最近 15 根 1 分钟 K 线" # Agent 会调用 get_kline 工具,返回带时间戳、OHLCV 的结构化数据 # "查一下 700.HK 当前的盘口深度" # Agent 会调用 get_order_book 工具,返回买卖档位 # "600519.SH 最近 5 个交易日的资金流向" # Agent 会调用 get_capital_flow 工具,返回资金流数据 MCP 工具的价值在于:让模型先拿到带标的、字段和时间的事实,再进行分析——而不是让模型用训练数据里的历史价格回答“现在多少钱”。 结尾 你的数据源,敢不敢让你问一句“这个数字是怎么变成现在这样的”? 不用写代码。先做一件最小的事:在采购合同或产品文档里,加一条“数据源口径确认”。确认四件事——代码格式是几位字符串、成交量单位是手还是股、午间休市怎么标、复权默认用哪种。 我现在会把“连通成功”当成试接的开始。能否说明每段数据如何识别、如何对账,出了差异怎样复现,才是报价源进入下一阶段的验收答案。 评论区:你们团队接入港股数据时,踩过哪个坑?或者还有第五个坑? 参考文献 香港交易所. 五位数字证券代码公告. 2008-04-07. 香港交易所. 每手股数标准化咨询文件. 2026. 香港交易所. 交易时段及恶劣天气安排. 访问日期:2026-10-08. 中国结算. 半日市交收安排. 访问日期:2026-10-08. 富途OpenAPI. 历史K线接口文档. 访问日期:2026-10-08. Interactive Brokers. Historical Data Limitations. 访问日期:2026-10-08. TickDB. REST API 官方文档及实测数据. 访问日期:2026-10-08. Codex. TickDB港股接口验证报告. 2026-10-08. Codex. TickDB港股接口补测报告(r2). 2026-10-08. 量化社区讨论. Wind与东方财富后复权涨跌幅误差. 访问日期:2026-10-08. 调用方式 做量化交易策略,常常离不开一分钟级别K线行情数据。分钟数据是十分重要的行情数据,体现了一分钟内的行情变化,统计粒度较小,实时性较强。 一般情况下分钟K线数据的获取主要包括横向切片和纵向切片两种方式: 1、分钟K线横向切片 横向切片方式获取,能一次性获取全市场所有股票的某一个时刻的分钟数据,便于纵览全局,运筹帷幄。 2、分钟K线纵向切片 纵向切片方式获取,能一次性获取多个股票在当天所有时刻的分钟数据,便于对个别股票进行深度分析。 分钟级别K线周期如下: 1m - 1分钟线 5m - 5分钟线 15m - 15分钟线 30m - 30分钟线 1h - 1小时线 调取场景 盘中实时获取日内K线数据,支持批量获取。 场景一:按K线时间戳获取日内分钟K线数据,比如一分钟、五分钟、60分钟等,也支持time设置为0,表示直接获取最新K线数据。 场景二、按股票获取当天所有分钟K线数据,比如code取值为000001,000002,time取值为-1,获取两支股票当天所有K线数据,注意总返回记录数不能超过6000条。 场景三、批量获取当天最新日线级别K线,比如日线、周线、月线、年线。 请求示例 http://api.xtick.top/doc/core/batchkline?type=1&code=000001,000002&time=1790213700000&period=1m&token= 输入参数 参数名 类型 范围/说明 描述 type int 1-沪深京A股,2-沪深指数,3-港股,4-ETF基金,5-沪深可转债 标的类型 code String - 股票代码。code取值为000001,则表示获取单个股票数据;code取值为000001,000002,则表示批量获取获取,股票数量最大为100个;code取值为all,则表示全推全市场数据。限制:需要结合time参数来获取数据,单次请求返回总记录数不超过6000条。比如如果time取值为-1,code不能设置为all,code批量参数设置的股票个数不能超过100个且返回数据总调数不能超过6000条。 time Long - 交易时间。time为K线时间戳。time取值为0,表示最新一条K线数据;time取值为-1,表示当天全部K线数据,分钟级K线日内则有多条数据,日线级别K线仅一条数据;time取值为K线时间戳,则表示根据时间戳查询和获取对应的K线数据。 period String 1m-1分钟线,5m-5分钟线,15m-15分钟线,30m-30分钟线,1h-1小时线,1d-日线,1w-周线,1mon-月线,1q-季度线,1y-年线 K线周期 token String - 登录网站获取token 返回参数 参数名 类型 描述 type int 标的类型 code String 股票代码 time long 交易日期 open float 开盘价 close float 收盘价 high float 最高价 low float 最低价 volume float 成交量(手) amount float 成交额(元) preClose float 昨日收盘价 参考资料 Github开源项目:https://github.com/xticktop/skills