在上一篇《个人量化选股(三):为什么是趋势动量,以及准入硬门槛与防追高》中,三道准入硬门槛(站上 MA200 年线、12-1 动量大于零、距年线乖离不超过 +30%)从 200 只中外观察池中过滤出了 63 只合格标的(中国资产 31 只,美股 32 只)。

这也是我最近在 QuantFull 整理的「个人量化选股实战体系」的第四篇。63 只股票通过了安全检查,但个人投资者的账户体量通常在几万到几十万元人民币之间。我们不可能把这 63 只股票全买下来。如果每只股票买一点,持仓就会退化成一个自制指数基金,小额资金频繁交易还会被券商最低佣金侵蚀净值。

在真实交易中,个人股票组合通常只容纳 3 到 6 只核心标的。

从 63 只准入合格标的收敛到最终的 3 到 6 只实盘持仓,需要经过截面打分、同门去重、行业集中度检验与整手物理资金过滤五个步骤:

个人量化选股:从准入到落地的五步收敛机制
个人量化选股:从准入到落地的五步收敛机制

截面打分双轨制:美日市场卡玛比率 vs 港 A 市场 12-1 动量

用同一套指标打全天下的市场,在实盘中会遇到水土不服。

我们在监控系统与实盘回测中,对不同市场的打分指标进行了明确区分:

  • 美股与日股:实盘监控采用 1 年卡玛比率(Calmar Ratio) 排序;
  • 港股与 A 股:确立采用 12-1 相对动量 排序。

为什么不同市场要用不同的打分方式?两者的计算口径如下:

$$\text{Calmar Ratio} = \frac{\text{Return}{1\text{y}}}{|\text{MaxDrawdown}{1\text{y}}|}$$

$$\text{Mom}{12-1} = \frac{P{t-21}}{P_{t-252}} - 1$$

卡玛比率把过去 1 年的收益率除以过去 1 年的最大绝对回撤。美股与日股属于成熟机构市场,中长期单边趋势具备自增强特征。但在单边上行中,成长科技股容易因阶段性流动性收紧而剧烈回调。在美股 48 只池的换股研究中,12-1 动量的年化换手率高达 160%~275%,而 1 年卡玛比率的年换手率只有 130%。美股日股选择卡玛比率的出发点是降低无效交易摩擦,选出回撤浅、走势平稳的复利标的。

但在港股和 A 股市场,如果硬套卡玛比率,排序会发生什么变化?

为了回答这个问题,我们用最新日 K 数据对 A 股 21 只和港股 23 只核心候选标的,分别按 12-1 相对动量与 1 年卡玛比率进行了全量重排:

港股与A股相对动量vs卡玛比率排名位移对比
港股与A股相对动量vs卡玛比率排名位移对比

图中的排名位移呈现出两个市场的关键分化:

在 A 股市场,12-1 相对动量与 1 年卡玛比率的 Spearman 秩相关系数仅为 0.645,排序发生了剧烈洗牌。算力与半导体等高弹性标的(如中际旭创、天孚通信、新易盛),虽然过去 1 年涨幅可观,但因为最大回撤全部超过了 -50%,在卡玛比率下遭受严重扣分,名次普遍下滑 4 到 11 名;相反,长江电力、中国核电、美的集团等公用事业与红利标的,由于最大回撤只有 10% 到 13%,卡玛排名大幅前移(长江电力直接从第 14 窜升至第 6)。A 股市场牛短熊长、轮动剧烈,如果为了追求曲线平滑而硬套卡玛比率,系统就会把宝贵的仓位塞给年化仅 10% 出头的低波动防御股,彻底失去动量组合的超额弹性。因此 A 股必须维持 12-1 相对动量。

在港股市场,两者的秩相关达到 0.931,但在前几名的分配上产生了致命的行业单一化。内资四大行(中国银行、工商银行、建设银行)在过去 1 年的最大回撤仅 -10.8% 到 -11.4%,卡玛比率高达 3.7 到 5.1。如果按卡玛比率选股,港股前三名将被这三家银行直接垄断;而 12-1 动量最强(+75.7%)的航运龙头太平洋航运(回撤 -23.9%),直接被挤到了第 6 名。采用 12-1 相对动量,能够打破银行板块的单一垄断,让太平洋航运(第 1)、汇丰控股(第 2)、中国银行(第 3)与中远海控(第 4)形成覆盖航运、煤炭与综合金融的多元主线。

美日市场的稳态精排与港 A 市场的相对动量分布对照如下:

截面打分双轨制:美日卡玛比率与港A相对动量
截面打分双轨制:美日卡玛比率与港A相对动量

在美日市场中,默沙东(MRK)卡玛比率 7.97、可口可乐(KO)卡玛比率 4.52、日立(6501)卡玛比率 3.32,用卡玛能有效筛选出回撤浅的稳态龙头;而港 A 市场采用 12-1 动量,能够直接抓住主线领头羊。

计算两类指标的 Python 向量化代码如下:

import numpy as np
import pandas as pd

def compute_calmar_and_momentum(prices: pd.Series) -> tuple[float, float]:
    """输入日度收盘价序列(后复权),返回 1 年卡玛比率与 12-1 相对动量。"""
    if len(prices) < 252:
        return 0.0, 0.0
    
    # 1. 计算 12-1 相对动量(剔除最近 21 日反转噪声)
    p_last_lag21 = prices.iloc[-21]
    p_base_lag252 = prices.iloc[-252]
    mom_12_1 = float((p_last_lag21 / p_base_lag252 - 1.0) * 100.0)
    
    # 2. 计算过去 1 年(252 天)最大绝对回撤与年化收益
    px_1y = prices.iloc[-252:]
    cummax_1y = px_1y.cummax()
    drawdown_1y = (px_1y - cummax_1y) / cummax_1y
    max_dd = float(abs(drawdown_1y.min()))
    ret_1y = float(px_1y.iloc[-1] / px_1y.iloc[0] - 1.0)
    
    calmar = float(ret_1y / max_dd) if max_dd > 0.001 else 0.0
    return calmar, mom_12_1

同门去重:A/H 两地上市溢价中位数仲裁

选出高分标的之后,我们面对一个中国市场特有的问题:很多大型蓝筹企业在 A 股和港股两地同时上市。

中国神华(601088 / 01088)、中远海控(601919 / 01919)、中国石油(601857 / 00857)、建设银行(601939 / 00939)和紫金矿业(601899 / 02899)等标的,业务相同,基本面一致。

如果把同一家公司的 A 股和 H 股同时买进组合,等于在单一标的上押了双倍仓位,违背了资金分散原则。

同门标的只能二选一。面对两边的股票,到底选哪一边?

常见的三种直觉选法:

  1. 总是选 A 股(图交易习惯和流动性);
  2. 总是选 H 股(图名义折价和高股息);
  3. 选动量更高的一边(谁涨得猛买谁)。

我们提取了 15 组典型的 A/H 对标股票,用 2021 年末至 2026 年中连续 143 个季度样本进行了回测对比。数据已换算为人民币同口径计价,并扣除股息红利税(港股通个人按 20% 扣税,A 股按持有 1 个月至 1 年的 10% 扣税):

AH同门去重与溢价中位数仲裁回测实证
AH同门去重与溢价中位数仲裁回测实证

实测数据对比(ah_listing_rules.csv):

选拔法则 样本季度数 下季平均实际收益 选中表现更优一侧的胜率 策略实测表现
总是选 A 股 143 +3.81% 46.85% 略跑输 H 股,无超额能力
总是选 H 股 143 +3.83% 53.15% 长期折价和分红带来微弱优势
选动量高的一边 143 +3.27% 45.45% 收益落后,产生负向损耗
1 年溢价中位数仲裁 143 +4.39% 56.64% 收益提升,选边胜率过半

数据反映出两个事实:

  1. 追动量选边会挨打:在两地上市的标的中选择动量更高的一侧,下季平均收益只有 +3.27%,胜率降到了 45.45%,比总是选 A 股或总是选 H 股都要差。因为 A 股与 H 股的价差往往呈现均值回归特性,追逐短期相对强势的一边,极易买在溢价扩张的波段顶部。当两地估值差收敛时,换边操作两头受损。
  2. 溢价中位数仲裁有效:当某只股票的 A 股溢价率高于它自己过去一年的中位数时,选 H 股;低于中位数时,选 A 股。下季度平均收益提升到 +4.39%,选对边的概率提高到 56.64%。

以中国神华(601088 / 01088)为例,面板 B 展示了其历史溢价率与 1 年滚动中位数通道。溢价率并不是固定不变的,它围绕自身中枢上下摆动。当 A 股溢价过高时买入 H 股,能享受到更深的折价保护与分红;当溢价回落至中位数下方时持有 A 股,则能分享 A 股端的估值溢价。

