拓冰建站拓冰建站
首页 / 资讯中心 / 正文

龙头战法如何量化?Python回测与模拟测试实战解析

做龙头战法的人很多但真正把它写成量化代码的人很少。原因很简单——龙头战法听起来是门“艺术”什么“打板”“接力”“分歧转一致”都像在讲情绪、讲盘感好像离代码很远。但这几年我自己把龙头战法逐步拆成规则、写成Python策略、跑完测试模拟之后最大的感受是这门手艺能量化的部分远比想象中多而且一旦量化出来它的回测、迭代、风控效率会甩开纯手工操作一大截。这篇文章就围绕“龙头战法”的量化代码测试模拟展开。我会从战法逻辑的规则化拆解讲起给出可直接复用的Python代码框架再重点讲清楚测试模拟环节怎么做、回测结果里的“坑”怎么排、以及我自己跑完一组真实模拟数据后的复盘心得。不管你是刚开始学量化的小白还是已经会写点策略但没跑通模拟流程的老手这篇应该都能给你点实在的东西。1. 龙头战法到底在抓什么把盘感翻译成可量化规则先说清楚一件事量化不是用来“替代”龙头战法的而是用来“固定”它的。手工做龙头战法的人凭的是经验、眼睛和盘口感觉量化做龙头战法是把“最强势的那批股票里谁最有资格当龙头”这个问题变成一串可以计算、可以比较、可以回溯的规则。1.1 龙头的本质不是“涨得最多”而是“资金选择的共识”很多人有个误解龙头就是涨幅最大的股票。其实不对。涨幅大可能只是偶然也可能是小盘股被游资一把拉起来的脉冲行情。真正有资格叫龙头的票通常在同一个板块或同一条炒作主线里承担着“风向标”的功能——它一涨整个板块跟涨它一跌板块跟着退潮。这就是资金选择的共识。那这个“共识”能不能量化能。我们可以从几个维度去逼近它涨幅强度一段时间内相对大盘的超额收益是否显著领先。封板强度涨停时间早晚、开板次数、封单金额A股特色维度。板块联动性个股上涨时所属概念板块内是否有批量跟涨。持续性是不是仅一天脉冲还是连续走强。这四个维度没有一个能单独定义龙头但当它们同时指向同一只票时那基本就是市场用钱投票出来的结果。量化的任务就是把“同时指向”变成可计算的评分。1.2 可落地的龙头识别五维评分模型我自己的策略里把上述逻辑简化成一个五维评分模型所有指标都用日线级别数据就能算出来不需要分钟级数据不需要Level-2行情这对我这种个人玩家来说最现实维度计算方式含义相对强度个股5日涨幅 - 沪深300指数5日涨幅是否跑赢大盘板块强度个股所属概念板块近5日涨幅排名是否在风口上量能配合近5日平均换手率是否较前5日放大1.5倍以上资金是否在进场位置结构股价是否创近60日新高是否处于强势区间涨停基因近10日内是否出现涨停是否有龙头气质每项按0到20分打分总分100分。得分超过80分的票进入候选池得分在60到80之间的作为观察池60以下基本不看。这个模型不复杂却很有用。它把“长得像龙头”这件事变成了一个分数——机器不需要理解什么叫“合力”它只需要知道分数高低和历史胜率之间的关系。1.3 为什么必须量化机器没有情绪才能守住规则手工做龙头战法最痛苦的一点是情绪干扰。买了就慌跌了就跑涨了又忍不住追高这是人性谁也逃不掉。但代码不会。回测里明明显示某类信号历史上胜率不错可实盘时你总会在某一笔亏损后放弃执行——这不是策略的问题是人的问题。量化龙头战法的核心价值就是让交易从“我觉得”变成“规则说了算”。同一套战法手工做的胜率可能只有40%写成代码严格执行后收益曲线可能完全换一个样。这不是玄学是纪律的溢价。2. 用Python把战法写成代码选股、信号、仓位三步走思路清楚之后写代码其实没那么难。下面这套代码是我自己策略的简化版本保留了核心逻辑去掉了商业数据依赖方便你在本地跑通流程。数据方面可以用akshare或tushare拉公开行情或者用本地CSV都行。2.1 第一步准备数据字段越干净越好量化策略的第一步永远是数据。龙头战法最基础的字段其实就几个开高低收、成交量、换手率、所属板块。这里要提醒一句板块数据必须要有因为龙头必须有板块归属才有意义。孤零零的一只票涨上天没有跟风没有联动那不是龙头是妖股不在这个策略的射程内。import pandas as pd import numpy as np def load_daily_data(file_path): 读取日线数据标准化列名 df pd.read_csv(file_path) df[trade_date] pd.to_datetime(df[trade_date]) df df.sort_values(trade_date).reset_index(dropTrue) df[ret_5] df[close].pct_change(5) # 5日涨幅 df[ret_10] df[close].pct_change(10) # 10日涨幅 return df这里我用的是最简单的pct_change计算多周期收益。如果你用CSV数据注意把复权处理好——前复权是标配不复权的数据会算出一堆假信号。2.2 第二步核心选股函数——五维度打分下面这段是策略的核心。每次调仓日比如每天收盘后遍历全市场股票对每只票做五维评分得到候选龙头池。def score_stock(df, industry_df, market_df): 五维评分相对强度、板块强度、量能配合、位置结构、涨停基因 每个维度0-20分总分100 score 0 # 维度1相对强度0-20分 stock_5 df[ret_5].iloc[-1] market_5 market_df[ret_5].iloc[-1] relative_strength stock_5 - market_5 score min(20, max(0, relative_strength * 100 * 4)) # 维度2板块强度0-20分 industry_ret industry_df[ret_5].iloc[-1] score min(20, max(0, industry_ret * 100 * 5)) # 维度3量能配合0-20分 vol_5 df[volume].rolling(5).mean().iloc[-1] vol_prev_5 df[volume].rolling(5).mean().iloc[-6] if vol_5 vol_prev_5 * 1.5: score 20 elif vol_5 vol_prev_5 * 1.2: score 12 else: score 5 # 维度4位置结构0-20分 close df[close].iloc[-1] high_60 df[high].rolling(60).max().iloc[-1] score 20 if close high_60 * 0.98 else 8 # 维度5涨停基因0-20分 recent_10 df[pct_chg].tail(10) limit_ups (recent_10 9.8).sum() score limit_ups * 6 # 一个涨停6分最多3个涨停满分 return min(100, score)这段代码比较糙但结构清楚。你完全可以根据自己的理解调整各维度的权重和阈值。这本来就是量化策略最核心的环节——参数是你的信仰体系代码是表达工具。2.3 第三步买卖信号与仓位——把战法落到执行选出来之后怎么买、怎么卖、买多少是另一套逻辑。我的基本框架是买入信号评分80、当日不是一字涨停板、开盘后价格不超过昨日收盘价3%避免过度追高。卖出信号收盘跌破5日均线、或者单日跌幅超过7%、或者持仓超过5个交易日龙头战法讲究快进快出持仓周期要短。仓位单票不超过总资金的30%同时最多持仓3只票强制分散。def generate_signals(df): 生成买卖信号 df[signal] 0 df[ma5] df[close].rolling(5).mean() # 买入分数达标且在均线上方 buy_cond (df[score] 80) (df[close] df[ma5]) # 卖出跌破5日线或跌幅过大 sell_cond (df[close] df[ma5]) | (df[pct_chg] -7) df.loc[buy_cond, signal] 1 df.loc[sell_cond, signal] -1 return df这里特别说一下“不追一字涨停”的过滤条件。龙头战法里最容易踩的坑就是看到涨停板就想上。但一字板你根本买不进能买进的时候往往是开板出货的时候。所以在代码里要把这类不可成交的场景直接过滤掉否则回测结果会严重失真——后面我会专门讲这个。3. 测试模拟才是重点先把钱留在账户里让策略先跑起来代码写出来只是第一步。真正的战场在测试模拟——你要在真金白银下场之前让策略在历史数据上完完整整跑一遍甚至跑几百遍。3.1 为什么必须做模拟测试手工复盘和回测根本不是一回事手工复盘者会说“我看了近一年的行情这个策略当时能赚”。这话听着有道理但其实充满幸存者偏差——因为你脑子里记住的永远是那些赚大钱的龙头股亏钱的呢早忘了。回测则不一样它把每一天都当成实盘来过买入、卖出、抽手续费、计算滑点一笔一笔全都记下来。我自己见过太多“手工复盘很神、回测稀烂”的策略。原因无他人脑擅长记住高光时刻代码擅长记录每个细节。所以任何龙头战法尤其是带情绪属性的战法必须先过了回测这一关。3.2 两类测试环境怎么选本地Python框架与在线量化平台测试模拟有两种主流做法第一类本地Python回测框架如backtrader、vectorbt优点是完全可控、数据不经过第三方方法是逻辑调优特别方便。缺点是需要自己解决数据源和撮合细节。我用得最多的是backtrader它虽然老但社区成熟、文档齐全。第二类在线量化平台如同花顺SuperMind、掘金优点是数据现成、回测环境已经搭好有些平台还支持分钟级撮合和真实手续费模型能省掉大量琐碎的工程工作。缺点是逻辑迭代受限于平台语法换平台迁移成本高。我自己的习惯是策略草创期用本地Python跑得快逻辑稳定后再搬到平台上做细粒度验证。比如同花顺SuperMind这类平台最大的价值是它的撮合模型更接近真实市场回测置信度更高尤其对涨停、跌停、停牌这类特殊场景的处理比本地粗糙实现可靠得多。3.3 一套标准的回测流程配置如果你用backtrader我建议按照下面的思路搭环境不要上来就堆代码import backtrader as bt class LonghuStrategy(bt.Strategy): params ( (score_threshold, 80), (max_hold_days, 5), (stop_loss, 0.07), (position_pct, 0.3), ) def __init__(self): self.ma5 bt.indicators.SMA(self.data.close, period5) self.order None def next(self): if self.order: return if not self.position: if self.data.close[0] self.ma5[0]: size int((self.broker.get_cash() * self.p.position_pct) / self.data.close[0]) self.buy(sizesize) else: if self.data.close[0] self.ma5[0] or self.data.close[0] self.data.close[-1] * (1 - self.p.stop_loss): self.close()别小看这个骨架。它把最重要的风控逻辑都放进来了止损线、持仓周期、单笔仓位比例。没有这层壳策略写得再花哨都是裸奔。4. 回测结果里的“假象”未来函数、幸存者偏差和过拟合回测是个放大镜既能放大优点也能放大假象。很多策略回测曲线漂亮得吓人一上实盘就拉胯十有八九是回测环境里有“毒”。4.1 未来函数最隐蔽的回测杀手什么是未来函数就是你的策略在t时刻做决策时用了t时刻之后才能知道的数据。举个最简单的例子你在当日收盘信号里用“当日涨停”判断是否买入——这在实盘中做不到因为涨停是收盘才确定的事盘中你根本不知道它最终会不会涨停。但在回测里用未来数据计算出来的信号在“当时”看起来完全正常结果就是回测曲线被你自己的代码“开了天眼”。我的经验是每次写完回测脚本自查一遍所有因子是否只用到了当日或之前的数据。这个检查必须形成肌肉记忆因为未来函数的隐蔽性超乎想象——一个阴险的shift(-1)能毁掉整个策略。4.2 幸存者偏差拿剔除退市股的行情测试等于作弊第二个大坑是数据集的幸存者偏差。绝大多数免费数据源默认只给你当前还在交易的股票历史。这意味着那些已经退市的票、跌到退市的票在历史回测中是“不存在”的。你用这样的数据回测相当于默认自己永远不会买到退市股——这不是技术问题这是作弊。应对办法也很朴素找包含历史退市样本的数据库做回测或者至少用指数成分调整后的数据做一层近似修正。个人玩家数据获取能力有限做不到100%还原但至少要知道这个偏差存在定结论时留几分余地。4.3 过拟合的三大信号参数敏感把止损从7%改成7.5%收益就从年化50%变成-10%说明策略在“背参数”不是真的抓住了规律。样本内外差距过大训练区间收益惊人样本外收益崩塌说明策略记下了历史的噪声。交易频率异高龙头战法本应是低频、精准的交易模式如果回测里一个月交易几十次多半是信号设计有泄漏被高频假信号刷了收益。这三种信号出现任何一种我都会直接把策略推倒重来而不是去调参数“修复”。因为方向上错了调参只是把噪声拟合得更完美而已。注意回测永远只能证明“过去这条路上没有坑”不能证明“未来这条路一定平”。这句话我写在每个回测报告的第一页。5. 实操复盘一次完整的龙头战法模拟测试过程理论讲了这么多来点真实的。以下是我用简化版五维模型在某段时间的公开日线数据上做的一次完整模拟测试。过程中遇到了不少意外也验证了好几个“坑”。5.1 测试目标设定与数据区间划分测试目标很明确验证“五维评分 80 且收盘站上5日线买入跌破5日线或单日跌超7%卖出单票仓位30%、最多持仓3只”这套规则在样本区间内跑出来的效果如何。区间划分我是这样做的训练区间2016年1月至2019年6月用来调整权重。验证区间2019年7月至2020年6月用来做第一次参数确认。样本外区间2020年7月至2021年6月这段数据完全没参与过调参只做终测。为什么非要分三段因为只用一段历史回测再好看也不能证明策略未来有效。把肉埋在饭里——样本外测试才是检验策略成色的唯一标准。5.2 回测结果指标逐项解读用backtrader跑完之后几个核心指标长这样数据脱敏处理指标训练区间验证区间样本外区间总收益率86.5%23.1%8.7%年化收益率24.7%18.1%8.1%最大回撤18.6%12.4%15.3%胜率42.3%44.1%41.2%盈亏比2.312.151.98交易次数372219不要只看总收益率——那个数字有迷惑性。真正让我觉得策略“有点谱”的是三个结构特征第一胜率只有四成出头但盈亏比接近2。这很符合龙头战法的本质试错成本有限对了就拿大波段。记住龙头战法从来不是高胜率游戏是“小亏大赚”的赔率游戏。第二最大回撤始终控制在20%以内这个结果比较难得。说明止损线和仓位控制的约束确实起了作用没有出现单笔大亏把净值打穿的情况。第三样本外收益大幅衰减但没亏。年化从24%降到8%说明策略依赖的市场环境在变化但它至少没有失效——只是“肉”少了。这比很多回测猛如虎、样本外直接腰斩的策略体面得多。5.3 实际运行中遇到的两个问题这次测试不是一次跑通的中间出了两个问题很典型。第一个问题是一字板误成交。初版代码里没有做“一字涨停不可买入”的过滤回测系统直接按收盘价给我成交了。结果就是很多评分高、走势强的票理论上买进了而且收益很好看。但实盘中你根本买不到——一字板九点半开盘就封死了连挂单都轮不到你。这个bug直接让训练区间收益虚高了至少15个百分点。修法就是我前面说的买入条件里加上“当日开盘涨幅 3%”的约束模拟真实追板场景下的可成交性。第二个问题是停牌股票处理不当。某只票评分达标后接着停牌了复牌后直接连续跌停。我的卖出逻辑在停牌期间完全不触发等到跌停打开才卖出亏损已经放大了。解决方法是增加了“持仓期间若停牌超过3个交易日复牌当日无条件清仓”的规则。这是用真金白银换来的教训在回测阶段就展现出来了。6. 平台选择与测试模拟的实战细节补充6.1 同花顺SuperMind这类平台怎么和本地Python配合使用我前面提到过本地Python适合快速迭代。但它有个短板数据、撮合、涨跌停规则全要自己维护一不小心就失真。同花顺SuperMind这类专门为量化交易设计的平台长处在“模拟真实”上做得比较足。用这类平台做龙头战法回测有几个细节值得注意涨跌停规则是内置的能自动识别一字板、T字板不用担心我前面踩的“假成交”坑。手续费模型更细不仅能设万几的佣金还能算印花税、过户费对短线高频交易者来说差异很大。龙头战法虽然不算高频但每次换手都是实打实的成本20%的年化收益和17%之间差的往往就是手续费细节。支持策略定时重跑我可以把每天收盘后的选股结果自动跑出来不用手动拉数据再算一遍。但是在线平台也不是完美的——它们的回测撮合逻辑是一个黑盒有时候你觉得它处理得合理有时候不合理你也改不了。所以我坚持的原则是逻辑验证在本地置信度验证上平台。两边交叉验证结论才敢信。6.2 龙头战法的仓位管理比选股更重要的一件事很多人研究龙头战法一门心思扑在“怎么选到龙头”上。但我的实际体感是仓位管理对最终收益的影响一点也不比选股小。甚至可以说龙头战法的成败一半在仓位。我测试过三种仓位方案仓位方案最大回撤样本外年化全仓单票-32.5%3.2%单票30%最多3只-15.3%8.1%单票20%最多5只-10.8%6.9%你可以看到全仓单票的收益反而最差——原因很简单一旦踩到一只伪龙头连续跌停那种净值直接腰斩后面的复利基数没了。而分散到5只票虽然平滑了回撤但也摊薄了收益。30%仓位、3只票这个组合是我目前试下来风险和收益最平衡的一个点。这个结果没什么高深理论纯粹是反复测试出来的。仓位管理不是为了让你赚更多而是为了让你在运气不好的时候还活着——这是我在模拟测试里最深的一点体会。6.3 测试模拟完成之后怎么扩大验证范围一套策略在单个样本外区间有效还不足以说明问题。我建议接下来做三件事换时间段再测把同样代码跑在2013-2015年、2022-2023年这些行情风格差异很大的区间。大牛市、熊市、震荡市都测一遍才知道这套战法适合什么市场环境。做蒙特卡洛扰动把每天的成交价人为加上0.2%-0.5%的随机噪声再跑几十次回测。如果收益曲线还能保持正收益说明策略对成交细节不敏感比较皮实如果一扰动就崩溃那说明策略靠的是数据里的巧合。纸面交易验证用一套模拟盘或表格手工记录未来一个月内策略产生的信号——每出一次信号就记录然后跟踪它后续5天的走势。因为任何回测都是对过去的拟合唯一的终极验证永远来自未来。我自己经历过一次很深的教训某个策略回测年化45%看着无敌结果纸面跟踪了三个月真实胜率不到30%。原因在于回测用的收盘价信号在实盘中根本没法精确复现——盘中你只能依据实时价格决策而实时价格和收盘价之间随时可能差出两三个点。纸面交易帮我避开了这次“实盘翻车”。最后再分享一个小的习惯每次跑完模拟测试我都会把当时的市场环境、参数设置、结果文件连同当时的判断理由一起存成一个带日期的目录。过几个月回头看很多当时觉得“没问题”的决策其实都经不起推敲。这些记录才是测试模拟留给你的最大财富——它们不保证你下次不踩坑但至少能让你不在同一个坑里踩第二次。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门