全部
文章&策略
学习干货
问答
官方
用户头像sh_***174w0d
2026-06-18 发布
在充满不确定性的市场中,能够穿越牛熊、实现长期稳定复利的策略是每位宽客的终极追求。今天,我们将为大家深度揭秘一个经过10年超长周期验证、累计收益高达 3815.57%(38倍)的硬核量化策略。 该策略不仅在收益上具备极强的爆发力,更在防御端做到了极致——长达十年的时间跨度内,最大回撤仅 22.21%。它是如何做到的?我们来看看它的核心亮点与底层逻辑。 ? 核心数据亮点 惊人的收益复利 累计收益:3815.57% 年化收益:45.84% 十年时间实现资产跨越式增长。无论是牛市的主升浪,还是震荡市的局部行情,策略都把握得斩钉截铁。 无惧牛熊的极佳防守(核心优势) 最大回撤:仅 22.21%(且回撤区间在2017-2018年的极端熊市) 索提诺比率:2.402(惩罚下行波动的指标,远大于1,说明下行风险极小) 相比基准收益仅24.09%,策略的超额收益高达3055%,这意味着收益并非靠“死扛”大盘Beta,而是刀刀见血的Alpha(Alpha值高达0.428)。 卓越的盈亏性价比(不对称优势) 盈亏比:2.35(平均每次赚钱的幅度是亏钱的2.3倍) 胜率:53.9% (盈利次数642次,亏损548次) 策略不过度追求不切实际的极限胜率,而是通过“截断亏损,让利润奔跑”,实现了极高的容错率。高达 1.719 的夏普比率证明了其极高的单位风险回报。 ⚙️ 策略底层逻辑揭秘:为什么它能稳赚10年? 通过深度解析策略的底层架构,我们总结出其持续盈利的四大核心武器: 灵敏的“大小盘择时”与“空仓避险”机制(顺势而为) 策略并没有死守某一种风格,而是通过对比代表大盘(沪深300)与小盘(399101)前10日的涨跌动能(Momentum)进行动态切换: 小盘占优时:果断切入高爆发的小市值股票; 大盘占优时:切换至白马/蓝筹阵营避险; 极端泥沙俱下时(大小盘均下跌):策略直接触发**“持币观望”**机制。空仓是规避系统性风险最强大的武器,这也是为什么策略能在历次股灾中保全本金的核心原因。 独创“市场冷暖温度计”,自适应选股 在切换到大盘股(白马股)时,策略引入了独创的市场温度感知模型(Market Temperature)。通过衡量当前大盘处于近一年来的相对高低位,将市场定义为“Cold(冷)”、“Warm(暖)”和“Hot(热)”: 冷冬市场:聚焦极端低估值(PB<1)、高分红潜力的深度价值股; 温和市场:兼顾价值与成长,选取经营现金流与利润均向好的复苏型企业; 过热市场:拥抱高景气度、高成长性(净利润年增>20%)的强势龙头。 这种动态切换避免了传统价值投资的“估值陷阱”,也避开了成长投资的高位接盘。 符合最新“国九条”的高质量微盘股筛选 在小市值选股上,该策略提前迎合了最苛刻的监管与价值要求。并不是无脑炒垃圾股,而是: 严格过滤 ST、新股、停牌股; 硬核财务底线:归母净利润必须>0,且营业总收入 > 1亿!精准清除了潜在的微盘“退市雷”和保壳垃圾股; 在高财务安全垫的基础上,通过 ROE(净资产收益率)和 ROA(总资产收益率)双剑合璧选出真正的“小而美”。 铁血的日内“双重止损防线”(拒绝死扛) 高盈亏比的根源在于其铁血的除草机制: 个股 8% 硬止损:盘中 14:30 和 14:50 分两次检测,跌破成本价8%(平均成本*0.92)立刻无条件清仓,绝不允许单只股票造成重创。 打板监控:对前一日涨停的持仓股进行特别关照。如果次日尾盘无法继续封死涨停,果断获利了结,有效防止了天地板和游资收割。
浏览25
评论0
收藏0
用户头像sh_**772oqg
2026-06-18 发布
概述 在搭建外汇实盘策略、行情监控工具与离线回测框架时,动态增减货币对是高频工程需求。若订阅更新逻辑设计不完善,极易产生行情断档、冗余 Tick 堆积、指标计算延迟抬升等问题,直接干扰交易信号输出,同时造成回测样本失真。本文结合多轮实盘调试与回测校验经验,梳理动态订阅场景下的数据同步痛点,提供分层解耦、增量更新的标准化实现思路,配套可直接集成至量化项目的 Python 代码。 一、量化体系下的动态订阅应用场景 量化开发中存在两类必须动态调整观测标的典型场景: 交互式行情观测系统:根据波动率、流动性人工筛选货币对,短时间内频繁调整订阅清单,多用于盘中机会扫描、多品种对比研究; 自动化轮动策略引擎:模型依据预设阈值自动切换标的池,批量轮换观测品种,适合多因子轮动、跨品种套利类策略。 多数开发者初期会采用「断开连接、全量重订阅」的简易实现,该方式仅适用于离线静态测试,无法满足实盘与高精度回测要求。重连间隙会形成数据空白区间,丢失关键盘口价差;频繁建连销毁还会拉高带宽消耗,甚至触发接口访问限流。 量化工程层面的核心约束:维持单一持久 WebSocket 通道、切换过程无数据缺失、降低无效数据流、控制客户端队列负载,保障实盘信号与回测数据集的完整性。 二、订阅切换引发数据异常的底层成因 外汇实时行情 API 采用「单传输链路 + 多标的主题」架构,服务端仅依据客户端指令推送数据,不会自动做订阅变更优化。未做状态管控时,三类问题会持续影响量化数据质量: 全量重置订阅逻辑:每次清空全部标的再批量订阅,切换窗口期无任何 Tick 输入,K 线重构、滑点统计、回测样本全部出现缺失; 仅新增不注销过期标的:长期累积无用品种数据流,本地消息队列持续膨胀,拖慢指标迭代与模型推理速度; 短周期连续下发订阅指令:频繁增减标的打乱服务端推送时序,产生大量重复、滞后的冗余行情,增加数据清洗开销。 通过日志回放与回测复现可定位问题根源:未隔离「当前有效标的集合」与「目标观测标的集合」,缺少集合差集运算、变更防抖缓冲两层基础处理逻辑。 三、适配量化系统的分层优化架构 3.1 双层解耦模块设计 将行情链路拆分为独立的连接管理层、订阅状态管理层,二者互不耦合,从底层消除切换带来的数据流抖动: 连接管理层:仅负责 WebSocket 心跳保活、异常断线自动重连,无论标的池如何调整,传输通道持续保持连接,避免数据断连; 订阅状态管理层:完成新旧标的集合对比、增减指令拆分,所有订阅变更仅在本模块执行,不改动底层传输链路。 3.2 基于集合差集的增量订阅更新 摒弃数组全覆盖的粗暴写法,使用 Set 结构存储当前生效、目标观测两组标的,通过集合运算区分两类操作: 待新增标的 = 目标集合 − 当前生效集合 待注销标的 = 当前生效集合 − 目标集合 分开发送订阅、注销请求,而非一次性重置全部标的,既消除切换空白窗口,也避免长期堆积无效行情数据。在行情采集与回测数据预处理项目中,我采用 AllTick API 作为数据源,统一规范的请求报文结构,可直接代入差集计算结果下发,降低对接调试成本。 3.3 200ms 防抖缓冲合并短时变更 人工筛选、模型自动轮动均会造成短时间内多次调整标的清单。设置 200ms 缓冲窗口,窗口内全部变更统一合并运算,仅执行一次订阅更新,减少接口请求频次,稳定服务端推送节奏。 3.4 本地队列滞后数据过滤机制 下发注销指令后,服务端会短暂推送延迟 Tick。在数据入计算模块前增加过滤逻辑,剔除已注销货币对的滞后行情,避免脏数据干扰技术指标、量化模型的运算结果。 工程设计核心思路 处理动态订阅应采用「状态集合管控思维」,而非逐次处理单次订阅 / 注销指令。持续维护一份准确的有效标的集合,基于差值做增量更新,代码可维护性更强,便于回测复现、线上故障排查。整套优化的核心目标,并非单纯实现标的切换功能,而是保障数据流在变更过程中完整连续,维持实盘与回测数据的一致性。 四、量化项目可直接集成代码示例 import json import websocket from typing import Set # 当前生效订阅货币对 current_symbols: Set = {"EURUSD", "GBPUSD"} # 切换后的目标观测标的池 target_symbols: Set = {"EURUSD", "USDJPY", "AUDUSD"} # 集合差集计算增减清单 add_list = list(target_symbols - current_symbols) remove_list = list(current_symbols - target_symbols) def refresh_subscription(ws_conn): global current_symbols # 下发新增订阅请求 if add_list: sub_cmd = json.dumps({"action": "subscribe", "params": add_list}) ws_conn.send(sub_cmd) # 下发注销订阅请求 if remove_list: unsub_cmd = json.dumps({"action": "unsubscribe", "params": remove_list}) ws_conn.send(unsub_cmd) # 同步本地有效标的状态 current_symbols = target_symbols.copy() 五、落地适配说明 这套分层增量订阅架构轻量化、无额外算力开销,可适配本地回测采集程序、云部署自动化策略、多品种监控面板等各类量化场景。通过持久连接、变更合并、滞后数据过滤三层优化,解决数据断层、冗余流量、高频请求三类影响数据可信度的核心问题,统一实盘与回测的行情采集逻辑,减少因数据处理差异带来的策略偏差。
浏览18
评论0
收藏0
用户头像sh_****559rtx
2026-06-18 发布
做港股量化,信噪比是决定策略成败的关键之一。我在构建实盘信号系统时,发现直接从WebSocket接入的原始成交数据里,混入了大量的非主动交易,如果不加甄别,因子计算和回测结果都会严重偏离。这里我就结合自己的实战经验,聊聊如何利用成交元数据,把自动对盘和碎股从真实成交中剥离出来。 量化场景下的痛点 量化模型对数据的纯净度要求很高。比如计算主动买入量、资金流向指标时,如果掺入了系统撮合产生的自动对盘,就会虚增交易活跃度,导致假信号。而碎股因为是零散交易,不反映主流资金意图,同样属于噪声。最直接的问题是:数据源通常不会直接给这些成交打上醒目的“噪声”标签,需要我们构建一套自动标记逻辑。手动处理不仅慢,而且无法应用于实盘级别的毫秒级决策。 关键判别字段 从WebSocket推送看,一笔成交记录核心字段如下: 字段 含义 time 成交时间 price 成交价格 volume 成交量 trade_type 类型标识(常不可靠) match_id 撮合编号(若有) 实践中我提炼了三条量化规则: 成交量规则:港股整手多为100股,volume模100非零或小于整手的,判定为碎股。 时间密集规则:对同一标的,如果在极短的时间窗口内出现多笔整手成交,且买卖方向高度对称,那大概率是系统自动对盘。 对手方规则:部分API会暴露买卖经纪商或账号信息。如果买方和卖方同时指向系统专用代码(例如“SYS”),直接归类为自动对盘。 实盘处理逻辑 我使用AllTick等提供的港股WebSocket数据,通过在线方式实现实时打标签。每笔成交推送到达时,立即按上述规则分类,并写入带有标签的时序队列,供下游因子计算和信号生成模块使用。代码示例如下: from websocket import create_connection import json # 这里填你的 AllTick API Token API_TOKEN = '你的API_TOKEN' ws_url = f"wss://ws.alltick.co/stock?token={API_TOKEN}" ws = create_connection(ws_url) # 订阅港股 00700.HK 的成交数据 subscribe_msg = { "action": "subscribe", "symbol": "00700.HK", "type": "transaction" } ws.send(json.dumps(subscribe_msg)) def check_auto_match(tick): # 假设系统自动对盘的成交方为 "SYS" return tick.get('buyer') == 'SYS' and tick.get('seller') == 'SYS' while True: data = ws.recv() tick = json.loads(data) volume = tick.get('volume', 0) if volume < 100: tick['tag'] = '碎股' elif check_auto_match(tick): tick['tag'] = '自动对盘' else: tick['tag'] = '普通成交' print(tick['time'], tick['price'], tick['volume'], tick['tag']) 这个简单的处理逻辑,能让我在实盘中持续输出带标签的成交流,为后续策略提供高质量输入。 对分析工作的提升 有了清晰标签后,我的量化框架只用“普通成交”计算资金流向、量比和主动买卖差等指标,回测的夏普比率明显更稳健。同时,我能监测到自动对盘发生的频率,一旦系统对盘异常增多,可能预示市场深度不足,可作为风控因子之一。碎股的独立统计则帮助我评估零散投资者的行为,进一步丰富多因子体系。总之,从源头把数据洗干净,量化之路会顺畅很多。
浏览24
评论0
收藏0
用户头像sh_****447dvu
2026-06-18 发布
一、研究背景 量化策略的有效性高度依赖订单簿深度数据的时序完整性与长期一致性。在行情基建落地阶段,两类底层数据问题会持续干扰因子测算、回测拟合与实盘信号输出: 盘口渐进漂移:轮询或简易 WebSocket 方案长时间运行后,本地缓存盘口与市场真实流动性产生累积偏差,套利、做市、盘口因子信号失真,回测结论无法复现实盘收益; 重连数据断层:增减监控标的时重建连接,批量调仓、高波动阶段会触发集中重连,服务端序列号重置、本地缓存清空,时序链条断裂,破坏数据集连续性。 以上问题属于行情存储架构缺陷,而非策略逻辑问题。本文分享一套单长连接动态订阅 + 序列号时序校验的增量更新方案,从底层规避数据偏差,配套可直接用于策略开发的 Python 实现,整套规范参考标准化实时行情 API 设计。 二、传统行情接入方案量化层面缺陷 2.1 REST 定时全量快照轮询 采样颗粒度粗,丢失轮询间隔内短时流动性变化,高频因子采样失真; 无增量推送,每次全量覆写、重排序,CPU 开销高,多标的并行监控资源压力大; 高频请求易触发接口限流,长线运行偏差不可逆,回测与实盘数据基准割裂。 2.2 切换标的即重建 WebSocket 连接重建重置 seq 序列号,清空本地深度缓存,时序断裂; 批量切换标的引发重连风暴,加剧数据丢失; 时序断层导致动态调仓逻辑无法在回测中完整复现。 三、三类接入方案量化价值对比 接入方案 核心量化缺陷 本文方案优势 REST 全量轮询 时序精度低、长期漂移、限流风险、高 CPU 占用 仅推送变动价位增量数据,完整保留短时盘口变化,适配高频因子采集 传统 WS 重连订阅 调仓触发重连、时序断裂、缓存清空、回测实盘背离 单长连接动态增删标的,序列号连续无中断,保障时序完整 多 WS 并行连接 心跳、缓存、重连逻辑冗余,内存带宽消耗高,扩容受限 单链路统一管理多标的,架构轻量化,支持数十标的稳定并行采样 四、量化级订单簿深度核心架构 4.1 双层字典轻量化内存存储 行情仅推送变动档位,采用增量更新规则: size > 0:新增 / 更新价位挂单量 size = 0:删除无效价位 存储结构: plaintext {code: {"bids": {}, "asks": {}, "last_seq": sequence_number}} 采用延迟排序机制:写入阶段仅增删数据,仅在因子计算、回测采样时执行排序,降低高频 Tick 下的硬件负载。 4.2 统一指令动态订阅机制 依托cmd_id=22004指令,通过 sub/unsub 实现标的热加载、热移除,全程无需断开连接: sub:新增标的,自动分配独立缓存,多标的数据物理隔离; unsub:移除闲置标的,释放内存带宽资源。 适配量化动态轮动、分批调仓的运行场景,无时序中断。 4.3 seq 序列号连续性校验(防漂移核心) 每个标的独立维护last_seq记录最新序列; 仅当新数据包seq == last_seq + 1才执行盘口更新; 检测到跳号、断序自动清空缓存,等待全量快照重新对齐。 从根源消除长线运行下的隐性盘口漂移,保证回测与实盘时序标准统一。 五、量化场景标准化配置参考 量化场景 原有数据问题 配置参数 校验标准 程序初始化批量订阅 重复拉取快照、缓存初始化混乱 cmd_id=22004、action=sub、标的数组 多标的独立缓存生成,序列从零连续递增 实盘运行新增标的 重连清空历史盘口,时序断裂 cmd_id=22004、action=sub、单标的 存量标的数据完整保留,新增标的独立时序 闲置标的取消监控 冗余数据流占用资源,干扰因子采样 cmd_id=22004、action=unsub 对应标的数据流终止,资源释放 重复发起订阅请求 冗余覆写造成盘口数据抖动 本地集合前置去重 无重复推送,盘口数据平稳 空数组无效订阅请求 无效请求消耗网络资源 前置数组非空校验 空参数请求直接拦截,链路稳态运行 六、实盘高频数据故障与兜底方案 海量 Tick 堆积、数据滞后 极端行情数据包密集,消费速度跟不上写入速度。通过独立协程队列解耦消息接收与盘口更新;本地仅保留前 50 档价位,控制内存上限,保证采样实时性。 网络假存活,行情静止无更新 网络抖动不触发断开回调,但数据流停滞。设置 10 秒心跳探活,连续 3 个周期无有效数据自动重连、清空缓存、同步快照校准盘口。 频繁切换订阅产生幽灵订阅 短时间连续 sub/unsub 造成本地订阅状态与服务端推送不一致。订阅操作加线程锁串行执行;数据包前置校验标的订阅状态,无效数据直接丢弃。 标的代码格式错误,静默丢失行情 代码书写错误无报错,但无任何深度数据返回。配置合法标的白名单,订阅前格式校验,异常输出告警日志,便于快速排查数据集缺失问题。 七、方案适配场景与能力边界 适配场景 盘口高频因子、套利、做市策略实盘数据底座搭建; 多标的动态轮动调仓类策略 7×24 小时无人值守运行; 高精度行情数据集采集、回测数据集清洗对齐。 不支持能力 多 WebSocket 连接间本地缓存同步; 依托实时流式接口回溯历史深度 Tick; cmd_id=22004以外自定义私有订阅指令扩展。 八、完整可落地 Python 源码 import websocket import json import threading # 实时行情WebSocket接入地址 WS_CRYPTO_URL = "wss://quote.alltick.co/quote-b-ws-api?token=YOUR_TOKEN" # 全局订阅集合 + 多标的独立深度存储 subscriptions = set() order_book_depth_storage = {} # {code: {"bids": {}, "asks": {}, "last_seq": 0}} def send_sub_cmd(ws, action: str, code_list: list): """统一订阅/取消订阅指令,适配动态调仓""" if not code_list: return cmd_payload = { "cmd_id": 22004, "action": action, "code": code_list } ws.send(json.dumps(cmd_payload)) # 同步本地存储状态 if action == "sub": for code in code_list: subscriptions.add(code) if code not in order_book_depth_storage: order_book_depth_storage[code] = {"bids": {}, "asks": {}, "last_seq": 0} elif action == "unsub": for code in code_list: subscriptions.discard(code) def update_depth_storage(side_map: dict, price: float, size: float): """深度增量更新逻辑""" if size <= 0: side_map.pop(price, None) else: side_map[price] = size def on_open(ws): """连接初始化,批量订阅核心标的""" init_codes = ["BTCUSDT", "ETHUSDT"] send_sub_cmd(ws, "sub", init_codes) print("行情连接建立,初始订阅标的:", init_codes) def on_message(ws, message): """行情解析、时序校验、盘口更新主逻辑""" if not message: return try: data = json.loads(message) if data.get("type") != "orderbook_diff": return code = data.get("code") seq = data.get("seq") side = data.get("side") price = float(data.get("price", 0)) size = float(data.get("size", 0)) if code not in subscriptions: return cache = order_book_depth_storage[code] last_seq = cache["last_seq"] # 序列断裂重置缓存 if last_seq != 0 and seq != last_seq + 1: cache["bids"].clear() cache["asks"].clear() cache["last_seq"] = 0 print(f"{code} 时序断裂,重置深度缓存") return target_map = cache["bids"] if side == "bid" else cache["asks"] update_depth_storage(target_map, price, size) cache["last_seq"] = seq except Exception as e: print("行情解析异常:", str(e)) def on_error(ws, error): print("WebSocket连接异常:", error) def on_close(ws, close_code, close_msg): print("连接断开,清空全部缓存") subscriptions.clear() order_book_depth_storage.clear() if __name__ == "__main__": ws_app = websocket.WebSocketApp( WS_CRYPTO_URL, on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close ) # 心跳保活配置 ws_app.run_forever(ping_interval=10, ping_timeout=5) 九、实盘部署优化建议 全程采用长连接动态增减标的,禁止频繁重建 WebSocket,守住时序数据连续性; 每 30 分钟调用全量快照接口校准缓存,抵消长线运行微量累积偏差,缩小回测实盘误差; 排序逻辑后置至因子读取阶段,降低高频行情 CPU 占用; 日志重点记录 seq 断裂、心跳超时、非法标的三类异常,便于数据问题复盘追溯; 各标的深度数据独立字典隔离,避免多策略并行时数据交叉污染; 如需持久化行情数据集,采用异步定时快照落盘,不阻塞实时更新链路。
浏览26
评论0
收藏0
用户头像sh_*219t3e
2026-06-18 发布
亲测最好用的AI编写量化策略工具,可以让 AI 直接写各个平台的策略代码,直接生成可运行的策略代码,代码质量远高于直接使用 DeepSeek、Trae 等平台。 大家可以直接用描述策略,然后一键生成可运行的完整策略代码,也可以把它当做一个API 查询工具。 🚀️ AI Supermind工具平台:https://iris.findtruman.io/ai/tool/ai-quantitative-trading/?invite_code=SWJX1ARK
浏览37
评论1
收藏0
用户头像sh_*2176oo
2026-06-18 发布
我回测了 A 股 10 年的"追涨停"策略,结果可能和你想的不一样 A 股散户圈里有一种玩法叫"打板"——今天某只股票涨停了,明天开盘就买进去,赌它继续涨。 打板选手有一套自己的逻辑:涨停说明有资金强势介入,次日惯性上冲的概率不低,如果能接力涨停就赚 10%,不能涨停就止损出来。听起来赔率不错。 但"听起来"和"跑数据"是两回事。 这篇文章用 AlphaFeed 拉 A 股历史数据,做一个严格的统计回测:涨停之后的第二天、第三天、第五天,平均涨跌是多少?胜率多高?如果严格执行"涨停次日买入"策略,长期下来是赚是亏? 先说结论:追涨停长期来看大概率亏钱,但细节比你以为的复杂。 1. 找出历史上所有涨停的日子 A 股涨停幅度一般是 10%(创业板/科创板 20%),但实际因为四舍五入,涨幅在 9.5%–10.5% 之间就可以算涨停。 我们先选一组活跃股,拉长期 K 线,找出所有涨停日: import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() symbols = [ "000001.SZ", "600519.SH", "000858.SZ", "601318.SH", "002594.SZ", "300750.SZ", "600036.SH", "000333.SZ", "601012.SH", "600276.SH", "000568.SZ", "601888.SH", "002415.SZ", "300059.SZ", "600809.SH", "000651.SZ", "002304.SZ", "300124.SZ", "002475.SZ", "600887.SH", ] klines = af.klines.batch( symbols, period="1d", count=5000, adjust="none", # 用不复权数据,否则涨跌幅会被复权扭曲 to_dataframe=True, show_progress=True, ) all_limit_ups = [] for sym, df in klines.items(): df = df.sort_values("trade_date").reset_index(drop=True) df["ret"] = df["close"].pct_change() for i in range(1, len(df)): if df["ret"].iloc[i] >= 0.095: # 涨停(含误差) all_limit_ups.append({ "symbol": sym, "date": df["trade_date"].iloc[i], "close": df["close"].iloc[i], "idx": i, }) print(f"共找到 {len(all_limit_ups)} 次涨停") print(f"覆盖 {len(klines)} 只标的") 2. 涨停次日表现:平均能赚多少? 核心问题:今天涨停,明天买进去,一天能赚多少? import pandas as pd import numpy as np from alphafeed import AlphaFeed af = AlphaFeed() symbols = [ "000001.SZ", "600519.SH", "000858.SZ", "601318.SH", "002594.SZ", "300750.SZ", "600036.SH", "000333.SZ", "601012.SH", "600276.SH", "000568.SZ", "601888.SH", "002415.SZ", "300059.SZ", "600809.SH", "000651.SZ", ] klines = af.klines.batch( symbols, period="1d", count=5000, adjust="none", to_dataframe=True, show_progress=True, ) results = [] for sym, df in klines.items(): df = df.sort_values("trade_date").reset_index(drop=True) df["ret"] = df["close"].pct_change() for i in range(1, len(df) - 5): if df["ret"].iloc[i] < 0.095: continue # 涨停次日买入(用次日开盘价) if i + 1 >= len(df): continue buy_price = df["open"].iloc[i + 1] if buy_price <= 0: continue # 次日收益(用次日收盘价) ret_1d = df["close"].iloc[i + 1] / buy_price - 1 # 第3日收益 ret_2d = df["close"].iloc[i + 2] / buy_price - 1 if i + 2 < len(df) else None # 第5日收益 ret_5d = df["close"].iloc[i + 5] / buy_price - 1 if i + 5 < len(df) else None # 是否连板(次日也涨停) next_ret = df["ret"].iloc[i + 1] is_连板 = next_ret >= 0.095 results.append({ "symbol": sym, "date": df["trade_date"].iloc[i], "ret_1d": ret_1d, "ret_2d": ret_2d, "ret_5d": ret_5d, "is_连板": is_连板, "open_pct": (buy_price / df["close"].iloc[i] - 1), # 次日开盘溢价 }) rdf = pd.DataFrame(results) print(f"=== 涨停次日表现统计({len(rdf)} 次涨停样本)===") print() for label, col in [("持有1天", "ret_1d"), ("持有2天", "ret_2d"), ("持有5天", "ret_5d")]: valid = rdf[col].dropna() print(f" {label}:") print(f" 平均收益: {valid.mean():+.2%}") print(f" 中位数: {valid.median():+.2%}") print(f" 胜率: {(valid > 0).mean():.1%}") print(f" 最大赚: {valid.max():+.2%}") print(f" 最大亏: {valid.min():+.2%}") print() 你可能会看到的结果 在多数统计中,涨停次日的平均收益接近 0 或微负,但中位数通常为负。这意味着: 少数大赚的案例拉高了平均值(连板翻倍的那些) 多数情况是小亏:高开低走、开盘冲高后回落 胜率大概在 40%–50% 之间——连抛硬币都不如 3. 次日开盘溢价:买入成本被抬高了 涨停次日最大的问题不是"涨不涨",而是你买不到好价格。 因为昨天涨停了,今天大家都想买,开盘价往往直接高开 3%–5%。你以为自己在追涨停,其实你在高位接盘: print("=== 涨停次日开盘溢价分布 ===") print(f" 平均开盘溢价: {rdf['open_pct'].mean():+.2%}") print(f" 中位数溢价: {rdf['open_pct'].median():+.2%}") print() bins = [(-1, -0.02), (-0.02, 0), (0, 0.02), (0.02, 0.05), (0.05, 0.10), (0.10, 1)] labels = ["低开>2%", "低开0-2%", "高开0-2%", "高开2-5%", "高开5-10%", "高开>10%"] for (lo, hi), label in zip(bins, labels): pct = ((rdf["open_pct"] >= lo) & (rdf["open_pct"] < hi)).mean() print(f" {label}: {pct:.1%}") 如果次日平均高开 3%,那你买入的一瞬间已经"亏了 3%"。即使当天收涨 2%,你的实际收益是 -1%。 这就是追涨停最大的隐性成本:你的买入价不是昨天的涨停价,而是今天被抬高后的开盘价。 4. 连板概率:买到第二个涨停有多难 打板选手追求的最大收益来源是"连板"——买进去之后第二天继续涨停。我们来看看概率: 连板率 = rdf["is_连板"].mean() print(f"=== 连板概率 ===") print(f" 涨停后次日再涨停的概率: {连板率:.1%}") print(f" 也就是说,每 {1/连板率:.0f} 次涨停里,大约有 1 次连板") print() # 连板 vs 不连板的收益差异 连板组 = rdf[rdf["is_连板"]] 非连板组 = rdf[~rdf["is_连板"]] print(f" 连板组 (n={len(连板组)}):") print(f" 次日收益: {连板组['ret_1d'].mean():+.2%}") print(f" 非连板组 (n={len(非连板组)}):") print(f" 次日收益: {非连板组['ret_1d'].mean():+.2%}") 一般来说,连板概率在 10%–20% 之间。这意味着你打 10 次板,可能只有 1–2 次吃到连板的肉,其余 8 次都在亏开盘溢价和高开低走的差价。 5. 什么样的涨停更值得追 不是所有涨停都一样。我们可以按几个维度拆分,看看哪种涨停次日表现更好: import pandas as pd import numpy as np from alphafeed import AlphaFeed af = AlphaFeed() # 假设已经有 rdf(上面的结果 DataFrame) # 维度1: 成交额大小 # 需要在构建 results 时加入成交额字段,这里补充 symbols = list(set(rdf["symbol"].tolist())) klines = af.klines.batch( symbols, period="1d", count=5000, adjust="none", to_dataframe=True, ) enriched = [] for _, row in rdf.iterrows(): sym = row["symbol"] if sym not in klines: continue kdf = klines[sym] kdf = kdf.sort_values("trade_date").reset_index(drop=True) match = kdf[kdf["trade_date"] == row["date"]] if match.empty: continue amount = match["amount"].values[0] volume = match["volume"].values[0] prev_amount = kdf[kdf["trade_date"] < row["date"]]["amount"].tail(20).mean() vol_ratio = amount / prev_amount if prev_amount > 0 else 1 enriched.append({ **row.to_dict(), "amount": amount, "vol_ratio": vol_ratio, }) edf = pd.DataFrame(enriched) print("=== 按成交额分组的涨停次日表现 ===") edf["amount_group"] = pd.qcut(edf["amount"], q=3, labels=["低成交额", "中成交额", "高成交额"]) for group in ["低成交额", "中成交额", "高成交额"]: g = edf[edf["amount_group"] == group] print(f" {group} (n={len(g)}): 次日均值{g['ret_1d'].mean():+.2%} 胜率{(g['ret_1d']>0).mean():.0%}") print() print("=== 按量比分组的涨停次日表现 ===") edf["vol_group"] = pd.cut(edf["vol_ratio"], bins=[0, 1.5, 3, 100], labels=["量比<1.5", "量比1.5-3", "量比>3"]) for group in ["量比<1.5", "量比1.5-3", "量比>3"]: g = edf[edf["vol_group"] == group] if len(g) < 5: continue print(f" {group} (n={len(g)}): 次日均值{g['ret_1d'].mean():+.2%} 胜率{(g['ret_1d']>0).mean():.0%}") 通常的发现是: 涨停类型 次日表现 解读 缩量涨停(量比低) 相对较好 筹码锁定好,抛压小 放巨量涨停(量比>3) 相对较差 换手大,可能是拉高出货 高成交额涨停 不确定 大盘股涨停少见,统计上有参考价值 低成交额涨停 波动大 小盘股弹性高但风险也高 6. 止损纪律:不止损会怎样 打板选手最重要的规则之一是"错了就砍"。不止损的后果有多严重?我们来对比: import pandas as pd import numpy as np # 模拟三种执行方式 strategies = { "无止损(持有5天)": rdf["ret_5d"].dropna(), "止损-3%": rdf["ret_1d"].apply(lambda x: x if x > -0.03 else -0.03), "止损-5%": rdf["ret_1d"].apply(lambda x: x if x > -0.05 else -0.05), } print("=== 止损 vs 不止损 ===") for name, rets in strategies.items(): equity = (1 + rets).cumprod() total_ret = equity.iloc[-1] - 1 max_dd = (equity / equity.cummax() - 1).min() print(f" {name}:") print(f" 累计收益: {total_ret:+.2%}") print(f" 最大回撤: {max_dd:.2%}") print(f" 平均单次: {rets.mean():+.2%}") print() 不止损的结果通常非常难看——因为那些大亏的 case(涨停次日直接跌 5%–8%)会把利润全部吃掉。严格止损会改善结果,但可能从"大亏"变成"小亏"。 7. 累计净值曲线:长期跑下来什么样 把每一次"涨停次日买入、收盘卖出"的收益串成净值曲线: import pandas as pd import numpy as np rdf_sorted = rdf.sort_values("date").reset_index(drop=True) equity = [1.0] for _, row in rdf_sorted.iterrows(): ret = row["ret_1d"] if pd.isna(ret): continue cost = 0.0015 # 单边手续费+印花税 net_ret = ret - cost * 2 equity.append(equity[-1] * (1 + net_ret)) equity_series = pd.Series(equity) total_return = equity_series.iloc[-1] - 1 max_dd = (equity_series / equity_series.cummax() - 1).min() print(f"=== 追涨停策略长期表现 ===") print(f" 交易次数: {len(rdf_sorted)}") print(f" 累计收益: {total_return:+.2%}") print(f" 最大回撤: {max_dd:.2%}") print(f" 最终净值: {equity_series.iloc[-1]:.4f}") print() if total_return < 0: print(f" 结论: 无差别追涨停,长期是亏钱的") else: print(f" 结论: 有正收益,但需要看夏普和回撤是否可接受") 加上交易成本之后,结果会更加难看。每次交易都要付万 3 佣金 + 千 1 印花税,打板交易频率高,成本累积很快。 8. 这意味着什么 回测结果通常指向几个结论: 1. 无差别追涨停是负期望的。 平均次日收益在扣除成本后大概率为负。涨停不是免费的"涨 10%"——你的买入成本被次日高开抬高了,而高开之后回落的概率比继续涨的概率大。 2. 少数人能赚钱,因为他们不是无差别追。 真正的打板高手会筛选:首板 vs 二板、题材强度、板块联动、分时走势、封单量。他们追的是特定条件下的涨停,而不是看到涨停就冲。 3. 追涨停赚钱的本质不是"涨停好",而是"选股好"。 如果你能选出明天涨停的票,你当然赚钱。但这和"追涨停"是两回事。追涨停是在涨停已经发生之后买入,这时候信息已经被价格消化了。 4. 打板的收益分布是极端的。 少数连板收益很大,多数普通涨停次日是亏的。这意味着你必须交易很多次才能碰到几次大赚,但过程中的亏损会消耗你的本金和心态。 9. 如果你还是想研究打板 把上面的分析框架改成你自己的筛选条件,看看特定条件下的涨停是否表现更好: # 示例:只看"首板"(前一天不是涨停的涨停) 首板 = rdf[rdf["open_pct"] < 0.095] # 次日不是一字板,说明不是连板后的 print(f"首板次日表现 (n={len(首板)}):") print(f" 平均收益: {首板['ret_1d'].mean():+.2%}") print(f" 胜率: {(首板['ret_1d'] > 0).mean():.0%}") 你也可以加入更多筛选维度: 板块里同时涨停的个数(题材强度) 涨停时间(早盘涨停 vs 尾盘涨停) 涨停前的走势(底部涨停 vs 高位涨停) 市值区间(小盘涨停 vs 大盘涨停) 每加一个条件,样本量就会减少,但如果剩下的样本显示出稳定的正期望,那可能是一个值得深入研究的方向。 10. 你可以用这个方法验证任何"民间策略" 这篇文章的价值不只是"打板赚不赚钱"这一个结论,而是给了你一套验证方法: 提出假设 → 定义规则 → 拉历史数据 → 统计收益/胜率/回撤 → 下结论 AlphaFeed 可以拉数千根 K 线,支持不复权模式(对涨停分析很重要),批量获取几十只票的数据。有了数据,任何策略假设都可以用同样的方法验证。 下次有人跟你说"这种票明天一定涨",你不用争论——打开终端,跑一下数据。 结语 追涨停是 A 股散户圈最有争议的话题之一。有人靠它赚到过钱(他们的故事你都听过),有人靠它亏到清仓(他们的故事你没听过)。 数据告诉我们的是:无差别追涨停的长期期望收益为负。 涨停次日高开低走的概率、交易成本的累积、连板极低的概率,这些因素加在一起,让"看到涨停就追"变成一个负期望的游戏。 但这不意味着所有涨停都不值得关注。如果你有能力在涨停中进一步筛选——通过成交量特征、板块联动、市场情绪、分时结构——那有可能找到正期望的子集。只是,这已经不是"追涨停",而是"选股"了。 参考文献: AlphaFeed 官网:https://alphafeed.org/ Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
浏览35
评论0
收藏0
用户头像9点半量化
2026-06-18 发布
引言:博弈战场的明牌与暗语 在职业操盘手的显示器上,经常会出现这样一种诡异的画面:买盘挂单(五档买单)层层堆叠,卖盘挂单寥寥无几,但股价却像断了线的风筝一样不仅不涨,反而阴跌不止。 如果你看不懂这种盘口信号,那么你在短线交易中的每一次点击鼠标,本质上和在澳门赌场闭着眼睛“买大小”没有任何区别。在金融市场这个零和博弈的残酷战场上,靠运气赚到的钱,迟早会凭“实力”亏回去。 很多投资者入场多年,甚至连“内外盘”的基本定义都搞不清楚。但你必须明白:内外盘是机构操盘手最不想让散户看穿的“盘口暗语”。今天,我将站在量化机构的角度,为你拆解这些掩盖在数据下的机构意图。 定义基石:什么是内外盘? 内外盘不是简单的买卖记录,它们揭示了多空双方的“进攻欲望”。 ●**内盘(主动卖): 盘面上显示为绿色**,代表交易以“买入价”成交。这意味着卖方更有迫切的套现欲望,愿意主动向下“砸”入买方的盘口。 ●**外盘(主动买): 盘面上显示为红色**,代表交易以“卖出价”成交。这反映了买方不惜代价、主动向上“扫”光卖盘的进攻意图。 专家视角: 为什么这是机构的“护城河”?因为内外盘是散户最易获取、也最容易产生误判的指标。机构经常利用内外盘制造“假信号(Spoofing)”来诱导你的决策。 核心策略:六大盘口实战场景 要看穿机构的诡计,不能死读数据,必须结合股价所处的位置(高位或低位)进行深度复盘。 场景一:低位洗盘吸筹 **●**现象: 外盘显著大于内盘,但股价不涨反跌,且盘口伴随巨大的“买入挂单壁垒”。 **●**机构意图: 这是主力在利用外盘的活跃度吸引眼球,同时用大挂单压住股价进行“压价吸筹”。他们通过这种反直觉的波动,洗掉信心不足的散户。 **●**行动建议: 买入或持股待涨。 “外盘大于内盘,价格不涨反跌,这是主力在吸筹。” 场景二:高位“多头陷阱” **●**现象: 股价已经历大幅拉升,内盘显著大于外盘,股价却依然呈现不跌反涨的虚假繁荣。 **●**机构意图: 典型的“诱多”信号。主力通过对倒拉升,制造内盘成交量假象,实则在利用散户的跟风盘进行隐蔽撤退。 **●**行动建议: 立即果断撤离,不要有任何幻想。 场景三:暴涨的黄金信号 **●**现象: 外盘是内盘的两倍以上,且伴随着明显的“量价齐升”。 **●**机构意图: 多头主力已经达成共识,形成压倒性优势,机构资金正在合力扫货,股价即将进入爆发期。 ●行动建议**:** 强势跟进,后市高度看涨。 场景四:高度控盘的寂静期 ●现象: 内外盘基本持平,且总量极小,成交量严重萎缩。 **●**机构意图: 筹码已被主力高度锁定(控盘),市场浮筹极少。主力在等待契机,此时的平静是暴风雨前的征兆。 **●**行动建议: 持股观望,只要股价不出现大幅放量冲高,就不卖出。 场景五:绝情的放量离场 **●**现象: 外盘明显小于内盘,伴随着盘面放量下跌。 **●**机构意图: 这是主力不计成本的出货信号。大资金正在通过主动砸盘寻求流动性退出。 **●**行动建议: 赶紧跑,这是没有任何悬念的杀跌开端。 场景六:多空均势的震荡期 **●**现象: 内外盘数值相差无几,股价在窄幅范围内波动。 **●**机构意图: 多空双方处于临时的博弈均衡点,主力既无明显进攻意愿,也无出货动力。 **●**行动建议: 持币观望。此时最忌“手痒”,不要在无明确趋势的区间浪费本金。 战地手册:盘口记忆口诀 这套口诀是实盘中真金白银砸出来的经验总结。注意:应用口诀时必须结合“位置论”。 **●**外大价跌主力吸: 股价低位,外盘大而价格不涨,是主力吃货。 **●**外大价跌主力出: 股价高位,若外盘大而价格跌,需警惕主力利用流动性对冲出货。 **●**内大价涨主力收: 股价高位,内盘大而价格涨,警惕诱多;股价低位,则是主力对倒建仓。 **●**外盘偏强,股价看上。 **●**内盘偏重,股价看下。 深度分析: 所有的口诀都不是死理。当内盘远超外盘却价格坚挺时,说明下方有巨大的“承接盘”;反之,则是市场的“空中楼阁”。 结语:做猎人,而非猎物 当你不再仅仅盯着价格数字,而是开始洞察每一笔成交背后的主动性时,你才真正跨过了职业交易的门槛。掌握内外盘的逻辑,不仅是学习一种战法,更是建立一种“看穿谎言”的底气。 下次当你看到盘口买单如潮、外盘猛增但股价却纹丝不动时,请冷静思考: 你是愿意成为机构撤退时的**“对手盘流动性”****,还是愿意潜伏在主力的阴影里,静候那一跃而起的获利时机?** 建议将此指南收藏并反复研读。只有将这些信号化为你的生理直觉,你才能在风云变幻的零和博弈中,真正拿回属于你的财富掌控权。
浏览28
评论0
收藏0
用户头像sh_*219t3e
2025-11-06 发布
最近我专门针对 Supermind 平台的AI 量化代码生成平台进行了优化改进,现在效果比市面上的 DS、豆包等工具好很多。 👉 SuperMind AI量化代码生成平台 这个工具最大的特点是直接和 AI 对话就能生成完整可运行的Supermind量化策略代码。你不需要懂 Python、C# 或策略 API,只要用自然语言描述你的交易逻辑,比如:“当5日均线向上突破20日均线时买入,反向时卖出。” AI 就会自动帮你生成完整策略代码,并能直接在平台上运行。 相比于通用大模型的输出,这个平台针对量化交易进行了专门优化生成的代码结构更清晰,逻辑更准确,对策略逻辑的理解更接近量化开发者的思路,并且可用作 API 查询或策略自动生成工具 之前上线后,很多朋友反馈代码质量和可运行性都非常高,几乎不需要再手动修改。现在我们的AI量化代码生成平台已经全面支持 Supermind,你可以直接体验。如果你之前在用 DS、豆包等平台,不妨试试看这个版本,可能会刷新你对AI 写量化策略的想象。
浏览4605
评论73
收藏7
用户头像1985159637
2023-09-28 发布
为了集中解决大家的问题,建议大家在此贴下面留言,本人如果有时间乐意免费为大家进行解答。牛牛1985159637
浏览2487
评论63
收藏3
用户头像忠诚的韩馥1
2026-06-17 发布
下面的我的代码,希望9:26获取当天的开盘价。 def open_auction(context, bar_dict): log.info(f"bar_dict:{bar_dict['601601.SH'].symbol}-{bar_dict['601601.SH'].datetime}-{bar_dict['601601.SH'].open}-{bar_dict['601601.SH'].high}-{bar_dict['601601.SH'].low}-{bar_dict['601601.SH'].close}") 得到的结果是前一天的收盘价,日志如下: 2026-03-02 09:26:00 - INFO bar_dict:601601.SH-2026-02-27 15:00:00-40.81-40.81-40.81-40.81 请各位高手大能指教。
浏览29
评论0
收藏0