执行 AH 溢价中位数仲裁的逻辑代码如下:

import pandas as pd

def arbitrate_ah_pair(
    a_raw_close: float,
    h_raw_close: float,
    hkd_cny_rate: float,
    history_prem: pd.Series
) -> str:
    """输入两地不复权收盘价、实时汇率与过去一年历史溢价序列,返回选 A 还是选 H。"""
    # 1. 计算当前 A 股相对 H 股的溢价率
    h_price_cny = h_raw_close * hkd_cny_rate
    current_premium = (a_raw_close / h_price_cny - 1.0) * 100.0
    
    # 2. 计算过去 252 个交易日的滚动溢价中位数
    median_premium = float(history_prem.iloc[-252:].median())
    
    # 3. 溢价高于中位数选 H,否则选 A
    if current_premium > median_premium:
        return "PICK_H"  # A 溢价过高,选 H 股享折价与高分红
    return "PICK_A"      # A 溢价偏低,选 A 股博估值修复

行业分散神话的破灭:为什么在历史回测中取消行业硬上限

在传统投资组合管理中,一个常见的原则是限制行业集中度,比如「同一个行业最多只能持有一只」。出发点是为了分散风险,防止单一行业暴跌拖垮整个账户。

在策略设计阶段,我们对这条规则进行了压力测试。为了防止主观过拟合,我们在测试前定下了一条硬性标准:

事前冻结规则:和不限行业相比,加入行业限制(每行业最多 1 只)后,组合的最大回撤在「破位后空仓」与「破位后换下一只」两种处理下,都必须至少降低 3.0 个百分点,才保留该限制;否则坚决取消。

我们对港股、A 股、美股、日股四个市场,分别运行了不限行业、合并后大行业限 1 只、细标签限 1 只三种配置的全周期回测:

四大市场行业硬上限回测检验
四大市场行业硬上限回测检验

四个市场实测数据汇总(industry_cap_drawdown_test.csv,换股处理口径):

市场 标的数 $k$ 不限行业 CAGR 大行业限 1 只 CAGR 收益损耗 不限行业最大回撤 大行业限 1 只最大回撤 回撤改善幅度
港股 3 +16.37% +12.35% -4.02 pp -25.08% -22.72% +2.36 pp (未达 3pp 门槛)
A 股 3 +14.50% +8.65% -5.85 pp -35.99% -30.03% +5.96 pp (空仓下恶化 2.4pp,不达标)
美股 5 +17.50% +18.81% +1.31 pp -17.01% -17.45% -0.44 pp (回撤反而加深)
日股 4 +31.08% +21.65% -9.43 pp -26.38% -25.94% +0.44 pp (几乎无改善)

测试结果表明:没有一个市场能稳定达到 3 个百分点的回撤改善门槛。

在日股市场,取消行业限制后,年化收益率从 21.65% 跃升至 31.08%(夏普比率从 0.97 升至 1.23),而最大回撤仅从 -25.94% 微幅增加到 -26.38%(差距不足 0.5 个百分点)。如果机械限制每行业 1 只,组合就必须在三大银行(三菱日联、三井住友、瑞穗)表现优异的年份里强行剔除后两家,换入弱势的其他行业股票。

在 A 股市场,加入大行业限制后,年化收益从 14.50% 跌落到 8.65%。在空仓处理下,收益更是从 10.79% 暴跌至 1.24%,回撤不仅没有收窄,反而加深了 2.4 个百分点。

行业限制在动量策略中失效的原因:

  1. 个人持仓数量有限:个人组合一共只持有 3 到 5 只标的。动量策略的本质是在赢家聚集的产业主线上进行暴露。强行限制每行业 1 只,等于主动踢掉主线行业里的第二名领跑者(如航运周期的中远海控与太平洋航运、煤炭周期的神华与陕煤)。
  2. 买入弱势标的:踢掉主线第二名之后,空出来的仓位必须填满,系统被迫买入非主线行业里相对较弱的平庸标的。这些股票在市场下行时抗跌能力弱,并没有起到保护组合的作用。
  3. 风控职责错配:控制组合系统性风险依靠的是 MA200 年线的绝对止损,而不是靠拉平行业暴露。当整个市场或主线行业破位时,趋势硬门槛会自动触发止损。

回测检验完成后,我们在所有四个市场的实盘配置中,取消了同一行业最多一只的硬性限制。

