摘要:量化开发者通过一个实时行情 API 接入 A 股、美股、港股等多类资产时,MCP 工具调用的成功状态(code=0)不等于横截面数据完整。一次静默的资产缺失,就可能歪曲你的统计口径、权重分配和监控覆盖。本文基于 TickDB 的跨市场调用实测,给出一套“完整/降级/关闭”验收标准,将数据完整性判断独立于任务执行状态之外。 跨市场策略的研究者都有过类似经历:一个同时覆盖 A 股、港股、美股和数字货币的监控任务,跑了几天之后才发现某个品种根本没返回数据。检查日志,每次调用都显示成功——code=0,任务状态正常。 问题不在调用是否成功,而在于:批次成功是任务状态,横截面完整是数据状态。两者必须分别判断。 你把请求发出去,接口返回了,code=0 告诉你工具调用结束。但它不能替你回答:请求的 symbol 全部回来了吗?有没有意外缺失?回来的品种资产类型对吗?有没有你没请求的 symbol 混了进来? 本文不讨论策略怎么写,也不讨论哪个市场值得关注。本文只做一件事:给你一张跨市场数据完整性验收卡,让你在任务上线前,先把“数据到底全不全”这件事独立地管起来。 资产缺失会怎样静默污染下游 假设一个定时任务每天拉取五类资产快照,用于跨市场比价或监控面板。某次请求中,数字货币品种没有返回,但任务仍标记为成功。以下三类问题会安静地发生: 比率计算失真。 计算依赖 A 股和数字货币的价格比,数字货币缺失后,比率要么无法计算,要么被填入上一期缓存值。前者中断任务,后者制造一条看起来正常、实际已经失真的结果。 权重被动偏移。 面板按资产类别分配权重,少了一类资产后,其余类别相对权重提高。波动率、风险暴露的统计口径已经改变,系统不会报错,你也不会立刻察觉。 监控盲区出现。 告警规则是“任意资产波动超过阈值”,缺失的品种不会触发告警。不是市场没波动,是波动没进入系统。 这三类问题的共同特点:静默。 程序没崩溃,任务没报错,结果表正常生成,但计算输入已经不完整。 实测:code=0 对应三种不同的数据状态 以下测试于 2026 年 6 月 13 日通过 TickDB MCP get_ticker 完成。测试只核对返回状态 code、请求 symbol、返回 symbol 和返回资产类型 type。价格和成交量属于动态行情,不作为本文结论依据。 测试一:不传 type,请求五个代表品种。 五个品种(A 股、港股、美股、数字货币、外汇)全部返回,返回的资产类型与实际一致。 测试二:传入 type=stock,请求相同五个品种。 三个股票返回,数字货币和外汇没有返回。code=0 仍然为成功状态。如果程序事先不知道这两个品种会被排除,只看到 code=0 就继续运行——这批数据就是横截面不完整的。 测试三:请求包含一个无效代码。 返回结果中只有有效品种,无效代码静默消失,code=0 仍然为成功状态。如果它不是事先声明的预期排除项,这就是一次意外缺失。 三组结果可以归纳为一张判断表: 本轮调用状态 返回集合状态 数据判断 code=0 请求 symbol 全部返回 完整 code=0 与已验证的预期排除一致 降级 code=0 无效或异常 symbol 静默缺失 不完整 所以,code=0 之后仍然需要一次独立的数据完整性判断。 什么时候放行、什么时候降级、什么时候关闭 在 MCP 调用与下游计算之间,可以增加一道完整性闸门: 任务状态 数据状态 是否放行 处理动作 成功 返回集合完整,无重复,类型一致 放行 正常进入下游 成功 仅缺少已验证的预期排除项 降级放行 记录排除条件和缺失项 成功 存在意外缺失、新增、重复或类型错误 关闭 关闭批次并告警 失败 未获得有效结果 关闭 按错误状态处理 完整批次的标准是:返回集合 = 请求集合 - 预期排除集合,并且没有意外缺失、没有意外新增、请求和返回中没有重复 symbol、返回的资产类型与预期一致、预期排除项没有意外出现在返回中。 跨市场数据完整性验收卡 以下检查清单,建议每次跨市场任务进入下游前逐项确认: 序号 检查项 说明 1 请求前定义预期 记录本次请求的 symbol 和对应资产类型 2 保存请求原始集合 不要依赖后续推断,先存下来 3 验证预期排除项 排除的 symbol 是否针对当前工具已验证 4 提取返回 symbol 和 type 不只看价格,不只看数组是否为空 5 检查请求重复 同一个 symbol 是否在请求中出现了多次 6 检查返回重复 同一个 symbol 是否在返回中出现了多次 7 检查意外缺失 没被排除的 symbol 是否有未返回的 8 检查意外新增 返回中是否出现了没请求过的 symbol 9 检查资产类型错配 返回的 type 是否与请求时声明的一致 10 检查排除项意外返回 已声明排除的品种是否又出现在了返回里 11 关闭批次规则 意外异常必须关闭,不能只打印警告 12 降级批次记录 降级继续时记录排除条件和缺失项 13 下游消费边界 下游只消费通过完整性检查的批次 14 新工具接入验证 新端点、新资产类别接入时重新验证实际行为 把完整性校验写进数据管道 校验可以分三步走。 第一步:请求前定义预期。 记录请求的 symbol 和对应资产类型。如果使用了 type 参数,还要记录哪些 symbol 预计不会返回、这种行为是否已针对当前工具验证、本批次是否允许降级继续。 第二步:返回后提取实际集合。 从返回记录中提取 (symbol, type),不要只提取价格,也不要只检查数组是否为空。 第三步:执行多维比对。 至少检查请求和返回中的重复 symbol、意外缺失、意外新增、资产类型错配,以及预期排除项是否意外返回。任一异常未被解释,都不应进入下游计算。 以 TickDB 这类统一行情 API 为例,同一个接口可以覆盖股票、数字货币、外汇等多类资产的快照查询,返回结构一致,type 字段直接标记资产类型。这让完整性校验可以在统一字段体系下完成——你不需要为每个市场单独写一个校验脚本,只需要维护一份“请求了什么、预期返回什么”的对照表,和实际返回集合做比较。 但必须明确:code=0 只表示工具调用成功,不能替你判断横截面是否完整。 这份判断,只能由你的程序对照请求集合、返回集合和预期排除集合来完成。任何接口都无法自动知道你本意要请求哪些品种、容忍哪些缺失——这是数据管道的工程责任,不是 API 能替你做的决策。 不能从本文推出什么 三组测试结果仅来自 2026 年 6 月 13 日的 TickDB MCP get_ticker 调用,不代表其他工具具有相同行为。 MCP 实测不能直接证明 REST、WebSocket、K 线或逐笔接口的行为。 五个代表品种成功返回,不表示所有品种在所有时间均可用。 下游比率失真、权重偏移和监控盲区属于工程风险推演,不是 MCP 返回结论。 本文不涉及策略收益、回测绩效或买卖决策。 可保存的验收卡速查版 请求 symbol 和预期资产类型已定义。 请求原始集合已保存。 预期排除项已验证。 返回 (symbol, type) 已提取。 请求重复已检查。 返回重复已检查。 意外缺失已检查。 意外新增已检查。 资产类型错配已检查。 排除项意外返回已检查。 意外异常会关闭批次。 降级批次已记录排除条件。 下游只消费通过检查的批次。 新工具接入时重新验证。 跨市场数据任务真正需要判断的,不只是“请求有没有成功”,而是:我要求的数据是否不多、不少、类型正确地回来了。 只看 code=0,你知道的是工具调用结束了。核对请求集合、返回集合和资产类型之后,你才知道这批数据是否可以进入下游。 免责声明:本文仅讨论跨市场量化任务中的数据完整性校验与工程治理方法,不构成任何投资建议。文中不包含对任何策略有效性的评价,不推荐任何具体证券或交易方向,不对未来收益做任何暗示。所有接口描述仅为说明数据校验的工程框架,不代表特定产品的功能承诺。 标签:#跨市场策略 #行情数据完整性 #批次校验 #统一行情API #量化数据治理 #MCP #TickDB 选股是量化里最高频的需求。 大多数人的做法是打开行情软件,手动翻看自选股、刷涨幅榜,或者跟着论坛帖子追热点。这种方式在股票数量少的时候还行,一旦想覆盖全市场——沪深京超过 5000 只股票——就完全靠不住了。 程序化选股的思路很直接:把全市场数据拉下来,按你定义的规则过滤,剩下的就是候选列表。这件事听起来需要很大的数据工程量,但如果数据接口支持"全市场池查询",整个流程可以压缩到十几行 Python。 这篇文章用 AlphaFeed 的 Universe 接口做一个完整的全市场扫描选股系统,覆盖几种常见的筛选逻辑。 1. 全市场行情快照:一行代码拿到所有 A 股 AlphaFeed 的 af.quotes.get(universes="CN_Stock") 可以一次性获取全部 A 股的实时行情快照: from alphafeed import AlphaFeed af = AlphaFeed() all_cn = af.quotes.get(universes="CN_Stock", to_dataframe=True) print(f"A 股标的总数: {len(all_cn)}") print(all_cn[["symbol", "last_price", "prev_close", "volume", "amount"]].head(10)) 返回的每一行包含当前价格、昨收、成交量、成交额等字段,相当于你自己做了一个全市场实时扫描器的数据底座。 如果你还想看 ETF,可以加一个池: all_etf = af.quotes.get(universes="CN_ETF", to_dataframe=True) print(f"ETF 标的总数: {len(all_etf)}") 注意:Universe 查询需要 Starter 及以上的订阅权限。免费版可以先用 symbols 参数指定具体股票来练手。 2. 第一个筛选器:涨幅 + 成交额 最基础的选股条件:今天涨了,而且成交额达标(排除冷门票和异常波动)。 import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() df = af.quotes.get(universes="CN_Stock", to_dataframe=True) df["change_pct"] = (df["last_price"] - df["prev_close"]) / df["prev_close"] selected = df[ (df["change_pct"] > 0.02) & (df["change_pct"] < 0.098) & (df["amount"] > 5e8) ].copy() selected = selected.sort_values("change_pct", ascending=False) print(f"符合条件的标的: {len(selected)} 只") print(selected[["symbol", "last_price", "change_pct", "amount"]].head(20)) 这里 change_pct < 0.098 是为了排除涨停板——涨停意味着你大概率买不进去,放在选股结果里没有实操意义。 amount > 5e8 是成交额超过 5 亿元,保证流动性。这个阈值可以根据你的资金量调整: 资金量级 建议成交额下限 10 万以下 1 亿 10–100 万 3 亿 100 万以上 5 亿+ 3. 量价异动选股:放量突破 单纯看涨幅意义有限——涨 3% 但缩量可能是虚涨,涨 3% 且放量才可能是资金在推。 问题在于,判断"放量"需要历史成交量来做基准。我们可以用最近 20 天的日均成交量作为参考: import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() df_today = af.quotes.get(universes="CN_Stock", to_dataframe=True) df_today["change_pct"] = (df_today["last_price"] - df_today["prev_close"]) / df_today["prev_close"] candidates = df_today[ (df_today["change_pct"] > 0.01) & (df_today["amount"] > 3e8) ].copy() symbols = candidates["symbol"].tolist() if len(symbols) > 200: symbols = symbols[:200] klines = af.klines.batch( symbols, period="1d", count=20, adjust="forward", to_dataframe=True, show_progress=True, ) vol_ratio_list = [] for sym, kdf in klines.items(): if len(kdf) < 10: continue avg_vol = kdf["volume"].mean() today_vol = candidates.loc[candidates["symbol"] == sym, "volume"].values if len(today_vol) == 0 or avg_vol == 0: continue ratio = today_vol[0] / avg_vol vol_ratio_list.append({ "symbol": sym, "vol_ratio": round(ratio, 2), "change_pct": candidates.loc[candidates["symbol"] == sym, "change_pct"].values[0], "amount": candidates.loc[candidates["symbol"] == sym, "amount"].values[0], }) vol_df = pd.DataFrame(vol_ratio_list) vol_df = vol_df[vol_df["vol_ratio"] > 2.0].sort_values("vol_ratio", ascending=False) print(f"放量突破标的: {len(vol_df)} 只") print(vol_df.head(20)) vol_ratio > 2.0 表示今日成交量是近 20 日均值的 2 倍以上。这个倍数越大,信号越强烈,但也要注意区分"放量上涨"和"放量出货"。 4. 动量选股:最近 N 天涨幅排名 另一种经典选股思路是动量因子——过去一段时间涨得好的股票,短期内可能继续涨(当然也可能反转,这就是为什么你需要回测)。 import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() df_today = af.quotes.get(universes="CN_Stock", to_dataframe=True) liquid = df_today[df_today["amount"] > 3e8].copy() symbols = liquid["symbol"].tolist() if len(symbols) > 500: symbols = symbols[:500] klines = af.klines.batch( symbols, period="1d", count=20, adjust="forward", to_dataframe=True, show_progress=True, ) momentum_list = [] for sym, kdf in klines.items(): kdf = kdf.sort_values("trade_date").reset_index(drop=True) if len(kdf) < 15: continue ret_20d = kdf["close"].iloc[-1] / kdf["close"].iloc[0] - 1 momentum_list.append({ "symbol": sym, "name": kdf["name"].iloc[0] if "name" in kdf.columns else sym, "momentum_20d": round(ret_20d, 4), "close": kdf["close"].iloc[-1], }) mom_df = pd.DataFrame(momentum_list) mom_df = mom_df.sort_values("momentum_20d", ascending=False) print("=== 20 日动量 Top 20 ===") print(mom_df.head(20).to_string(index=False)) print("\n=== 20 日动量 Bottom 10(反转候选?)===") print(mom_df.tail(10).to_string(index=False)) 动量选股经常出现在因子投资研究中。学术上一般用过去 12 个月收益(扣掉最近 1 个月)做截面排序。上面用 20 天只是一个短周期版本,适合快速筛选近期趋势股。 5. 技术面选股:均线多头排列 均线多头排列是很多技术面选股系统的基本条件之一:5 日均线 > 10 日均线 > 20 日均线 > 60 日均线,说明各周期趋势一致向上。 import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() df_today = af.quotes.get(universes="CN_Stock", to_dataframe=True) liquid = df_today[df_today["amount"] > 3e8].copy() symbols = liquid["symbol"].tolist()[:500] klines = af.klines.batch( symbols, period="1d", count=80, adjust="forward", to_dataframe=True, show_progress=True, ) bullish_list = [] for sym, kdf in klines.items(): kdf = kdf.sort_values("trade_date").reset_index(drop=True) if len(kdf) < 60: continue ma5 = kdf["close"].rolling(5).mean().iloc[-1] ma10 = kdf["close"].rolling(10).mean().iloc[-1] ma20 = kdf["close"].rolling(20).mean().iloc[-1] ma60 = kdf["close"].rolling(60).mean().iloc[-1] if ma5 > ma10 > ma20 > ma60: bullish_list.append({ "symbol": sym, "name": kdf["name"].iloc[0] if "name" in kdf.columns else sym, "close": kdf["close"].iloc[-1], "ma5": round(ma5, 2), "ma10": round(ma10, 2), "ma20": round(ma20, 2), "ma60": round(ma60, 2), }) bull_df = pd.DataFrame(bullish_list) print(f"均线多头排列标的: {len(bull_df)} 只") print(bull_df.head(20).to_string(index=False)) 这种筛选的作用不是直接告诉你"该买什么",而是缩小研究范围。从 5000 只缩到 50 只,然后你再对这 50 只做进一步分析(看基本面、行业逻辑、估值等)。 6. 组合条件选股:把多个信号叠加 实战中很少用单一条件选股。更常见的做法是把几个条件叠起来——涨幅适中、放量、动量为正、均线方向一致: import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() df_today = af.quotes.get(universes="CN_Stock", to_dataframe=True) df_today["change_pct"] = (df_today["last_price"] - df_today["prev_close"]) / df_today["prev_close"] liquid = df_today[ (df_today["amount"] > 5e8) & (df_today["change_pct"] > 0) & (df_today["change_pct"] < 0.098) ].copy() symbols = liquid["symbol"].tolist()[:300] klines = af.klines.batch( symbols, period="1d", count=80, adjust="forward", to_dataframe=True, show_progress=True, ) results = [] for sym, kdf in klines.items(): kdf = kdf.sort_values("trade_date").reset_index(drop=True) if len(kdf) < 60: continue ma5 = kdf["close"].rolling(5).mean().iloc[-1] ma20 = kdf["close"].rolling(20).mean().iloc[-1] ma60 = kdf["close"].rolling(60).mean().iloc[-1] is_bullish = ma5 > ma20 > ma60 avg_vol = kdf["volume"].iloc[-20:].mean() today_row = liquid[liquid["symbol"] == sym] if today_row.empty or avg_vol == 0: continue vol_ratio = today_row["volume"].values[0] / avg_vol ret_20d = kdf["close"].iloc[-1] / kdf["close"].iloc[-20] - 1 if is_bullish and vol_ratio > 1.5 and ret_20d > 0.05: results.append({ "symbol": sym, "name": kdf["name"].iloc[0] if "name" in kdf.columns else sym, "close": kdf["close"].iloc[-1], "change_pct": round(today_row["change_pct"].values[0], 4), "vol_ratio": round(vol_ratio, 2), "momentum_20d": round(ret_20d, 4), }) final = pd.DataFrame(results).sort_values("momentum_20d", ascending=False) print(f"组合条件选出: {len(final)} 只") print(final.to_string(index=False)) 这段代码的逻辑是: 流动性门槛:成交额 > 5 亿 今日上涨但未涨停:排除无法买入和无涨幅的标的 均线多头:MA5 > MA20 > MA60 放量:量比 > 1.5 20 日动量为正:涨幅 > 5% 你可以根据自己的交易风格调整任何一个参数。 7. 把选股结果保存下来 选股不是看一眼就完了。你需要把每天的结果存下来,才能回头验证"上周选出来的票,后来表现怎么样"。 import json from datetime import datetime output = { "scan_time": datetime.now().isoformat(), "filter_desc": "bullish_ma + vol_ratio>1.5 + momentum_20d>5%", "count": len(final), "symbols": final.to_dict(orient="records"), } filename = f"scan_{datetime.now().strftime('%Y%m%d_%H%M')}.json" with open(filename, "w", encoding="utf-8") as f: json.dump(output, f, ensure_ascii=False, indent=2) print(f"已保存到 {filename}") 长期积累下来,你会有一个选股信号和后续表现的对照数据库。这是做因子研究和信号评价的基础素材。 8. 定时运行:让选股每天自动跑 如果你不想每天手动执行,可以把脚本做成定时任务。 Linux/macOS 上用 crontab: # 每个交易日 14:30 运行一次 30 14 * * 1-5 cd /path/to/project && uv run python scan_stocks.py >> scan.log 2>&1 或者用 Python 的 schedule 库在一个长驻进程里循环: import schedule import time def daily_scan(): # 把上面的选股逻辑封装成函数 print("开始全市场扫描...") run_composite_scan() print("扫描完成") schedule.every().day.at("14:30").do(daily_scan) while True: schedule.run_pending() time.sleep(60) 9. 从扫描到策略:下一步怎么走 全市场选股本身不是策略,它是策略的输入端。拿到候选列表之后,你还需要回答几个问题: 问题 可能的方向 选出来的票后续表现如何? 对历史数据做回测:每天选出 Top 10,等权持有 5 天,看收益 哪些筛选条件贡献最大? 因子重要性分析:单独测试每个条件的 IC 值 会不会选出太多垃圾票? 加入基本面过滤(市值、行业、ST 剔除等) 参数是不是过拟合? 用滚动窗口做样本外检验 实盘能不能执行? 考虑滑点、涨停无法买入、停牌复牌等情况 全市场扫描给了你一个程序化的起点。有了这个起点,后面不管你是做日线轮动、周线动量、还是事件驱动,都有一个可复用的数据获取和筛选框架。 结语 选股的本质是"在大量标的中快速缩小注意力范围"。 传统方式是靠人肉翻看、靠消息面、靠别人的推荐。程序化方式是定义规则、全市场扫描、存档结果、持续验证。 AlphaFeed 的 Universe 查询让"全市场快照"这件事变得很轻——一个 API 调用就能拿到所有 A 股的实时数据。在此基础上,筛选逻辑、组合条件、定时运行、信号存档,全部用 Python 搭起来。 不要期望一个选股条件能"选出必涨的票"。但一个持续运行的选股系统,可以帮你系统性地观察市场、积累数据、迭代方法。 相关链接: AlphaFeed 官网:https://alphafeed.org/ Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart 全市场行情文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart 公开版白皮书 A股多因子共振强势股策略 - 公开版白皮书 ================================================================================ 【策略名称】 多因子共振强势股低吸策略 【策略开发者】 个人量化研究者 【开发平台】 同花顺SuperMind量化交易平台 【策略类型】 中短线量化策略 | 技术面为主 | 智能风控型 ================================================================================ 一、策略核心理念(公开版) 【底层逻辑】 "强势股回踩短期均线低吸 + 多因子共振确认 + 智能动态风控" 【核心假设】 强势股在上涨过程中会回踩短期均线 回踩时如果量价配合健康、大盘环境允许,反弹概率高 通过严格的多因子过滤,提高入场胜率 通过动态仓位和智能止损,控制下行风险 【策略优势】 • 不预测市场,只跟随强势股 • 严格风控,单笔亏损可控 • 适应多种市场环境(牛/熊/震荡) • 全自动交易,无需盯盘 ================================================================================ 二、策略框架(公开版) 【选股维度】 本策略采用多维度因子共振选股,主要维度包括: 板块与基本面过滤 • 仅交易流动性好的主板标的 • 排除风险类股票(ST、退市等) 相对强度筛选 • 基于个股与大盘的相对强弱关系 • 确保选中的是市场中的强势股 技术形态确认 • 识别强势股回踩短期均线的技术形态 • 区分"健康回踩"与"趋势破位" 量价关系验证 • 回踩过程中成交量特征分析 • 确认抛压减轻、筹码稳定 动量指标过滤 • 基于RSI等动量指标的健康区间判断 • 避开极端超买超卖区域 波动率控制 • 基于ATR等波动率指标筛选 • 排除波动过大的标的 大盘环境判断 • 多维度大盘趋势评分系统 • 根据市场环境动态调整操作频率 【交易规则框架】 买入规则: • 触发条件:多因子全部满足 • 买入价格:次日开盘价(避免收盘价后视镜) • 仓位控制:根据大盘评分动态调整 • 持仓上限:严格限制最大持仓数量 • 单日买入上限:控制单日操作频率 卖出规则: • 技术止损:跌破关键均线或前低 • 动态止损:基于个股波动率自适应调整 • 固定止损:设置最大可承受亏损比例 • 分批止盈:盈利后分阶段减仓锁定利润 • 移动止盈:盈利超目标后回撤保护 • 持仓期满:强制平仓避免长期套牢 连败保护: • 连续亏损后自动降低仓位 • 防止连续亏损导致心态崩溃 • 盈利后恢复正常操作节奏 ================================================================================ 三、回测结果(四时段验证) 【验证方法】 将策略分别回测四个完全不同的市场环境,验证稳定性 ┌─────────────────┬────────────┬────────────┬────────────┬────────────┐ │ 指标 │ 2020-2021 │ 2021-2022 │ 2022 │ 2025-2026 │ │ │ 牛市 │ 震荡市 │ 熊市 │ 反弹/牛市 │ ├─────────────────┼────────────┼────────────┼────────────┼────────────┤ │ 总收益率 │ +411.6% │ +181.6% │ +92.1% │ +127.8% │ │ 年化收益率 │ +131.6% │ +70.5% │ +96.3% │ +132.4% │ │ 超额收益 │ +391.0% │ +207.3% │ +113.8% │ +105.1% │ │ 最大回撤 │ 19.28% │ 23.62% │ 18.65% │ 15.71% │ │ 夏普比率 │ 4.12 │ 2.19 │ 3.14 │ 3.36 │ │ 胜率 │ 55.14% │ 52.58% │ 51.24% │ 54.92% │ │ Alpha │ 1.23 │ 0.80 │ 1.12 │ 1.02 │ │ Beta │ 0.76 │ 0.72 │ 0.71 │ 1.34 │ └─────────────────┴────────────┴────────────┴────────────┴────────────┘ 【综合表现】 • 平均年化收益率:107.7% • 平均最大回撤:19.3% • 平均夏普比率:3.20 • 平均胜率:53.5% 【核心结论】 ✓ 策略穿越牛熊,在所有市场环境中均大幅跑赢大盘 ✓ 回撤控制稳定,始终控制在25%以内 ✓ 胜率稳定,始终超过50% ✓ 夏普比率始终>2,风险收益比优秀 ================================================================================ 四、风险控制体系(公开版) 【事前风控】 多因子共振选股,提高入场胜率 大盘环境过滤,避免逆势操作 行业分散,控制单一行业集中度 【事中风控】 动态仓位管理,根据市场环境自适应调整 智能止损系统,根据个股特性动态调整 分批止盈策略,保护利润同时让利润奔跑 连败保护机制,防止连续亏损心态崩溃 【事后风控】 定期评估策略有效性(每季度) 回撤超阈值时暂停策略,复盘原因 连续跑输大盘时重新评估策略逻辑 ================================================================================ 五、策略特点与适用人群 【策略特点】 ✓ 全自动交易,无需盯盘 ✓ 中短线策略,持仓周期3-10天 ✓ 适应多种市场环境(牛市/熊市/震荡市) ✓ 风险可控,单笔亏损有限 ✓ 经过四年四种市场环境验证 【适用人群】 • 有一定风险承受能力的投资者 • 希望获得超额收益的进阶投资者 • 没有时间盯盘的上班族 • 相信量化投资的理性投资者 【不适用人群】 • 风险厌恶型投资者(无法接受20%以上回撤) • 追求保本保息的投资者 • 频繁干预策略的投资者 ================================================================================ 六、合作方式(欢迎洽谈) 【方式一:技术入股】 • 合作模式:您出资金,我出策略 • 收益分成:资金方70%,策略方30% • 亏损承担:资金方100% • 适合对象:有资金但没时间/没策略的投资者 • 合作流程:模拟验证→小资金实盘→逐步加仓 【方式二:策略授权】 • 合作模式:一次性授权费 + 业绩提成 • 授权费用:根据策略规模协商(面议) • 业绩提成:盈利的10%-20% • 适合对象:私募、资管、家办等专业机构 • 交付内容:完整策略代码 + 使用培训 + 季度优化 【方式三:联合开发】 • 合作模式:共同出资,共同开发优化 • 收益分配:按出资比例分配 • 适合对象:志同道合的量化爱好者 • 合作内容:策略优化、新策略开发、资源共享 【合作保障】 先进行3个月模拟交易验证 再小资金(10万)实盘测试6个月 确认稳定后再逐步扩大规模 签署正式合作协议,明确权责利 【联系方式】 请通过平台私信或邮件联系,非诚勿扰 ================================================================================ 七、免责声明 本策略回测结果基于历史数据,不代表未来收益 任何投资都有风险,过往业绩不代表未来表现 投资者应根据自身风险承受能力谨慎决策 本策略仅供参考,不构成投资建议 实盘交易前建议先进行模拟交易验证 策略合作需签署正式协议,明确风险承担 ================================================================================ 八、关于策略细节说明 【为什么不公开具体参数?】 策略的核心价值在于: 独特的因子组合逻辑 经过验证的参数优化 完善的风控体系设计 长期稳定的实盘表现 这些是经过大量时间投入和反复验证形成的核心竞争力, 因此具体参数和代码仅在正式合作后提供。 【如何验证策略真实性?】 查看回测报告(本平台可公开验证) 要求进行模拟交易验证(3个月免费) 小资金实盘测试(10万,6个月) 观察策略在不同市场环境中的表现 【策略的持续优化】 策略会定期进行: • 季度有效性评估 • 参数适应性调整 • 新因子测试与纳入 • 风控体系优化 确保策略在不同市场周期中保持竞争力。 =============================================================================== 版本:公开版V1.0 日期:2026-06-13 完整版仅提供给正式合作方 ================================================================================ 一、量化实验室是什么? 量化实验室是SuperMind量化平台最新推出的AI功能,它不是再给你一堆冷冰冰的工具,而是用AI Agent把你的投研想法变成现实——无论是复杂的因子研究,还是策略的代码生成与回测,统统交给它。 重磅加码:现在体验,每周额度直接翻4倍!(原50 Credits/周,限时升级至200 Credits/周)。活动截止至 2026-06-14 23:59:59,快来试试AI如何重塑你的量化研究! 1.1 因子研究 支持从研究想法、已有公式或研报逻辑出发,Agent自动生成因子表达式并回测验证。适合把“我想研究某个市场规律”这类想法,快速变成可以检验的数据结果。 1.2 策略代码生成 用自然语言描述策略逻辑,Agent自动生成可执行源码并回测: 支持Python策略和公式策略两种类型 Python策略适合选股、多因子、择时、风控、资金管理等复杂逻辑 公式策略适合单标的择时、技术指标、期货或股票的轻量策略 生成策略源码后自动执行回测,结果文件里能看到指标、交易记录和策略表现 支持多轮对话,哪里不满意就直接说,Agent继续改代码、重新跑结果 二、支持的策略类型 量化实验室支持两种策略类型:Python策略和公式策略。两者定位不同,各有适用场景。 2.1 Python策略 Python策略自由度更高,适合把一套完整交易框架写出来: 多股票选股:支持从指数成分股、行业板块或全A股票池中筛选股票 多因子模型:打分排名、因子回归、因子中性化 复杂风控:动态止损、移动止盈、仓位控制、个股持仓上限 灵活调仓:日、周、月任意频率,支持条件触发 完整回测:生成策略源码后直接执行回测,沉淀结果报告 2.2 公式策略 公式策略基于同花顺指标公式语法,更适合单标的、技术指标型策略: 单标的回测:主要针对单只股票、指数或期货合约 技术指标:MACD、KDJ、布林带等经典指标 交易信号:金叉死叉、突破、超买超卖、ATR波动突破 期货策略:日内交易、趋势跟踪、止损止盈规则 2.3 两者对比 能力 Python策略 公式策略 选股范围 全市场动态股票 提前指定单只标的 择时逻辑 任意复杂 指标信号、突破信号等 风控体系 动态止损、移动止盈、仓位管理 简单止盈止损 资金管理 等权、市值加权、风险平价 简单资金调整 因子研究 多因子打分、排名、回归 不支持 编程语法 Python 同花顺公式 回测结果文件 strategy_backtest_*.md funcat_backtest_*.md 适用场景 A股选股、多因子策略 股票/期货单标的择时 2.4 如何选择? 想做A股选股、多因子策略 → 选Python策略 想做股票/期货日内、单标的技术指标择时 → 选公式策略 不确定 → 选Python策略,通用性更强 三、使用方法 3.1 整体流程 进入量化实验室 → 选择Agent → 描述策略 → AI生成代码 → 自动回测 → 查看结果 → 多轮优化 3.2 第一步:进入量化实验室 打开 同花顺SuperMind量化平台 注册登录(同花顺账号通用) 点击上方导航栏「我的研究」-「量化实验室」 3.3 第二步:选择Agent 根据你的需求选择合适的Agent: Agent 适用场景 量化助手 生成Python策略或公式策略,并执行回测(最常用) 因子研究Agent 从研究想法出发,生成因子 因子复现Agent 把公式/伪代码翻译成可执行表达式 生成策略代码时,直接选择「量化助手」即可。在使用时,最好在描述中明确说“生成Python策略”或“生成公式策略”,否则Agent可能会理解错方向。 3.4 第三步:描述你的策略 用大白话把策略逻辑讲清楚,关键是这几个要素: 要素 说明 示例 买什么 股票池 "沪深300成分股"、"全A股剔除ST" 什么时候买 开仓条件 "金叉买入"、"突破20日高点" 什么时候卖 平仓条件 "死叉卖出"、"亏损5%止损" 怎么分钱 资金管理 "等权重"、"按因子加权" 回测区间 起止时间 "2023年到2024年" 回测频率 运行频率 "日频"、"5分钟频率" 基准指数 对比基准 "沪深300"、"中证500" 描述示例: 写一个Python策略: - 股票池:沪深300成分股 - 买入:5日均线上穿20日均线,次日开盘买 - 卖出:5日均线下穿20日均线,次日开盘卖 - 资金:每笔买入5万 - 回测:2023-2024年,初始资金1000万,日频 公式策略可以这么说: 生成一个公式策略: - 标的:300033.SZ - 信号:收盘价上穿20日均线买入,下穿20日均线卖出 - 风控:亏损5%止损,盈利后从最高点回撤3%止盈 - 回测:2023-2025年,日频 3.5 第四步:查看回测结果 AI生成代码并执行回测后,策略源码和回测结果会保存到文件中: Python策略:strategy_backtest_*.md 公式策略:funcat_backtest_*.md 报告通常包含: 核心指标:总收益率、年化收益率、最大回撤、夏普比率、胜率、盈亏比、交易次数 净值曲线:策略收益 vs 基准收益 3.6 第五步:多轮优化 不满意?直接告诉AI怎么改: # 加个过滤条件 在刚才基础上,加个成交量过滤,金叉时成交量要大于5日均量的1.5倍 # 优化风控 再加个动态止损:从最高点回撤5%止损,同时3%移动止盈 # 调整参数 把MACD参数改成(8,17,9),回测时间延长到2024年 每一轮AI都会自动修改代码、重新回测、出新报告。反复调整,直到满意为止。 当然,AI生成的代码也需要用户自己甄别。它能大幅降低从想法到回测的门槛,但重要参数、交易假设和异常结果仍然建议自己再检查一遍。 3.7 剩余额度查看 四、实战案例 案例1:双均线公式策略 策略思路:最经典的趋势跟踪策略。收盘价上穿20日均线买入,下穿20日均线卖出,再加上止损止盈。这个案例适合用公式策略快速上手。 你怎么说: 生成一个公式策略: 1. 回测标的: - 标的:同花顺 - 频率:日频 - 回测区间:2023-01-01 至 2025-01-01 2. 开仓条件: - 计算20日收盘价均线MA20 - 当收盘价从下方上穿MA20时买入 3. 平仓条件: - 当收盘价从上方下穿MA20时卖出 - 买入后亏损达到5%时止损 - 买入后盈利创新高,再从最高点回撤3%时止盈 案例2:动量选股+止损策略 策略思路:选近期涨得好的股票(动量效应),但排除涨太多的(避免追高),加上硬性止损保护。 你怎么说: 生成一个Python选股策略: 1. 选股条件: - 股票池:中证500成分股 - 剔除ST股、停牌股、上市不足120日的股票 - 过去20日收益率排名前20%(动量强) - 过去5日平均换手率大于3%(确保流动性) - 排除过去20日涨幅超过30%的股票(避免追高) 2. 开仓条件: - 每周一开盘时,根据上述条件筛选出目标股票池 - 买入所有符合条件的股票,以开盘价执行 3. 平仓条件: - 每周一调仓时,不在新目标池中的股票全部卖出 - 个股亏损达到8%,无论是否到调仓日,立即止损卖出 - 个股盈利达到20%止盈 4. 资金分配: - 初始资金100万 - 持仓上限20只股票 - 采用等权重分配:总资金/持仓股票数 = 每只股票的分配金额 - 如果筛选出的股票超过20只,按动量排名取前20只 - 买入时按100股整数倍取整 5. 回测参数: - 回测区间:2022-01-01 至 2024-12-31 - 基准指数:中证500 - 初始资金:100万 - 回测频率:分钟 案例3:资金流向+波动率复合策略 策略思路:跟着主力资金走,但要选波动适中的股票(资金流入说明有人看好,波动适中说明走势稳健)。 你怎么说: 设计一个Python策略: 1. 选股条件: - 股票池:全A股(剔除ST股、停牌股、上市不足120日的次新股) - 因子1 - 资金流向:过去5日主力资金净流入(大单+特大单买入 - 大单+特大单卖出)/ 总成交额 > 0 - 因子2 - 波动率:过去20日收益率的年化波动率,要求处于全市场中位数±1个标准差之间 - 两个条件同时满足才入选 2. 开仓条件: - 每两周的第一个交易日开盘时执行选股 - 买入所有符合条件的股票 3. 平仓条件: - 每两周调仓时,不在新目标池中的股票全部卖出 - 个股亏损达到10%,立即止损 - 个股持有超过30个交易日仍未盈利,考虑卖出(避免长期套牢) 4. 资金分配: - 初始资金100万 - 持仓上限15只股票 - 采用等权重分配:可用资金/新买入股票数 - 卖出股票释放的资金,在下一个调仓日再分配 - 保留5%的现金作为缓冲,避免频繁满仓操作 5. 调仓频率: - 每两周调仓一次(即每10个交易日) 6. 回测参数: - 回测区间:2023-01-01 至 2024-12-31 - 基准指数:中证800 - 初始资金:100万 - 回测频率:分钟 案例4:多因子打分排名策略 策略思路:综合多个维度给股票打分,选出综合表现最好的。类似基金公司的量化选股模型。 你怎么说: 创建一个多因子Python策略: 1. 选股条件: - 股票池:沪深300成分股 - 剔除ST股、停牌股 - 三个因子,各自权重: - PE_TTM(市盈率,越低越好):权重30% - ROE(净资产收益率,越高越好):权重40% - 过去60日收益率(动量,越高越好):权重30% - 对每个因子进行标准化打分(0-100分) - 加权计算综合得分 = PE得分×30% + ROE得分×40% + 动量得分×30% - 选择综合得分排名前20的股票 2. 开仓条件: - 每月第一个交易日开盘时执行选股 - 买入综合得分前20名的股票 3. 平仓条件: - 每月调仓时,不在新目标池中的股票全部卖出 - 个股亏损达到15%,立即止损 - 如果某只股票连续两个月综合得分跌出前30名,下个月强制卖出 4. 资金分配: - 初始资金100万 - 固定持仓20只股票 - 采用等权重分配:总资金/20 = 每只股票5万元 - 调仓时,先卖出需要清仓的股票,再买入新股票 - 买入顺序按综合得分从高到低,确保高分股票优先获得资金 - 如果资金不足,优先买入得分最高的股票 5. 调仓频率: - 每月第一个交易日调仓 6. 回测参数: - 回测区间:2022-01-01 至 2024-12-31 - 基准指数:沪深300 - 初始资金:100万 - 回测频率:日频 五、常见问题 Q:AI生成的代码一定正确吗? A:不一定。AI能显著提高从想法到回测的速度,但生成代码、回测参数和交易假设仍然需要自己甄别,尤其是用于真实交易前。 Q:生成的代码有bug怎么办? A:直接告诉AI“回测报错了,错误信息是xxx”,它会根据报错继续修改代码并重新回测。 Q:生成后还能继续改吗? A:可以。比如“加一个成交量过滤”“把止损从8%改成5%”“回测区间延长到2025年”,都可以在同一个会话里继续说。 Q:策略能导出到本地吗? A:可以。Python策略会沉淀Python源码和 strategy_backtest_*.md 报告,公式策略会沉淀公式策略结果和 funcat_backtest_*.md 报告。 Q:可以免费使用吗? A:我们为每位用户每周提供了50 Credits的体验额度,可以满足多个策略代码生成任务。2026-06-14 23:59:59前体验额度限时4倍! 六、总结 传统方式 量化实验室方式 学Python语法 → 学量化框架 → 写代码 → 调试 → 回测 说策略想法 → 生成Python/公式策略 → 自动回测 → 看报告 耗时:几天到几周 耗时:几分钟 不管你是量化新手想入门,还是老手想快速验证想法,SuperMind量化实验室都值得一试。尤其是策略代码生成这一步,它把“我有个策略想法”和“我看到了回测结果”之间的距离,压到了几分钟。 【重磅更新】 支持生成和执行通用代码 除策略代码外,量化实验室目前也支持生成通用python代码并执行,例如可以做数据处理、分析、可视化输出等。 与量化平台其他功能进行交互 supermind-cli 是Agent与SuperMind 量化平台进行交互的skill,可以让用户快速完成策略管理、回测与自选板块管理等。 管理个人策略仓库 将AI 生成的策略同步至云端仓库,或拉取其他策略的代码。推送后可以在“我的策略”-“策略研究”中看到这个策略。 示例:“把刚才写好的双均线策略推送到策略仓库里,命名为神奇均线”、“帮我看看云端现在有哪些策略” 异步回测 推送完成后可以发起异步回测任务。回测完成之后可在“我的策略”-“策略研究”-“回测列表”中查看回测详情。 示例:“用过去两年的数据跑一下这个策略的回测,初始资金500W” 维护自选板块 新增、更新或查询自选板块,添加后同花顺行情客户端可见。 示例:“帮我把这几只白酒股加到自选板块里”、“查一下我现在的自选板块都有哪些股票” 相关链接: AI Lab帮助文档 API文档 因子研究指南 回测引擎说明 行情监控程序断线了。做过实盘或仿真的人对这一幕都不陌生。网络抖动、交易所维护、程序异常——原因可以列一长串,但多数人的第一反应高度一致:重连成功,数据回来,策略接着跑。 问题恰恰出在这里。重连成功不等于数据连续。 断线窗口内可能已经发生过一轮完整波动,而重连后涌入的第一条数据,可能与断线前的最后一条之间存在跳跃、重叠或空洞。不经检查就直接恢复策略,等于让策略在一条被撕裂过的数据流上继续做决策。 本文不讨论策略该如何写,也不讨论断线后是否该平仓。本文只交付一件事:一张断线窗口审计卡,让你在恢复策略前,用六项检查确认数据流是否真的愈合了。 断线恢复需要的不是重连,是三个确认 重连解决网络层的问题,应用层还要再确认三件事: 当前状态是否已校准——策略手里那张“地图”,是断线前的旧快照,还是重连后的最新行情? 空窗是否被标记——断线期间的数据空洞,是被明确记录下来了,还是在复盘时被误读为“没有波动的安静时间”? 回补数据是否清楚自己的粒度上限——K 线能告诉你这一分钟的开盘价和收盘价,但不能还原逐笔过程。策略需要的精度,回补数据给不给得了? 这三项确认合在一起,才是应用层对“断线恢复”的完整回答。缺任何一项,策略都可能在一根你以为完整、实际存在裂痕的管道上运行——这些裂痕不会立刻报错,它们会安静地污染信号、回测和复盘结论,直到很久之后你才发现,有些异常信号不是策略的问题,而是数据根本没对齐。 断线窗口审计卡 以下六项检查,建议在每次断线恢复后、策略恢复前逐条核验。 检查项 查什么 常见错误 最小修正 ① 断线起止时间 断线发生和重连成功的时间是否已精确记录 日志里只写了“连接断开”,没有时间戳,事后无法确定窗口长度 断线事件触发时立即记录系统时间戳;重连成功后再记一条。差值就是你策略“在黑暗中运行”的时间窗口 ② 当前状态校准 策略恢复后第一条行情数据是来自内存缓存,还是从数据源重新拉取的最新状态 沿用断线前的最后一笔缓存价格继续计算信号,断线期间价格已大幅变化却不自知 重连后显式拉取一次当前快照,覆盖内存状态,作为策略恢复的起点 ③ 空窗区间标记 断线起止之间,数据流里是否有明确的占位标记表示“此处无数据” 重连后数据直接接上新推送,中间不留任何痕迹;复盘时空窗被误读为平静期 在数据流中显式插入空窗标记,包含起止时间和标记类型,让下游程序能识别不可靠区间 ④ K线/聚合数据粒度 回补的K线或聚合数据时间粒度是多少,对策略是否足够 用1分钟K线回补断线缺口,直接当成数据已补齐并继续高频信号分析 明确记录回补数据的类型和粒度;K线不能恢复逐笔,聚合数据只能做有限回补。若策略需要逐笔精度,这部分信号就是不可恢复的 ⑤ 异动先查数据健康 重连后检测到价格跳空或成交量异常时,第一步是区分“市场异动”还是“数据断线造成” 断线恢复后第一根K线显示价格变化,直接触发异动告警,实际可能是时间戳偏差或重复推送 在异动判断逻辑中加一层数据健康检查:对重连后前N条数据先检查时间戳连续性、重复性、与当前快照的一致性 ⑥ 审计日志留存 断线事件、重连动作、校准操作、空窗标记、回补数据来源与粒度是否完整记录 手动重启策略后没有留存原始输入和处理动作,事后无法复现异常信号的原因 审计日志至少保留原始输入和处理动作,确保任何排查都有据可查 一个可复核的分工框架 把断线恢复拆成三个动作,对应三种数据形态的分工——这不是产品功能清单,而是帮你理清什么能补、什么不能补的工程框架: 当前状态校准 → 用快照。重连后第一时间拉取最新 ticker,覆盖过期状态,回答“策略现在站在哪里”。 有限历史回补 → 用 K 线。填补聚合数据缺口,但需明确粒度限制:1分钟K线只能还原四个点,不能恢复逐笔过程。 持续更新恢复 → 用推流。流恢复后继续接收实时数据,但前几条推送需额外检查时间戳连续性和价格吻合度。 以 TickDB 为例,上述三个动作恰好对应它的 REST、K 线和 WebSocket 三种接入方式。同一个行情数据源内部就完成了当前校准、历史回补和实时恢复的分工,研究者不需要在三个不同的数据接口之间切换和对照字段定义。这减少的不是代码量,而是在排查“断线到底影响了什么”时的复杂度——你只需要在一套一致的字段体系下检查时间戳连续性和价格跳空,而不是先花时间搞清楚不同接口之间的字段语义差异。 但这一框架存在明确的能力边界:K 线不能恢复逐笔,聚合数据不能替代丢失的原始推送,重连成功不等于数据连续。 timestamp 字段记录的是事件发生时间,不等于延迟、新鲜度、采样频率或任何形式的 SLA。 本文不讨论什么 本文仅讨论行情监控断线后的数据连续性核验与工程治理方法,不涉及任何策略盈亏、交易信号准确性、断线后是否应平仓或持仓,也不涉及竞品对比、延迟数据或性能承诺。 可保存的断线窗口审计卡 断线起止时间是否已记录。 重连后当前状态是否重新校准。 空窗区间是否明确标记。 使用 K 线或历史聚合数据时,是否明确粒度限制。 异动判断是否先检查数据健康。 审计日志是否保留原始输入和处理动作。 下次行情监控断线后、恢复策略前,先拿出这张卡,逐条过一遍。断线不可怕,可怕的是你以为数据还完整,策略还在一条没有裂缝的管道上跑。 声明:本文仅讨论量化策略的数据监控与工程治理方法,不构成任何投资建议。文中不包含对任何策略有效性的评价,不推荐任何具体证券或交易方向,不对未来收益做任何暗示。所有接口描述仅为说明数据恢复的工程分工,不代表特定产品的功能承诺。 昨晚跑策略又把数据搞混了,真是头大。发现很多人对美股期权的高频数据到底长啥样不太清楚,我自己也是踩过不少坑。今天干脆就着数据库里能下到的那些数据,简单捋一捋,希望能帮到同样在找数据的朋友。 先说说最细的逐笔数据(Trade & Quote)。这个就是最原始的每一笔成交和报价的变动记录,数据量巨大,但信息也是最全的。比如你做高频或者想精确分析订单流,这个就绕不开。 它里面主要就是两类东西,成交和报价。 成交记录(Trade)会告诉你: 具体在什么时间点(精确到秒甚至毫秒)成交了。 成交的价格和数量是多少。 是在哪个交易所成交的。 这笔成交是买方推动的还是卖方推动的(有些数据源会标注)。 报价记录(Quote)则是买卖盘口的变动: 买一价和买一量,卖一价和卖一量是最基本的。 有些深度数据会提供买卖多档的报价。 同样有时间戳和交易所信息。 这个数据好是好,就是太“吃”存储和算力了,回测起来比较慢。 为了方便研究,很多人会用聚合好的分钟线数据。分钟数据把一分钟内的信息给汇总了,比如开盘价、最高价、最低价、收盘价(OHLC),还有这一分钟内的总成交量。对于期权来说,分钟数据里最有用的是通常会附带一些计算好的指标,也就是下面要说的希腊字母和隐含波动率。 这就引到日级别数据了,日数据除了基本的OHLC和成交量,核心就是那些期权特有的风险指标。对于做期权策略或者风险管理的朋友,这几个字段是每天必看的: 字段 简单解释 Delta 股价变动1块钱,期权价格大概变动多少。 Gamma Delta的变化速度,衡量Delta稳不稳定。 Theta 时间流逝一天,期权价值损耗多少。 Vega 隐含波动率变动1%,期权价格变动多少。 隐含波动率 (IV) 市场对未来波动率的预期,反向算出来的。 这些指标不是交易所直接给的,都是根据模型(比如BS模型)算出来的。所以不同数据提供商的计算结果可能有点细微差别,用的时候最好留意一下数据说明。 如果你需要写代码直接调取这些数据,可以看看他们提供的Python接口。比如下面这样,先安装库,然后调用行情数据。这里得注意参数别填错,还有调用频率也别太高,免得被限制。 # 示例:使用CMES金融数据库的行情接口获取数据 # 注意入参正确,调用频率正常,避免频繁请求。 # 安装数据接口库(假设库名为cmes_api) # pip install cmesapi import cmesapi # 初始化客户端,通常需要你的API Key client = cmesapi.Client(api_key='你的密钥') # 获取某只股票期权的日度数据,包含希腊值 # 这里参数是示例,具体要看接口文档 data = client.get_option_daily( symbol='AAPL', expiry='20241018', option_type='C', strike=180.0, start_date='2024-01-01', end_date='2024-09-01', fields=['open', 'high', 'low', 'close', 'volume', 'delta', 'gamma', 'theta', 'vega', 'implied_volatility'] ) print(data.head()) 说实话,整理这些数据字段写得我手都酸了。刚开始接触的时候,我也分不清Tick和分钟线的适用场景,后来用多了才有点感觉。Tick数据就像个事无巨细的监控,市场每动一下都记下来,做微观分析必不可少,但对存储和计算真是挑战。分钟和日线数据就像是帮你总结好的简报,用起来轻便很多,尤其日数据带着希腊字母,做日常监控和策略回测效率高。 我一开始图省事用过一些免费数据源,但在处理期权除权除息和合约切换上特别麻烦,清洗数据的时间比研究策略还长。后来还是用了CMES金融数据库里处理好的版本,虽然需要一些积分,但数据是干净的,省心太多了,能把时间花在刀刃上。 对了,如果你主要做中低频的策略,其实真没必要一上来就死磕Tick数据,先从日数据和分钟数据入手把逻辑跑通,会更有效率。除非你是做高频或者订单流分析,那逐笔数据的细节就很重要了。 今天就先聊这么多吧,主要是把数据包里有什么、分别能干什么事理了一下。数据只是原料,怎么用还得看自己的策略需求。如果有大佬对压缩Tick数据体积有高招,欢迎指点!或者你们在用什么别的数据源觉得不错,也可以在下面聊聊。 最近我专门针对 Supermind 平台的AI 量化代码生成平台进行了优化改进,现在效果比市面上的 DS、豆包等工具好很多。 👉 SuperMind AI量化代码生成平台 这个工具最大的特点是直接和 AI 对话就能生成完整可运行的Supermind量化策略代码。你不需要懂 Python、C# 或策略 API,只要用自然语言描述你的交易逻辑,比如:“当5日均线向上突破20日均线时买入,反向时卖出。” AI 就会自动帮你生成完整策略代码,并能直接在平台上运行。 相比于通用大模型的输出,这个平台针对量化交易进行了专门优化生成的代码结构更清晰,逻辑更准确,对策略逻辑的理解更接近量化开发者的思路,并且可用作 API 查询或策略自动生成工具 之前上线后,很多朋友反馈代码质量和可运行性都非常高,几乎不需要再手动修改。现在我们的AI量化代码生成平台已经全面支持 Supermind,你可以直接体验。如果你之前在用 DS、豆包等平台,不妨试试看这个版本,可能会刷新你对AI 写量化策略的想象。 在交易这场残酷的淘汰赛中,大多数散户的航行并没有指南针。他们凭感觉进场,在恐惧中割肉,在贪婪中看着利润化为乌有。很多投资者将失败归咎于“行情看不准”,但在我看来,这只是掩盖无能的借口。 顶尖交易者与普通人真正的鸿沟,不在于预测行情的精准度,而在于是否拥有一套冰冷的、强制执行的自我审视系统。如果你能从今天开始,坚持执行以下三步自检并进行书面记录,两个月后,你将亲手修补那些致命的亏损漏洞,彻底打败市场上 95% 的盲目追随者。 第一阶段:买入前的“灵魂五问” 在你的手指触碰到买入键之前,必须像审讯犯人一样审视这笔交易。如果以下五个问题中,有任何一个你无法给出清晰明确的答案,请立刻停止操作,哪怕行情看起来再诱人。 **1.**开仓逻辑:看好的依据是什么? 这笔单子是基于客观的支撑位、成交量或题材逻辑,还是仅仅源于你“主观觉得”它会涨?如果找不到客观支撑逻辑,那就关掉行情,先别看。 **2.**止损方案:你的退路在哪里? 如果行情没有如期运行,触发什么具体条件你会果断离场?必须在进场前定死你的止损位。 **3.**亏损量化:最坏的情况你能接受吗? 算一算,一旦触发止损,这笔单子会亏掉多少绝对金额?这个数字是否在你的心理舒适区内? **4.**心理画像:你现在的状态正常吗? 你是因为刚亏了钱急于翻本?还是因为连胜三场后自我膨胀、开始随性下单?问问自己,你现在是理性的交易者,还是狂热的赌徒? **5.**压力测试:这笔仓位会让你失眠吗? 如果止损被击穿,你的心情是“心疼但能睡得着”,还是会彻底陷入绝望和自我怀疑? “以上这五个问题,如果有任意一个你自己都给不出一个清晰明确的答案,就不要下单。” 第二阶段:持仓时的“心理体检” 进入头寸后,你就不再是观察者,而是博弈者。情绪会随着K线上下跳动,此时你需要实时监测自己的心态。 **●**止损执行:你是否在心存幻想? 当价格真正触碰止损线时,你是在果断执行计划,还是在寻找“可能会反弹”的理由,舍不得割肉? ●浮盈心态:利润回撤到哪里你会“肉疼”****? 在盈利时,你必须明确自己对回撤的容忍度。回撤多少你会心慌?如果不提前确定,你的利润终将被贪婪吞噬。 **●**操作本质:你在执行计划,还是随性而为? 此时此刻的任何动作(加仓、减仓、平仓),是源于开仓前的预案,还是受盘中波动的即兴驱使? **●**焦点错位:你在盯着逻辑,还是盯着钱? 你是否每秒钟都在盯着盈亏数字的变化,让自己的心跳随数字波动?盯着数字是交易者的心理自杀,你应该盯着的是支撑你持仓的题材逻辑是否依然成立。 行动建议: 如果以上四个问题中,有任何一个让你感到混乱、无法给出明确答案,请立刻平掉手中的仓位,或者直接关掉电脑,强迫自己冷静半小时。 第三阶段:收盘后的“镜像复盘” 收盘后的工作才是拉开差距的关键。复盘自检表是一面镜子,它会逼你看清那个在市场波浪中真实、甚至有些丑陋的自己。请务必将以下内容进行书面记录: **1.**原则检查: 今天的交易中,有没有哪一笔违背了你预设的原则? **2.**心理溯源: 如果违规了,当时你脑子里真实的念头是什么?(请诚实地写下来,哪怕那个念头很愚蠢)。 **3.**情绪画像: 记录今日状态——贪婪、恐惧、平淡还是膨胀? **4.**认知边界: 今天的记录里,是否出现了你完全看不懂、甚至不知道为什么要做的“异常订单”? 核心分析:为什么这套系统能产生降维打击? 这套自检表并不是能预知未来的“交易圣杯”,它的威力在于其对**“模式漏洞”**的极致暴露。 **●**清除情绪噪音: 通过强制性逻辑过滤,它直接切断了 90% 以上因情绪化、随性而产生的错误订单。 **●**修补盈利短板: 坚持记录两个月,那些你从未察觉的习惯性错误(如舍不得止损、无脑追高)会清晰地浮现出来。看清了漏洞,你才有机会去攻克它。 **●**建立职业直觉: 当你习惯了用这套逻辑体系思考,你的交易将从“靠天吃饭”转变为“靠系统盈利”。 结语 交易是一场自己与自己的战争,平庸者在寻找神技,卓越者在修炼自律。从今天起,拿起笔和纸,记录下你的每一次自检。 最后,请问自己一个问题:你是想继续在市场的风暴中随波逐流、任人宰割,还是愿意用两个月的铁律记录,换取一面能看清漏洞、让你一生受用的交易之镜? 引言:关于“这次不一样”的幻觉 在 A 股市场,历史总是在押韵。从当年的白酒狂热、医疗风暴、核心资产神话,到近年来的新能源与 AI 浪潮,几乎每年都会上演一场蔚为壮观的“抱团”盛事。每当行情走向疯狂的顶点,市场总会不约而同地传出一种声音:“这次不一样,这是长期的产业逻辑。” 然而,历史最终总会用几乎相同的方式终结投资者的幻觉。很多投资者直到亏损离场都想不通:为什么产业趋势明明还在,公司看起来也确实是无可挑剔的“好公司”,但股价却会迎来惨烈的崩塌? 核心逻辑:抱团的本质是流动性游戏,而非估值游戏 必须看清一个残酷的真相:大级别抱团的崩塌,核心往往不在于逻辑的证伪,而在于增量资金的耗尽。 从产业趋势萌芽到最终崩塌,交易结构的“腐烂”通常会经历三个阶梯式的演变: 第一阶段: 产业趋势初现,市场形成初步共识,行业龙头率先启动。 第二阶段: 赚钱效应扩散,机构开始大规模集中持仓,市场不断强化“龙头永远涨”的防御性思维。 第三阶段: 估值彻底脱离产业基本面。逻辑从“公司能赚多少钱”演变为“因为它是核心资产,所以理应继续涨”。 到了第三阶段,基本面研究已经失去了意义,本质上这是一场“击鼓传花”的博弈——大家不再关心公司价值,而是在研究谁会去接最后一棒。 “抱团本质上从来不是估值逻辑,而是流动性逻辑。” 取向一:当估值开始“先给百倍,再等业绩” 抱团崩塌的首要信号,是估值与现金流的完全脱节。 回顾 2015 年的创业板、2021 年的白酒以及 2023 年的 AI,它们在后期都呈现出惊人的一致性:市场直接给出“百倍估值”,然后要求投资者静待未来 5 到 10 年的业绩兑现。这种极度透支未来的做法,让市场变得极其脆弱。 投资者必须意识到:高估值最大的敌人从来不是亏损,而是增速下降。 任何产业都有周期,一旦利润增长追不上估值扩张的野心,整个估值体系就会在瞬间土崩瓦解。 取向二:挤在同一条船上的机构陷阱 为什么理性的机构投资者也会集体陷入癫狂?答案是“排名压力”。 基金经理们真正害怕的不是亏钱,而是“别人都在赚钱而自己没上车”。这种心理驱动了机构持仓的极度集中,导致公募仓位高度一致、北向资金高度密集、ETF 疯狂吸筹。 表面看,这是机构对资产的高度认可;实质上,这意味着交易结构已经彻底淤积。因为所有该买、能买的人都已经买入,市场上再也找不到新的增量买盘。此时,只要有一丝风吹草动,原本坚固的船体就会发生“结构性坍塌”。 “抱团最大的风险从来不是没人信,而是所有人都相信。” 取向三:宏观流动性——被忽略的“屠龙刀” 很多时候,产业的基本面并没有发生任何恶化,但资产价格却跌得深不见底。这通常是因为宏观流动性的转向,让原本廉价的杠杆变得沉重。 钱变贵了,就是高估值资产的“索命符”: 2015 年的创业板: 死于人为的“去杠杆”。 2021 年的白酒与新能源: 死于全球加息周期引发的风险偏好收缩。 高估值资产本质上依赖低利率环境。当流动性收紧,投资者会突然清醒地意识到:十年后的利润,在当下其实根本不值钱。正如源码所言:“行业根本没变,变的是资金成本。” 取向四:当“买菜阿姨”也开始谈论产业趋势 当一个真实的产业逻辑演变成“全民信仰”时,交易结构的崩坏便进入了倒计时。 在每一个大周期的顶部,我们都能听到那些极具煽动性的“无限逻辑”:2015 年是“互联网改变一切”,2021 年是“新能源永续增长”,2023 年是“AI 重构万物”。逻辑本身或许是真的,但当它被炒作成全民信仰时,市场会出现以下致命信号: 千亿市值公司批量出现,估值已无上限; 媒体全量传播,楼下的买菜阿姨都能对产业趋势侃侃而谈; 散户无脑追入龙头,市场默认“永远不会跌”。 当市场进入只谈信仰、不谈估值的境地,这种交易结构的彻底过热,正是大顶落下的时刻。 结语:在周期的轮回中保持清醒 总结来看,判断一场抱团行情是否走向终结,只需对照这四个“绝杀”条件: 1.估值是否已通过“百倍杠杆”严重透支未来? 2.机构持仓是否已经极度拥挤,导致交易结构腐烂? 3.宏观流动性是否已悄然转向,资金成本是否在抬升? 4.产业逻辑是否已经全量化、全民化,甚至批量催生千亿市值? 根据目前的市场观测,这四个条件中已有部分悄然满足,但所幸尚未达到“四条集齐”的临界点。 在周期的轮转中,每位投资者都该做一个深刻的“灵魂拷问”:当你买入那个“所有人都相信”的逻辑时,你是在为产业的未来投资,还是在为一个即将耗尽增量的流动性陷阱买单? 如果你刚开始学量化,我不建议一上来就研究几千只股票。 股票数量多、停牌多、涨跌停多、财务和行业因素复杂。新手很容易在数据处理、选股池、交易规则里迷路。 ETF 轮动反而是一个更适合入门的方向。 它的核心思想很简单:在一组 ETF 里,定期选择近期表现更强的品种持有。如果所有品种都不好,就降低仓位或空仓。 这篇文章我们用 AlphaFeed 写一个最小可运行的 ETF 轮动策略。它不追求复杂,也不承诺收益。重点是展示一个清晰、可复现、可继续迭代的量化研究流程。 1. 什么是 ETF 轮动 ETF 轮动是一种相对强弱策略。 假设你关注这些方向: 宽基指数 ETF。 科技或成长 ETF。 红利或价值 ETF。 债券或货币类 ETF。 黄金、商品或海外市场 ETF。 每隔一段时间,比如每周或每月,你计算每个 ETF 过去一段时间的收益率,选择表现最强的一个或几个持有。 背后的假设是:市场趋势有一定延续性。近期强的资产,短期内可能继续强。 当然,这不是永远有效。趋势会反转,轮动会失灵,所以必须通过回测和风险控制来评估。 2. 准备 ETF 数据 AlphaFeed 支持 ETF 行情和 K 线。代码格式和股票一致,比如 A 股 ETF 通常使用交易所后缀: from alphafeed import AlphaFeed af = AlphaFeed() df = af.klines.get( "510300.SH", period="1d", count=300, adjust="forward", to_dataframe=True, ) print(df.tail()) 如果你想看全量 ETF 实时行情,可以使用: etfs = af.quotes.get(universes="CN_ETF", to_dataframe=True) print(etfs.head()) 为了方便演示,我们先手动设定一个 ETF 池。实际研究时,你可以根据规模、成交额、跟踪指数等条件筛选。 ETF_POOL = [ "510300.SH", # 沪深300 ETF 示例 "510500.SH", # 中证500 ETF 示例 "159915.SZ", # 创业板 ETF 示例 "588000.SH", # 科创50 ETF 示例 "518880.SH", # 黄金 ETF 示例 ] 注意:不同账户和数据权限下,具体可用标的请以接口返回为准。 3. 批量获取 ETF 日 K from alphafeed import AlphaFeed af = AlphaFeed() dfs = af.klines.batch( ETF_POOL, period="1d", count=1000, adjust="forward", to_dataframe=True, show_progress=True, ) 我们先把每个 ETF 的收盘价整理成一个矩阵: import pandas as pd def build_close_matrix(dfs: dict[str, pd.DataFrame]) -> pd.DataFrame: series = [] for symbol, df in dfs.items(): one = df.sort_values("trade_date").set_index("trade_date")["close"] one.name = symbol series.append(one) close = pd.concat(series, axis=1).sort_index() close = close.dropna(how="all") return close close = build_close_matrix(dfs) print(close.tail()) 这个 close 就是后面所有研究的基础: trade_date 510300.SH 510500.SH 159915.SZ ... 2026-06-01 ... ... ... ... 2026-06-02 ... ... ... ... 多资产策略的第一步,往往就是把不同标的对齐到同一个日期索引上。 4. 定义轮动信号 我们用一个非常简单的规则: 每天计算每个 ETF 过去 60 个交易日收益率。 选择收益率最高的 ETF。 如果最高收益率小于 0,则空仓。 今天生成的选择,明天才持有,避免未来函数。 lookback = 60 momentum = close / close.shift(lookback) - 1 selected = momentum.idxmax(axis=1) best_momentum = momentum.max(axis=1) signal = pd.DataFrame(0, index=close.index, columns=close.columns) for date in close.index: if pd.notna(best_momentum.loc[date]) and best_momentum.loc[date] > 0: symbol = selected.loc[date] signal.loc[date, symbol] = 1 这里的 signal 是一个持仓矩阵。 如果某天选择 510300.SH,那这一行里 510300.SH 为 1,其他 ETF 为 0。如果所有 ETF 动量都小于 0,则全为 0。 5. 计算组合收益 先计算每个 ETF 的日收益: ret = close.pct_change().fillna(0) 再把信号后移一天: position = signal.shift(1).fillna(0) 组合收益: portfolio_ret = (position * ret).sum(axis=1) equity = (1 + portfolio_ret).cumprod() 加入交易成本: fee = 0.0003 slippage = 0.0002 turnover = position.diff().abs().sum(axis=1).fillna(0) cost = turnover * (fee + slippage) portfolio_ret_after_cost = portfolio_ret - cost equity_after_cost = (1 + portfolio_ret_after_cost).cumprod() 完整回测逻辑并不复杂,但每一步都要清楚: 步骤 目的 计算动量 找近期更强的 ETF 生成 signal 记录当日选择 signal 后移 避免未来函数 计算收益 得到组合日收益 加交易成本 更接近真实交易 生成净值 观察长期表现 6. 计算指标 import numpy as np def calc_metrics(equity: pd.Series, returns: pd.Series) -> dict: total_return = equity.iloc[-1] / equity.iloc[0] - 1 annual_return = (1 + total_return) ** (252 / len(equity)) - 1 drawdown = equity / equity.cummax() - 1 max_drawdown = drawdown.min() sharpe = 0 if returns.std() == 0 else returns.mean() / returns.std() * np.sqrt(252) return { "total_return": total_return, "annual_return": annual_return, "max_drawdown": max_drawdown, "sharpe": sharpe, } metrics = calc_metrics(equity_after_cost, portfolio_ret_after_cost) print(metrics) 再画净值曲线: import matplotlib.pyplot as plt equity_after_cost.plot(figsize=(10, 5), title="ETF Rotation Equity") plt.tight_layout() plt.savefig("etf_rotation_equity.png", dpi=160) 7. 输出每天持有了什么 只看净值不够。轮动策略还应该能解释每天持仓。 holding = position.idxmax(axis=1) has_position = position.sum(axis=1) > 0 holding = holding.where(has_position, "CASH") report = pd.DataFrame({ "holding": holding, "portfolio_ret": portfolio_ret_after_cost, "equity": equity_after_cost, }) print(report.tail(20)) 这份报告能告诉你: 策略最近持有什么。 什么时候切换了 ETF。 空仓发生在哪些阶段。 净值变化和持仓是否对应。 策略不能只是一个黑箱。尤其是新手阶段,你必须能解释结果。 8. 参数扫描:20 日、60 日、120 日动量谁更稳 轮动策略最重要的参数之一是动量周期。 我们可以扫描多个 lookback: def run_rotation(close: pd.DataFrame, lookback: int) -> dict: momentum = close / close.shift(lookback) - 1 selected = momentum.idxmax(axis=1) best_momentum = momentum.max(axis=1) signal = pd.DataFrame(0, index=close.index, columns=close.columns) for date in close.index: if pd.notna(best_momentum.loc[date]) and best_momentum.loc[date] > 0: signal.loc[date, selected.loc[date]] = 1 ret = close.pct_change().fillna(0) position = signal.shift(1).fillna(0) portfolio_ret = (position * ret).sum(axis=1) turnover = position.diff().abs().sum(axis=1).fillna(0) cost = turnover * 0.0005 portfolio_ret = portfolio_ret - cost equity = (1 + portfolio_ret).cumprod() metrics = calc_metrics(equity, portfolio_ret) metrics["lookback"] = lookback return metrics results = [run_rotation(close, lb) for lb in [20, 40, 60, 120]] result_df = pd.DataFrame(results).sort_values("sharpe", ascending=False) print(result_df) 还是那句话:不要只看最优参数。你要看不同参数下结果是否都还能接受。 如果只有 40 日动量很好,20、60、120 都不行,那要警惕过拟合。 9. 可以继续升级的方向 ETF 轮动是一个很好的量化练习框架,因为它可以逐步加复杂度: 升级方向 示例 多持仓 每次持有动量前 2 或前 3 波动率调整 对高波动 ETF 降低权重 趋势过滤 只有指数在长期均线上方才开仓 再平衡频率 从每日切换改成每周或每月 成交额过滤 排除流动性较差的 ETF 加入债券/黄金 提高资产类别分散度 比如多持仓版本,可以让策略更平滑: top_n = 2 signal = pd.DataFrame(0, index=close.index, columns=close.columns) for date in momentum.index: row = momentum.loc[date].dropna() row = row[row > 0].sort_values(ascending=False).head(top_n) if len(row) > 0: signal.loc[date, row.index] = 1 / len(row) 这时策略不再把所有资金压到一个 ETF 上,而是分散到近期表现较强的多个 ETF。 10. 为什么 ETF 轮动适合新手 ETF 轮动有几个优点: 标的数量少,容易理解。 数据结构简单,适合 pandas 练习。 不需要复杂财务数据。 策略逻辑直观,容易解释。 很适合学习多资产回测。 它也有缺点: 趋势反转时可能回撤。 参数容易过拟合。 频繁切换会产生交易成本。 ETF 选择会影响结果。 过去有效不代表未来有效。 新手最应该学到的不是“ETF 轮动一定能赚钱”,而是完整研究流程:选池、取数、对齐、生成信号、延迟持仓、计算收益、加入成本、输出指标、检查参数稳定性。 这套流程学会了,以后研究股票、指数、美股、港股都能复用。 结语 ETF 轮动是普通人学习量化的好入口。 它足够简单,能让你快速跑出结果;又足够真实,能覆盖数据对齐、持仓矩阵、交易成本、参数扫描这些关键问题。 AlphaFeed 在这个过程里承担的是数据底座的角色。你用统一的 Python SDK 获取 ETF K 线和实时行情,把精力放在策略假设和回测逻辑上,而不是反复修数据接口。 先写一个简单版本,再一点点加规则。量化研究就是这样长出来的。 参考文献: AlphaFeed 官网:https://alphafeed.org/