市值中性化
大部分因子当中都包含了市值的影响,所以当我们通过一些指标选择股票的时候, 每个因子都会提供市值的因素,选择的股票就会比较集中, 及选股的标准不太好。市值中性化就是排除市值影响后的因子。
计算方法:
回归法去除
建立目标因子 y 和市值 x 的回归方程,然后计算目标因子和其预测值之间的偏差,偏差就是不受市值影响的部分,即市值中性化后的结果
例如股票振幅,要计算市值中性化后的股票振幅,过程如下:
1. 获取两个因子数据,即股票振幅和市值数据
2. 对目标值因子股票振幅进行去极值,然后标准化
3. 建立市值 x 与股票振幅 y 的回归方程
4. 通过回归系数, 预测新的因子结果 y_predict
5. 求出目标因子 y 与 y_predict 的偏差即为新的因子值
指标参数:
y |
中性化股票振幅输出列。 |
S |
序表,公司基本面数据 |
函数代码:
A |
B |
|
… |
…… |
…… |
13 |
func NSA(A,$y,S) |
=A.derive@o(:nsa_totalshare,:nsa_totalvalue,:nsa_amp,:nsa_amppre) |
14 |
=EXT@c(A,S,"totalShare:nsa_totalshare") |
|
15 |
=A.run(nsa_totalshare* 收盘:nsa_totalvalue) |
|
16 |
=A.run(if(#==1,0,( 最高 - 最低)/ 收盘 [-1]):nsa_amp) |
|
17 |
=A.sert("nsa_amp") |
|
18 |
=B17(1).numnorm() |
|
19 |
=A.([lg(nsa_totalvalue)] | 1) |
|
20 |
=linefit(B19,B18(1)).conj() |
|
21 |
=A.run(lg(nsa_totalvalue)*B20(1)+B20(2):nsa_amppre) |
|
22 |
=A.run(nsa_amp-nsa_amppre: ${y}) |
|
23 |
=A.alter(;nsa_totalshare,nsa_totalvalue,nsa_amp,nsa_amppre) |
函数保存到 indicator.splx。
举例:调用脚本计算浦发银行 2024 年的中性化股票振幅。
A |
B |
|
… |
… |
|
4 |
=call@f("indicator.splx") |
登记脚本中的函数 |
5 |
… |
K线数据 |
6 |
… |
公司基本面数据 |
7 |
=A5.derive(:NSA) |
增加要返回的指标字段 |
8 |
=NSA(A7,NSA,A6) |
调用函数计算指标 |
运行效果: