相对行业波动率

过去 N 日, 股票相对行业指数的收益波动率, 相对收益波动率越大, 股票相对行业指数越容易走出不同走势。
相对行业波动率 =(股票涨幅 - 行业涨幅)的 N 日标准差 * sqrt(N 日)
行业涨幅 = 行业收盘价 / 昨日行业收盘价 -1
行业收盘价取当前股票所在一级行业或二级行业内所有股票的当日收盘价的中位数。

指标参数为:

y

RIV 输出列

S

序表,行业收盘价

n

时间周期


这个指标中需要用到股票列表数据和行业收盘价,为了方便其他指标复用,在写函数代码之前我们先编写两个脚本。

(1) 读数脚本 loadstock.splx

代码:


A

B

1

=pos(opt,"ST")

=pos(opt,"w")

2

=if(ifv(DATAPATH),DATAPATH,"")


3

=T(A2/"stock.btx").select((!ipo || ipodate<ipo) && (!outdate || outdate>out) )

4

=A3.select(A1 || !pos(name,"ST") )


5

=if(B1, A4.derive().keys@i(code), A4.id(code) )


6

return A5


脚本参数:

opt

参数中包含“ST”时,返回值包含 ST 股票,反之会清洗掉 ST 股票;参数中包含“w”时,返回序表,反之返回股票代码序列

ipo

上市日期

out

退市日期

(2) 行业收盘价计算脚本 calcindustry.splx

代码:


A

B

1

=pos(opt,"i")


2

=cl=[cl].conj().sort()


3

=ifn(SL, Stock@STw() )


4

if !A1

=A3.select(cl.select@b1( ~-code) )

5


=B4.group(industry)

6


=B5.(~1.industry)

7

=ifn(B6,A2)


8

=A3.group(industry).select(A7.select@b1( cmp( ~, industry) )).( Load( ~.(code), sd, ed ).group( industry, tdate; ~.(close).median():close) )

9

=if(A1, A8, B5.conj( ~.news( A8(B5.#); code, tdate, close )).derive().keys@i(code,tdate) )

10

return A9


脚本参数:

cl

股票代码,可以为单支或序列,如 600000 或 [1,600690,600519]

sd

开始日期

ed

截止日期

SL

序表,股票列表数据。参数省略时会自动读取

下面我们来编写相对行业波动率指标函数:


A

B

……

……

25

func RIV(A,$y,S, n)

=A.derive@o(:riv_hmedclose,:riv_pctChg,:riv_hpctChg,:riv_rchange)

26


=EXT@c(A, S, "close:riv_hmedclose")

27


=A.run(收盘 / 收盘 [-1]-1:riv_pctChg,riv_hmedclose/riv_hmedclose[-1]-1:riv_hpctChg)

28


=A.run(riv_pctChg-riv_hpctChg:riv_rchange)

29


=A.run(var@sr(riv_rchange[1-n:0])*sqrt(n):${y})

30


=A.alter(;riv_hmedclose,riv_pctChg,riv_hpctChg,riv_rchange)

函数保存到 indicator.splx。

举例:

调用脚本和函数计算浦发银行 2024 年相对行业波动率,n 取 250。


A

B


5

=call@f("indicator.splx")

登记脚本中的函数

6

>register@o("Stock", "loadstock.splx")

登记股票列表读数脚本

7

>register@o("Industry", "calcindustry.splx")

登记行业收盘价计算脚本

8

……

K线数据

9

=Industry(A2, A3, A4)

计算行业收盘价

10

=A8.derive(:RIV)

增加要返回的指标字段

11

=RIV(A10,RIV,A9,250)

调用函数计算指标

运行效果:

..