同一张行情表,寒武纪的成交额自己算是5,414万元,接口给的是54.20亿元,差了100倍,原因只是一个单位。行情看板三天就能接通,上线后的返工,几乎都来自界面上说不清“自己是什么”的数字。 本文依据上交所、港交所的一手文件,加上10月12日盘中对7类资产的实测,给你四样东西: 一张“价格身份证”:每个数字上线前要答的5个问题 7个返工点逐条拆:钱在哪里算错、为什么会错 一份可以直接发给数据供应商的7问清单 2段可运行的 Python 代码 做行情看板,最便宜的一步恰恰是接接口。 10月12日周一上午,我把寒武纪和腾讯放进同一张行情表,拿“成交量×价格”自己算了一遍成交额: 寒武纪:成交量 54,605,最新价 991.44 元。自己算是约 5,414 万元,接口给的成交额是约 54.20 亿元,差了100倍。 腾讯:成交量 6,542,389,最新价 427.20 港元。自己算是约 27.95 亿港元,接口给的是 27.97 亿港元,对得上。 没有哪个数是错的。寒武纪的“成交量”按手计,1手是100股;腾讯的按股计。字段名都叫成交量,单位差了100倍。 (寒武纪快照为北京时间2026年10月12日11:29:56,腾讯为11:07:51。) 单位还只是一处。今年下半年,这类“同一个数、换了规则”的事正在变多:7月6日起,A股每天15:05到15:30多了一段盘后固定价格交易,据证券导报报道,首日约1,900家主板公司参与;11月16日起,港股开始统一每手股数,约650家公司可能要改。 行情接口几行代码就能接通。行情应用能不能上线,取决于界面上的每个数字能不能出示它的“身份证”:品种、时段、算法、时间、状态。答不出来的数字,迟早会以客户投诉、错误决策或返工账单的形式找上门。 下文分三部分:一块面板 → 7个返工点逐个拆 → 自建还是外采怎么算账。不写代码的读者,每节读到“先问供应商”就够了,技术细节可以直接转给技术同事。 第一部分|三天能做出来的面板,每个数字还要多答5个问题 我按一份技术底稿搭了一块跨资产行情面板:React 前端加 Python 后端,API Key 只放在服务端。7类资产各放一个品种:寒武纪(A股)、腾讯(港股)、苹果(美股)、欧元/美元(外汇)、黄金(贵金属)、标普500(指数)、BTC/USDT(加密资产)。 从第一次调用接口到页面上出现数字,比写这段话还快。 (真实数据静态快照,取证时刻见图;面板按底稿自建,不是官方产品界面。) 接通快,不等于做完了。和一个“三天Demo”比,这块面板多的是每个数字旁边那行小字:涨跌按什么窗口算,成交量按手还是按股,这个价是几点的。 这行小字,就是“价格身份证”的5格: 格 它回答什么 面板里的例子 品种 这个数属于谁 000001 是平安银行还是上证指数 时段 这个数产生在哪个交易时段 苹果的报价是周五收盘,盘口是今天的夜盘 算法 这个数按什么规则算、单位是什么 涨跌幅按当日还是滚动24小时;成交量按手还是按股 时间 这个数对应哪一刻 K线时间戳标的是这根的开始还是结束 状态 这个数现在有没有、还会不会变 指数的“买价0”其实是没有;最后一根K线还在变 读法:每一格都是上线前要答的一个问题,答不出来的那格,就是以后某个工单的位置。(例子均来自2026年10月12日实测。) Demo 回答“能不能显示”,产品要回答“显示的是什么”。 第二部分|7个返工点:钱在哪里算错 (以下实测均为北京时间2026年10月12日的单次调用。) ① 品种|同一个代码,可能是两个品种 能报错的接口,比替你猜的接口安全。 场景:用户在自选里输入“000001”,点了添加。他要的是平安银行,还是上证指数? 实测:我不带资产类型去查“000001”,接口直接返回 400 错误 AMBIGUOUS_SYMBOL,并列出两个候选:上证指数、平安银行。带上后缀再查,000001.SZ 是平安银行,11.77元;000001.SH 是上证指数,3,808.54点。 钱怎么算错:如果系统替用户猜成了指数,自选里写着“平安银行”的那一行就显示 3,808 元。1万股持仓,估值从约11.8万元变成约3,808万元。 为什么:同一串数字,在沪深两个交易所之间、股票和指数之间都可能重复。还有一层容易混:请求时用的类型、页面上的分类、数字的单位,是三件事。黄金请求时属于外汇类,页面上应该放在“贵金属”,单位是美元/盎司;指数的单位是“点”,不能加货币符号。 先问供应商:“代码冲突时,你们是报错、默认选一个,还是静默返回其中一个?” 给技术同事:品种目录从产品查询接口分页建立,存好代码、类型、市场、币种;不按代码后缀猜币种;后端只接受目录里有的代码。 ② 算法|“成交量”的单位,换一个市场就变 字段名一样,不等于单位一样。新加一个市场,先核单位。 场景:先做港股看板,上线顺利。老板说“加上A股”,半天接完,成交额、换手率、大单筛选全错了。 实测:开篇那组数,用成交额除以成交量:寒武纪约 99,255 元,是股价的100倍,1个单位是100股;腾讯约 427.45,和股价差不多,1个单位是1股。逐笔成交、盘口数量也一样:寒武纪下午14:00的买一是“976.01元、8手”。(单位由返回结果反推,接入前以文档为准。) 钱怎么算错:成交额差100倍只是第一层。第二层在大单筛选:寒武纪最近成交里有一笔数量“51”,当股算约5.06万元,按手算约505.6万元。阈值设成“单笔≥50万元算大单”,这一笔就漏了。 为什么:A股行情习惯按手报量,港股按股,加密资产按币;外汇不在集中交易所成交,“成交量”又是另一回事。 而且单位表不是写一次就完的。港交所现在有44种每手股数,从10股到10万股;6月30日宣布统一为8种,第二阶段从11月16日开始,约650家公司可能要改。A股这边,科创板200股以上可以按1股递增,“1手=100股”在交易规则里也不总是整齐的。 先问供应商:“每个市场的成交量、盘口数量、逐笔数量,单位分别是什么?写在文档哪里?” 给技术同事:单位按市场配置,不按字段名猜。每天用“成交额÷成交量÷价格”自检一次,比值在1或100附近都正常,突然跳变就报警。代码在第三部分。 ③ 时段|同一屏的两个价,可能来自两个时段 报价区和盘口区各有自己的时段。不标出来,用户只会觉得“你们的价格对不上”。 场景:周一上午,用户打开苹果的详情页。报价区写着 336.64,盘口买一是 337.14。他截图发给客服:“哪个是真的?” 实测:上午11:08,同一分钟里: 报价区的 336.64,是周五常规盘的收盘价,时间停在北京时间10月10日04:00,已经过去约55小时; 同一份快照里还有夜盘价 337.16,时间是11:07; 盘口买一 337.14、卖一 337.17,各只有1档,属于正在进行的夜盘; 最近成交每一笔都标着 overnight(夜盘)。 下午两点再查,报价区还是 336.64,夜盘价已经变成 337.03。美股常规盘开盘之前,这个主快照不会动。 钱怎么算错:按报价算盈亏、按盘口挂单,两个价差0.50美元,1万股就是5,000美元。更常见的代价是客服时间:两个数都对,只是没人告诉用户各自属于哪个时段。 为什么:快照的主价格停在最后一个常规盘,扩展时段放在单独的对象里,各带各的时间;盘口和成交走另外的接口,返回的是此刻正在交易的时段。美股夜盘的细节,上一篇《拆解美股夜盘数据5个口径》已经拆过。 A股也不再是“15:00收盘”那么简单。上交所修订后的《交易规则》7月6日起施行,盘后固定价格交易从科创板扩展到全部A股和ETF:每天15:05到15:30,按当天收盘价成交。据证券导报报道,首日这段时间全市场成交约10.7亿元。可我实测的交易时段接口,A股只返回到14:57,收盘集合竞价和这段盘后交易都不在里面。 时段表要自己核,不能只看接口给的清单。 先问供应商:“快照、盘口、成交分别对应哪个时段?15:05以后的盘后成交,算不算进当天成交量?” 给技术同事:行情状态按“类型+代码+时段”分开存,夜盘数据不覆盖主快照;页面上每块区域显示自己的时段和时间。 ④ 算法|涨跌幅不是一个字段,是三种窗口 窗口不同的涨跌幅放进一个排行榜,排出来的顺序本身就是错的。 场景:产品想在首页做一个“全市场涨幅榜”,股票、外汇、加密资产混在一起排。 实测: 寒武纪 −1.01%:相对昨收 985.99 元。这个昨收从早到晚没变过。 BTC/USDT +1.08%:下午两点查,它的“前收”是 83,074.01;上午11点查,同一个字段是 83,049.15。同一天,“前收”自己变了。 标普500 0.00%:前收 7,811.54,和最新价一模一样。美股还没开盘,这个0.00不代表“今天平盘”。 钱怎么算错:比特币的24小时涨幅和A股的当日涨幅比大小,没有意义;按涨跌幅触发的提醒,要么误报,要么该报的时候不报。 为什么:加密资产全天交易,没有“收盘”,涨跌按滚动24小时算,窗口起点每分钟都在往后挪。币安的官方接口文档写得很直白:24小时行情就是“24小时滚动窗口”的统计。股票按交易日算;指数在休市时前收怎么滚,各家做法不一样。 先问供应商:“每类资产的涨跌幅,基准价是什么、窗口多长?休市时前收怎么变?” 给技术同事:每条涨跌幅带上窗口标签,不做跨资产混排;真要统一,就用K线按同一个窗口自己重算。这个字段下一篇专门讲。 ⑤ 状态|“0”和“没有”,不是同一个数 不适用的字段显示“—”,不显示“0”。 场景:面板上,标普500那一行写着“买价0.00、卖价0.00、成交量0”。用户问:“标普今天没人交易?” 实测:我实测的接口,对标普500返回的买价、卖价都是 0.00000,成交量 0.00,上午、下午两次一样。指数本来就没有买卖盘和成交量,这里的0意思是“没有”。 外汇和黄金又是另一种情况:它们有买卖价,也返回了一个“成交量”(欧元/美元 38,426.00,黄金 45,598.00)。外汇不在集中交易所成交,这个数代表什么,文档没写,我的面板干脆不显示。 钱怎么算错:中间价按 (0+0)÷2 算出来是0,指数估值直接归零;用买卖价差做流动性风控,价差变成0,要么天天误报,要么永远不报。这两种错在测试环境里都看不出来。 为什么:指数是算出来的数,不能交易,没有买卖盘。可在接口里,“没有”和“0”长得一模一样,前端只看“有没有值”,就会把“没有”当成0画出来。 先问供应商:“不适用的字段,你们是返回空、不返回,还是返回0?” 给技术同事:按资产类型维护字段白名单,指数不读买卖价和成交量;格式化函数分清“不存在、为空、为零”三种情况,写成公共函数,别每个页面各写一遍。 ⑥ 时间|K线时间戳:有的标开始,有的标结束 时间戳不说是开始还是结束,就等于没说是哪一刻。 场景:你要做一张A股和港股的叠加对比图,或者一个跨市场的分钟级回测。 实测: 下午两点,同一次调用取“最新一根”5分钟K线:寒武纪标 14:05,腾讯标 14:00,说的是同一段5分钟。1分钟K线也一样:寒武纪标 14:01,腾讯标 14:00。 再看全天的5分钟K线:寒武纪第一根标 09:35,上午最后一根标 11:30,下午第一根标 13:05;腾讯第一根标 09:30,上周五还有一根标 16:00,那是港股16:00到16:10的收市竞价。 从这些时间看,A股用每根的结束时刻标注,港股用开始时刻。(这是推断,接入前以文档为准。) 最后一根还在变:寒武纪标14:05的那根,20秒内我查了3次,收盘价是 976.62、976.01、976.02,成交量从155涨到289。 钱怎么算错:叠加图上,两只票错开一整根。回测更贵:直接按时间戳对齐,总有一个市场的信号会提前用到5分钟后才有的数据,回测收益虚高,上线就对不上。日K线也一样:寒武纪午间返回的“今日收盘”是 991.44,到下午两点最新价已经是 976.01。盘中导出的CSV如果把最后一根当成收盘,报表里就是一个还没发生的收盘价。 为什么:这不是某一家接口的毛病。数据分析库 pandas 在把1分钟数据合成3分钟时,标签就有“取开头”和“取结尾”两种选法,同一组数据,时间戳能差一个周期。量化平台 QuantConnect 干脆给每根K线存两个时间:开始和结束,而且等这一根结束后才交给策略,就是为了防止回测提前看到未来。 量化研究机构 Concretum 做过一次对比:同一个开盘突破策略,代码、参数、日期都一样,只换数据商,最终资金从约22.6万美元到约72.6万美元,相差3倍多。他们的结论是:分歧不在策略,在数据。 先问供应商:“K线时间戳是开始还是结束?各市场一样吗?最后一根什么时候算结束?” 给技术同事:每根K线存成“开始—结束”的区间再对齐;导出CSV时给最后一行打上“可能未结束”的标记;不要拿最新报价拼一根“收盘K线”。 ⑦ 状态|盘口档位由市场决定,不支持的要说“不支持” 返回几档就画几档。不支持的市场,写“不支持”,不留空白。 场景:前端按A股写死了5档盘口,后来要加港股、美股、加密资产。 实测:同一个盘口接口,寒武纪返回5档,腾讯10档,苹果(夜盘)1档,BTC/USDT 每边1,000档。不支持盘口的品种,回应也不一样:标普500返回“成功”,但买卖两边都是空的;黄金、欧元/美元直接返回错误。 钱怎么算错:写死5档,港股丢掉一半深度;美股只有1档,前端要么画出4行空白,要么“补”出不存在的买二到买五,等于造了一份假深度,用户照着下单,这是最贵的一种错。外汇盘口显示空白,用户第一反应是“断线了”,工单又来了。 为什么:档位是市场本身决定的。A股5档、港股10档、美股夜盘可能只有1档、加密资产上千档,指数根本没有盘口。前端规定不了这件事。 先问供应商:“每个市场返回几档?不支持的市场返回什么?” 给技术同事:档位以接口返回为准,页面上写明“实际返回N档”;能力按市场配置;“没数据”“不支持”“请求失败”三种情况分开显示。盘口和成交的区别,第七篇再拆。 7个返工点,一张表收齐 返工点 身份证 这次实测 先问供应商 ① 同一个代码两个品种 品种 000001 不带类型,返回歧义错误和两个候选 代码冲突怎么处理? ② 成交量单位 算法 寒武纪按手、腾讯按股,差100倍 各市场数量单位是什么? ③ 两个时段 时段 苹果报价是周五收盘,盘口是今天夜盘 各接口对应哪个时段? ④ 涨跌窗口 算法 BTC 的前收一天里变了,A股不变 基准价和窗口是什么? ⑤ 0和没有 状态 指数买卖价返回0 不适用字段返回什么? ⑥ K线时间戳 时间 同一段5分钟,寒武纪标14:05,腾讯标14:00 时间戳是开始还是结束? ⑦ 盘口档位 状态 5档、10档、1档、1,000档;不支持的有的返回空、有的报错 各市场几档?不支持返回什么? 读法:最后一列就是可以直接发给供应商的7个问题。(实测均为2026年10月12日北京时间。) 第三部分|怎么办:自建还是外采,按这7点算账 1. 规则还在变:自建的成本在维护,不在接通 接通一个行情接口,确实只要几行代码。上面7个点没有一个是写代码的难题,难的是每一点都要有人知道规则,而且规则一直在变。只看今年下半年: 7月2日:港交所每手股数新框架第一阶段生效。 7月6日:A股盘后固定价格交易扩展到全部A股和ETF,每天15:05到15:30按收盘价成交。 11月1日:美国结束夏令时,美股各时段对应的北京时间整体后移1小时。 11月16日:港股无纸化市场上线,每手股数统一进入第二阶段。 四个日期里,两个改的是“单位”,两个改的是“时段”和“时间”,正好落在返工点②和③上。 数据层如果是自己接的,每一次都得有人跟:谁去看港交所公告,谁确认A股盘后成交算不算当天成交量,谁在夏令时切换那天检查一遍时间显示。 这不是写一次就完的代码。规则每变一次,5格身份证就要有人重核一次。 2. 一张算账表:自建要维护什么,外采要验收什么 返工点 自建要一直维护的 外采要验收的 谁拍板 ①② 品种和单位 品种目录、上市退市、代码变更、各市场单位表 目录能不能拿全;单位有没有写进文档 产品 ③ 时段 交易时段、交易日历、A股盘后、美股夏令时和夜盘 每个接口返回哪个时段,怎么标 产品、量化 ④⑤ 窗口和缺失 每类资产的涨跌窗口,每个字段适不适用 窗口和“不适用”有没有写清 产品、风控 ⑥ 时间 K线时间约定、最后一根怎么处理、时区 时间戳是开始还是结束、最后一根何时结束 量化、研发 ⑦ 能力 各市场档位、各套餐权限、错误分类 档位、权限、错误码有没有写清 商务、研发 读法:自建,就是把中间两列都变成自己的活;外采,是把维护交出去,把“问清楚”留给自己。 外采不是把这7个问题外包出去。供应商答不清的每一项,最后都会变回你自己的维护项。 行情数据本身是一门很大的生意:据 Burton-Taylor 的研究,2025年全球金融市场数据与分析支出增长6.5%,达到492亿美元。这也说明,“接一个免费接口”和“买一份能答清这5格的数据”,是两种不同的成本,不是同一个东西的免费版和付费版。 落到人身上,各签一行: 老板:“再加一个市场”不是半天的活,排期里要留出核对单位、时段、窗口和档位的时间;规则变了,谁来跟。 产品经理:每个数字旁边,标不标窗口、单位、时间?没标的那一个,就是你下一个要回答客户的问题。 商务和采购:拿下面7个问题去问供应商。不要求每项都答“支持”,但要求每项都答得清楚;答不清的,不进生产环境。 3. 上线前发给供应商的7个问题 可以直接复制: 代码冲突时,你们是报错、默认选一个,还是静默返回其中一个? 每个市场的成交量、盘口数量、逐笔数量,单位分别是什么? 快照、盘口、成交分别对应哪个时段?A股15:05以后的盘后成交,算不算进当天成交量? 每类资产的涨跌幅,基准价和窗口是什么?休市时前收怎么变? 不适用的字段(比如指数的买卖价、成交量),返回空、不返回,还是返回0? K线时间戳是开始还是结束?各市场一样吗?最后一根什么时候算结束? 每个市场返回几档盘口?不支持的市场返回什么? 4. 两段代码:给每个数字补上身份证 以下内容建议转给技术同事。 TickDB 为开发者和 AI 应用提供统一的全球行情数据接口,让团队通过一套接入获取多市场实时与历史数据,更快构建行情、分析和监控产品。 前面这些检查,我用 TickDB 的行情快照接口跑了一遍。下面两段代码是那块面板自选列表的取数核心:按资产类型分批请求,检查返回码,再给每个数字补上窗口、单位和时间。 代码1:按资产类型分批取快照,并给每个数字补上“身份证” import os import requests API_KEY = os.environ["TICKDB_API_KEY"] # 只放在服务端,不写进前端代码 BASE = "https://api.tickdb.ai/v1/market/ticker" # 身份证信息逐项配置,不从代码后缀推断 WATCHLIST = { "stock": {"688256.SH": {"unit": "手", "window": "当日"}, "700.HK": {"unit": "股", "window": "当日"}, "AAPL.US": {"unit": "股", "window": "常规盘"}}, "forex": {"EURUSD": {"unit": None, "window": "当日"}, "XAUUSD": {"unit": None, "window": "当日"}}, "indices": {"SPX": {"unit": None, "window": None}}, # 指数不读买卖价和成交量 "crypto": {"BTCUSDT": {"unit": "BTC", "window": "滚动24小时"}}, } def fetch(type_, symbols): resp = requests.get(BASE, params={"symbols": ",".join(symbols), "type": type_}, headers={"X-API-Key": API_KEY}, timeout=10) # 单次最多50个 body = resp.json() if resp.status_code != 200 or body.get("code") != 0: # 例如不带 type 查 "000001",会返回歧义错误和候选列表 raise RuntimeError(f"{type_}: {resp.status_code} {body.get('code')} {body.get('message')}") return body["data"] rows = [] for type_, items in WATCHLIST.items(): for q in fetch(type_, list(items)): meta = items[q["symbol"]] rows.append({ "symbol": q["symbol"], "type": type_, "price": q.get("last_price"), # 保留字符串,显示时再格式化 "time_ms": q.get("timestamp"), # 每个数字带自己的时间 "change_pct": q.get("price_change_percent_24h") if meta["window"] else None, "window": meta["window"], "volume": q.get("volume_24h") if meta["unit"] else None, "turnover": q.get("quote_volume_24h"), "unit": meta["unit"], "overnight": q.get("overnight_quote"), # 美股夜盘单独存,不覆盖主快照 }) 代码2:用“成交额 ÷ 成交量 ÷ 价格”自检成交量单位 from decimal import Decimal, InvalidOperation def unit_ratio(row): """返回 成交额/成交量/价格:约等于1是按股计,约等于100是按手计;缺任何一项返回 None。""" try: price, vol, turnover = (Decimal(str(row[k])) for k in ("price", "volume", "turnover")) except (InvalidOperation, TypeError, KeyError): return None if price <= 0 or vol <= 0: return None return round(turnover / vol / price, 1) for r in rows: if r["unit"] in ("手", "股"): ratio = unit_ratio(r) expected = 100 if r["unit"] == "手" else 1 flag = "OK" if ratio is not None and abs(ratio - expected) / expected < 0.05 else "CHECK" print(r["symbol"], r["unit"], ratio, flag) 用10月12日的实测数算一遍:寒武纪约100,腾讯约1,苹果约0.99。哪天比值突然跳到别处,就该去查单位是不是变了。 能做到的 / 边界 怎么验证 一个快照接口覆盖股票、外汇、贵金属、指数、加密资产,按类型分批请求 本文自选列表的7个品种 代码有歧义时返回错误并列出候选,不替你猜 不带类型查“000001” 美股盘前、盘后、夜盘分开存放,各带时间;美股成交记录标明属于哪个时段 查苹果的快照和最近成交 边界:各市场的数量单位、K线时间戳含义,本文由返回结果推断 接入前对照文档确认 边界:外汇、贵金属、指数不提供盘口和逐笔;交易时段接口没有列出A股收盘集合竞价和盘后交易时段 见返工点③⑦ 读法:前三行是这次实测能证明的,后两行是边界。以上只说明这次调用的情况,不代表全市场、全时段。(2026年10月12日实测。) 做和不做的差别:不做,成交额差100倍进了报表,客服天天解释“哪个价是真的”,回测因为时间戳错位虚高;做了,代码2自动判单位,每个数字带着窗口和时间,7个问题让每家供应商按同一套标准回答。 一个场景:一位做港股看板的产品经理,要加A股之前先跑了一遍代码2,看到寒武纪比值约100、腾讯约1,于是在A股成交量旁标上“手”,并把“单笔≥50万元”的大单阈值按手换算,免得上线后漏单。(场景按10月12日的实测数推演。) 以上代码只检查接入层行为,结果只说明本次调用的情况;比值在开盘初期、集合竞价前后可能小幅偏离,阈值按自己的品种调。 常见问题 1. A股和港股的成交量单位一样吗? 不一样。本文实测的接口里,A股按手(100股),港股按股。用“成交额÷成交量÷价格”可以自己核:寒武纪约100,腾讯约1。接入前以供应商文档为准。 2. A股现在几点收盘?15:05以后还有成交吗? 连续竞价到14:57,14:57到15:00是收盘集合竞价。2026年7月6日起,全部A股和ETF在15:05到15:30还有一段盘后固定价格交易,按当天收盘价成交。 3. K线的时间戳代表开始还是结束? 不同市场、不同数据商可能不一样。本文实测,同一段14:00到14:05的5分钟K线,寒武纪标14:05,腾讯标14:00。接入前要向供应商确认,并按“开始—结束”区间对齐。 4. 不同资产的涨跌幅能放在一起排行吗? 不建议。股票按当日算,加密资产按滚动24小时算,窗口不同,比大小没有意义。真要统一,就用K线按同一个窗口自己重算。 最后一个问题 你们面板上最显眼的那个数字,能说出它的5格身份证吗? 今天就能做的一件事:给自己的看板截一张图,在每个数字旁边写上它的单位、窗口和时间。写不出来的那一个,就是你的第一个返工点。 参考资料 访问日期均为2026年10月12日。 上海证券交易所,《上海证券交易所交易规则》(2026年修订,7月6日施行);光明网2026年7月6日相关报道 证券导报,2026年7月7日关于盘后固定价格交易首日的报道 港交所,每手股数框架咨询文件(2025年12月)及推进公告(2026年6月30日);SCMP 2026年3月9日相关报道 港交所,《Trading Mechanism of CAS in the Securities Market》(2026年4月10日版) 澎湃新闻,2023年8月11日关于科创板申报规则的报道 pandas 官方文档,resample 的 label 与 closed 参数 QuantConnect 文档,数据交付时间与 bar 的 Time / EndTime Concretum Group,《Can You Trust Your Intraday Database?》及配套文章 币安官方API文档,24小时行情接口定义 Burton-Taylor International Consulting 研究(FOW 2026年4月8日报道) TickDB,行情接口文档及作者实测记录 系列上一篇:《拆解美股夜盘数据5个口径》 做国内量化或者行情工具的开发者,A股数据肯定是绕不开的。但接A股数据的时候有个问题:A股的交易规则跟美股、港股都不一样——涨跌停、T+1、集合竞价、午休,这些规则在API数据里是怎么体现的? 这篇从A股交易规则出发,讲一下怎么用Python接A股实时行情,以及这些特殊规则在返回数据里怎么对应。如果你在找一个稳定的股票数据接口或者实时行情API,这篇应该能帮你省掉不少踩坑的时间。 为什么需要专业的A股数据接口 做量化策略或者行情面板的时候,数据是最基础的。一开始我试过爬财经网站的页面,但稳定性太差了——页面结构一改就挂,而且延迟很高,做实时监控根本没法用。后来才转用专业的金融数据API,至少数据格式稳定、接口响应快,不用每天盯着爬虫脚本挂没挂。 选接口的时候主要看几点:一是数据覆盖全不全,沪深两市的股票能不能都拿到;二是实时性够不够,做日内策略延迟太高就没意义了;三是历史K线数据够不够全,回测需要长时间的历史数据。最后找了一圈试了几个接口,留下来一直在用的是itick,主要是接口设计比较干净,文档也写得清楚。 A股交易规则与数据字段的对应 先把A股的交易规则理清楚,这样看返回数据的时候才知道每个字段是什么意思。 交易时间:上午9:30-11:30,下午13:00-15:00。中午有1.5小时休市。 涨跌停:主板股票±10%,创业板/科创板±20%,ST股票±5%。涨停的时候买盘挂单很多,卖盘很少;跌停反过来。 T+1:当天买的股票第二天才能卖,但API返回的成交量和成交额是实时的。 集合竞价:开盘前9:15-9:25是集合竞价时间,这时候也有成交数据。 这些规则在API返回数据里怎么体现呢?看几个关键字段: ts:交易状态,0=正常交易,1=停牌,2=退市,3=熔断。停牌的时候没有成交。 ld:最新价。涨停的时候这个价就是涨停价。 chp:涨跌幅百分比。±10%就是涨停/跌停了。 v:当日累计成交量。 tu:当日累计成交额。 REST拉取A股报价 先从REST开始,确认数据格式。做行情面板或者批量拉快照的时候,REST接口最方便。 import requests API_BASE = "https://api.itick.org" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} # 拉A股实时报价 def get_a_share_quote(code): resp = requests.get( f"{API_BASE}/stock/quote", headers=headers, params={ "region": "CN", "code": code } ) return resp.json()["data"] # 拉几只A股大盘股 stocks = ["600519", "000001", "300750"] for code in stocks: q = get_a_share_quote(code) sign = "+" if q["chp"] >= 0 else "" print(f"{code}: {q['ld']} ({sign}{q['chp']}%)") 返回字段跟其他市场基本一致:ld最新价、chp涨跌幅、o/h/l开高低、v成交量。做技术分析或者行情看板这些字段够用了。 注意:A股代码是6位数字,传参数的时候要传字符串形式("600519"),不要传数字。一开始我传了数字类型,结果接口返回参数错误,折腾了半天才反应过来。 WebSocket订阅A股 做实时监控或者盘中告警的时候,轮询REST接口效率太低,这时候就得用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 # A股订阅格式:代码$市场 ws.send(json.dumps({ "ac": "subscribe", "params": "600519$CN,000001$CN", "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']}%)") A股订阅是两个参数(600519$CN),跟美股一样,不是印度那种三个参数。做实时行情推送的时候,WebSocket比轮询REST效率高很多——不需要每秒发一次请求,服务端有数据就主动推过来。 K线数据获取 做技术分析或者策略回测的时候,需要历史K线数据。K线接口跟其他市场一样,只是region传 CN。 def get_a_share_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": "CN", "code": code, "kType": k_type, "limit": limit } ) return resp.json()["data"] # 拉贵州茅台近100根日K daily = get_a_share_kline("600519", k_type=8, limit=100) closes = [bar["c"] for bar in daily] # 算20日均线 ma20 = sum(closes[-20:]) / 20 print(f"600519最新收盘: {closes[-1]}, 20日均线: {ma20:.2f}") K线返回标准OHLCV:t时间戳、o/h/l/c开高低收、v成交量。做技术分析直接用这些字段就行,不用自己再清洗数据。 A股特有的注意事项 交易时间有午休。 A股中午休市1.5小时(11:30-13:00),这个时间段没有成交数据。做实时监控的时候要注意,别把午休时间当成流动性枯竭——我一开始做告警的时候,午休期间一直没数据还以为接口挂了,后来才反应过来是休市了。 涨跌停判断。 主板股票涨跌幅超过±10%就是涨停/跌停,创业板/科创板是±20%。做策略的时候要判断当前是否涨停,涨停的时候买不进去。可以通过chp字段判断,如果涨跌幅接近10%或者20%就要小心了。 代码是6位数字。 A股代码是6位数字(600519、000001),跟港股的5位数字(00700)、日本的4位数字(7203)都不一样。一开始我传了"700",结果返回空数据——那是港股腾讯的代码,A股没有700这个代码。 region是CN。 A股市场region传 CN,不是 SH 或 SZ。 集合竞价时间。 开盘前9:15-9:25是集合竞价,这时候也有成交数据,但价格波动很大。做策略的时候要注意区分集合竞价和连续竞价,别把集合竞价的成交量当成正常交易的量。 完整脚本:A股行情监控 把前面几块拼起来,最终的完整脚本: 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} # A股监控列表 watchlist = ["600519", "000001", "300750"] # 启动时拉快照 print("=== A股快照 ===") for code in watchlist: r = requests.get(f"{API_BASE}/stock/quote", headers=headers, params={"region": "CN", "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}$CN" 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() 这个脚本跑起来之后,开盘前先看到一组A股的快照,盘中实时更新价格和涨跌幅。做行情面板或者盘中告警的话,这个基础上再扩展就行。 小结 接A股数据的技术框架跟美股差不多——REST做快照和历史数据,WebSocket做实时推送。主要区别在交易规则(涨跌停、T+1、午休)和代码格式(6位数字)。这些细节不踩一遍坑很容易忽略。 参考文档:https://docs.itick.org/websocket/stocks GitHub:https://github.com/itick-org/ 散户交易的痛点与“大道至简”的交易哲学 许多散户在做短线交易时,往往陷入对复杂指标的盲目迷信——MACD、KDJ、RSI看了一大堆,各种交叉与背离记了满脑子,但在实际实操中却依然频繁亏损。究其原因,并非这些指标本身毫无价值,而是你看得越多,越容易在潜意识里进行“自我欺骗”。当股价跌破关键支撑位时,你总能从某个指标里找到不离场的托词,结果便是眼睁睁看着账户滑向万丈深渊。 短线交易要想真正实现盈利,靠的绝不是学遍所有指标,而是找到一套适合自己的规则并重复执行。看懂越多的指标越容易动摇心志,做短线真正需要的是极简的纪律和一套自洽的规则。用一套极简的纪律去约束情绪的波动,才是穿透牛熊周期、在残酷市场中死里逃生的关键。 “再简单的纪律也好过没有纪律。” 看清市场的资金本质,用规则取代情绪化决策,这正是散户短线交易走向成熟的第一步。 核心干货:5日均线短线交易的5大黄金法则 法则一:无放量大阳,坚决不碰(筛选标的) 短线交易的核心在于紧跟主力资金的步调。从筹码博弈的角度来看,放量大阳线是主力资金“建仓或拉升”最明确的筹码语言。如果一只股票在很长一段时间内,连一根有力度的放量大阳线都没有出现过,这表明根本没有主力资金在其中深度发力。 缺乏资金共振的标的,筹码完全处于无序的散户博弈状态,充其量只是无序的“电梯行情”,上涨空间自然被锁死。遇到这类没有主力参与的股票,无需任何留恋,直接“划走”。 法则二:放量看方向,回踩找位置(寻找买点) 主力资金在底部完成首轮启动后,出于洗盘拉升的需要,极少会直接走出单边连续暴涨,通常会借助回调洗刷浮筹。只要主力资金发力的方向明确,且股价回踩5日均线时未跌破支撑、5日均线本身保持向上拐升态势,这个回踩点就是多头筹码的动态支撑位,也是重点观察与寻机建仓的核心买点。 请牢记这条核心口诀:“放量看方向,回踩找位置”。 法则三:加速偏离先兑现,回踩不破再接回(持仓与止盈) 当股价出现加速拉升、明显偏离5日均线时,乖离率过高会导致短线获利盘涌出,此时切忌盲目幻想股价会无休止地暴涨。策略上应当果断锁定并兑现一部分计划内的利润。锁住既得利润是计划内的理性选择;相反,若执着于赚取预期外的最后一滴利润,反而极易遭受预期外的深度亏损。 兑现部分利润后,若后续股价回踩5日均线不破,甚至5日均线重新拐头向上,再将减掉的仓位接回也完全来得及。这种操作看似放弃了一小段波动,实则是“以高确定性换取账户权益曲线的平滑向上”。 法则四:收盘跌破不硬扛,控制风险永远第一(风险控制) 每日临近收盘时,必须将其设定为风控防线的检验时刻。重点观察收盘前股价能否重新站上5日均线。如果股价依然收在5日均线下方,必须果断进行减仓,绝不盲目死扛。 卖飞了,后续趋势修复时还可以寻找机会重新补仓;但死扛一旦遇到趋势破位,面临的可能就是无底深渊。想要在股市中长期生存,必须时刻将风控置于利润之前: “永远要先想着控制风险,再想着赚多少钱。” 法则五:连续三日收不回即清仓,指标失灵果断换股(止损与离场) 在跌破均线后的风险防范上,必须严格遵守“越跌越卖”原则,并分情况进行标准化处置: **●**彻底离场原则:短线强势股的5日均线是多方的生命线。若股价连续三个交易日都无法重新站回5日均线(尤其是股价处于高位时),从供需关系来看,意味着5日均线已由“动态支撑”转化为“强动态阻力”,多方动能彻底衰竭。此时无法预知下方何处才能止跌,切勿与市场较劲,必须果断清仓保留本金。离场后,必须等待“5日均线再度拐头向上,且股价也重新站上均线”这一双重确认信号同时出现时,方可考虑重新进场。 ●**应对震荡市失灵:若你的交易陷入“一追就跌,一割就涨”的怪圈,且连续失败两次**,这就明确宣告该股已进入无序的震荡趋势,5日均线已经暂时失灵。此时不要硬扛或跟股票死磕,直接换股离场,去寻找股价与5日均线均明显向上的标的,让技术指标重新为你服务。 建立属于你的交易规则 从筛选标的、寻找买点,到持仓止盈、风控离场,上述5条铁律构成了一套完整的短线交易规则闭环。 需注意的是,交易并非死板硬套。若你的操作风格偏向波段,或标的股票波动基底较大,亦可将这套规则同理套用至10日或20日均线,找到最契合你自身节奏的均线载体。 虽然这些规则看起来简单粗浅,但能否克服人性的贪婪与恐惧、彻底执行纪律,才是拉开普通投资者与资深交易员盈利差距的关键。规则即是心性修炼的具象化。 在接下来的交易中,你是准备继续在复杂的指标里自我欺骗,还是开始用一根简单的均线来约束自己的情绪? 一、先搞清楚一件事:你拿数据做什么 量化策略失效的原因里,数据源问题占了很大比例。延迟、字段对不齐、复权口径不一致,任何一个都会让回测收益在实盘里蒸发。但选数据源不是“哪个最好”的问题——日频策略和竞价策略对数据的要求完全不同,就像自行车和赛车讨论轮胎没有意义。 Fxyz的定位很明确:A股盘中策略、五档和竞价研究。它的接口设计围绕这个场景展开,不是全能选手,但在它瞄准的射程内,能力比较集中。 二、Fxyz 接口全景:三组十四接口,覆盖盘中全链路 FxyzSkill 将数据分为 Basic、Board、Market 三组,共 14 个接口。按交易研究流程重新梳理后,实际覆盖六个数据层: 数据层 代表接口 量化用途 更新节奏 基础股票池 /wolf/list 获取沪深京A股、ETF、指数列表,剔除ST/退市标的 收盘后 18:00 更新 实时行情 /wolf/time 价格、涨跌幅、量比、换手率、估值等30+字段 交易时段约每分钟更新 涨跌停监控 /wolf/zt、/wolf/dt、/wolf/zb 涨停/跌停/炸板统计,判断市场情绪和连板强度 盘中每分钟;历史收盘后 15:30 K线与历史 /wolf/time/kline 5分钟至年线,8种周期,支持复权 盘中实时;历史收盘后更新 盘口与竞价 /wolf/time/five、/wolf/time/bid 买卖五档、开盘竞价、微观结构因子 文档标注盘中毫秒级 资金流向 /wolf/money 特大单/大单/中单/小单分类统计 历史数据盘后更新 这个结构的关键设计在于:实时行情不是孤立接口。/wolf/time 返回的字段天然支持因子计算——zdf(涨跌幅)做动量、hsl(换手率)做活跃度筛选、roe 和 ttmsyl 提供基本面维度,不需要额外拼接多个数据源。涨跌停数据补情绪,五档补交易结构,资金流补验证,形成一个可闭环的盘中研究链路。 三、横向对比:Fxyz 在数据源生态中的位置 把 Fxyz 放进 2026 年个人量化开发者的常见选项里,差异点更清楚: 四、数据接口详情 1、基础数据接口 这类接口提供的是相对静态的参考数据,更新频率低但用途广泛。 股票列表 是最基础的接口,支持通过 flag 参数筛选11种股票类型(所有股票、深交所、上交所、北交所、指数、创业板、科创板、ETF、ST股票、退市股票、沪深可转债),历史数据收盘后6点更新。返回格式简洁:code(股票代码)+ name(股票名称)。 概念成分股 提供板块成分股查询,适合做板块轮动策略。 财务核心指标 提供季度更新的基本面数据,适合价值投资和因子选股策略。 2、涨停板数据接口 这是黑狼数据的差异化亮点。多数数据API只给行情数据,题材情绪数据需要额外采购。黑狼数据直接把涨停板、跌停板、炸板、强势股、次新股5个接口打包提供,对打板策略和短线量化特别友好。 这5个接口均为实时数据,盘中实时更新。炸板数据可以构建市场情绪指标,强势股接口适合龙头跟踪策略,次新股接口则覆盖了近IPO的交易标的。 3、实时行情数据接口 这是接口数量最多的类别(9个),覆盖了从日频到毫秒级的全频段数据: 秒级数据:实时行情、实时K线、竞价数据(09:15-09:25集合竞价时段) 毫秒级Tick数据:买卖五档、逐笔交易、分价数据——高频交易者的核心数据源 日频数据:日线快照(收盘后更新)、资金流向(盘后整理)、复权变更数据 五、使用场景 策略类型 推荐接口组合 理由 量化选股 股票列表 + 财务核心指标 + 概念成分股 构建股票池 + 基本面筛选 日频策略 实时行情 + 实时K线 + 日线快照 + 资金流向 日频信号 + 资金面验证 高频交易 买卖五档 + 逐笔交易 + 分价数据 毫秒级Tick数据 打板策略 涨停板 + 跌停板 + 炸板 + 强势股 + 实时行情 题材情绪 + 实时确认 竞价策略 竞价数据 + 实时行情 09:15-09:25集合竞价 综合监控 全量接口 一站式行情监控平台 GitHub开源地址: GitHub - fxyzsite/FxyzSkill: 专业的股票实时数据API服务平台,提供沪深京A股、ETF基金、指数等全面的金融行情数据。 · GitHub 编写第一个量化策略(手把手详细版教程) 对于大部分人来说,量化交易是非常陌生与神秘的。本节内容将带你开启第一个量化策略! 本节内容摘要: 1.理解量化策略的基本框架。 2.学会编写一个简单的量化交易策略。 3.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号。 1.理解量化策略的基本框架 通常情况下,完整的量化交易策略至少需要确定两件事: A.交易标的,即买什么; B.确定交易时机,即怎么买卖。 让我们来设计一个简单完整的量化交易策略: 策略交易标的:贵州茅台; 策略交易时机:5日均线与20日均线金叉时,买入;5日均线与20日均线死叉时,卖出。 2.学会编写一个简单的量化交易策略 第一步:打开SuperMind量化交易平台,先在上方导航栏点击“我的策略”—“策略编译”,再点击蓝色按钮“+新建策略”,接着点击已创建的策略进入策略编译器页面,如下: 温馨提示:“回测列表”下方三个按钮,可以设置编译器字体大小,背景颜色,编译设置,开启全屏编译,查看API文档,如下: 第二步:理解量化交易策略框架对应的代码框架。def init(context): #初始化函数:确定交易标的def handle_bar(context, bar_dict): #定时运行函数:确定交易时机 框架理解: 1.def init(context)与def handle_bar(context, bar_dict)是两个函数,函数格式固定为:def 函数名(参数),其中def后面带空格键,函数末尾必须带冒号。 2.def init(context)函数是初始化函数,只运行一次,确定初始化条件;def handle_bar(context, bar_dict)函数是定时运行函数,平台默认该函数定时运行。日级策略,每日9:30;分钟级策略,交易期间内的每分钟。 3.“#”后面为注释内容,用于注释代码,便于编写和阅读。 第三步:确定交易标的:context.security = '600519.SH'。 温馨提示: 1.context是账户对象,该对象存放所有账户相关信息,持仓、可用现金、资产盈亏。 2.context.security是在账户对象下,设置security变量,存放在账户内,这里我们需要确定交易标的,即:context.security = '600519.SH'。def init(context): context.security = '600519.SH'#已确定交易标的def handle_bar(context, bar_dict): #定时运行函数:确定交易时机 第四步:确定交易时机,即为:5日均线与20日均线金叉时,买入;5日均线与20日均线死叉时,卖出。 从交易时机出发,我们需要计算交易标的5日和20日均线,那么5、20日均线需要用历史行情数据的收盘价来计算。 整个流程即:获取历史行情20日的收盘价数据———计算5、20日均线———判断5、20日均线,进行买卖交易。 A.获取历史行情20日的收盘价数据: 1.找到函数历史数据函数:history 2.填写函数参数,获取到数据: i.交易标的,即:获取那个股票的数据。 ii.数据字段:['close']收盘价,即:获取哪个数据。 iii.输入历史长度,即:获取多长时间的数据。 iv.获取数据的时间步长,即:获取日线级步长数据。 v.填写是否跳过停牌数据,复权选项,返回数据格式。 最终结果即为:history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1) 3.将获取到的数据储存,便于计算,即:closeprice = history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1)#获取证券过去20日的收盘价数据 closeprice = history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1) B.计算5、20日均线: 1.获取数据值,即:closeprice['close'],['close']可以获取储存中的收盘价数据,格式为closeprice['close']。温馨提示:closeprice是我们刚才获取的数据,但是数据有股票、时间、数值,我们直接用['close']获取收盘价数据值用于计算即可。 2.选取数据长度,即:closeprice['close'].iloc[-5:]。iloc[]用于取值,我们之前获取20个数据,但5日均线只需要过去5日的收盘价,因此iloc[-5:]即为获取倒数第五个到最后一个数据。温馨提示: i.iloc[:]是获取所有数据。 ii.iloc[:x]是从第一个获取到第x个,不包括第x个。 iii.iloc[x:y]是从第x个到第y个,包括x,但不包括y。 iv.iloc[-x:]获取倒数第x个到最后一个数据。 3.计算均值,即closeprice['close'].iloc[-5:].mean(),赋值给MA5。同理MA20=closeprice['close'].mean(),即对所有值取平均,相当于MA20=closeprice['close'].iloc[:].mean()。#计算二十日均线价格 MA20 = closeprice['close'].mean()#计算五日均线价格 MA5 = closeprice['close'].iloc[-5:].mean() C.判断5、20日均线,进行买卖交易: 1.if判断条件,即为 if MA5 > MA20:。温馨提示if判断函数的格式为if +添加判断+:,其中if后面必须带一个空格键,其次末尾必须带冒号。 2.当MA5小于MA20时,我们再对持仓市值判断,如果有持仓,那么持仓市值必然大于0,需要进行卖出交易,我们直接通过context账户对象中portfolio资产组合内stock_account股票账户下来获取持仓市值,即为:context.portfolio.stock_account.market_value。 3.下单买入交易: i.当触发MA5大于MA20时,我们需要买入股票,这时候我们可以使用order_target_percent下单函数,该函数以目标市值占比下单。 ii.输入下单函数的参数,order_target_percent函数需要输入两个参数: 1.下单的股票,即为context.security,我们之前将交易标的传入进去,可以直接用。 2.下单的占比,即为1,取值范围[0,1],此时取1,表示全仓买入股票。 iii.触发条件后程序提醒,当代码执行完下单函数后,我们用log.info()来打印日志,这样我们也可以看到程序下单了。 温馨提示:log.info()内你可以直接输入中文,例如:log.info('条件满足!买入贵州茅台啦!')# 如果5日均线大于20日均线,则全仓买入股票if MA5 > MA20: # 按目标市值占比下单 order_target_percent(context.security, 1) # 记录这次买入 log.info("买入 %s" % (context.security)) 4.下单卖出交易: i.当触发MA5小于MA20时,我们需要卖出股票,这时候我们可以使用order_target下单函数,该函数以目标股数下单。 ii.输入下单函数的参数,order_target函数需要输入两个参数: 1.下单的股票,即为context.security,我们之前将交易标的传入进去,可以直接用。 2.下单的目标股数,即0,因为我们需要将持仓股票卖出,卖到0股为止。 iii.触发条件后程序提醒,当代码执行完下单函数后,我们同log.info()来打印日志,这样我们也可以看到程序下单了。# 如果5日均线小于20日均线,并且目前有头寸,则清仓股票elif MA20 > MA5 and context.portfolio.stock_account.market_value > 0: # 卖出所有股票,使这只股票的最终持有量为0 order_target(context.security, 0) # 记录这次卖出 log.info("卖出 %s" % (context.security))最终完整代码:def init(context): # 设置要操作的股票:贵州茅台 context.security = '600519.SH'# 设置买卖条件,每个交易频率(日/分钟/tick)调用一次def handle_bar(context, bar_dict): # 获取股票过去20天的收盘价数据 closeprice = history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1) # 计算20日均线 MA20 = closeprice['close'].mean() # 计算5日均线 MA5 = closeprice['close'].iloc[-5:].mean() # 如果5日均线大于20日均线,则全仓买入股票 if MA5 > MA20 : # 按目标市值占比下单 order_target_percent(context.security, 1) # 记录这次买入 log.info("买入 %s" % (context.security)) # 如果5日均线小于20日均线,并且目前有头寸,则清仓股票 elif MA20 > MA5 and context.portfolio.stock_account.market_value > 0: # 卖出所有股票,使这只股票的最终持有量为0 order_target(context.security, 0) # 记录这次卖出 log.info("卖出 %s" % (context.security))第五步 回测量化交易策略 通过以上4步,我们已经完成了量化交易策略编写,那么接下来我们需要进行量化交易策略回测。 A.首先,我们尝试去跑通整个历史行情,排查代码错误。 i.右上角设置回测历史长度,设置资金,设置交易频率。 ii.点击左上角“编译运行”按钮,右边出现量化交易策略在历史行情中的表现情况 B.当量化交易策略能跑通整个历史行情后,我们可以确定该代码正确无误,随后点击右上角蓝色按钮“进行回测”。页面跳转至回测页面,在回测详情界面,您可以查看策略收益曲线,风险指标,每日持仓,交易明细,输出日志等信息,如下: C.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号 1.在回测显示结果页面,右上角点击蓝色按钮开启模拟交易,可以自行选择:从当前日开始模拟,在已有的回测基础上继续模拟.如下图: 2.至此,我们成功开启了模拟交易,可以查看您的模拟交易账户详细情况:交易明细、持仓、盈亏情况、账户风险指标等等。如下图: 3.您可以为您模拟交易账户新建模拟交易、暂停策略运行、发布策略至社区、重启策略、查看策略运行日志、查看策略代码。注意:重启按钮只会在策略运行错误后显示,如果策略运行正常,显示暂停按钮。新建模拟交易如下图: 
亲测最好用的AI编写量化策略工具,可以让 AI 直接生成同花顺Supermind上可运行的策略代码,代码质量远高于直接使用 DeepSeek、GPT等平台。 😃Supermind AI工具入口:https://easyquant.ai/ 大家可以直接向AI描述策略,然后一键生成可运行的完整策略代码,也可以把它当做一个API 查询工具。 最近做亚洲市场量化的朋友越来越多,日本股市是绕不开的一个——东证一部(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 的选择,还是对高低位量价结构与趋势通道的研判,本质上都是为了帮助投资者建立客观的盘面参照系。 然而,在投资咨询的实践中,我发现大多数投资者并非“不懂”这些道理,而是“做不到”。股市交易真正的难点,从来不在于口诀本身多么深奥,而在于执行时能否克服人性深处的贪婪与恐惧。 当盘面剧烈波动、市场情绪极度亢奋或恐慌时,你是否能摒弃主观偏见,严格执行止损止盈纪律?在未来的交易中,面对诱人的涨幅与刺眼的亏损,你是否能真正做到知行合一?