全部
文章&策略
学习干货
问答
官方
用户头像me_361829775857
2026-08-20 发布
一个能拉股票Level2逐笔、十档Tick、分钟线、日线数据的地方 这几天翻了不少数据源,发现不少网站只给五档行情,要么就是日线数据收费贼高,真到做实盘回测的时候就卡住了。后来顺着一个老哥的笔记摸到了CMES数据下载页面,发现它家把几类我一直在找的数据都放出来了,而且下载方式比较规矩,没那么多弯弯绕绕。 先说一下这个页面里到底能拿到什么,免得大家点进去还要慢慢翻。 数据种类一览 数据类型 行情深度 时间粒度 典型作用 股票Level2逐笔Tick 逐笔成交+逐笔委托 单笔成交/委托 还原盘口博弈、做高频因子、大单拆分分析 股票Level2十档Tick 买一到买十、卖一到卖十,含挂单量 快照,通常3秒一次 看更深层的挂单堆积,找支撑压力位 股票Level2五档Tick 买一到买五、卖一到卖五 快照,3秒 普通追单、盘口失衡策略 分钟线行情 1分钟/5分钟/15分钟/30分钟/60分钟 分钟K线 中高频策略回测、盘中择时 日线行情 开高低收、成交量、成交额 日频 选股、趋势跟踪、因子计算 这里有个细节:逐笔数据里包含“逐笔成交”和“逐笔委托”两张表。成交表记录了每一笔成交的价格、数量、买卖方向(用BS标记),委托表是交易所发布的逐笔挂单流水,能看到撤单、新增委托这些动作。做高频策略的人对这两张表会比较敏感,因为能还原盘口限价单队列的变化。 十档Tick和五档Tick就是常规的快照行情,每条记录包含时间戳、最新价、累计成交量、累计成交额,以及十个或五个档位的价格和挂单量。字段名一般是这样: trade_date time 时间戳 last_price 最新价 volume 累计成交量 amount 累计成交额 bid_price1 ~ bid_price10,bid_volume1 ~ bid_volume10 ask_price1 ~ ask_price10,ask_volume1 ~ ask_volume10 我下载了一份某天的十档Tick,发现有些股票在买五到买十突然堆了很大挂单,但买一到买三却很薄,这种盘口结构在五档里根本看不到,后面价格稍微一碰就崩了,看十档能提前感觉到那个“暗流”。 分钟线就简单了,就是常见的OHLCV,字段有 open high low close volume amount,再加上分钟标记。日线就是加了个 pre_close change pct_chg 之类。 下载方式 页面直接提供按日期和代码的下载链接,不需要点来点去填一堆表。也支持批量下载,对于想建本地数据仓库的人来说省事不少。另外它家还有个python接口,可以程序化拉取,避免手动下几百个文件到手抽筋。当时顺手测试了一下,接口文档在 https://cmes-data.com/download.html?type=vip 里有,简单写了个demo: # CMES金融数据库的行情接口,注意入参正确,调用频率正常 import requests # 示例:获取某只股票某天的逐笔成交数据 url = "https://api.cmes-data.com/v1/stock/transaction" params = { "code": "000001.SZ", "date": "2025-01-15", "token": "your_token_here" } resp = requests.get(url, params=params) data = resp.json() # 返回的data里包含逐笔成交记录,字段说明见文档 print(len(data['data'])) 请求频率不能太高,官方文档写着一秒不超过5次,正常拉数据完全够用,别搞成死循环就行。 实际用起来要留意的点 逐笔数据量非常大,一天一个活跃票可能有几十万条,直接存csv会炸,建议边拉边存parquet或者进数据库。 十档Tick的3秒快照不是均匀的,有时会差几秒,做时间序列对齐要自己处理一下。 日线数据里没有复权因子,如果需要后复权得自己算,或者去其他数据源补。 代码里602、688开头的票也在覆盖范围内,不过有些新上市不久的票历史月数据可能不全。 踩过的坑 有一次手贱没看日期,直接循环拉了一批数据,结果把半小时的额度用完了,提示 “请求过于频繁,请稍后再试”。后来老实加了 time.sleep(1),就再没出问题。另外token记得定期更新,我一开始用的测试token过期了,还以为接口挂了,找了半天原因。 总之这个页面看着不花哨,但东西挺实在,尤其对我这种不想花大价钱买数据,又需要高频颗粒度的人,能省下一大笔预算。至于数据质量,我回测对比过几天的逐笔成交和通达信,笔数误差在万分之几,基本可以接受。 最后提醒一句,如果要在小红书或者公众号发相关的数据教程,尽量别用“稳赚”“必涨”这些词,平台会判定违规,直接说“数据字段”“盘口分析”就没事。文章里表格也别加背景色,纯文本形式最安全,否则容易被系统误判成营销内容。
浏览59
评论0
收藏0
用户头像sh_****447dvu
2026-08-20 发布
在量化策略研究过程中,研究者往往将主要精力投入策略模型构建、指标调参、回测框架迭代,而行情数据源的预处理环节容易被忽视。回测结果的可信度,高度依赖底层行情数据的质量,数据层面的微小异常,会直接传导至模型输出,造成结论偏差。 本人在开展贵金属 Tick 级别策略回测工作时,遇到一类典型的数据问题:贵金属实时 API 会偶发推送重复的 Tick 行情记录。使用小规模样本集进行验证时,重复样本占比低,回测报告不会呈现明显异常。当扩大回测时间跨度、使用全量 Tick 历史数据运算后,问题逐步暴露:策略统计成交次数虚高、技术指标计算偏离真实市场状态,回测输出结果失去参考价值。 经过链路排查确认,该问题并非策略模型本身存在逻辑缺陷。根源在于行情接收链路:同一条 Tick 数据被多次接收并写入数据集,回测引擎会将重复记录识别为真实市场撮合成交。对于秒级、分钟级的中高频贵金属策略,该类数据污染带来的误差会持续放大,严重干扰策略有效性评估。 贵金属实时 API 产生重复 Tick 的主要成因 贵金属实时 Tick 行情以流式网络接口对外输出,完整链路包含服务端消息下发、网络传输转发、客户端接收解析等环节。链路任意节点出现扰动,就可能发生已接收数据被再次推送的现象,主要诱因分为三类: 网络短时抖动,服务端触发消息重传机制; WebSocket 连接断开后自动重连,服务端补发缓存中留存的历史 Tick 数据; 接口内置消息确认应答逻辑,造成单条行情多次抵达客户端。 贵金属品种 Tick 更新密度大,接口偶发输出重复记录属于工程层面的常见现象。若缺少前置的数据清洗流程,后续 K 线合成、策略回测推演都会引入系统性误差。 Tick 去重方案选型:兼顾数据准确性与完整性 不存在普适的去重方案,不同处理逻辑各有适用边界,研究过程中需要同时保障数据准确性和原始行情完整性,不能为消除重复样本,误过滤真实有效的成交 Tick。 处理方案 适用研究场景 交易唯一编号校验 高精度历史回测研究 时间滑动窗口校验 实时 Tick 流接收处理 多字段组合指纹校验 常规行情统计与回测分析 研究注意点:不建议直接采用全字段完全匹配做去重。真实市场环境下,存在两笔独立撮合成交,价格、成交量恰好完全一致的情况。过滤条件设置过于严苛,会丢失合法 Tick 样本,破坏原始数据集。 工程实现:落盘前构建指纹过滤层 较为稳妥的实现思路,是在 Tick 数据持久化存储之前增设过滤模块。为每一条流入的 Tick 生成唯一指纹标识,以此判断该条记录是否已经完成处理。 如果 API 接口提供交易编号,优先使用交易编号校验,识别精度最高;接口无该字段时,则组合品种代码、时间戳、成交价格、成交量生成组合 key 完成校验。 cache = set() def check_tick(data): key = ( data["symbol"], data["timestamp"], data["price"], data["volume"] ) if key in cache: return False cache.add(key) return True 该逻辑可以过滤绝大多数完全重复的 Tick 记录,同时不会干扰正常行情数据流,适合回测前置预处理环节使用。 WebSocket 行情接收完整示例与工程细节 对接 WebSocket 实时行情时,建议对行情接收、重复校验、数据持久化三个环节做解耦设计。先获取原始消息报文,执行指纹去重校验,再开展后续回测相关业务处理。 import websocket import json cache = set() def on_message(ws, message): data = json.loads(message) key = ( data.get("symbol"), data.get("timestamp"), data.get("price") ) if key in cache: return cache.add(key) print("new tick:", data) ws = websocket.WebSocketApp( "wss://api.alltick.co/ws", on_message=on_message ) ws.run_forever() 在策略研究与回测实践中,有几项细节需要重点关注: 统一时间戳标准:不同数据源的时间单位存在差异,时间格式不统一,会直接造成指纹校验误判; 留存原始行情数据:不要修改原始报文,使用清洗之后的副本数据集执行回测,便于后续异常溯源与问题复盘; 缓存生命周期管理:内存缓存需要配置过期策略,避免长时间运行造成内存持续占用;面对超大规模 Tick 数据集,可以替换为高性能缓存组件维护去重状态。 研究小结 在量化研究工作中,大家更多聚焦策略模型迭代、参数优化、框架性能优化,数据源预处理容易被忽视。 Tick 重复推送属于隐蔽的数据层问题,单条重复记录影响有限,但在短周期策略回测当中,数据缺陷会不断累积放大。不少回测与预期不符的现象,并非策略模型逻辑失效,而是底层行情数据存在异常。 做好 Tick 去重清洗、时间标准化、分层存储等基础工作,能够减少大量难以定位的回测异常,提升策略研究的可靠性。在本人的原型研究中,会借助 Alltick API 获取贵金属 Tick 原始行情,叠加上述预处理流程,降低数据源异常带来的回测干扰。
浏览60
评论0
收藏0
用户头像sh_***174w0d
2026-08-20 发布
涨停板后的“心跳时刻” 很多股民朋友都有过这种体验:头天股票刚强势涨停,本该全家加餐,可第二天一睁眼就开始犯愁。盯着集合竞价跳动的数字,心里跟打翻了五味瓶似的:是该落袋为安,还是搏个连板? 看着盘面红红绿绿,不少人习惯去翻那些MACD、KDJ,或者到处打听有没有利好消息。我自己倒是习惯先在 9db交割单 平台上把竞价盘口过一遍,省得临场手忙脚乱。老实说,真正的操盘高手在9点25分“集合竞价”定格的那一刻,心里就有数了。高手不看乱七八糟的指标,他们只看一个信号,花30秒算清楚一个“救命数字”,是走是留,当下立断。 这个核心数字到底是什么? 这个定生死、分强弱的数字,就是“开盘溢价率”。 别被这个名词唬住了,这纯粹就是一道小学数学题,但它却是洞察主力资金意图的“显微镜”。在9点25分集合竞价结束时,直接把开盘价带入公式,主力的真实底牌就亮出来了。 计算公式: 开盘溢价率 = (当天开盘价 - 昨天收盘价) / 昨天收盘价 * 100 咱们拿实战数据说话:比如某支股票,昨天涨停收盘价是 39.25 元,今天早晨9点25分出来的开盘价是 38.98 元。咱们算一下:(38.98 - 39.25) / 39.25 * 100 = -0.7。这个“-0.7”就是它的开盘溢价率。算清这个数,只需30秒,却能救你的命。 取舍准则一:溢价率为负,主力在“撤退” 如果算出来的结果小于0(低开),这就是极度危险的信号。 涨停代表的是绝对强势,按常理第二天必须高开。如果不仅没高开,反而低开了,说明主力的接力意愿极差,甚至出现了“接力断层”,主力已经在借机抹油开溜。 操作建议: 集合竞价定生死。只要是负值,开盘即离场,果断“断舍离”,千万不要抱有主力会“反包”的幻想,再不走大概率就要面临被套。 取舍准则二:1%~3%的尴尬区,关注量能 溢价率在1%到3%之间,属于典型的弱势信号。这说明主力态度暧昧,向上攻击的决心并不坚定,处于一个多空博弈的尴尬区间。 “如果开盘半小时内不能放量上攻,直接走人,别抱幻想。” 操作建议: 盯住开盘前半小时(9:30-10:00)。如果这30分钟内股价没有伴随成交量的急剧放大而上冲,说明主力诱多失败,应果断撤退。 取舍准则三:3%~5%的健康走势,学会落袋为安 溢价率在3%到5%之间,说明市场情绪比较积极,主力仍在场内博弈,这属于一个比较健康的溢价水平。 但这并不意味着可以高枕无忧。你要时刻警惕主力拉高出货导致股价冲高回落。 操作建议: 观察盘中走势,如果股价进一步冲高,涨幅触及**6%**以上,不要贪心,建议先减掉一半仓位。先把利润装进兜里,后面怎么走你都能心态平和地应对。 取舍准则四:大于5%的抢筹意愿,博取连板机会 如果开盘溢价率直接冲破5%,这代表主力抢筹意愿极强,资金产生了强烈的共鸣。这通常是“大肉”的信号,说明市场热度爆棚,极具连板潜力。 操作建议: 设定你的持股底线。只要开盘后股价不快速跌破3%这个“安全垫”位置,大概率还会继续冲高甚至封死连板。只要防守位不破,就大胆持股观望,博取更大的收益。 结语:股市翻身,靠的是纪律而非直觉 在股市里博弈,想要真正翻身,靠的不是拍脑门的灵感,而是铁一般的纪律。 这套计算公式和取舍准则,本质上是你给自己立下的一份“军令状”。在真金白银的诱惑面前,人性往往是贪婪且迟疑的。当你写下并执行这套逻辑时,你就克制了冲动。符合条件就守,不符合条件就撤,当你能像数学公式一样冷静执行计划时,财富自然会向你靠拢。
浏览88
评论0
收藏0
用户头像Jacktick
2026-08-20 发布
免费 A 股数据接口能不能用?能。 但原型跑起来以后,麻烦往往才刚开始:数据要每天更新、代码要交给同事、接口突然报错,或者想接进自己的工具。这时只看“免费”就不够了。 先给答案 只是拉历史数据、学 Python:先用开源或免费路径,别急着把一堆接口都接上。 想把任务固定每天跑:先拿一个标的、一个周期跑通,再看权限、字段和报错怎么处理。 要接进团队工具或 AI 工作流:早点想清楚谁维护、出错后怎么查、以后换源麻不麻烦。 我这次把几个常见路径放在一起看,最后发现选数据源没什么标准答案。先把自己的任务讲清楚,选择会容易很多。 先看你属于哪一类 现在要做的事 先关注什么 拉一段历史行情,验证指标 数据能不能拿到、上游来自哪里 做个人研究或回测 复权、日期、字段和复现方式 每天跑监控或看板 权限、更新和报错后的处理 交给团队或产品 接入方式、维护成本和换源难度 很多人一开始只想“先跑起来”。这没问题。等任务变成每天跑、多人用,再回头补数据源这件事,通常会更费劲。 四条常见路径,TickDB放在第二个 下面的顺序不是排名,只是按我自己看资料和上手验证时更顺手的顺序排。价格、免费额度和权限会变,真要用之前还是要自己打开官网确认一下。 路径 适合谁 上手前看一眼 Tushare 要查A股日线、按接口权限取数的人 daily 接口、Token、积分和独立权限 TickDB 想先跑一条请求,再按脚本、对话或推送方式继续接的人 REST、MCP、CLI、WebSocket 是不同入口;我这次实际跑了 REST 和 MCP AKShare 做本地研究原型,愿意自己处理公开上游变化的人 不同接口的来源、频率和复现方式 BaoStock 想先找免费数据路径的人 先看当前文档和条款;我这次没拿到可用的官方Python API页面 如果只是做本地练习,开源库很省心。任务要长期跑,先做一条真实请求更实在。能拿到数据只是第一步,后面还要看它能不能接进你的工作。 TickDB 是什么,适合用在什么地方 TickDB 是一套给开发者、量化研究和 AI 应用用的统一行情数据接口。你可以先用它查 A 股的历史K线,后面如果任务变成实时看板、跨市场研究,或者想让 AI 工具直接查行情,也不用重新换一套接入方式。 它的基础能力可以简单理解成两层:数据层有实时行情和历史数据;接入层有 REST、WebSocket、Skill、MCP、CLI。刚开始不需要全用上。写脚本时先用 REST,做实时推送再看 WebSocket,想把行情接进 AI 工具时再试 MCP、Skill 或 CLI。 这也是我觉得它适合持续任务的地方:先把 A 股这一条跑通,后面任务变了,接法还能往下延伸。 我是怎么验证 TickDB 的 我先用 REST 拉了 600519.SH 的 5 条日 K,返回 HTTP 200、API code 0。然后又用 MCP 把日K、交易日和交易时段放在一起看了一遍。这样做的好处很简单:先确认数据、日期和交易时段有没有对上,再往后接自己的任务。 如果你也想用自己的标的试一遍,可以直接去 TickDB 官网注册。官网当前提供免费体验,注册后生成一个 API Key,就能先把下面的脚本跑起来。别急着研究所有功能,先把你最关心的那只股票、那个周期跑通,心里就有数了。 下面是这次用的完整检查脚本: python -m pip install certifi export TICKDB_API_KEY="你的API Key" python tickdb_a_share_rest_check.py #!/usr/bin/env python3 import json import os import ssl import sys import time import urllib.error import urllib.parse import urllib.request from datetime import datetime, timezone import certifi API_KEY = os.environ.get("TICKDB_API_KEY", "").strip() API_BASE = "https://api.tickdb.ai" PARAMS = {"symbol": "600519.SH", "interval": "1d", "limit": 5, "type": "stock"} if not API_KEY: raise SystemExit("ERROR: set TICKDB_API_KEY before running") url = f"{API_BASE}/v1/market/kline?{urllib.parse.urlencode(PARAMS)}" request = urllib.request.Request( url, headers={"X-API-Key": API_KEY, "Accept": "application/json", "User-Agent": "A-share-api-check/1.0"}, method="GET", ) started = time.monotonic() http_status, body, error = None, "", None try: with urllib.request.urlopen( request, timeout=20, context=ssl.create_default_context(cafile=certifi.where()) ) as response: http_status = response.status body = response.read().decode("utf-8", errors="replace") except urllib.error.HTTPError as exc: http_status = exc.code body = exc.read().decode("utf-8", errors="replace") error = f"HTTPError: {exc.code}" except Exception as exc: error = f"{type(exc).__name__}: {exc}" try: payload = json.loads(body) if body else None except json.JSONDecodeError: payload = {"non_json_body": body[:1000]} api_code = payload.get("code") if isinstance(payload, dict) else None data = payload.get("data", {}) if isinstance(payload, dict) else {} klines = data.get("klines", []) if isinstance(data, dict) else [] success = http_status == 200 and api_code == 0 and bool(klines) print(json.dumps({ "retrieved_at_utc": datetime.now(timezone.utc).isoformat(), "request": {"path": "/v1/market/kline", "params": PARAMS}, "http_status": http_status, "api_code": api_code, "returned_kline_count": len(klines), "elapsed_ms": round((time.monotonic() - started) * 1000), "error": error, "status": "PASS" if success else "FAIL", }, ensure_ascii=False, indent=2)) sys.exit(0 if success else 1) 跑完以后,别只盯着 PASS。我一般会看这四件事: 标的代码对不对; 周期和条数够不够; 账号有没有这个端点的权限; 出错时能不能把请求参数和返回内容留下来。 最后这一条很容易被忽略。数据一旦有异常,能定位、补回、重跑,比“第一次调用成功”更有用。 FAQ 1. 第一次测 A 股数据 API,最少要做什么? 拿一个自己熟悉的标的,选一个日线周期,先跑通一次。然后看返回条数、日期和字段。先把这一小步跑顺,再考虑要不要接进回测、看板或定时任务。 2. 接口返回了数据,为什么回测还是不对? 先别急着改策略。先检查复权、日期、字段、交易日和时区。日K能返回,不等于这些细节都已经对上。把请求参数和响应保存下来,排查会快很多。 3. TickDB 除了 REST 还能怎么用? 如果你习惯在对话式工具里查行情,可以用 Hosted MCP 或 Skill;终端和 Agent 场景可以看 CLI;需要持续推送时再看 WebSocket。它们适合的任务不同,可以从你现在最常用的一种方式开始。 最后说一句 选数据源前,先写下自己要什么数据、多久跑一次、出错后谁来查。然后选一个路径,跑一条小请求。这个顺序比先比较一大堆产品更省时间。 示例标的只用于演示数据请求,不构成投资建议。
浏览63
评论0
收藏0
用户头像9点半量化
2026-08-20 发布
引言:打破对 MACD 的思维定式 在技术分析的江湖里,MACD 被尊为“指标之王”。然而,绝大多数投资者在使用时,往往深陷“金叉进、死叉出”的教条,结果总是:金叉买入时行情已近尾声,死叉卖出时利润早已回撤。这种显而易见的“滞后性”,是无数交易者的痛。 作为一名职业交易员,我始终主张:领先指标半步,才能胜过市场一步。 如果我们不再苦等慢吞吞的线条交叉,而是将目光锁定在红绿柱体的“能量极值”上,会发生什么?今天,我将为你拆解一套基于 MACD 柱体波峰变化的“非滞后”交易策略,助你洞察场内资金运行逻辑,精准捕捉主升浪起点。 核心发现一:不再执着于“金叉”,动能衰竭处暗藏生机 传统理论教你在绿柱缩短至零轴时买入,那本质上还是金叉逻辑。真正的职业选手会关注动能衰竭(Momentum Exhaustion)。当绿柱达到最长、向下动能释放到极致时,反转的种子已经埋下。 实战操盘步骤: **1.**寻找极值: 在行情连续下跌中,锁定 MACD 绿柱体量达到最深、最长的时刻(即数值上的最低点)。 **2.**定位 K 线: 找到该最长绿柱所对应的 K 线,这根线代表了空头最后的疯狂。 3.划定“多空分水岭”: 在这根 K 线的 最高点 画出一条水平压力线。 深度解析: 这根 K 线的高点是多头反攻的“第一阵地”。由于这是动能释放至极致的位置,一旦价格能收复此高点,说明空头已无力维持跌势,主升浪往往由此开启。 “绿柱寻低点,找到绿柱体量最低(最长)时对应的 K 线,在这根 K 线的高点画一条水平横线,后续股价向上突破这条横线就可以择机进场。很大概率会迎来一波主升浪行情。” 核心发现二:红柱极值后的冷静,情绪过热的硬指标 上涨行情中,红柱不断拉长代表多头情绪高涨。然而,当红柱达到体量最高(最长)时,往往意味着市场进入了“情绪过热”阶段,也就是所谓的极致缩量或最后的冲刺。 实战操盘步骤: 1.**寻找极值: 在行情加速上涨中,寻找 MACD 红柱体量达到最长**的时刻。 **2.**定位 K 线: 找到该最长红柱所对应的 K 线。 3.划定“保护性底线”: 在这根 K 线的 最低点 画出一条水平支撑线。 深度解析: 这根 K 线的最低点是场内主力资金的真实防守位。红柱最长意味着买盘力量达到鼎盛,随之而来的通常是动能的回落。一旦价格跌破此线,说明场内资金运行逻辑已从进攻转为撤退,清仓离场是唯一的纪律。 “找到红柱体量最高时对应的 K 线,在这根 K 线的低点画一条水平横线,后续股价向下跌破这条横线,立刻清仓离场。之后往往会开启一轮下跌行情。” 核心发现三:K 线位置才是最终的“发令枪” 指标负责预警,价格负责确认。MACD 柱体帮助我们识别“情绪极端点”,但交易的执行必须依赖价格行为(Price Action)。 专业交易执行清单: 进场准则(向上突破): 绿柱极值出现后,不盲目入场,必须等待收盘价有效站稳在对应 K 线的高点之上。这是多头夺回主控权的信号。 出场准则(向下破位): 红柱极值出现后,一旦价格收于对应 K 线低点下方,必须果断斩仓。不要幻想回踩,跌破即代表逻辑破坏。 总结口诀:一套可以循环复刻的交易系统 为了方便大家在盘中快速反应,我们将这套逻辑浓缩为以下口诀。建议将其贴在你的显示器边缘: 绿柱寻低点,突破对应 K 线高点即为抄底机会; 红柱寻高点,跌破对应 K 线低点就是逃顶信号。 这套系统的核心在于避开滞后的交叉,直接追踪资金运行的强弱痕迹。无论是在日线还是小时级别,其捕捉阶段性顶底的逻辑完全一致,具备极强的可复刻性。 结语:从盲目摸索到逻辑交易 在投资学习的道路上,最怕的是在认知的误区里反复试错。MACD 柱体交易法不是玄学,而是对市场情绪(从极致走向衰竭)的量化呈现。 想要真正掌握这套方法,仅仅读完文章是不够的。你需要通过每日复盘(Daily Market Reviewing),去观察历史走势中每一个能量峰值与 K 线高低点的博弈过程。看清了场内暗藏的风险与机会,你才不会在波动中迷失方向。
浏览73
评论0
收藏0
用户头像sh_*219t3e
2026-08-20 发布
已支持最新版Supermind,实测下来还挺方便: 👉EasyQuant AI量化助手(支持最新版Supermind):https://iris.findtruman.io/ai/tool/ai-quantitative-trading/ 自然语言描述策略 → 直接生成最新版 SuperMind 代码 均线、MACD、选股、买卖逻辑、止盈止损等都可以直接让 AI 写。 而且不只是生成代码,已有代码报错、修改策略、补充交易逻辑也能直接交给 AI。
浏览72
评论0
收藏0
用户头像sh_**772oqg
2026-08-20 发布
研究背景 在加密资产高频策略研发过程中,订单簿深度数据是滑点仿真、因子构建、策略回测的核心输入。项目初期开展接口对接时,多数研究者会优先关注接口延迟、行情推送速率,默认只要数据流持续输出,盘口相关的计算就能够保持可信。 随着策略迭代,需要基于完整盘口快照与增量更新开展仿真回测,就会暴露出一个容易被忽视的数据风险:订单簿数据流的连续性。一旦快照与增量报文之间发生消息丢失,本地维护的内存盘口状态会逐步与真实交易所盘口产生偏差。该类偏差在普通行情展示场景很难被察觉,但在回测与模型演算过程中误差会持续放大,直接干扰策略有效性评估。 当前主流加密货币 API 不会持续下发全量订单簿,普遍采用「快照(Snapshot)+ 增量更新(Incremental Update)」的混合推送模式: 快照:返回某一时间点完整的买卖挂单档位,用于本地订单簿初始化; 增量更新:市场盘口发生变动后,仅推送发生变更的档位,包含挂单新增、撤单、成交移除等事件。 正常链路下版本编号需要连续递增。举个典型案例:快照基准版本为 8000,后续增量版本依次为 8001、8002、8004、8005,版本 8003 缺失即产生时序缺口。即便后续增量报文正常接收,本地盘口档位已经和真实市场错位,基于该盘口计算得到的深度因子、滑点指标均失去研究参考价值。 订单簿两大核心工程问题:缺口检测与状态恢复 时序缺口不会直接造成程序崩溃,属于静默式数据异常,大多在回测结果校验阶段才会被发现。结合项目实践,梳理检测逻辑与恢复方案。 时序缺口的检测逻辑 接收到增量更新报文之后,不直接修改本地订单簿内存,优先校验版本编号的连续性。 核心逻辑:保存上一条有效增量的last_update_id,和当前报文update_id做比对;当update_id != last_update_id + 1,判定存在时序缺口。 面向回测、仿真的研究环境,仅做简单编号比对并不充分。需要同时留存报文接收时间、当前订单簿版本等元信息,用来区分异常根因:判断异常来自网络传输延迟,还是真实发生报文丢失。 缺口出现后的盘口恢复方案 开发中常见误区:尝试通过业务逻辑手动推演、补全缺失的增量片段。订单簿内部挂单变化复杂,单条更新的丢失,背后可能对应多档挂单新增、撤销与成交,应用层无法通过推算还原真实盘口状态。 经过多组回测对比验证,可靠性最高的处理方式为执行完整重同步,处理流程: 暂停增量报文的业务消费逻辑; 请求获取最新订单簿快照; 校验快照版本编号,确认快照数据有效性; 清空已经产生偏移的本地订单簿状态; 以快照版本作为新基准,恢复消费后续增量更新。 重同步会带来短暂的数据加载停顿,但可以从根源消除盘口漂移,保障后续回测数据集质量。 WebSocket 环境下订单簿数据流处理要点 订单簿更新频次高,量化研究场景普遍采用 WebSocket 长连接接收盘口数据。对比循环调用 REST 接口,长连接由服务端主动推送变更事件,更适配高频变动的深度数据。 工程层面建议增设内存消息缓冲层,原始报文先入队暂存,严格按照版本编号顺序消费,规避行情剧烈波动阶段出现的消息乱序问题。 本次方案验证环节,订阅加密货币订单簿数据流。即便是标准化 WebSocket 行情接口,也不能仅解析价格字段,消息连续性校验是必不可少的环节。 import websocket import json last_update_id = None def on_message(ws, message): global last_update_id data = json.loads(message) update_id = data.get("update_id") if update_id: if last_update_id and update_id != last_update_id + 1: print("alltick order book gap detected", update_id) last_update_id = update_id print("symbol:", data.get("symbol"), "update_id:", update_id) def on_open(ws): sub_req = json.dumps({"action":"subscribe","symbol":"BTCUSDT","type":"depth"}) ws.send(sub_req) if __name__ == "__main__": ws_app = websocket.WebSocketApp("wss://api.alltick.co/ws", on_open=on_open, on_message=on_message) ws_app.run_forever() 说明:以上为基础演示代码。用于策略回测、仿真运行的环境,需要自行实现断线重连、异常捕获、消息缓冲队列等配套逻辑。 订单簿长期运行还会遇到几类衍生问题:WebSocket 重连后产生重复报文、大流量推送造成消息顺序错乱、本地消费处理速度不及行情推送速率、快照版本与增量版本不匹配。 推荐架构思路:将消息接收、合法性校验、订单簿状态更新三层逻辑解耦。行情数据流入系统后优先完成时序、版本校验,校验通过之后再更新内存盘口,以此提升极端行情下整套管线的稳定性。 面向量化回测的研究思考 订单簿开发的核心难点,不在于获取行情数据,而在于长期维持盘口状态的准确性。快照与增量更新只是两种不同的数据格式,底层依赖一条不可断裂的流式数据链路。 开展因子挖掘、滑点评估、历史回测时,只有保证数据流完整连续,数据集输出结果才能够贴近真实市场。如果忽略版本连续性校验,盘口漂移会污染全部样本,会出现回测指标表现优异,但实盘仿真完全失效的现象。
浏览68
评论0
收藏0
用户头像sh_*219t3e
2025-09-26 发布
大家好,我想和大家分享一个我最近开发的项目——一款面向量化交易的 AI 智能助手工具网站。它可以帮助大家快速生成高质量、可直接复制运行的量化策略代码,无论你是量化小白还是策略开发者,都能从中受益。 核心亮点: 1.多平台支持:目前已支持 PTrade、QMT、miniQMT、聚宽等,并计划不断扩展更多平台。 2.策略生成高效:用户只需选择平台并输入策略想法,AI 即可生成可运行的量化策略代码。 3.快速入门与优化: • 对量化小白:轻松生成可直接运行的策略,快速上手交易。 • 对策略开发者:帮助完善、优化已有策略,节省开发时间。 • 对文档需求者:可作为量化平台的 API 文档问答机器人,方便查询和使用。 4.业内首创:这是首个面向多平台的量化交易 AI 助手,解决了现有 Deepseek 或 Trae 等 AI 工具因缺乏平台知识库而生成代码无法运行的问题。 使用方式:登录 → 选择你使用的平台 → 输入策略想法 → 生成可运行的策略代码。 我希望这个工具能帮助大家更高效地进行策略开发和量化交易,也欢迎大家在帖子里分享使用体验和建议。 网站链接:https://iris.findtruman.io/ai/tool/ai-quantitative-trading/ 如果大家有任何问题或功能需求,也可以在帖子里留言,我会持续优化和更新,让它成为量化交易领域最实用的 AI 助手!
浏览6498
评论92
收藏3
用户头像sh_****559rtx
2026-08-20 发布
我们在做量化策略测评时,经常被问到:“为什么回测收益很好,实盘却不理想?”其中很大一部分原因,不是策略逻辑本身,而是数据口径不一致。尤其是实时行情和历史K线,如果处理不当,回测与实盘的偏差会被放大。 客户需求很明确:量化团队希望用历史数据训练和验证策略,再用实时行情触发交易信号。两者必须基于相同的字段定义、时间基准和价格精度。我们作为券商投顾工具测评人,看过不少策略在数据接入阶段就埋下了隐患。 一、实时tick与历史K线的数据差异 股票数据接口API返回的数据类型包括tick、分钟K线、日K线等。实时行情通常包含最新成交价、成交量、时间戳;历史数据则包含开高低收等字段。如果直接用接口原始格式,实时信号和回测数据很容易出现字段错位。 比如,回测时用日K线收盘价作为信号,实盘却用tick最新价触发,两者在时间点和价格上本来就有差异。如果再加上时区不一致,信号就会漂移。 二、统一数据结构,减少数据清洗成本 我们的做法是,先设计一层转换逻辑,把不同来源的行情统一成固定格式: market_data = { "symbol": "AAPL", "price": 225.50, "volume": 200, "timestamp": "2026-08-14T13:30:00Z" } 这样,实时tick和历史K线进入数据库后,可以按照相同规则调用。策略回测和实盘信号使用同一套字段,数据清洗成本大幅下降。 三、时间基准统一为UTC 时间戳是量化数据中容易踩坑的部分。不同交易市场有各自的交易时间标准。如果实时行情采用交易所本地时间,历史数据保存的是UTC时间,计算指标时就会出现偏移。例如,A股和美股跨市场策略,如果时间基准不统一,信号触发时间会完全错乱。 我们的原则是:数据进入系统后统一转换为UTC格式,展示或策略计算时再转换成对应交易市场时间。这样实时推送和历史接口的数据都在同一条时间轴上。 四、实时与历史数据的衔接 在量化交易中,实时行情和历史数据需要紧密配合。例如,策略需要先加载过去一段时间的K线计算指标,再持续接收最新tick判断是否触发交易。这里要保证历史数据的结束时间和实时数据的开始时间能够连续衔接。 我们一般会先让实时数据经过格式转换,再进入缓存或存储模块,避免策略模块直接处理原始行情。以AllTick API的WebSocket行情接口为例,可以订阅股票实时tick数据,再按自己的规则转换后供策略调用: import websocket import json def on_message(ws, message): data = json.loads(message) market_data = { "symbol": data.get("symbol"), "price": data.get("price"), "volume": data.get("volume"), "timestamp": data.get("timestamp") } print(market_data) ws = websocket.WebSocketApp( "wss://api.alltick.co/stock/websocket", on_message=on_message ) ws.run_forever() 这里的重点是数据标准化,而不是单纯获取行情。 五、量化场景下的额外建议 针对量化交易,我们还有几个经验: 回测和实盘要使用同一套数据转换逻辑,避免回测用后复权、实盘用不复权; 价格精度要统一,例如统一到最小变动价位,避免浮点数误差; 成交量单位要明确,否则不同来源的成交量可能差100倍; 实时数据流断开后要有回补机制,确保策略不会因为数据缺失而漏信号; 历史数据和实时数据在时间衔接处要特别注意,避免重复计算同一根K线。 经过多个量化项目之后,我们越来越看重行情数据的标准化处理。实时行情和历史数据不是两个独立部分,而是同一个数据体系中的不同阶段。提前建立统一的数据格式和时间规则,后面策略回测和实盘运行才能更稳定。对量化开发者来说,数据接入只是起点,数据管理能力才是策略有效性的基础。
浏览72
评论0
收藏0
用户头像sh_**729dg0
2026-08-19 发布
最近在搞一个量价因子,需要港股的十档挂单明细,结果发现公开渠道要么缺字段,要么下载速度慢得离谱。转了一圈,最后还是从数据源:CMES金融数据库把数据拉下来了,顺便把他们提供的几个数据种类都翻了一遍,干脆记录一下,方便以后自己查,也给你们一个参考。 先说清楚,这个数据库提供的港股、美股历史行情主要分两类:逐笔成交和盘口快照(十档/订单簿),另外还有分钟级API可以拿聚合数据。下面把每个数据里有什么字段列出来,不扯虚的。 港股逐笔成交 每一笔成交一条记录,不是分钟线,是真正的tick级。字段大概是这些: 字段 含义 备注 代码 股票代码 比如00700 时间 成交时间戳 毫秒级 价格 成交价 港元 成交量 股数 有可能拆单,需要自己合并 成交方向 主动买/主动卖/中性盘 这个分类有些数据源会标错,需要拿盘口验证 成交序号 交易所给的编号 用于去重 这里有个坑:港股有些券商通道返回的成交方向是反的,我之前拿另一家数据回测,买卖信号都对不上,后来发现是方向字段定义不一致。在CMES这边我重新校验过,和交易所原始数据对得上,才敢用。 港股十档盘口快照 这个本质上是切片,不是连续变化,更新频率大概3秒一次,但有时候行情火爆会更快。字段拆开看: 字段 说明 代码 股票代码 时间 快照时间 最新价 快照时刻的最新成交价 买1-10价 十档买价 买1-10量 每档买盘挂单量(股数) 卖1-10价 十档卖价 卖1-10量 每档卖盘挂单量 总买量/总卖量 所有买盘卖盘合计(有些数据源没有) 涨停/跌停价 如果有的话 十档数据最关键是挂单量是否真实,有些数据源会把前档量合并,那就没法分析订单簿深度了。比如你算“卖一量/总卖量”这种指标,如果总量不准,算出来就是错的。我踩过这坑,所以后来都直接拿逐笔和快照原始字段自己算。 美股逐笔成交 美股做市商多,成交更碎,而且有暗池、场外回传,所以逐笔数据里会有几点不同: 字段 备注 代码 如AAPL 时间 精确到毫秒,带时区 价格 美元 成交量 股数 成交条件码 比如@代表常规成交,F代表交叉交易等,这个码很重要,能过滤掉非市价成交 交易所代码 哪家交易所成交的,比如N=NYSE,Q=NASDAQ 成交序号 去重用 美股逐笔量很大,一天全市场可能上亿条,下载下来硬盘要留够。字段里我最看重成交条件码,因为很多暗池交易其实不具备价格发现功能,做回测如果不剔除,结果会明显失真。 美股订单簿(Level 2) 美股订单簿和港股十档不同,它是逐笔变化的,也就是只要盘口挂单有变动,就推送一条增量记录。所以字段不止是价格和量,还有动作类型: 字段 含义 代码 股票代码 时间 变化时间 价格 委托价格 数量 挂单量 方向 买/卖 动作 新增、修改、删除 订单簿ID 用来追踪某个订单的生命周期 这个数据量比逐笔成交还大,我就试过下载一天某只热票的订单簿,直接几十G。要是做高频因子,比如订单簿不平衡度、订单流毒性,就必须用这个数据,千万不能用快照代替。 分钟级API接口 除了历史批量下载,他们还开了个API,能拿分钟K线,适合做日内策略或者监控。我平时用Python调,接口地址和参数文档在 https://cmes-data.com/download.html?type=vip 有写。简单贴一段代码,你们可以直接跑: # pip install cmes_data # 先安装包,注意版本可能更新 from cmes_data import MinuteAPI # CMES金融数据库的行情接口,注意入参正确,调用频率正常 api = MinuteAPI(api_key='你的key') # 注册后会分配key df = api.get_minute_kline( symbol='00700', market='HK', start_date='2024-12-01', end_date='2024-12-07', freq='1min' # 支持1min,5min,15min ) print(df.head()) 调用频率官方限制是每秒不超过10次,我一般会加个time.sleep(0.2)保底,避免被临时封IP。返回的字段有开盘价、最高、最低、收盘价、成交量、成交额,还有一个“数据时间”字段,注意收盘价已经复权。 日更新和批量下载 历史数据可以一次性把指定日期范围全拉下来,我试过拉港股过去一年全部逐笔,大概跑了一个多小时,中间断过两次,好在支持断点续传,不用从头来。每天收盘后数据会自动更新,早上起来就能拉到昨天的,做盘前分析刚好够用。 注意:无论是港股还是美股,历史数据都是以单独文件提供,格式是parquet或者csv.gz,压缩比很高,我本地解析用pandas直接读,没有什么加密,这点比较方便。 顺便提几个容易出错的地方 港股交易时段分为早市、午市、竞价时段,逐笔数据里会包含所有时段,但如果你只做连续竞价,要按时间过滤掉盘前盘后。 美股数据注意时区,默认是美东时间,转北京时间夏令时减12小时,冬令时减13小时,我经常搞混,还好代码里写死了自动转换。 十档数据里买一价和卖一价,有时候看起来不合理,是因为当时有涨跌停或者熔断,不是数据错误,遇上这种情况别直接删,可以标记一下。 最后想说,数据字段再全,关键还是得自己理解业务逻辑,字段定义清楚,回测才能少走弯路。文章里提到的这些数据,你可以自己去CMES官网看看,下载页面就有样例文件,拿几个样例先跑跑,比看文档直观。
浏览70
评论0
收藏0