跳转至


课程  因子投资  机器学习  Python  Poetry  ppw  tools  programming  Numpy  Pandas  pandas  算法  hdbscan  聚类  选股  Algo  minimum  numpy  algo  FFT  模式识别  配对交易  GBDT  LightGBM  XGBoost  statistics  CDF  KS-Test  monte-carlo  VaR  回测  过拟合  algorithms  machine learning  strategy  python  sklearn  pdf  概率  数学  面试题  量化交易  策略分类  风险管理  Info  interview  career  xgboost  PCA  wavelet  时序事件归因  SHAP  Figures  Behavioral Economics  graduate  arma  garch  人物  职场  Quantopian  figure  Banz  金融行业  买方  卖方  story  量化传奇  rsi  zigzag  穹顶压力  因子  ESG  因子策略  投资  策略  pe  ORB  Xgboost  Alligator  Indicator  factor  alpha101  alpha  技术指标  wave  quant  algorithm  pearson  spearman  tushare  因子分析  Alphalens  涨停板  herd-behaviour  momentum  因子评估  review  SMC  聪明钱  trade  history  indicators  zscore  波动率  强化学习  顶背离  freshman  resources  others  AI  DeepSeek  network  量子计算  金融交易  IBM  weekly  LLT  backtest  backtrader  研报  papers  UBL  quantlib  jupyter-notebook  scikit-learn  pypinyin  qmt  xtquant  blog  static-site  duckdb  工具  colors  free resources  barra  world quant  Alpha  openbb  数据  risk-management  llm  prompt  CANSLIM  Augment  arsenal  copilot  vscode  code  量化数据存储  hdf5  h5py  cursor  augment  trae  Jupyter  jupysql  pyarrow  parquet  数据源  quantstats  实盘  clickhouse  notebook  redis  remote-agent  AI-tools  Moonshot  回测,研报,tushare 

strategy »

净新高占比因子


个股的顶底强弱比较难以把握,它们的偶然性太强。董事长有可能跑路,个股也可能遇到突发利好(比如竞争对手仓库失火)。在个股的顶底处,情绪占据主导地位,理性退避次席,技术指标出现钝化,进入现状不可描述,一切皆有可能的状态。

但是,行业指数作为多个随机变量的叠加,就会出现一定的规律性(受A4系统性影响的偶然性我们先排除在外,毕竟也不是天天有A4)。这是因子分析和技术分析可以一展身手的地方。

今天要介绍的净新高占比因子,可以用来捕捉行业强弱趋势以及反转,以此因子为基础,我们可以构建指数增强策略。

Tip

  1. NHNL因子如何定义
  2. 锚定效应是本因子的基石
  3. 从因子到策略实现
  4. 如何使用XtQuant来获得数据

因子定义

净新高占比指标是指行业指数中,创年度新高与年度新低之差的个股数占全行业个股数的百分比:

\[ (NHNL)\% = (count(HHV) - count(LLV))/N \]

Tip

从因子定义可以看出,它不是在[-1,1]区间均匀分布的。在机器学习中使用这一方案,会有轻微的梯度优化困难。虽然我们也可以仿RSI的思路,将其改造为:

\[ (NHNL)\% = (count(HHV) - count(LLV))/(count(HHV) + count(LLV)) \]

但这样做显然没有对应的逻辑存在。这是我们在做因子分析时要注意的点。不要刻舟求剑。

因子背后的逻辑

该因子的主要金融原理是锚定效应。行为金融学告诉我们,绝大多数投资者都有很强的锚定效应。投资者始终会以自己买入股票/基金时的价格(即锚定成本)为基准,视自己的账户是处于浮盈还是浮亏状态,来确定自己的操作。

创年度新高的个股,其股票持有者均为浮盈状态,即使其计划卖出,也希望等行情再上涨一段时间,因此其抛压相对较小;而创年度新低的个股,因其股票持有者均为浮亏状态,因此只要行情反弹便有投资者卖出,抛压反而较大。这样就出现了熊市不言底,牛市不言顶的规律,或者说新高之后还有新高,新低之后还有新低的股谚。

Tip

何时这一趋势被反转?上述效应本质上是动量因子。在动量延续时,反转因子的力量也在积聚。此时可以关注反弹因子如月线RSI是否到了前高。如果月线RSI到了前高,再出现确认信号,则一个以季为单位的顶就很可能出现了。

基于这一原理,显然,净新高因子能较好地刻画行业指数的强弱。

信号构建

华福证券以中信一级行业指数为例,给出了以下参考指标:

\[ NHNL = \begin{cases} x \geq 30\% \ 贪婪\\\ 20\% \leq x \lt 30\% \ 乐观\\\ -20\% \lt x \lt 20\% \ 正常区间\\\ -30\% \lt x \leq -20\% \ 悲观\\\ x \leq -30\% \ 恐惧 \end{cases} \]

为了防止一级行业指数个股数太少引发的过大波动,他们建议当一级行业指数上市超过 1 年的个股数小于 40 时,将阈值放宽为±30%/40%。

建议该指标这样使用(以单边做多为例):

  1. 当NHNL进行乐观区间时,开始建仓,此时是动量策略
  2. 当NHNL进入贪婪区间时,注意可能到来的反转。首次从贪婪区间跌回乐观区间时,做空信号出现,下一交易日开盘卖出。
  3. 当NHNL进行恐慌区间时,注意可能到来的反转。首次从恐慌区间涨回悲观区间时,下一交易日开盘买入。此时注意设置好止损位,反弹延续才能继续持有。

代码

代码的关键是要获取行业指数及成份股行情,因为计算一年内的新高和新低非常容易。

我们以XtQuant为例进行演示。XtQuant是迅投研发的行情数据及实盘接口,开通量化权限的话,可以免费获得行情数据,因此它是又一个优秀的免费数据源。我们在第24课有详细介绍它的使用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sectors = set()

for item in get_sector_list():
    for i in range(6, 1, -1):
        key = item[:i]

        if key.startswith("SW1"):
            sectors.add(key)
            break
print(sectors)

# 显示:
'SW1煤炭', 'SW1交通运', 'SW1综合', 'SW1通信' ...

我们大约拿到40个申万一级板块名。接下来我们就需要获取板块内的每支成分股的证券代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
xt.get_stock_list_in_sector("SW1煤炭")

# 显示:

['600121.SH',
 '600123.SH',
 '600157.SH',
 '600188.SH',
 '600348.SH',
 '600395.SH',
 ...
]

获取个股行情数据的方法在最近的笔记中有详细介绍,这里不再重复。

Tip

掌握获取证券列表、再遍历之以获得行情数据,是一个基本方法。也是我们掌握一个数据源时,必须首先掌握的API。这是我们第一课起,就跟大家介绍过的。

更多的代码不便一一演示。我们有示例notebook可以提供。最终我们能得到这样一个效果:

Quiz

请说说为什么净新高占比因子不是在[-1,1]区间内均匀分布的。为了得出结论,你用了几秒?

根据华福证券-市场情绪指标专题(五),进行了提炼和改写,特此致谢!