现实物理约束:整手资金摩擦与顺延选拔机制

做回测时,软件通常假设股票可以任意买入 0.001 股。但在实盘交易中,个人投资者面对着真实的交易制度约束:整手交易限制。

  • A 股市场买入至少为 100 股整倍数;
  • 港股市场各股票一手股数由上市公司自行决定,一手可能是 500 股、1,000 股、2,000 股甚至 5,000 股;
  • 日股市场统一下单门槛为 100 股。

对于资金量在 5 万至 10 万元的个人账户,这个物理限制会带来明显的资产分配问题。

假设 A 股目标持仓为 3 只股票,每只股票的目标仓位是总资金的三分之一(约 3.2 万元)。如果排名前列的股票单价较高,买入一手就需要 5 万元(超过目标仓位的 1.5 倍),这笔交易就会打乱整个组合的仓位平衡。

我们引入了买不起顺延机制:

  1. 按照截面得分从高到低依次选拔候选股票;
  2. 计算买入一手该标的所需的最低本金;
  3. 如果买入一手所需资金超过了该仓位目标资金的 1.5 倍,系统判定为买不起,自动跳过该标的,顺延至下一名候选股票;
  4. 顺延下来的标的继续进行整手检查,直到填满目标持仓名额。

以下是处理整手预算限制与向后顺延的核心算法:

from typing import Dict, List, Optional
import pandas as pd

def select_with_lot_size_budget(
    ranked_candidates: pd.DataFrame,
    total_capital: float,
    target_k: int = 3,
    max_capital_drag_ratio: float = 1.5
) -> pd.DataFrame:
    """输入排好序的候选池、总资金量与目标只数,执行整手预算检查与顺延选拔。"""
    target_slot_capital = total_capital / target_k
    selected_stocks = []
    
    for _, stock in ranked_candidates.iterrows():
        # 计算买入一手所需名义资金(人民币)
        one_lot_cost = stock['price_cny'] * stock['lot_size']
        
        # 如果一手资金超过单只目标资金的 1.5 倍,跳过顺延
        if one_lot_cost > target_slot_capital * max_capital_drag_ratio:
            continue
            
        selected_stocks.append(stock)
        if len(selected_stocks) >= target_k:
            break
            
    return pd.DataFrame(selected_stocks)

在 2026 年 10 月的实际持仓中,这套选拔规则最终确定的持仓分布如下:

  • 雪盈美股账户(6 只个股):可口可乐(KO)、默沙东(MRK)、Visa(V)、苹果(AAPL)、埃克森美孚(XOM)、英伟达(NVDA)。利用 Calmar 比率兼顾了动量与低回撤;
  • 雪盈日股账户(4 只个股):日本邮船(9101)、日立(6501)、三菱日联(8306)、伊藤忠商事(8001)。取消行业限制后,保留了工业与金融主线;
  • 中国股票组合(6 只个股,约 9.58 万元):中信 A 股持有陕西煤业(601225)、中国神华(601088);中信港股通持有建设银行(00939)、太平洋航运(02343)、中远海控(01919);富途持有中国石油(00857)。单只标的资金占比在 15.3% 至 17.5% 之间,分散均匀。

阶段小结

截面打分与去重排他完成了买入端的标的选择:

  • 美日市场采用 Calmar 比率,压制单边暴涨后的大幅回撤,选出稳态复利标的;
  • 港 A 市场采用 12-1 相对动量,剔除短期反转噪声,灵敏捕捉产业主线领头羊;
  • A/H 两地上市标的采用 1 年溢价中位数仲裁,下季平均收益达 +4.39%,胜率达 56.64%,避免了追逐相对动量带来的损耗;
  • 历史回测证明行业硬上限无法降低系统性回撤,反而侵蚀超额收益,因此取消同一行业最多一只的限制;
  • 通过买不起顺延机制,让小体量资金能够处理整手交易门槛。

选出标的之后,下一个问题是调仓节奏。如果每天根据最新排名换股,微小的排名波动就会引发频繁的卖出与买入,产生交易摩擦。

下一篇我们要讨论的是:如何通过设置上轨买入与下轨卖出的双线缓冲区,结合固定的调仓窗口,在实盘中过滤排名抖动带来的无效换手。


选股体系与延伸阅读

本文所属的完整量化选股架构、全景行业雷达与配套策略代码,均整理在 QuantFull:


关于作者