板块动量分析与Python次日策略:聚焦软件、金融科技、电网设备与恒生科技
发布时间:2026/9/1 17:42:07 作者:尧图编辑部 阅读量:1,286

很多做复盘的人会在收盘后把“软件、金融科技、电网设备、恒生科技”这几个方向放在一起看。表面上看这只是当天热点板块的简单罗列但如果你认真做过策略研究就会意识到一个矛盾这几个方向的驱动逻辑不同、交易市场不同、资金属性也不同把它们放进同一张表里真正能提炼出来的共性是什么我的判断是不要试图从这种“多板块并存”的复盘里直接预测明天的涨跌而是把“明天策略”改造成一个工程流程。所谓工程流程就是以可追踪的日线数据为输入经过明确的信号规则、仓位约束和执行条件得到一份可以随时被市场变化取消的预案。只有这种预案才能真正回答“软件走强时金融科技要不要跟”“电网设备回调是风险还是机会”“恒生科技和A股板块能不能用同一套动量逻辑”这类具体问题。接下来的内容会先解释四个方向的定义和定价逻辑再给出一个基于 Python 的板块动量分析与次日策略框架最后落到回测验证、常见排错和工程化建议。说明一下这篇文章是方法论不构成投资建议也不预测任何具体涨跌它解决的是开发者如何建立一套自己可运行、可复核、可回测的决策流程。1. 为什么要把四个方向放在同一个框架里先看这四个关键词的共同点它们都是科技相关资产但各自的风险收益特征其实差异很大。“软件”是典型的高弹性成长板块行情往往由产品预期、订单和流动性驱动启动时涨幅快回调时幅度也大。“金融科技”的核心客户是银行、券商和保险机构业绩波动往往跟随金融机构的 IT 投入周期和单纯软件股相比多了一层机构资本开支的属性。“电网设备”属于高端制造与基础设施建设的交叉方向订单确认周期长基本面兑现慢但一旦形成趋势持续性往往比纯主题炒作更稳。“恒生科技”则是港股科技板块的总称覆盖互联网平台、消费电子、SaaS 和部分半导体公司它不仅受行业景气度影响还叠加了汇率、港股流动性和美股科技股情绪等多重外部变量。把这四个方向放在同一个分析框架里真正的价值不是预测明天谁最强而是建立一个横截面比较机制。比如当软件板块的 20 日动量快速上升时我们应当判断金融科技是否会在某个滞后周期后形成补涨或者电网设备是否正在出现资金切换。这种跨板块的强弱对比比孤立看某一个板块的涨跌幅更能反映资金的大方向。从工程角度看这种框架还解决了另一个问题板块研究很难靠人工盯盘完成。一个板块有几十只甚至上百只成分股如果每天手动整理涨跌幅、成交量和回撤数据既容易出错也无法形成稳定的历史积累。正确的做法是把日线数据入库用代码统一计算动量、回撤和相关性再让决策规则独立运行。这也是后面几章要逐步展开的内容。有一点必须提前说清楚这些板块之间不是完全独立的。软件和金融科技有大量公司存在业务重合电网设备也可能受同一笔基建资金预期影响。因此只看“涨跌排名”会高估分散度甚至出现四个方向信号高度同向的情况。引入风险预算和相关性约束是让策略稳定落地的重要一步。2. 四个方向的核心概念与适用场景2.1 软件板块软件板块在行情软件里通常被拆成基础软件、工业软件、办公软件、网络安全和 AI 应用等多个细分方向。它的商业模式偏订阅制或项目制收入确认比硬件公司更有持续性因此市场对它的估值更多参考远期空间而不是当期利润。从交易角度看软件板块的行情往往是事件驱动和趋势驱动的混合。例如 AI 应用落地、信创订单释放、企业级 SaaS 渗透率提升都可能成为阶段性的催化剂。但软件公司的盈利波动比较大研发费用前置、项目回款周期长导致基本面兑现速度经常慢于股价这也是软件板块波动率偏高的原因。对开发者来说跟踪软件板块需要注意成分股会频繁更新。很多行情源会按“软件服务”“软件产业”等口径分类不同口径的成分股差异很大所以分析软件板块时最好固定一个分类口径不要中途混用否则计算出来的动量指标会失真。2.2 金融科技金融科技本质上是一批“向金融机构卖技术”的软件公司业务覆盖银行核心系统、证券交易系统、支付清算、反洗钱、风控合规和保险科技。它和软件板块最大的区别是下游客户高度集中于持牌金融机构因此业绩和金融机构的 IT 投入周期高度相关。金融科技的行情逻辑通常分成两层第一层是行业景气度比如金融机构加大数字化转型投入、信创系统升级、新业务上线带来的系统改造需求第二层是交易情绪因为金融科技股自带“互联网金融”“数字经济发展”的标签在市场风险偏好抬升时容易获得超额弹性。需要注意的是金融科技板块内部的分化非常明显。有的公司收入依赖银行预算增长稳定但想象空间有限有的公司切入支付、信贷和财富管理场景收入弹性大但合规风险也更大。也就是说做金融科技的板块分析时不能只盯指数还要看细分方向上是否存在政策或业务模式变化。2.3 电网设备电网设备并不属于通常意义上的“科技软件”范畴它包括变压器、开关设备、智能电表、特高压设备、继电保护和新能源并网装置等。这个方向的主要驱动力是电网投资计划和电力系统改造需求订单可见度比大多数消费类公司更高。电网设备板块有个显著特征订单落地到收入确认之间通常隔着几个季度。因此即使板块在题材阶段快速上涨公司财报里的收入增速也未必同步兑现。如果我们用短期动量策略去跟踪它就必须做好“价格领先基本面”的心理准备否则很容易在公告季被业绩落差打乱节奏。同时电网设备属于高端制造行业格局相对集中龙头企业对招投标节奏影响较大。板块内部个股与个股之间的关系比软件板块更紧密所以用指数级数据做分析时效果通常比个股分析更稳定。2.4 恒生科技恒生科技是一个港股行业指数不是 A 股板块。它覆盖了大部分在香港上市的中国科技公司与 A 股科技板块有一定的基本面相关性但交易规则完全不同港股是 T0没有单日涨跌幅限制存在做空机制同时还要考虑港币与人民币之间的汇率变化。对 A 股投资者来说跟踪恒生科技最常用的方式是港股通标的或场内 ETF。但 ETF 的价格还会受到升贴水影响也就是说即使指数本身涨了ETF 的实际成交价也未必同步上涨。因此把恒生科技的“指数动量”直接等同于“持仓收益”会产生不小的偏差。在一个同时包含 A 股和港股资产的策略框架里恒生科技应该被当作一个独立的风险因子来处理。它的交易时段、结算规则和节假日安排与 A 股不同所以如果要按“次日策略”执行必须额外增加日期对齐逻辑不能直接用 A 股的交易日历去处理。3. 基于 Python 的板块日线数据准备3.1 数据源选择做板块分析之前先要解决数据获取问题。国内常用的数据源大致分为三类开源社区维护的 AkShareTushare 这一类带积分机制的接口库以及 Wind、Choice、同花顺等商业终端。开源库的优势是免费、接入快但接口经常调整字段稳定性不如商业终端商业终端数据质量高但要评估授权成本和运行环境限制。更稳妥的做法是把原始日线数据先落到本地 CSV 或 SQLite 数据库策略模块只读取本地数据。这样做的好处是即便上游数据源临时变更或者你自己切换了数据供应商历史策略回测结果也不会因为数据格式变化而失真。下面演示的代码就是以本地 CSV 为输入这样不会被某个具体接口的字段差异绑死。3.2 环境搭建建议使用 Python 3.9 或更高版本并单独创建虚拟环境避免和系统 Python 或项目依赖互相污染。conda create -n market_analy python3.10 -y conda activate market_analy pip install pandas numpy akshare matplotlib如果不用 conda也可以用 virtualenv。这里把 AkShare 装上是为了演示“从开源接口拉取数据并落盘”的通用思路后续分析核心并不依赖 AkShare。示例环境会用到 pandas 做表格计算、numpy 做向量运算、matplotlib 做可视化如果有 SQLite 需求Python 标准库中的 sqlite3 也足够用。拉取数据时可以先用 AkShare 的行业板块接口做一次全量下载再把字段统一转换成下面演示的本地格式。需要说明的是AkShare 不同版本对接口名称和字段名的定义不完全一致具体调用前应以你安装版本的文档为准。下面这段代码给出的是思路不是永久不变的接口写法。# 文件路径fetch_sector_data.py import akshare as ak import pandas as pd # 示例拉取某个板块的历史行情并保存为 CSV # 如果你的 AkShare 版本不同请用 help(ak) 查看实际函数名 try: df ak.stock_board_industry_history_em( symbol软件服务, start_date20240101, end_date20241231, ) df.to_csv(data/software_history.csv, indexFalse) print(df.tail()) except Exception as e: print(接口调用失败请检查 AkShare 版本后再试) print(e)这里的关键点不在于接口本身而在于字段标准化。我建议统一保存为五列date、open、high、low、close其中 date 是日期close 是后复权或前复权后的收盘指数。复权口径必须统一否则计算阶段收益时会叠加分红除权造成的跳跃。如果你的数据源已经做了复权就在本地文件里加一个adjust_type字段记录它是前复权还是后复权方便以后复查。4. 板块动量矩阵与横截面排序只看单日涨跌幅就像只看后视镜里的最近一段路很难判断趋势是否已经发生变化。更合理的做法是同时观察多个时间窗口的收益和近期回撤这样既能捕捉短期的强势又能避免追到已经涨过头的方向。下面这段代码会读取本地 CSV然后生成一个“动量矩阵”每一行代表一个板块每一列代表不同周期下的区间收益最后按综合动量从高到低排序。# 文件路径daily_sector_analyzer.py import pandas as pd CSV_PATH data/px.csv def load_px(path: str) - pd.DataFrame: # 预期 CSV 格式date, software, fintech, grid, hstech df pd.read_csv(path, parse_dates[date]) df df.set_index(date).sort_index() return df def rolling_max_drawdown(series: pd.Series, window: int 20) - float: y series.iloc[-window:] peak y.cummax() dd (y - peak) / peak return dd.min() def build_momentum_matrix(df: pd.DataFrame, windows(5, 20, 60)) - pd.DataFrame: rows {} for col in df.columns: row {} for win in windows: payoff df[col].iloc[-1] / df[col].iloc[-win] - 1 row[fmom_{win}d] round(payoff, 4) row[max_drawdown_20d] round(rolling_max_drawdown(df[col], window20), 4) rows[col] row matrix pd.DataFrame(rows).T matrix[mean_mom] matrix[[fmom_{w}d for w in windows]].mean(axis1) matrix[score] ( 0.6 * matrix[mom_5d] 0.3 * matrix[mom_20d] 0.1 * matrix[mom_60d] ).round(4) matrix matrix.sort_values(score, ascendingFalse) return matrix if __name__ __main__: px load_px(CSV_PATH) matrix build_momentum_matrix(px) print(matrix)这段代码有三个地方值得解释。第一我用了 5 日、20 日、60 日三个窗口。5 日反映短期情绪20 日反映月度趋势60 日反映季度动量。三个窗口的权重并不固定你完全可以根据自己的风格调整但要注意权重一旦变了回测结果要重新做不能只改在生产环境里。第二代码里加入了 20 日最大回撤。这个值的作用是防止我们选中“虽然前期涨幅很大但最近已经连续回撤”的方向。有的板块 60 日动量非常漂亮但从高点回撤了 15%此时盲目进入很可能接在调整的中途。第三score 是横截面排序的核心。它不是一个绝对涨跌预测而是一个相对强弱分数。分数高只代表该板块在四个方向中处于相对强势的位置不代表它明天一定继续涨。真正的交易决策还需要结合第 5 章的流程和风险预算来做。运行上面代码后你会看到类似下面这样一张表格。请注意这里的数值只是为了演示输出结构不是真实行情数据。板块mom_5dmom_20dmom_60dmax_drawdown_20dmean_momscoresoftware0.0210.0580.132-0.0410.07030.0421fintech0.0100.0330.091-0.0520.04470.0251grid-0.0060.0180.047-0.0710.01970.0095hstech-0.018-0.0240.036-0.093-0.0020-0.0108如果只看 5 日收益软件板块已经领先再看 20 日和 60 日软件同样占优同时它的回撤最小。也就是说至少在示例数据里软件板块是横截面上相对最强势的方向。电网设备和恒生科技的短期动量偏弱但电网设备未来仍可能存在反转机会需要靠次日策略中的开盘条件确认。5. 明天策略的完整流程设计很多人理解的“明天策略”是预测明天哪只股票会涨。真正可执行的策略应该是一套包含观察条件、触发信号、仓位上限和取消条件的规则。我建议把流程拆成五步。第一步确定可交易标的。对大部分开发者来说用板块 ETF 或指数基金作为分析载体比逐只分析成分股更稳定。因为板块 ETF 解决了单一个股暴雷的问题流动性也更好。如果只能买股票那就要在板块内按权重和流动性选出候选池避免把注意力放在市值过小的标的上。第二步生成动量矩阵与回撤矩阵。每天都运行一遍第 4 节的daily_sector_analyzer.py把四个方向最近 5 日、20 日、60 日的得分记录下来。这里要格外注意不要只在收盘后运行一次。更合理的做法是每周固定一天跑一次并且把每次输出归档到独立目录方便以后复盘策略信号是否失灵。第三步把分数映射到交易信号。这里不要追求复杂模型先用最简单的分段逻辑即可。例如score 大于 0.02 时标记为“关注”score 小于 -0.02 时标记为“回避”中间值标记为“观望”。阈值并不神秘它来自对历史数据的观察但必须通过回测验证而不是拍脑袋。# 文件路径strategy_engine.py import pandas as pd def map_signal(score: float) - str: if score 0.02: return watch if score -0.02: return avoid return hold def build_plan(matrix: pd.DataFrame, risk_budget: float 0.02) - pd.DataFrame: plan [] for symbol, row in matrix.iterrows(): signal map_signal(row[score]) dd abs(row.get(max_drawdown_20d, 0)) # 回撤过大时即使动量靠前也只允许小仓位观察 if dd 0.08: size 0.25 * risk_budget elif signal watch: size 1.0 * risk_budget else: size 0.0 plan.append({ symbol: symbol, score: row[score], signal: signal, drawdown_20d: dd, target_size: round(size, 4), }) return pd.DataFrame(plan)第四步是设定风险预算。我在这里用了一个基础思路单日最大风险预算为账户净值的 2%再根据板块回撤动态调整单板块的目标仓位。如果某个方向 20 日最大回撤已经超过 8%即使它的动量排名靠前也只允许观察仓进入。这样做等于承认短期动量的局限性它可能延续也可能突然反转。第五步是写好“明日预案”。预案应该包含开盘后的确认条件而不是死板地执行。举个例子如果软件板块在动量矩阵里排名第一那么次日开盘后如果它高开但迅速跌破前日收盘价说明盘前情绪已经被快速消化预案应当自动降级或取消如果它高开且成交量较前一日明显放大再考虑是否按目标仓位执行。这个“触发—确认—取消”的过程才是一个真正可执行的明天策略。6. 回测验证与效果检验回到那一句经常被低估的话任何策略都必须先跑过历史回测。回测的目的不是找到一个完美的参数而是确认这个策略在价格行为上有基本的一致性不会完全依赖运气。下面给一个最简单的板块轮动回测框架每天取动量排名前 2 的板块等权持有次日再重新排序调仓双边交易成本设定为 0.05%。# 文件路径backtest_simple.py import pandas as pd def backtest_daily_signal(px: pd.DataFrame, top_n: int 2, fee: float 0.0005): ret px.pct_change() weights pd.DataFrame(0.0, indexpx.index, columnspx.columns) for i in range(1, len(px)): # 用前一交易日收盘数据计算动量避免用到未来信息 prev_row px.iloc[i - 1] mom (prev_row / px.iloc[max(0, i - 21)] - 1) ranking mom.rank(ascendingFalse) selected ranking[ranking top_n].index.tolist() for col in selected: weights.iloc[i, px.columns.get_loc(col)] 1.0 / len(selected) portfolio_ret (weights.shift(1) * ret).sum(axis1) turnover weights.diff().abs().sum(axis1).fillna(0) net_ret portfolio_ret - turnover * fee nav (1 net_ret).cumprod() return nav, net_ret if __name__ __main__: px pd.read_csv(data/px.csv, index_col0, parse_datesTrue) nav, net_ret backtest_daily_signal(px) print(期末净值:, round(nav.iloc[-1], 4)) print(最大回撤:, round((nav / nav.cummax() - 1).min(), 4)) print(交易次数:, int((net_ret ! 0).sum()))这段代码里有一个很容易犯的错误一定要用前一天的收盘数据计算动量而不是用当天的数据。如果当天数据还没有结束就拿当天数据做排序回测结果会严重虚高这就是典型的未来函数问题。上面代码里prev_row取的是前一交易日的收盘价px.iloc[i-21]是前一个月的收盘价所以排序过程完全不包含当天信息。运行结果出来后不要只看期末净值。更重要的指标有三个最大回撤、交易次数和盈亏比。如果策略在一个季度内频繁调仓交易成本会吃掉大量收益如果最大回撤超过 20%说明策略并不稳定需要调整 top_n 或动量窗口。这里尤其要控制“反复改参数直到历史净值最好看”的冲动。过拟合是量化策略最常见的失败原因正确的做法是先设一组基准参数再在样本外区间验证。如果回测结果不理想先检查数据有没有问题再检查信号逻辑。常见的数据问题包括复权口径不统一、交易日期未对齐、恒生科技在 A 股休市日没有数据导致 DataFrame 缺行。信号逻辑问题则要看是不是动量窗口太短导致频繁反转。7. 常见问题与排查思路下面把这些年最容易遇到的问题整理成了一张表格方便你照着排查。问题现象可能原因排查方式解决方案收盘后数据与盘中行情不一致行情源对不同板块成分股定义不同对比数据源披露的成分股数量和日期固定一个板块口径并按快照日期归档四个方向信号频繁同向软件与金融科技存在大量业务重合计算板块收益率相关系数矩阵在评分中增加相关性惩罚或只保留一个高相关方向恒生科技在 A 股交易日缺失数据港股节假日与 A 股不同检查两个市场日历差异用最近交易日数据向前填充或单独处理港股交易日回测结果很好实盘连续亏损种子参数过拟合未做样本外验证把历史数据切成训练期和验证期重新设计参数选择流程减少调参自由度同一个板块在不同软件里代码不同分类标准不一致核对板块指数编制规则在数据仓库里保存板块成分表版本号除权除息后价格突变数据源未做复权处理查看区间收益是否出现异常跳变统一使用后复权或前复权数据如果只能记住一条排查原则那就是出问题时先问“数据有没有错”再问“策略逻辑有没有错”。大部分策略失效不是信号规则写得不好而是数据口径、日期对齐和复权方式在某个环节出了偏差。把数据快照和代码版本管理起来可以让你在复盘时快速定位到问题所在而不是靠猜。8. 工程化与风险管理最佳实践策略研究写得快不代表能稳定运行。把“明天策略”变成一套可重复执行的系统需要考虑工程化问题。第一数据必须本地落盘。不要每次运行都实时拉接口因为接口不稳定会造成策略信号缺失。建议用每日定时任务把行情数据落到本地再在本地完成计算。数据仓库文件也要带上版本号例如px_20240813.csv这种命名方式避免每次覆盖历史数据。第二交易计划必须有日志。不要只输出最终信号要把输入数据、动量矩阵、评分明细、风险预算和最终预案全部保存下来。这样当某一天信号出问题时你可以回溯到具体是哪一步计算出了偏差。用logging模块写日志或者直接把 DataFrame 追加到一个signal_log.csv文件中都是不错的做法。第三仓位控制是第一优先级。无论动量指标有多强都不要把全部资金压在一个板块上。至少执行两个约束单板块初始仓位不超过风险预算的 1 倍全部板块合计仓位不超过账户净值的 80%。如果策略持有恒生科技还要额外考虑汇率波动和港股的隔夜跳空风险降低该方向的目标仓位。第四区分不同交易规则。A 股是 T1当天买入后不能卖出港股和部分 ETF 虽然可以 T0但也要考虑流动性和价差。如果你要同时交易四个方向必须为不同市场维护独立的执行规则不能共用同一个“次日买入、次日卖出”的模板。第五注重合规与授权。使用开源行情库或商业数据接口时都要确认数据使用条款尤其是机构内部使用场景。涉及账号、Token、服务器权限时要遵循最小权限原则不要把密钥写进代码仓库。任何自动化策略都应经过合法授权并在模拟盘环境验证后再考虑小仓位实盘。第六主动设计“取消机制”。明天策略不是今天写死就不会改。第二天开盘后如果盘面表现和预案假设明显不符要立即降级。一个最简单的做法是开盘前 15 分钟内不要交易等成交量稳定后再确认信号如果板块指数低开超过 2%直接跳过当天买入动作。9. 用 8.13 这类复盘日生成一份“明日策略”样例我们用一个完全虚构的数据来演示流程假设 8.13 收盘后得到的动量矩阵如下。注意以下数据只是为了展示计算过程不是任何真实盘面信息。板块scoresignaltarget_sizesoftware0.0421watch0.0200fintech0.0251watch0.0200grid0.0095hold0.0000hstech-0.0108avoid0.0000按照第 5 章的规则软件和金融科技进入了观察名单电网设备保持观望恒生科技暂时回避。那么“明天策略”并不是无脑买入软件和金融科技而是设定好开盘确认条件。如果软件板块次日高开并在 15 分钟内站稳分时均线同时成交额不低于 8.13 日均值的 80%则可以按 2% 风险预算建仓如果高开后快速回补跳空缺口说明做多资金不足预案直接取消。金融科技的确认阈值可以比软件稍宽因为它可能与软件产生共振但也可能独立走弱。电网设备暂时不操作但如果它在低位放量并重新站上 5 日线可以把它从观望状态提升到观察状态。整体仓位合计为 4%剩余部分保留现金。这个预案的好处是它不是在 8.13 收盘后强行判断“明天一定会涨”而是给第二天开盘后的价格行为设置了一个清晰的过滤条件。符合条件就执行不符合就放弃这就是工程化的“明天策略”。如果你真的想把这套流程跑起来建议从一个最小数据集开始先把本地 CSV、动量矩阵和策略脚本跑通再逐步接入实时行情和提醒。这样等到下一次遇到多板块并存的复盘日你拿出来的就不再是一句模棱两可的“明天策略”而是一套可以追溯、可以回测、可以及时取消的应对预案。