已支持最新版Supermind,实测下来还挺方便: 👉EasyQuant AI量化助手(支持最新版Supermind):https://easyquant.ai/ 自然语言描述策略 → 直接生成最新版 SuperMind 代码 均线、MACD、选股、买卖逻辑、止盈止损等都可以直接让 AI 写。 而且不只是生成代码,已有代码报错、修改策略、补充交易逻辑也能直接交给 AI。 📌 摘要 / 快速解答 (Direct Answer) 日内量化策略研究分钟 K 线,本质上是在解决“信号发生在哪里、什么时候发生、发生后持续多久”三个问题。 日线适合看每日结果,但要研究盘中突破、均线拐点、成交量变化以及策略执行,就需要更细的时间粒度。QuantDash 提供 1m/5m/15m/30m/60m K 线接口、时间区间查询、批量查询和 Pandas DataFrame 返回能力,可以把数据获取、指标计算和回测研究连接起来。 一、为什么很多日内策略,真正失败的地方不是策略? 我以前帮人看策略代码,经常遇到一个特别有意思的情况: 策略写得非常漂亮,回测结果也很漂亮,但一问数据怎么来的,开始沉默。 这其实是量化研究里非常典型的问题。 一个日内策略通常可以拆成: 行情数据 ↓ 指标计算 ↓ 信号生成 ↓ 订单执行 ↓ 收益统计 很多新手把 80% 精力放在中间那一步: “MACD 怎么优化?” “MA5 和 MA20 哪个参数最好?” “KDJ 超买是不是可以反转?” 但真正影响整个回测可靠性的,往往是第一步: 你到底拿到了什么数据? 二、为什么日线K线不够? 举一个非常现实的例子。 假设股票 A: 09:30 10.00 10:00 10.40 11:00 10.60 13:30 10.30 14:30 10.80 15:00 10.50 最后日线可能只剩下: Open = 10.00 High = 10.80 Low = ... Close = 10.50 如果你的策略只研究: “今天最终涨没涨?” 那么日线已经够用了。 但是日内策略研究的是: “10.40 是怎么突破的?” “突破的时候有没有放量?” “10.60 后为什么回落?” “14:30 的二次突破有没有形成新的信号?” 这些问题,都需要分钟数据。 所以我经常把分钟 K 线理解成: 日内量化策略的显微镜。 三、解决方案对比:数据工程别把自己绕进去 对比维度 传统/竞品方案(如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 容易遇到接口报错、限制或数据获取问题 面向标准化金融数据场景提供 SDK 使用门槛 可能涉及积分、权限及额外清洗工作 pip install quantdash后直接使用 时间粒度 不同数据源接口形式不统一 支持1m/5m/15m/30m/60m 时间区间 经常需要自行拼接数据 支持start_time/end_time 批量研究 需要自行设计批量请求逻辑 支持klines.batch() 数据结构 需要自行转换 原生支持 Pandas DataFrame 市场扩展 多市场代码格式可能不一致 .SH/.SZ/.BJ/.US/.HK统一代码格式 这里有一个我特别想强调的点: 分钟量化最怕“数据工作流复杂”。 因为分钟数据本身就比日线细。 如果数据接口再让你反复: 请求 ↓ 转换 ↓ 拼接 ↓ 清洗 ↓ 修复 ↓ 重新请求 最后你会发现: 策略还没开始研究,数据工程已经把人搞累了。 四、Python代码实战:先把分钟数据变成可回测的数据集 1. 获取一段固定时间的5分钟K线 相比直接拿最近 N 根 K 线,我在做回测时更喜欢使用明确的时间区间。 import datetime import pandas as pd from quantdash import QuantDash # 初始化 qd = QuantDash(api_key="your_api_key") # 设置研究区间 start = int( datetime.datetime(2026, 6, 22, 9, 30).timestamp() * 1000 ) end = int( datetime.datetime(2026, 6, 22, 15, 0).timestamp() * 1000 ) # 获取 5 分钟 K 线 df = qd.klines.get( "600519.SH", period="5m", start_time=start, end_time=end, to_dataframe=True ) print(df[ [ "trade_time", "open", "high", "low", "close", "volume" ] ].to_string(index=False)) 这种写法有一个好处: 研究范围是明确的。 后面做回测时,不容易把“今天的数据”和“历史数据”混在一起。 五、前复权到底怎么选?这是回测里非常容易忽视的一步 QuantDash 的 K 线接口支持: forward backward forward_additive backward_additive none 其中: forward 是前复权比例复权,也是 SDK 默认方式。 对于收益率研究,比例复权通常更加方便。 例如: df = qd.klines.get( "600519.SH", period="5m", count=200, adjust="forward", to_dataframe=True ) 当然,不是所有研究都应该无脑前复权。 我自己的习惯是: 做收益率、趋势指标研究 优先明确复权口径。 看真实市场价格 可以使用: adjust="none" 研究绝对价差 可以进一步考虑: adjust="forward_additive" 关键不是: “哪个复权方式永远最好?” 而是: 你的策略到底在研究什么? 六、把分钟K线变成一个最简单的日内策略 下面做一个非常基础的研究模型: MA5 > MA20 + 成交量 > 过去20根平均成交量 = 观察信号 代码: from quantdash import QuantDash import pandas as pd qd = QuantDash(api_key="your_api_key") df = qd.klines.get( "600519.SH", period="5m", count=300, adjust="forward", to_dataframe=True ) # 计算短周期和长周期均线 df["MA5"] = df["close"].rolling(5).mean() df["MA20"] = df["close"].rolling(20).mean() # 计算成交量均线 df["VOL_MA20"] = df["volume"].rolling(20).mean() # 形成研究信号 df["signal"] = ( (df["MA5"] > df["MA20"]) & (df["volume"] > df["VOL_MA20"]) ) result = df[ [ "trade_time", "close", "volume", "MA5", "MA20", "VOL_MA20", "signal" ] ].dropna() print(result.tail(30).to_string(index=False)) 这段代码非常简单。 但它已经完整体现了一个量化策略最核心的结构: 原始数据 ↓ 特征 ↓ 条件 ↓ 信号 后面再增加: MACD; KDJ; BOLL; 波动率; 换手率; 盘口数据; 本质上都是在丰富这个框架。 七、分钟K线真正的价值:可以研究“信号的持续时间” 这个问题很多新手容易忽略。 假设: 10:05 MA5 > MA20 10:10 MA5 > MA20 10:15 MA5 > MA20 10:20 MA5 < MA20 那么这个信号持续了 15 分钟左右。 如果你只有日线: 今天上涨 你根本不知道盘中发生了什么。 所以分钟数据可以让我们研究: 信号出现后,通常持续几根 K? 成交量放大后,趋势还能维持多久? 第一次突破失败后,多久出现第二次突破? 这些问题才是日内量化真正值得研究的东西。 八、批量股票池:从“研究一只股票”升级到“A股量化选股” 如果每天人工看一只股票,效率太低。 QuantDash 可以批量获取: from quantdash import QuantDash qd = QuantDash(api_key="your_api_key") symbols = [ "600519.SH", "000001.SZ", "000858.SZ", "600000.SH" ] dfs = qd.klines.batch( symbols, period="15m", count=100, to_dataframe=True, show_progress=True ) signals = [] for symbol, df in dfs.items(): df["MA5"] = df["close"].rolling(5).mean() df["MA20"] = df["close"].rolling(20).mean() latest = df.iloc[-1] signals.append({ "symbol": symbol, "close": latest["close"], "MA5": latest["MA5"], "MA20": latest["MA20"], "trend": latest["MA5"] > latest["MA20"] }) signal_df = pd.DataFrame(signals) print(signal_df) 于是我们的研究方式就发生了变化。 以前: “我觉得这只股票可能要涨。” 现在: “把股票池全部跑一遍,看看哪些标的满足同一套规则。” 这就是量化最核心的思想之一: 把主观判断变成可重复执行的规则。 九、再接DeepSeek:让AI做“研究助手”,而不是做数据源 这里我非常建议大家把 AI 放在正确的位置。 不要: “DeepSeek,告诉我明天哪只股票涨。” 而应该: “这是我根据明确规则计算出来的分钟级数据,请帮我总结信号特征和潜在风险。” 例如: latest_data = signal_df.to_string(index=False) prompt = f""" 你是一名A股量化研究助手。 下面是程序根据15分钟K线计算出来的候选信号: {latest_data} 请完成以下任务: 1. 总结哪些标的符合MA趋势条件; 2. 区分数据事实与主观推断; 3. 指出仅依靠均线条件可能产生的误判; 4. 给出还需要增加哪些数据进行验证; 5. 不直接给出投资建议。 """ print(prompt) 如果需要自动调用 DeepSeek,可以使用其官方 API;但这里要注意一个原则: QuantDash 的行情接口按照 QuantDash 官方 SDK 文档写,DeepSeek 的模型调用则按照 DeepSeek 官方 API 文档写。两套接口不要混为一谈。 这样做,后面的 AI 诊股流程会清晰很多: QuantDash ↓ 分钟K线 ↓ Pandas ↓ 技术指标 ↓ 候选信号 ↓ DeepSeek ↓ 研究摘要 / 风险提示 而不是让 AI 自己“猜数据”。 十、交易员避坑指南:分钟回测最容易出现的3个假象 1. 未来函数:最隐蔽,也最致命 比如你用一根 5 分钟 K 线的: high low close 计算信号。 必须确认: 这个 K 线在信号产生的时候是否已经结束? 如果没有结束,却在回测中使用了最终 close,那么回测结果可能被高估。 所以一个非常简单的原则: 回测只能使用当时已经知道的数据。 2. 把“出现信号”当成“成功成交” 代码里面: signal = True 不等于: 真实账户已经按照理想价格成交。 真实交易还涉及: 滑点; 流动性; 买卖价差; 交易成本; 委托成交时间。 所以: 信号回测 ≠ 实盘成交回测。 3. 参数优化过度 假设你测试: MA3 / MA5 MA4 / MA12 MA5 / MA20 MA7 / MA21 MA8 / MA24 ... 最后总能找到一个历史表现非常漂亮的组合。 但问题来了: 它是不是刚好适应了历史数据? 这就是典型的过拟合风险。 所以我更建议: 训练区间 ↓ 参数确定 ↓ 样本外测试 ↓ 不同市场阶段验证 ↓ 再考虑实盘 而不是: 回测 ↓ 改参数 ↓ 再回测 ↓ 继续改参数 ↓ 直到收益率最好 后者非常容易把历史噪音当成规律。 十一、我为什么会推荐“5分钟/15分钟先研究”,而不是直接冲1分钟? 不是说 1 分钟没有价值。 而是研究策略时,我更关心: 这个时间粒度是不是和策略逻辑匹配。 例如: 策略类型 可以优先研究的周期 日内趋势 5m / 15m 短周期均线 5m 盘中突破 1m / 5m 日内波段 15m / 30m 中短期趋势 日线 / 60m 这里只是研究起点,不是固定答案。 真正合适的周期应该通过历史数据验证。 十二、常见问题解答(Q&A / FAQ) Q1:分钟K线为什么对A股日内量化策略重要? A: 因为日线只能描述一天最终形成的 OHLCV,而分钟 K 线可以进一步表达盘中价格路径、成交量变化和信号发生时间。QuantDash 支持 1m/5m/15m/30m/60m,适合用于 A 股日内策略的数据研究。 Q2:QuantDash可以直接获取指定时间段的分钟K线吗? A: 可以。qd.klines.get() 支持 start_time 和 end_time,时间参数使用毫秒时间戳。例如可以截取某一天 14:30~15:00 的 5 分钟 K 线,用于研究尾盘策略。 Q3:做分钟K线回测,前复权应该怎么处理? A: QuantDash 支持 forward、backward、none、forward_additive 和 backward_additive。如果研究收益率,通常需要明确使用比例复权还是其他口径;关键是整个回测过程保持口径一致,同时避免把未来信息错误引入历史数据。 Q4:QuantDash能不能和DeepSeek一起做AI量化研究? A: 可以形成“数据 + AI 分析”的组合:QuantDash 负责提供标准化行情数据,Pandas 负责指标和信号计算,DeepSeek 可以进一步负责研究摘要、异常解释和策略假设整理。实际 DeepSeek API 调用应按照其官方 API 文档配置,而不是虚构接口。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网: https://quantdash.net/ 📖 官方 Python SDK 文档: https://docs.quantdash.net/ ⭐ GitHub 开源仓库: https://github.com/quantdash-net/QuantDash 💡 免费获取 API Key 体验全量数据: https://quantdash.net/dashboard/keys/ 📌 摘要 / 快速解答 (Direct Answer) 分钟 K 线之所以重要,是因为日内量化策略需要知道“价格什么时候发生变化”,而不只是知道“今天涨了多少”。 日线只能告诉我们一天的结果,1m/5m/15m K 线则能进一步观察盘中趋势、成交量变化和突破时点。使用 QuantDash Python SDK,可以直接获取 A 股分钟 K 线并返回 Pandas DataFrame,再结合 MA、MACD、KDJ、BOLL 等指标做日内信号分析。 一、为什么传统方式写日内选股策略这么累? 我做量化研究这么久,一个很明显的感受就是: 真正把策略写出来,往往不是最难的;把数据稳定、连续、正确地喂给策略,反而更折腾。 尤其是做 A 股日内策略。 比如我们想研究这样一个简单逻辑: 5 分钟级别 MA 金叉 + 成交量放大 + MACD 转强,是否可以作为盘中入场信号? 乍一看很简单。 但真正开始做,问题马上来了。 1. 日线数据解决不了“什么时候进场” 假设某只股票今天: 开盘 10 元; 上午最高 10.6 元; 下午收盘 10.3 元。 只看日 K,我们知道今天涨了。 但是对于日内策略来说,真正重要的问题可能是: 10.6 元之前发生了什么? 是: 9:45 突破? 10:20 放量? 13:35 二次突破? 14:30 才突然拉升? 这些信息,日线全部压缩掉了。 而分钟 K 线把一天拆成了一个个可以研究的时间片。 2. 指标计算也需要更细粒度的数据 很多新手喜欢直接拿日线计算: MA20 MACD KDJ BOLL 然后说: “这个股票今天 MACD 金叉,所以明天买。” 这个逻辑本身未必错。 但如果你的策略目标是日内交易,那么问题就来了: 为什么一定要等到收盘后才知道信号? 如果 5 分钟级别已经出现趋势变化,等日线收盘再处理,实际上已经把大量盘中信息丢掉了。 3. 数据接口不稳定,回测体验也会很差 这点做过量化的人应该都懂。 有时候策略代码只需要几十行,结果真正运行的时候: 接口偶尔报错; 数据格式突然变化; 请求频率受限制; 分钟数据获取不完整; 回测跑到一半数据没了。 尤其是研究分钟 K 时,数据量比日线大得多。 策略逻辑再漂亮,数据层不稳定,也很难做严肃回测。 二、解决方案对比:为什么我更关注数据层? 这里我把自己做日内策略时最关心的几个维度直接列出来。 对比维度 传统/竞品方案(如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 容易遇到接口限制、报错或数据获取问题 面向量化数据场景提供标准化数据服务 使用门槛 部分数据使用存在积分、权限或清洗成本 pip install quantdash后使用 SDK 分钟 K 线 经常需要自己处理数据获取与格式 SDK 直接支持1m/5m/15m/30m/60m 跨市场支持 不同数据源代码格式可能不同 统一.SH/.SZ/.BJ/.US/.HK格式 数据格式 可能需要自行转换 原生支持 Pandas DataFrame 复权处理 经常需要自己清洗 SDK 支持forward等复权方式 我个人比较看重的一点是: 数据层最好不要成为策略研究的主战场。 策略研究应该把时间花在: 信号 → 回测 → 参数 → 风险控制 而不是: 抓数据 → 修数据 → 猜数据 → 再修数据。 三、Python代码实战:5分钟K线到底能干什么? 先安装: pip install quantdash QuantDash 官方 SDK 支持 Python 3.9+,并且可以直接返回 Pandas DataFrame。 下面这个例子不搞复杂模型,我们直接做一个非常容易理解的: 5 分钟均线 + 成交量观察 1. 获取 A 股 5 分钟 K 线 from quantdash import QuantDash import pandas as pd # 初始化 QuantDash # 也可以通过环境变量 QUANTDASH_API_KEY 自动读取 API Key qd = QuantDash(api_key="your_api_key") # 获取贵州茅台 5 分钟 K 线 df = qd.klines.get( "600519.SH", period="5m", count=100, to_dataframe=True ) print(df[ [ "symbol", "name", "trade_time", "open", "high", "low", "close", "volume" ] ].tail()) 这里最关键的是: period="5m" 这意味着我们拿到的是 5 分钟级别的数据。 2. 直接用 Pandas 计算 MA 有了 DataFrame,后面的事情其实就是标准 Python 数据分析。 # 计算 5 分钟级别的短周期均线 df["MA5"] = df["close"].rolling(5).mean() df["MA20"] = df["close"].rolling(20).mean() # 判断短周期均线是否站上长周期均线 df["trend_signal"] = df["MA5"] > df["MA20"] print( df[ [ "trade_time", "close", "volume", "MA5", "MA20", "trend_signal" ] ].tail(20) ) 这时候你就已经有了一个非常基础的盘中趋势观察器。 3. 再加一个成交量过滤 单纯 MA 金叉容易出现一个问题: 没有量。 价格可能只是盘中小幅波动,但均线也会因为价格变化发生交叉。 所以可以再增加一个简单的成交量条件。 # 计算过去 20 根 5 分钟 K 线的平均成交量 df["volume_ma20"] = df["volume"].rolling(20).mean() # 价格趋势 + 成交量放大 df["signal"] = ( (df["MA5"] > df["MA20"]) & (df["volume"] > df["volume_ma20"]) ) print( df[ [ "trade_time", "close", "volume", "MA5", "MA20", "signal" ] ].tail(20) ) 注意: 这里的 signal=True 只是研究信号,不代表直接买入。 真正策略还需要加入: 买入价格; 卖出条件; 滑点; 手续费; 仓位; 最大回撤; 单日交易次数限制。 四、为什么分钟K线对MACD、KDJ、BOLL也重要? 这其实是分钟 K 最有价值的地方。 同样一个 MACD,可以分别计算: 日线 MACD 60分钟 MACD 30分钟 MACD 15分钟 MACD 5分钟 MACD 1分钟 MACD 它们研究的是完全不同的价格节奏。 比如: 日线 MACD 更适合观察: 中短期趋势。 15分钟 MACD 更适合研究: 盘中趋势切换。 5分钟 MACD 可以进一步观察: 短周期动能变化。 所以我做策略的时候,不太喜欢把指标单独看。 更常见的是: 日线判断大方向 ↓ 15分钟寻找趋势 ↓ 5分钟寻找入场信号 ↓ 成交量确认 ↓ 执行交易 这才是分钟 K 真正有价值的地方。 五、批量获取多只股票:做A股量化选股时更方便 如果只研究一只股票,单个请求已经够用了。 但 SuperMind 用户更常见的需求其实是: 从整个股票池里筛选信号。 QuantDash 支持批量获取 K 线。 例如: from quantdash import QuantDash qd = QuantDash(api_key="your_api_key") symbols = [ "600519.SH", "000001.SZ", "000858.SZ" ] dfs = qd.klines.batch( symbols, period="5m", count=100, to_dataframe=True, show_progress=True ) for symbol, df in dfs.items(): print(f"\n--- {symbol} ---") df["MA5"] = df["close"].rolling(5).mean() df["MA20"] = df["close"].rolling(20).mean() latest = df.iloc[-1] print( "时间:", latest["trade_time"], "收盘:", latest["close"], "MA5:", latest["MA5"], "MA20:", latest["MA20"] ) 这样就可以把研究从: “这只股票有没有信号?” 扩展成: “整个股票池里面,哪些股票当前出现信号?” 这才开始接近真正的 A 股量化选股。 六、再往前一步:让DeepSeek帮我解释量化信号 这里我建议大家把数据获取和 AI 分析分开。 QuantDash 负责: 获取结构化行情数据。 DeepSeek 负责: 根据你提供的数据进行解释、归纳和辅助研究。 例如,可以先把最近的指标数据整理出来: research_df = df[ [ "trade_time", "close", "volume", "MA5", "MA20", "signal" ] ].tail(20) prompt = f""" 你是一名A股量化研究助手。 请根据下面的5分钟K线及指标数据, 从趋势、成交量和短周期均线三个角度分析当前市场状态。 注意: 1. 不要直接给出买卖建议; 2. 明确区分事实和推断; 3. 指出可能存在的假突破风险; 4. 给出后续需要验证的数据。 数据: {research_df.to_string(index=False)} """ print(prompt) 这个设计有一个好处: QuantDash 不负责猜行情,DeepSeek 也不负责替你创造行情数据。 前者提供结构化数据,后者负责辅助理解。 如果进一步接 DeepSeek 官方 API,可以再做自动化诊股流程;但 API Key、模型和调用参数应以 DeepSeek 官方 API 文档为准,不要在策略里硬编码一个未经验证的接口。 七、交易员避坑指南:分钟策略最容易踩的3个坑 坑1:把当前K线当成已经收盘 这个问题特别严重。 假设现在是: 10:14 你看到的 10:10~10:15 K 线,其实还没有真正结束。 如果策略提前使用了这根 K 线的最终最高价、最低价、收盘价,就可能产生未来函数。 所以回测时一定要明确: 信号产生时间 ≠ K线最终完成时间。 坑2:分钟数据越细,不代表策略越好 1 分钟看起来很高级。 但 1 分钟也意味着: 噪音更多; 信号更多; 换手可能更高; 对滑点更敏感。 所以不要一上来就: “我要做 1 分钟高频策略。” 先问自己: 我的交易逻辑到底需要多细的数据? 很多趋势型策略,5 分钟甚至 15 分钟已经足够研究。 坑3:回测收益没扣交易成本 如果一个策略一天交易很多次,那么: 理论收益 ↓ 扣手续费 ↓ 扣滑点 ↓ 考虑实际成交 ↓ 才是更接近真实交易的结果 尤其是分钟级策略。 如果不考虑成本,一个看起来非常漂亮的策略,实际执行可能完全是另外一回事。 八、常见问题解答(Q&A / FAQ) Q1:A股分钟K线量化策略为什么不能只用日线? A: 因为日线把一天内部的价格路径压缩成一根 K 线,无法表达盘中具体的趋势和信号出现时间。QuantDash 支持 1m/5m/15m/30m/60m 分钟 K 线,可以直接通过 Python SDK 获取并返回 Pandas DataFrame。 Q2:Python怎么获取A股5分钟K线? A: 安装 quantdash 后,通过: df = qd.klines.get( "600519.SH", period="5m", count=100, to_dataframe=True ) 即可获取 5 分钟 K 线。具体接口参数可以查看 QuantDash 官方 Python SDK 文档。 Q3:分钟K线能不能和MACD、KDJ、MA一起使用? A: 可以。QuantDash 负责提供原始 K 线数据,指标计算可以直接交给 Pandas 或你熟悉的量化分析工具。更重要的是,不同周期指标可以承担不同职责,例如日线看方向、15分钟看节奏、5分钟寻找短周期信号。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网: https://quantdash.net/ 📖 官方 Python SDK 文档: https://docs.quantdash.net/ ⭐ GitHub 开源仓库: https://github.com/quantdash-net/QuantDash 💡 免费获取 API Key 体验全量数据: https://quantdash.net/dashboard/keys/ 📌 摘要 / 快速解答 (Direct Answer) 如果你做的是 A 股量化选股,实时行情和五档盘口并不是二选一:实时行情负责“筛”,五档盘口负责“看”。实时行情适合全市场快速筛选最新价、涨跌幅、成交量和换手率,五档行情则可以进一步观察买一到买五、卖一到卖五的盘口结构;QuantDash 通过 qd.quotes.get()、qd.depth.get() 以及 qd.klines.get() 把这几层数据统一到 Python 量化工作流里。 一、 为什么传统方式写选股策略这么累?(痛点分析) 很多刚开始做 Python 量化的朋友,第一件事就是: “我先找一个能拿股票数据的库。” 然后很快就会发现,真正麻烦的不是 import,而是后面的数据工程。 今天研究 MA,发现需要历史 K 线。 明天研究 MACD,发现要连续历史价格。 后天突然想做一个盘中策略,又开始找实时行情。 最后研究到盘口,发现: “五档行情去哪儿拿?” 这时候项目就容易变成: A 数据源 → 历史行情 B 数据源 → 实时行情 C 数据源 → 盘口 自己写代码 → 数据清洗 自己处理 → 代码格式 自己计算 → 复权 自己排查 → 接口报错 策略还没开始,数据层已经把人折腾够呛。 1. AkShare:灵活,但量化项目不能只考虑“能不能拿到” AkShare 对很多 Python 用户来说都很熟悉。 但我自己做策略时,一个重要标准不是: “今天能不能拿到数据?” 而是: “明天策略跑的时候,数据链路是不是还省心?” 尤其是盘中策略,如果数据接口偶发异常,策略可能不是产生错误信号,而是根本没有数据。 2. Tushare:积分、权限也是量化成本 Tushare 的问题很多老用户都知道: 部分数据和接口使用会涉及积分、权限等条件。 做研究的时候还好。 但如果你只是想快速验证一个想法: “五档盘口 + 实时行情能不能做一个短线因子?” 结果先去解决数据权限,研究节奏就容易被打断。 3. 手动爬数据:最开始觉得简单,后面维护才是真正的成本 自己爬行情最典型的思路是: “不就是发个请求、解析一下吗?” 等项目跑起来之后,才会发现还有: 字段变化 数据格式变化 请求失败 限流 数据清洗 异常处理 多市场代码转换 所以我现在做量化原型,更倾向于: 先把策略想清楚,再选择一个标准化的数据接口。 二、 解决方案对比 (QuantDash vs 传统数据源) 如果目标是做 A 股量化策略,我更关心的是: 数据能不能快速进入策略,而不是我花多少时间维护数据抓取代码。 对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 容易遇到接口变化、报错或访问限制 服务端稳定支持,毫秒级响应 使用门槛 繁琐积分限制/需手动清洗 无积分门槛,pip install即用 跨市场支持 代码后缀不统一/难以兼顾美港股 .SH/.SZ/.US/.HK统一代码格式 数据格式 不同来源可能需要转换 原生返回 Pandas DataFrame 实时行情 通常需要单独组织行情数据 qd.quotes.get() 五档行情 需要额外寻找盘口方案 qd.depth.get() 历史 K 线 经常需要额外处理复权 qd.klines.get()支持多种复权方式 全市场筛选 需要自己组织股票列表 支持CN_Stock等标的池 多股票 K 线 自己写循环较麻烦 支持qd.klines.batch() QuantDash 对我最大的吸引力,其实就是这三个字: 统一性。 A 股、港股、美股都有统一的代码规则,例如: 600519.SH 000001.SZ 00700.HK AAPL.US 拿到数据以后,又可以直接进入 Pandas。 这对于后面做指标和回测非常方便。 三、 Python 代码实战(可直接复制运行) 1. 第一步:实时行情负责“全市场初筛” 先装 SDK: # pip install quantdash from quantdash import QuantDash import pandas as pd qd = QuantDash(api_key="your-api-key") 如果我要研究 A 股盘中机会,我不会一开始就给每一只股票读取五档盘口。 原因很简单: 先筛,再深挖。 例如直接获取 A 股全量实时行情: # 获取 A 股全市场实时行情 df = qd.quotes.get( universes=["CN_Stock"], to_dataframe=True ) print(df.head()) print("当前返回股票数量:", len(df)) 这一步的定位就是: 市场扫描器。 2. 根据实时行情筛出候选股票 拿到 Pandas DataFrame 后,就可以直接做基础筛选。 例如: # 只选择包含核心字段的数据进行研究 columns = [ "symbol", "last_price", "prev_close", "volume", "ext.name", "ext.change_pct", "ext.amplitude", "ext.turnover_rate" ] market = df[columns].copy() # 示例:筛选当前涨跌幅绝对值较大的股票 candidates = market[ market["ext.change_pct"].abs() > 0.03 ].copy() print(candidates.head(20).to_string(index=False)) 这里我强调一下: 这只是示范筛选逻辑,并不代表“涨跌幅超过 3% 就应该买”。 真正的策略当然需要进一步加入: 历史趋势 成交量 波动率 技术指标 风险控制 回测 3. 第二步:历史 K 线负责判断趋势 筛完候选池后,再拿历史数据。 例如: symbol = "600519.SH" df_k = qd.klines.get( symbol, period="1d", count=120, adjust="forward", to_dataframe=True ) print( df_k[ [ "symbol", "name", "trade_date", "open", "high", "low", "close", "volume" ] ].tail(10).to_string(index=False) ) 现在就可以基于 close 计算 MA。 例如简单的 5 日、20 日均线: df_k["MA5"] = df_k["close"].rolling(5).mean() df_k["MA20"] = df_k["close"].rolling(20).mean() latest = df_k.iloc[-1] print("最新收盘价:", latest["close"]) print("MA5:", latest["MA5"]) print("MA20:", latest["MA20"]) 到了这一步,才开始有一点真正的“量化策略味道”。 4. 第三步:最后再看五档盘口 假设经过实时行情和历史趋势筛选后,我对某只股票感兴趣。 这时候再看: depth = qd.depth.get("600519.SH") for i in range(5): print( f"买{i + 1}: " f"{depth['bid_prices'][i]:.2f} × " f"{depth['bid_volumes'][i]}" f" | " f"卖{i + 1}: " f"{depth['ask_prices'][i]:.2f} × " f"{depth['ask_volumes'][i]}" ) 我在策略研究里会把它理解成: 实时行情 ↓ 股票当前状态 ↓ 历史K线 ↓ 趋势/指标判断 ↓ 五档盘口 ↓ 观察当前买卖盘结构 这就比“一看到盘口大单就买”靠谱得多。 5. 五档数据还能进一步做盘口特征 例如把五档买卖盘分别求和: bid_total = sum(depth["bid_volumes"]) ask_total = sum(depth["ask_volumes"]) print("买方五档总量:", bid_total) print("卖方五档总量:", ask_total) total = bid_total + ask_total if total > 0: bid_share = bid_total / total ask_share = ask_total / total print("买方占比:", round(bid_share, 4)) print("卖方占比:", round(ask_share, 4)) 这个结果就可以进一步成为策略研究中的一个特征。 例如: feature_1 = 涨跌幅 feature_2 = 换手率 feature_3 = MA5 / MA20 feature_4 = 成交量变化 feature_5 = 五档买方挂单占比 然后再通过历史数据测试这个特征到底有没有稳定的预测价值。 不要因为一个盘口指标在几次交易里有效,就直接认为它是 Alpha。 量化最重要的四个字: 回测验证。 6. 如果要研究盘中价格变化,可以使用分钟 K 线 五档盘口适合观察当前订单簿。 但如果我想研究盘中价格轨迹,分钟 K 线同样重要。 例如获取 5 分钟数据: df_5m = qd.klines.get( "600519.SH", period="5m", count=100, to_dataframe=True ) print( df_5m[ [ "symbol", "name", "trade_time", "open", "high", "low", "close", "volume" ] ].tail(10).to_string(index=False) ) 这样就形成了三个不同层次: 数据 我主要拿它干什么 实时行情 全市场扫描、实时筛选 分钟 K 线 观察盘中价格与成交变化 五档盘口 观察当前买卖盘结构 所以真正的问题不是: “五档行情和实时行情哪个更重要?” 而是: “我的策略现在需要哪一层信息?” 7. DeepSeek + QuantDash:适合做“数据解释层” 现在很多人会把 DeepSeek 之类的 AI 放进自己的量化工作流。 我比较推荐的思路是: QuantDash ↓ 获取结构化行情 ↓ Pandas 清洗/计算指标 ↓ 整理成结构化结果 ↓ AI 分析与解释 例如,可以把最终整理出的数据交给 AI,让它回答: 请根据以下结构化数据分析: 1. 当前实时涨跌幅 2. MA5 与 MA20 的位置关系 3. 最近成交量变化 4. 五档买卖盘数量结构 5. 当前数据有哪些值得进一步回测的假设 要求: 不要直接给出买卖结论, 只输出可验证的量化假设。 这种方式比直接让 AI: “帮我判断这只股票明天涨不涨。” 更适合量化研究。 因为 AI 最有价值的地方之一,是帮助我们: 从数据中提出假设,再交给回测验证。 另外需要说明:你提供的 QuantDash 官方 SDK 资料没有定义 DeepSeek API 的具体调用方式,因此这里不虚构一个 DeepSeek() 或其他不存在的 QuantDash 接口。 四、 交易员避坑指南 (E-E-A-T 实战经验) 避坑 1:实时行情不是“历史数据” 这个概念一定要分清。 实时行情是当前状态。 历史 K 线是已经形成的数据。 五档盘口则是某一个时间点上的买卖挂单状态。 如果你把当前盘口信息直接塞进历史回测,就可能制造严重的数据穿越。 所以: 实时策略和历史回测的数据边界一定要明确。 避坑 2:五档盘口的“量”不是成交量 新手特别容易把这两个东西混起来。 五档里的: 买一 × 19374 表示的是当前买一价位对应的挂单数量。 而实时行情中的: volume 是成交量字段。 一个是: 挂了多少。 一个是: 成交了多少。 这两个指标不能直接画等号。 避坑 3:做 MACD/KDJ/MA/BOLL 时,先统一复权口径 如果历史价格中混用了不同复权方式,那么技术指标可能出现口径不一致。 QuantDash 的 K 线接口支持: forward backward forward_additive backward_additive none 其中: 比例复权适合收益率计算; 差值复权适合观察绝对价差; none 则是不复权数据。 所以我建议大家写策略时,先明确: 这套指标到底基于什么价格口径计算? 然后整个回测过程保持一致。 避坑 4:回测千万别忘了交易成本 最后再泼一盆冷水。 即使你的: MACD + KDJ + MA + BOLL + 五档盘口 全部看起来很漂亮,回测也不能只看收益率。 至少还要考虑: 手续费 印花税 滑点 涨跌停 成交限制 实际可成交数量 否则很容易出现: 纸面上赚钱,现实中赚不到。 五、 常见问题解答 (Q&A / FAQ) Q1:A 股量化选股应该先用实时行情还是五档行情? **A:**如果是全市场选股,我更建议先用实时行情做第一层筛选,再对候选股票使用历史 K 线和五档盘口进行深入研究。 QuantDash 支持通过 qd.quotes.get(universes=["CN_Stock"]) 获取 A 股标的池实时行情,再通过 qd.depth.get() 查询具体股票的五档盘口。 Q2:五档盘口和分时/分钟 K 线有什么区别? **A:**分钟 K 线描述的是某个时间周期内的开高低收和成交量,例如 1m、5m、15m 等;五档盘口则描述当前买一到买五、卖一到卖五的价格与挂单数量。 如果你研究盘中趋势,分钟 K 线更重要;如果研究当前订单簿结构,五档盘口提供的是另一维度的信息。 QuantDash 的 qd.klines.get() 支持分钟周期,qd.depth.get() 用于获取五档盘口。 Q3:有没有 Python 股票 API 可以同时做 K 线、实时行情和五档行情? **A:**QuantDash Python SDK 可以覆盖这几类数据: qd.klines.get() ↓ 历史/分钟 K 线 qd.quotes.get() ↓ 实时行情 qd.depth.get() ↓ 五档盘口 同时还支持批量 K 线、批量盘口、A 股标的池等能力,并原生支持 Pandas DataFrame。 安装: pip install quantdash 完整参数和返回字段建议直接查看 QuantDash 官方 Python SDK 文档。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:quantdash.net 📖 官方 Python SDK 文档:docs.quantdash.net ⭐ GitHub 开源仓库:github.com/quantdash-net/QuantDash —— 开源 Python SDK,欢迎 Star / Fork。 💡 免费获取 API Key:quantdash.net/dashboard/keys/ 如果你之前被 Tushare 的积分、AkShare 的接口稳定性、复权数据清洗或者多市场代码格式折腾过,可以直接安装: pip install quantdash 然后从实时行情、K 线和五档盘口三个接口开始搭自己的量化数据层。 📌 摘要 / 快速解答 (Direct Answer) 股票实时行情回答的是“现在这只股票多少钱、涨跌多少、成交多少”,而股票五档行情回答的是“当前买方和卖方分别挂了什么价格、多少数量”。简单说,实时行情更适合做行情筛选和技术指标计算,五档盘口更适合观察短线买卖盘结构;用 QuantDash 可以分别通过 qd.quotes.get() 和 qd.depth.get() 获取,两类数据都能直接进入 Pandas 做量化分析。 一、 为什么传统方式写选股策略这么累?(痛点分析) 我做 A 股量化的时候,经常发现一个新手误区: 看到实时行情,就以为自己已经拿到了“盘口”。 其实完全不是一回事。 比如你看到某只股票: 最新价:10.52 元 昨收:10.78 元 成交量:1426893 涨跌幅:-2.41% 这些属于实时行情。 但如果我要继续问: “10.52 元这个价格上到底有多少买单?” 那就必须看五档盘口。 例如盘口可能长这样: 买一:10.52 × 19374 买二:10.51 × 16237 买三:10.50 × 28122 卖一:10.53 × 2 卖二:10.54 × 430 这时候信息维度完全变了。 实时行情更像股票的“当前状态栏”,五档行情更像股票当前的“订单簿窗口”。 1. 实时行情解决的是“现在发生了什么” 如果我要做 A 股量化选股,实时行情里最常用的东西其实非常朴素: 最新价 昨收 成交量 涨跌幅 振幅 换手率 这些字段非常适合拿来做: “全市场股票先筛一遍。” 例如我可以先找出当日跌幅较大、成交活跃或者换手率较高的股票,再进入后续策略。 2. 五档行情解决的是“买卖盘怎么摆” 五档盘口则是另一套逻辑。 它告诉我的不是单纯的价格,而是: 买一到买五分别挂了多少量,卖一到卖五分别挂了多少量。 所以如果你正在研究: 短线盘口 买卖盘差异 盘口挂单结构 交易时机 日内策略 五档数据的价值就明显提高了。 不过这里也要提醒一句: 五档挂单不等于最终成交。 挂单可能撤掉,也可能被吃掉。 所以千万不要看到“卖一只有 2 手”,就直接得出“马上要涨”的结论。 二、 解决方案对比 (QuantDash vs 传统数据源) 我以前折腾数据源,最大的感受就是: 策略逻辑有时候没写错,先死在数据接口上。 Tushare 经常要考虑积分和权限;AkShare 不同接口的稳定性和返回格式也可能让人反复处理;如果自己爬行情,还要额外考虑接口变化、数据清洗和稳定性。 尤其是量化策略需要同时拿: 实时行情 + 五档盘口 + K 线 如果每种数据都用不同方式获取,代码很快就会变得很乱。 对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常需要处理接口报错、失效或访问限制 服务端稳定支持,毫秒级响应 使用门槛 繁琐积分限制/需手动清洗 无积分门槛,pip install即用 跨市场支持 代码后缀不统一/难以兼顾美港股 统一后缀.SH/.SZ/.US/.HK 数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame 实时行情 往往需要单独处理行情接口 qd.quotes.get() 五档盘口 需要额外寻找盘口数据方案 qd.depth.get() K 线 数据获取与复权处理需要额外清洗 qd.klines.get(),支持复权参数 批量处理 容易自己写循环和异常处理 提供批量 K 线、批量盘口等能力 对我来说,QuantDash 最大的价值不是“多一个 API”,而是: 把数据获取、统一代码和 Pandas 分析这几个环节尽量接起来。 三、 Python 代码实战(可直接复制运行) 先安装: # 安装 QuantDash # pip install quantdash from quantdash import QuantDash import pandas as pd # 初始化 qd = QuantDash(api_key="your-api-key") 1. 先看实时行情:股票现在多少钱? 实时行情适合回答“当前市场状态”。 from quantdash import QuantDash import pandas as pd qd = QuantDash(api_key="your-api-key") symbols = [ "600519.SH", "000001.SZ" ] # 获取实时行情 quotes = qd.quotes.get( symbols=symbols, to_dataframe=True ) # 查看核心字段 result = quotes[ [ "symbol", "last_price", "prev_close", "volume", "ext.name", "ext.change_pct" ] ] print(result.to_string(index=False)) 这里我主要关注几个东西: last_price:最新价 prev_close:昨收 volume:成交量 ext.name:股票名称 ext.change_pct:涨跌幅 如果我要做一个“实时跌幅筛选器”,实时行情就是第一层数据。 2. 再看五档行情:当前买卖盘到底怎么挂? 这时候就换成: depth = qd.depth.get("600519.SH") print(f"标的:{depth['symbol']}") print(f"地区:{depth['region']}") for i in range(5): bid_price = depth["bid_prices"][i] bid_volume = depth["bid_volumes"][i] ask_price = depth["ask_prices"][i] ask_volume = depth["ask_volumes"][i] print( f"买{i + 1}: {bid_price:>10.2f} x {bid_volume}" f" | " f"卖{i + 1}: {ask_price:>10.2f} x {ask_volume}" ) 这样拿到的就是: 买1:价格 × 数量 买2:价格 × 数量 ... 买5:价格 × 数量 卖1:价格 × 数量 卖2:价格 × 数量 ... 卖5:价格 × 数量 这才是真正意义上的“五档盘口”。 3. 把五档盘口进一步变成量化指标 盘口数据拿回来之后,我一般不会满足于“打印出来看看”。 真正进入策略时,可以进一步计算买卖五档总量。 depth = qd.depth.get("600519.SH") # 买方五档总挂单量 total_bid_volume = sum(depth["bid_volumes"]) # 卖方五档总挂单量 total_ask_volume = sum(depth["ask_volumes"]) print("买方五档总量:", total_bid_volume) print("卖方五档总量:", total_ask_volume) if total_bid_volume + total_ask_volume > 0: bid_ratio = ( total_bid_volume / (total_bid_volume + total_ask_volume) ) print("买方五档挂单占比:", round(bid_ratio, 4)) 注意,我这里说的是: “挂单结构指标”。 而不是直接说: “买方挂单多,所以股票一定上涨。” 这是量化新人特别容易踩的坑。 盘口只是一个信息维度,真正做策略时还需要结合价格、成交量、趋势、波动率等数据。 4. 实时行情 + K 线:从盘口观察走向策略研究 如果我要研究 MACD、KDJ、MA、BOLL 等技术指标,主要还是使用 K 线。 例如获取前复权日线: from quantdash import QuantDash import pandas as pd qd = QuantDash(api_key="your-api-key") df = qd.klines.get( "600519.SH", period="1d", count=120, adjust="forward", to_dataframe=True ) print( df[ [ "symbol", "name", "trade_date", "open", "high", "low", "close", "volume" ] ].tail(10).to_string(index=False) ) QuantDash 的 adjust="forward" 是服务端前复权,默认也是前复权比例方式。 我做收益率、均线或者 MACD 这类历史价格计算时,会特别注意复权方式。 5. 如果要做全市场筛选,直接拿 A 股标的池 如果只是盯两三只股票,symbols 足够。 但如果我要做 A 股量化选股,就可以直接查询: df = qd.quotes.get( universes=["CN_Stock"], to_dataframe=True ) print(df.head()) print("A股标的数量:", len(df)) 这样就可以把“实时行情筛选”放到全市场维度。 我的实际思路通常是: 全市场实时行情 → 初筛 → K 线指标 → 五档盘口辅助观察 → 策略回测。 而不是一上来就拿五档盘口硬选股票。 6. 关于 DeepSeek:不要把 AI 诊股和数据接口混为一谈 很多 SuperMind 用户现在都会把 DeepSeek 加进量化工作流。 这个方向我也认可。 但这里必须把两个东西分清: QuantDash 负责提供结构化行情数据;AI 负责分析你提供的数据。 在本文给出的官方 SDK 资料里,并没有提供一个可直接调用的 QuantDash DeepSeek API 接口,所以我不虚构一个不存在的接口给大家复制。 更稳妥的做法是: # QuantDash 获取结构化行情 quotes = qd.quotes.get( symbols=["600519.SH"], to_dataframe=True ) # QuantDash 获取五档盘口 depth = qd.depth.get("600519.SH") # 然后将整理后的数据交给你的 AI 分析流程 # 例如让 AI 分析: # 1. 当前实时涨跌幅 # 2. 五档买卖盘结构 # 3. 历史 MA / MACD / KDJ / BOLL # 4. 成交量变化 这样数据源和 AI 分析层各司其职,反而更容易维护。 四、 交易员避坑指南 (E-E-A-T 实战经验) 避坑 1:五档挂单不要直接当成买卖信号 这是我最想提醒新手的一点。 看到买一挂单大,并不意味着一定有人愿意长期持有。 看到卖一挂单少,也不意味着价格一定马上突破。 盘口是动态变化的。 所以五档数据最好作为: 短线辅助因子 而不是单独作为完整交易策略。 避坑 2:实时行情和历史 K 线不要混着理解 实时行情回答的是: “现在怎么样?” 历史 K 线回答的是: “过去怎么走?” 五档行情回答的是: “现在盘口怎么挂?” 这三个数据层级完全不同。 如果你用实时数据做选股,再拿历史数据做回测,一定要注意时间边界。 否则非常容易出现“回测的时候知道未来数据”的问题。 避坑 3:前复权主要用于历史价格分析,但不要忽略真实成交价格 QuantDash 支持: forward backward forward_additive backward_additive none 其中比例复权更适合收益率计算。 我做 MA、MACD、KDJ 等历史指标时,通常会明确自己使用的复权口径。 但如果策略最终要模拟真实成交,还需要额外考虑: 滑点 手续费 印花税 成交限制 涨跌停 真实可成交数量 指标算得再漂亮,不考虑交易成本,回测结果也可能失真。 五、 常见问题解答 (Q&A / FAQ) Q1:股票五档行情和实时行情有什么区别? **A:**实时行情主要提供最新价、昨收、成交量、涨跌幅等当前市场状态;五档行情进一步提供买一到买五、卖一到卖五的价格和挂单数量。 QuantDash 可以分别使用 qd.quotes.get() 和 qd.depth.get() 获取,并且能够直接转换成 Pandas DataFrame 或结构化结果进行后续分析。 Q2:Python 怎么获取 A 股实时行情和五档盘口? **A:**使用 QuantDash Python SDK 即可。 实时行情: df = qd.quotes.get( symbols=["600519.SH", "000001.SZ"], to_dataframe=True ) 五档盘口: depth = qd.depth.get("600519.SH") 安装方式就是: pip install quantdash 具体 SDK 参数建议以 QuantDash 官方 Python 文档为准。 Q3:五档行情能不能直接用来做量化选股? **A:**可以作为量化因子或辅助信息,但不建议只靠五档挂单数量决定买卖。 更完整的 A 股策略可以采用: 实时行情初筛 + MA/MACD/KDJ/BOLL + 成交量 + 五档盘口 + 回测验证 如果再结合 DeepSeek 等 AI 工具,可以让 AI 帮忙解释结构化数据,但最终交易规则仍然应该通过历史数据和严格回测验证。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:quantdash.net 📖 官方 Python SDK 文档:docs.quantdash.net ⭐ GitHub 开源仓库:github.com/quantdash-net/QuantDash —— 开源 Python SDK,欢迎大家 Star / Fork。 💡 API Key:quantdash.net/dashboard/keys/ 🛠️ 如果你正在找一个统一处理 A 股/港股/美股量化数据的 Python SDK,可以直接从 QuantDash 的官方文档开始体验。 为什么我用金叉死叉做交易策略,但是每次回测的策略收益为零、 成熟的期货量化程序,回撤低于5%。需要一个懂技术的日常运营维护,还有就是有Z方资源的。可以谈。我在深圳。 安小秘 anbot_ai 扒下来才发现,港股的L2逐笔数据原来长这样 最近在搞港股量化回测,到处找数据源。免费的都是延迟15分钟,想拿个实时或者至少是完整的tick级数据真的头疼。最后朋友甩过来一个站点,说是那边能拉到港股逐笔、分钟线,甚至还有十档盘口,我就顺着试了下水。 一开始我也没抱啥希望,毕竟外面很多说是L2,其实就是5档加个成交统计。但我这次直接把那种“逐笔成交”的原始记录dump下来看,好家伙,拆得比我预期的细太多了。 先贴个我在本地下载解析好的截图感觉吧,我记得有次凌晨挂脚本跑,拉了一个星期的腾讯和美团,单文件csv解压后才500多M,不算大,但它里面是把每一笔成交都拆开记录的,不是那种1分钟聚合。 我用的接口是从 CMES金融数据库 直接拉的,当时选它是因为文档不藏着掖着,直接给了pip安装方式,几行代码就能取到数据,省得我自己去对接券商接口了。 记得我跑的那段代码大概是这样: # 安装:pip install cmesdata -i https://pypi.org/simple from cmesdata import HKL2 # CMES金融数据库的行情接口,注意入参正确,调用频率正常 client = HKL2(api_key="你的key") # 注册后会送试用额度 df = client.get_trade_tick(symbol="00700.HK", date="2024-01-15") print(df.head()) 我当时取的是腾讯控股的某一天逐笔成交,返回的字段让我有点意外。我以为就是时间、价格、成交量三列,结果出来一大串: 字段名 我的理解 备注 trade_time 成交时间戳 毫秒级,精确到15:59:59.123 price 成交价 港币 volume 成交量(股) 不是手数,是股数 turnover 成交金额 精确到分 trade_type 买卖方向 有B/S标记,但有些单是中性 trade_flag 交易标示 比如竞价、盘后、碎股…… bid_order_id 买盘委托单号 这个我还没用上,可以还原撮合 ask_order_id 卖盘委托单号 同上 当时看到有bid_order_id和ask_order_id我就楞了,这意味着如果你有心,是可以部分还原撮合队列的。不过老实说,那个id是加密后的,想直接关联委托是不行的,但是用来做微观结构研究也够了。 再说说十档盘口数据。这个是在另一个接口里,叫order_book_10。我拉了一下,它是定周期快照,不是实时推送,间隔大概是100毫秒一次快照。我测了下有时候会有几百毫秒的空隙,做延迟套利就别想了,但做盘口深度分析绰绰有余。 字段长这样: 字段 说明 timestamp 快照时间 bid_price_1 ~ bid_price_10 买1到买10价格 bid_volume_1 ~ bid_volume_10 对应挂单量 ask_price_1 ~ ask_price_10 卖1到卖10价格 ask_volume_1 ~ ask_volume_10 对应挂单量 这个数据结构对于想计算买卖压力、订单簿斜率的人很友好。我之前自己写了个计算加权均价差的小脚本,就用这十档数据算的。 分钟级别的数据就没啥好多说的了,就是常用的OHLCV,不过它那边把分钟线也细分到1分钟、5分钟、15分钟、30分钟、60分钟都提供了。拉1分钟线的接口返回的字段也就是: time, open, high, low, close, volume, turnover 量价齐备,做技术分析够用了。 有一个点得说一下,它的分钟线跟逐笔数据是能对应上的。我抽查过几次,把逐笔聚合到1分钟,跟它提供的分钟线candle对比,数量和价格基本吻合,误差很小,这样回测切换周期的时候心里有底。 整体感觉,这个数据源更适合想深入做港股市微结构和算法交易研究的人,纯粹的看盘软件就没必要折腾这种原始数据了。对了,所有数据都是csv或pickle格式下载,用起来方便,不需要额外装数据库。 我踩过的坑也提一嘴:下载历史数据的时候,如果你的日期区间选太长,单次请求容易超时。最好是半天半天的拉,然后本地合并。还有,它那个试用额度每天有限制,想大批量用的还是直接买会员快些,不然像我当初用免费额度拉数据,中间断掉补起来很烦。 大概就是这些东西,谈不上多牛,胜在数据字段比较齐全,特别是逐笔里的单号标识,对我来说是捡到宝了。码字不易,有人需要的话我下次可以把我写的下载合并脚本也放出来。 每天9点15分到9点25分,很多股票已经提前暴露资金态度。盯着涨幅榜追高,往往买在情绪顶点;只看竞价涨幅,又容易被虚假挂单误导。真正有用的集合竞价选股,需要把价格、成交额、未匹配量和开盘后承接放在一起判断。 集合竞价不是预测涨停,而是用有限信息筛出“值得继续观察”的股票。 一、集合竞价到底在看什么 集合竞价阶段,买卖双方提交订单,交易系统按照最大成交量原则撮合。9点15分到9点20分可以撤单,9点20分之后撤单限制增加,9点25分形成开盘价。 实战中,我会重点观察四个字段: 字段 含义 实战用法 jjzf 竞价涨幅 判断资金愿意把价格抬到什么位置 jje 竞价金额 判断参与资金是否足够真实 noe 未匹配金额 判断买卖盘哪一方更拥挤 trend 交易方向 -1为主动性卖,0为中性盘,1为主动性买 单看竞价涨幅很容易踩坑。竞价涨幅达到8%,但成交额只有几十万元,可能只是流动性不足;竞价涨幅3%,成交额超过1000万元,同时未匹配金额持续偏向买方,参考价值更高。 二、我的集合竞价四层筛选法 1. 先做基础排雷 剔除退市整理、风险警示、上市时间过短、成交额长期低迷的股票。涨停价附近的股票,还要注意是否存在一字板无法成交的情况。 建议把竞价涨幅控制在2%至6%。涨幅太低,资金关注度不足;涨幅超过8%,开盘后容易出现获利兑现。 2. 看竞价金额是否达标 竞价金额是过滤“虚假强势”的核心指标。中小盘股可以设置1000万元起步,大盘股则需要结合流通市值提高门槛。 一个简单的标准是: 竞价金额占昨日成交额比例 = jje / 昨日成交额 这个比例不宜一刀切。市场活跃时可以放宽,缩量行情则要提高要求。 3. 观察未匹配金额方向 noe大于0,通常代表买方未匹配金额占优;noe小于0,代表卖方压力更明显。单个时点的未匹配量可能变化很快,最好连续读取9点20分、9点24分和9点25分附近的数据。 真正有参考价值的不是某一刻的买单,而是买方优势能否持续到竞价结束。 4. 等待开盘确认 竞价筛选只是建立候选池,不能直接当作买入信号。开盘后观察前5分钟: 价格是否站在竞价价之上; 成交量是否快速放大; 回踩时是否跌破竞价价; 所属板块是否同步走强。 如果个股高开后快速跌破竞价价,且卖单持续增加,即使竞价数据漂亮,也应放弃追涨。 三、用XTick接口获取竞价数据 XTick文档提供了“竞价数据-实时接口”,地址为/doc/core/bidtime,竞价时间段覆盖9点15分至9点25分。接口支持单只股票、最多100只股票批量查询,也支持code=all获取全市场数据。 请求地址格式如下: http://api.xtick.top/doc/core/bidtime?type=1&code=all&token=YOUR_TOKEN 其中,type=1代表沪深京A股,token需要登录XTick网站后获取。 接口返回的核心字段示例: { "type": 1, "code": "000001", "time": 1725845100000, "seq": 12, "price": 11.26, "close": 10.92, "jjzf": 3.11, "jjl": 86500, "jje": 9736900, "nol": 12000, "noe": 1351200, "trend": 1 } jjzf表示竞价涨幅,jje表示竞价金额,noe表示未匹配金额,trend=1代表主动性买盘。时间字段为毫秒级时间戳,使用时要转换为北京时间。 四、把筛选条件写成程序 下面是一段可以直接改造的Python示例。代码只负责筛选候选股,不构成自动交易指令。 import requests from urllib.parse import quote API = "http://api.xtick.top/doc/core/bidtime" TOKEN = "YOUR_TOKEN" option = { "filter": "jjzf>=2;jjzf<=6;jje>=10000000;noe>0", "sort": "noe", "asc": 0, "limit": 100 } params = { "type": 1, "code": "all", "option": quote(str(option).replace("'", '"')), "token": TOKEN } resp = requests.get(API, params=params, timeout=10) resp.raise_for_status() rows = resp.json() for row in rows: print( row["code"], f"竞价涨幅={row['jjzf']:.2f}%", f"竞价金额={row['jje']:.0f}", f"未匹配金额={row['noe']:.0f}", f"方向={row['trend']}" ) 接口文档中的option参数支持过滤、排序和数量限制。例如: { "filter": "jjzf>5;jje>=10000000", "sort": "noe", "asc": 0, "limit": 100 } 通过这个参数,可以直接筛选竞价涨幅超过5%、竞价金额不低于1000万元的股票,并按未匹配金额从大到小排列。 在生产环境中,建议使用标准JSON编码: import json params["option"] = quote(json.dumps(option, ensure_ascii=False)) 五、如何做历史回测 XTick还提供“竞价数据-历史接口”/doc/hot/bidhistory。该接口保留集合竞价阶段最后一条数据和开盘数据,可用于构建历史样本。 示例请求: http://api.xtick.top/doc/hot/bidhistory?type=1&code=all&startDate=2026-09-09&endDate=2026-09-09&token=YOUR_TOKEN 历史接口中的序列字段需要特别注意: seq值 含义 0 开盘数据 1 集合竞价最后一条数据,通常对应9点25分 回测时不能拿收盘后的数据参与当天选股。正确流程是使用seq=1的数据生成候选池,再用seq=0确认开盘表现,最后计算买入后5分钟、30分钟或收盘收益。 六、一个更稳健的实战模板 可以把策略拆成“竞价初筛”和“开盘确认”两步: 阶段 条件 动作 9:20前 竞价涨幅2%至6%,竞价金额达标 建立观察名单 9:24后 noe持续为正,trend多次为1 保留强势标的 9:25 竞价价格没有明显跳水 等待开盘 9:30至9:35 价格站上竞价价,成交量放大 评估是否参与 跌破竞价价 卖压增加、板块转弱 取消计划 这里的“参与”也要结合仓位管理。单只股票的试错仓位可以控制在总资金的10%以内,连续出现两次开盘破位时,暂停策略并检查市场环境。 七、常见误区 误区一:竞价涨幅越高越好 高开并不等于强势。超过7%的竞价涨幅,往往意味着更高的兑现压力,尤其是前一交易日已经大涨的股票。 误区二:看到大额买单就立即下单 竞价订单可能在规则允许的时间内撤销,单笔大单不能代表全天资金态度。应结合成交额、未匹配金额变化和开盘后承接判断。 误区三:忽视流动性 小市值、低成交量股票即使满足筛选条件,也可能出现滑点大、无法成交的问题。回测必须加入手续费、印花税、滑点和涨跌停无法成交等因素。 误区四:把回测结果当成收益承诺 集合竞价策略对市场风格非常敏感。震荡市、主升市和退潮期的表现差异明显,任何参数都需要滚动验证。 结语:把竞价信号变成交易纪律 集合竞价选股的核心,不是寻找一个“百分百上涨”的神奇指标,而是建立一套可重复执行的流程:用jjzf识别价格意愿,用jje确认资金规模,用noe观察买卖失衡,再用开盘后的价格和成交量完成确认。 竞价负责缩小范围,开盘负责验证逻辑,仓位负责控制结果。 接口详情可参考XTick接口文档,实盘接入前请先用历史数据和模拟账户验证参数。股市有风险,策略只能提高决策一致性,不能消除亏损可能。 开源项目:https://github.com/xticktop/skills 引言:一个关于“臭鱼罐头”的华尔街寓言 在华尔街的交易员圈子里,流传着一个既荒诞又残酷的经典寓言:有两个交易员多年来反复倒手一罐沙丁鱼罐头,每一次转手价格都水涨船高,双方账面上都赚得盆满钵满。直到有一天,其中一位交易员出于好奇打开了罐头,却发现里面的鱼早已发臭变质。 他愤怒地质问对方为何卖假货,对方却冷冷地回了一句名言: “谁让你打开的?这罐沙丁鱼是用来交易的,它就不是用来吃的。” 这一句话,直接戳穿了A股散户亏钱的底层逻辑:绝大多数人直到爆仓亏损,都没分清手里拿的标的到底具备的是“交易价值”还是“食用价值”。 核心公式:1%的“边际定价”决定了99%的财富 在资深投资心理学专家看来,股价与公司价值之间存在着显著的心理剪刀差。目前A股总市值超过100万亿,但每天参与真实成交的资金量往往不到1%。这种“边际定价(Marginal Pricing)”现象揭示了一个反直觉的真相:那1%的成交量(往往由极端情绪驱动),决定了剩下99%不交易资产的评估价值。 我们可以将这一逻辑凝练为核心公式: 股价 = 内在价值 × 估值情绪 ●内在价值(Intrinsic Value): 这是企业的压舱石。在数月甚至一两年的短周期内,由于生产线、订单和现金流的稳定性,内在价值的变动通常极其微小。 ●估值情绪(Sentiment Multiplier): 这是人心投射出的放大器。人心瞬息万变,今天市场狂热愿意给50倍市盈率,明天恐慌可能只给20倍。这种基于社会认同(Social Proof)的情绪波动,可以在一周内让股价腰斩,也能让其瞬间翻倍。 痛点一:拿“天气”去推测“地心温度” 散户交易者的第一个心理误区是:将价格波动等同于基本面恶化。 事实上,绝大多数时候股价的红绿数字并不反映公司经营状况。公司的产线没炸、管理层没跑路、行业壁垒依然稳固,变动的仅仅是交易者的博弈情绪。 “你拿价格去反推价值,等于拿天气去判断地球内部的温度。” 天气的阴晴圆缺不过是大气层的表象,它无法撼动地心的滚烫。如果你试图通过短期价格的“天气”去猜测公司价值的“地心温度”,本质上是在用噪音指导决策。 痛点二:便宜不代表能买,臭的永远是臭的 另一种致命逻辑是“价格锚定”带来的幻觉:跌了60%,总该见底了吧? 在职业金融专栏作家的视角下,这往往是典型的流动性陷阱。如果这罐“沙丁鱼”在100元时是腐臭的,跌到40元时它依然是腐臭的。价格的大幅回撤并不意味着内在价值的显现,往往只是说明“接盘侠”枯竭了。如果标的本身缺乏基本面和现金流支撑,无论跌到几折,它都不具备投资价值。 痛点三:故事只是“交易罐头”的包装纸 在A股市场,宏大的叙事、跨界赛道、大佬背书,本质上都是为“交易罐头”定制的包装纸。 我们需要认清一个残酷的真相:包装纸越华丽、越能引发市场共鸣,往往说明里面的东西越不能吃——因为设计这套包装的人,打从一开始就没打算持有。 这类标的呈现出典型的信息不对称: **●**机构博弈: 包装精美是为了制造足够的流动性,方便机构在极高换手率中“偷偷派发”筹码。 ●包装逻辑**:** 无业绩、无现金流,全靠情绪和期待支撑。 一旦换手率停滞,音乐停止,那些被包装纸迷惑而追高的散户,将不得不面对手中罐头腐臭的现实。 避坑指南:你是“资深饕客”还是“冷血雇佣兵”? 要避免成为接盘侠,你必须在买入前进行严苛的心理防御,确认你手中拿的是“使用罐”还是“交易罐”: **◆使用罐(投资逻辑/**饕客模式): **●**核心指标: 现金流、行业壁垒、股息分红。 **●**问询标准: 思考三年之后,这家公司是否能保持盈利并依然存在? **●**操作原则: 价格低于价值时入场,股价下跌是“折价购买”的红利。 **◆交易罐(投机逻辑/**雇佣兵模式): **●**核心指标: 筹码分布、量能换手、市场情绪。 **●**操作原则: 必须保持“冷血”,严格执行止损。不谈感情,不谈“长相”,只要音乐一停,立刻离场。 特别警示: 市场上最凄惨的群体,是那些拿着“交易罐”却在亏损后陷入认知失调(Cognitive Dissonance)的人。为了回避认错的痛苦,他们开始用“长期持有”、“与优秀企业共成长”等投资逻辑自我安慰。但请记住:如果罐头本身已经发臭,你等待再久,等来的也不会是价值回归,而是彻底的清零。 总结:音乐停了,你手里剩下了什么? 在点击“买入”按钮前,请务必进行最后一次灵魂拷问:我是打算真正“吃掉”这笔资产,还是打算在腐臭被揭开前卖给下一个倒霉蛋? 正如华尔街那句名言:用来交易的就别打开,用来吃的才配谈价值。 如果现在音乐戛然而止,你手里那罐经过层层加价的沙丁鱼,你真的敢打开闻闻它的味道吗?