第六节 自定义指标

第六节  自定义指标


果仁网现有的指标可能还不能满足用户的需要,那么就可以使用自定义指标。

读者需要注意,在公式里面不用写"-"符号。

目前自定义指标支持的计算表达式有:+、-、×、/等算数四则运算。下面笔者简要介绍一下,有兴趣的读者可以在果仁网自己操作。

日期前移函数

这里的时间,主要是指以当天为起始日,往前退N个交易日的对应值的函数。

(1)Ref(指标,天数)或者Dateshift(指标,天数)

将指标的值前移几天。如"Ref(收盘价,5)",就是5日前收盘价。

(2)BarRef(指标,天数)

取得指标几个K线Bar前的值,和Ref()功能类似,很多情况返回同样的值。区别是Ref()包括停牌日,BarRef()跳过停牌日,只数K线图里的Bar。

时序统计函数(纵向统计函数)

这些两数都是对指标在连续的一段日期里进行聚合运算,现在一共有6个单指标移动窗口函数,1个双指标函数。

(1)MA(指标,天数)

计算指标在过去几个交易日(不包含停牌日)的平均值,如"MA(收盘价,5)"就是过去5日平均收盘价。

(2)EMA(指标,天数)

计算指标在过去几个交易日(不包含停牌日)的指数平均值,如"EMA(收盘价,5)"就是过去5日指数平均收盘价。

(3)Sum(指标,天数)

计算指标在过去几个交易日(不包含停牌日)的聚合值,如"Sum(当时成交量,10)".就是过去10日总成交量。

(4)Max(指标,天数)

计算指标在过去几个交易日(不包含停牌日)的最大值,如"Max(收盘价,10)"就是过去10日最高收盘价。

(5)Min(指标,天数)

计算指标过去几个交易日(不包含停牌日)的最小值,如"Min(收盘价,10)"就是过去10日最低收盘价。

(6)Stdev(指标,天数)

计算过去几天里的标准方差,如股价在过去20日涨幅波动率="Sldev(1日涨幅,20)"。

以上的窗口函数,都会跳过停牌日期,如"M阻(收盘价,10)"里面的10天不包含个股停牌的日期,如果想算入停牌日期,可以使用MA2,EMA2,Sum2,Max2,Min2,Stdev2。

(7)Corr(指标1,指标2,天数)

计算在过去几天里两个指标的相关性。比如个股上证涨幅20日相关度="corr(l日涨幅,#bench.change.000001,20)"。Corr()的计算不关心股票是否停牌,不会跳过停牌日。

(8)Covar(指标1,指标2,天数)

计算两个指标在过去N天的协方差。如"covar(1日涨幅,收盘价,250)"返回l日涨幅和收盘价在过去250天的协方差。

(9)Var(指标1,天数)

计算指标在过去N天的方差。如"var(q~盘价,250)"返回收盘价在过去250天的方差。

股票统计函数

股票统计函数(横向统计函数):在当天内对所有股票的某个指标进行统计。

(1)HMax(指标,范用)

范围等于0时,返回全部股票指标的最大值;范序|等于1时,返回股票所在行业里的股票指标的最大值。如"HMax(收盘价,1)"返回股票所在行业里的股票最高收盘价。

(2)HMin(指标,范围)

范围等于0时,返问全部股票指标的最小值;也围等于l时,返回股票所在行业里的股票指标的最小值。如"HMin(收盘价,0)"返回所有股票里的最低收盘价。

(3)HAvg(指标,他用)

范围等于0时,返回回全部股票指标的平均值;范用等于l时,返股票所在行业里的股票指标的平均值。如"HAvg(市净率,1)"返回股票所在行业里的平均市净率。

(4)HWAvg(指标,权重指标,范围)

范围等于0时,返回全部股票指标的加权平均值;范围等于1时,返回股票所在行业里的股票指标的加权平均值。如"HWAvg(1日涨幅,总市值,1)"返回股票所在行业里的当天按市值加权平均涨幅。

(5)HMed(指标,范围)

范嗣等于0时,返回全部股票指标的中位数;范围等于l时,返回股票所在行业里的股票指标的中位数。如"HMed(净资产增长,1)"返回股票所在行业里的净资产增长率的中值。

(6)HSum(指标,范围)

范围等于0时,返回全部股票指标的和值;范围等于1,返回股票所在行业里的股票指标的和值。如"HSum(流通市值,1)"返回股票所在行业的总流通市值。

(7)HStdev(指标,范围)

范围等于0时,返回全部股票指标的标准方差;范围等于1,返回股票所在行业里的股票指标的标准方差。"HStdev(20日涨幅,1)"返回股票所在行业里的股票20日涨幅的标准方差,代表了行业内股票近期涨幅的离散度。

(8)HCorr(指标1,指标2,范围)

范围等于0时,返回全部股票的两个指标的相关度;范用等于1,返回股票所在行业里的股票两个指标的相关度。如"HCorr(20涨幅,市净率,0)"就是全部A股的20涨幅和市净率的相关度。

(9)HRaank(指标,顺序标记,范围)

将所有股票按指标值排名,并返回排名名次。顺序标记=0,是由小到大排名,顺序标记=1,是由大到小排名。范用=0,全部A股,范罔=1,行业内股票排名。如"HRank(收盘价,0,0)",将所有A股按照收盘价由小到大排名,并返回每个股票的名次。收盘价最低的股票HRank是1,第二低的HRank是2,依次类推。"HRank(收盘价,0,1)",将所有股票在各自的行业内接收盘价由小到大排名,每个行业有自己的第一名,HRank是1的股票有20多个。

(10)HRankScore(指标,顺序标记,范围)

将所有股票按指标值排名,并返回排名分。排名分在0到100之间,排在最前面的股票得分1000排名分的具体计算规则在帮助文档中。顺序标记=0,是由小到大排名,顺序标记=1,是由大到小排名。范围=0,全部A股,范围=1,行业内股票排名。如"HRankScore(收盘价,0,0)",将所有A股按照收盘价由小到大排名,并返回每个股票的排名分。收盘价最低的股票HRankScore是100,第二低的HRankScore是99.9,依次类推。

(11)CounlStock(条件,范围)

计数符合条件的股票。范围等于0,在全部股中计数;范围等于1,在本行业内部计数。

"CounlStock(1日涨幅>0.05,0)"计算全股票中当日涨幅大于5%的股票个数。

"CountStock(1日涨幅>0.05,1)"计算本行业中当日涨幅大于5%的股票个数。

"CounlStock(后复权收盘价>20日复权价,0)/CounlStock(收盘价>0,0)"计算站在20日均线之上的股票占全部股票的比例。

注意:(1)当股票指标的值为空时,这只股票不参与统计。如"HAvg(市盈率,0)"计算全市场股票平均市盈率,市盈率为空值的股票不参与统计。(2)股票投资域或筛选条件的设定不影响横向统计函数的结果。

数学函数

(1)abs(指标)

指标的绝对值。例如,"abs(l日涨幅)"返回1日涨幅的绝对值。

(2)log(指标)

指标的对数值。如指标是负值,返回空。如"Iog(收盘价)返回收盘价的Log值。

(3)sqrt(指标)

指标的平方根如指标是负值,返回空,如"sqrt(收盘价)"返回收盘价的平方根值。

(4)Round(指标)

将指标四舍五入取整数。如"Round(1.6)"=2,"Round(收盘价)"将收盘价的值四舍五入取整数。

(5)Mod(指标1指标2或者常数)

用指标1整除指标2,再取余数。如"Mod(12,10)"=2,"Mod(收盘价,10)"将收盘价整除10再取余数。

(6)Floor(指标)

将指标往下取整数。如"Floor(1.6)"=1,"Floor(收盘价)"将收盘价往下取整。

(7)Power(指标,乘幕指数)

计算指标的乘幕。如"power(收盘价,2)"得到收盘价的平方,"power(收盘价,0.5)"得到收盘价的平方根。

合并函数

(1)Greater(指标1,指标2)

返回指标l和指标2之间较大的那个值。等价于"if(指标1>指标2,指标1,指标2)"。如"GreaLer(2,1)"=2,"GreaLer(收盘价,开盘价)"返回收盘价和开盘价较大的那个值。

(2)Less(指标1,指标2)

返回指标l和指标2之间较小的那个值。等价于"if(指标1<指标2,指标1,指标2)"。如"Less(2,1)"=1,"Less(收盘价,开盘价)"返回收盘价和开盘价较小的那个值。

金叉死叉函数

(1)crossover(短线指标,长线指标)

金叉函数,如果短线指标上穿伏线指标,返回1,再则返回0。如"crossover(5日复极均价,60日复权均价)",当5日线上穿60线时,返回1;否则返回0。

(2)crossunder(短线指标,长线指标)

死叉函数,如果短线指标下穿l天线指标,返回1,再则返回0"如"crossunder(5日复权均价,60日复权均价)",当5日线下穿60线时,返回1;否则返回0。

日期统计函数

以下两个函数对于做技术分析非常有用。

(1)CounLDays(条件,N)

统计在过去N个交易日里,条件值为真(>0)的天数。例如:

过去10天里涨停的天数="CountDays(1日涨幅>0.0995,10)";

过去30天里停牌的天数="CounLDays(成交量=0,30)";

过去30天里出现金叉的天数="CountDays(Crossover(5日复权均价,20日复权均价),30)"。

(2)DaysLast(条件)

统计上次条件为真(>0)到当天间隔的天数。例如:

连续上涨天数="DaysLast(1日涨幅<=0)",就是现在到上次不上涨的那一天的天数;

连续交易的天数="DaysLast(当日成交量=0)",也就是上一次停牌到现在的天数;

连续涨停的天数="DaysLast(1日涨幅<o.0995)",也就是距离上次没有涨停的天数。

(3)LastValue(指标,条件)

条件取值函数。在股票历史上任一天,返回从这一天往前算满足条件的最后那一天的指标值。如,"LastValue(收盘价,1日涨幅>0.05)"返回最后一次涨幅大于5%的收盘价。

逻辑函数

(1)And(条件1,条件2)

两个输入都是非0数值,返回1,杏则返回0。输入条件是关系表达式。And(1,1)返回],And(1,0)返回o,And(],空)返回空。例如,有成交量低价格="And(当日成交量>0,收盘价<5)",在筛选条件里,可以直接使用"大于。"或者"小于1"来判定逻辑指标的真假。比如"有成交量低价格大于0"可以选出"有成交量低价格"指标为真的所有股票,而"有成交量低价格小于1"可以选出"有成交量低价格"指标为假的所有股票。

(2)Or(条件1,条件2)

两个输入有一个非0数值,返回1,杏则返回0。输入条件是关系表达式。Or(0,1)返回1,Oc(0,0)返回0,Or(1,空)返回10例如,有成交量或者低价格="Or(当日成交量>0,收盘价<5)"。

(3)Not(条件)

输入是一个非O数值,返回1,再则返回0。输入条件是关系表达式。Not(1)=0,Not(0)=1,Not(空)=空。例如,没有成交量="Not(成交量>0)"。

反身函数

(1)ticker()

在股票策略里退回股票自身的股票代码。ticker()需要和if表达式结合使用,可以对某只或某几只股票做特殊处理。例如:

"if(ticker()=‘000002',1,0)",对于万科A返回1,对于其他股票返回0;

"if(ticker()=‘000002',后复权收盘价/MA(后复权收盘价,30)-1,后复权收盘价/MA(后复权收盘价,40)-1)",对万科使用30日乖离率,对其他股票使用40日乖离率。

在基金策略中,ticker()返回基金自身的基金代码,用法和在股票策略中一样。

(2)Industry()

返回股票自身的行业代码,仅在股票策略中有效。行业代码在下表中列出。industry()需要和if表达式结合使用,可以对某个行业的股票或某几个行业的股票做出特殊处理。

例如,股票估值低="if(indust叩门=25,市盈率<10,市盈率<30)",如果当前股票属于银行业,市盈率小于10就返回真(1),如果当前股票不属于银行业,市盈率小于30就返回真(1)。

大盘指标变量

(1)#Bench.Close.指数代码

返回某个指数的收盘价。如"#Bench.Close.000001"是上证指数的收盘价,而"#Bench.Close.000300"是沪深300的收盘价。

(2)#Bench.open.指数代码

返问某个指数的当日开盘价。如"#Bench.open.000001"是上证指数的当日开盘价,而"#Bench.open.000300"是沪深300的当日开盘价。

(3)#Bench.high.指数代码

返回某个指数的当日最高价。如"#Bench.high.000001"是上证指数的当日最高价,而"#Bench.high.000300"是沪深300的当日最高价。

(4)#Bench.low.指数代码

返回某个指数的当日最低价。如"#Bench.low.000001"是上证指数的当日最低价,而"#Bench.low.000300"是沪深300的当日最低价。

(5)#Bench.Change.指数代码

返回某个指数的日涨幅。如"#ßench.Change.000001"是上证指数的H涨幅,而"#Bench.Change.399006"是创业板的日涨幅。

(6)#Bench.Vol.指数代码

返回某个指数的成交量。如"#Bench.Vol.000001"是上证指数的成交量,而"#Bench.V01.399006"是创业板的成交量。

(7)#Bench.Amt.指数代码

返回某个指数的成交额。如"#Bench.Amt.00001"是上证指数的成交额,而"#Bench.AmL.399006"是创业板的成交额。

(8)#Bench.PE.指数代码

返回某个指数的加权市盈率。加权市盈率=指数成分股的总市值/指数成分股的总利润TTM。如"#Bench.PE.000001"是上证指数成分的加权平均市盈率,而"#Bench.PE.000300"是沪深300成分股的加权平均市盈率。

(9)#Bench.PE2.指数代码

返回某个指数的调和市盈率。调和市盈率=指数成分股PE倒数的均值的倒数,即1/Avg(成分股E/P)。这样算出来的PE近似于指数PE中值,且更加合理。如"#Bench.PE2.000001"是上证指数成分股的调和平均市盈率,而"#Bench.PE2.000300"是沪深300成分股的调和平均市盈率。

(10)#Bench.PB.指数代码

返回某个指数的加权市净率。加权市净率=指数成分股的总市值/指数成分股的总净值。如"#Bench.PB.α削1"是上证指数成分股的加权平均市净率,而"#Bench.PB.000300"是沪深300成分股的加权平均市净率。

(11)#Bench.PB2.指数代码

返回某个指数的调和市净率。指数成分股PB倒数的均值的倒数,即1/Avg(成分股B/P)。这样算出来的PB是比较合理的指数PB中值。如"#Bench.PB2.000001"是上证指数成分股的调和平均市净率,而"#Bench.PB2.000300"是沪深300成分股的调和平均市净率。

(12)#Bench.zt.指数代码

指数成分股的涨停比例,如"#Bencb.zt.000001"是上证指数成分股涨停比例。

(13)#Bench.dt.指数代码

指数成分股的跌停比例,如"#Bench.dt.000001"是上证指数成分股跌停比例。

(14)#Bench.up.指数代码

指数成分股的上涨比例,如"#Bench.up.000001"是上证指数成分股上涨比例。

(15)#Bench.down.指数代码

指数成分股的下跌比例,如"#Bench.down.000001"是上证指数成分股下跌比例。

大盘指标变量可以用于个股指标和大盘之间的比较。例如:

个股相对沪深300涨幅="1日涨幅-#Bench.Change.000300"

上证指数20天移动平均="MA2(#Bench.Close.000001,20)"

注意:对大盘指数做移动平均,需要使用MA2。

上证指数20天Bias="#Bench.Close.000001/MA2(#Beneh.Close.000001,20)-1"

相对沪深300市盈率差值-"市盈率-#Bench.PE.000300"

所有的使用大盘变量的窗口函数都要加个"2"作为后缀,如MA2,Max2,Min2,EMA2,Surn2,sldev2。

现在支持的指数有:000001上证指数、000010上证180、000012国债指数、000013企债指数、000016上证50、000300沪深300、000902中证流通、399001深证成指、399005中小板指P、399006创业板指、399330深证100。

季报函数

季报函数只能用于季报指标计算。

(1)RefQ(季报指标,前移季度数N)

返回从最新季报往前N个季度的财报指标。如"RefQ(营业收入,1)",返回最新季报往前-个季度的营业收入。比如现在某只股票的最新季报是2016Q2,"RefQ(营业收入,1)"是这只股票在2016Ql的营业收入,而"RefQ(营业收入,4)"是这只股票在2015Q2的营业收入。叫Ref(营业收入,250)"是这只股票250个交易日前的最新季报的营业收入。

(2)TTM(季报指标,前移季度数)

返回股票最新4个季度指标加在一起的值。如"TTM(营业收入,0)",返回最新4个季报营业收入之和,"TTM(营业收入,4)"返回1年前的4个季报营业收入之和。

(3)SumQ(季报指标,季度数N,前移季度数)

返回股票最新N个季度指标之和。如"SumQ(营业收入,4,0)"=TfM(营业收入,0)。

(4)AvgQ(季报指标,季度数N,前移季度数)

返回股票最新N个季度指标之平均值。如"AvgQ(资产合计,4,0)",返回最新4个季度的总资产平均值;"AvgQ(资产合计,4,4)",返回4个季度前的4个季度的总资产平均值。

注意:以上季报函数只能用于一个原始季报指标,不能用于其他类型的指标,也不能和其他函数嵌套使用。以下为使用错误的案例:RefQ(市盈率,1):收盘价不是原始季报指标,不能用RefQ()函数。

RefQ(营业收入一营业支出,1):如何只支持一个指标,不支持表达式。

RefQ(TTM(营业收入,0),1):季报函数不支持函数嵌套,可使用TTM(营业收入,1)计算一个季度前的营业收入TTM。

用户创建一个自定义指标后,可以和使用其他公共指标一样使用这个指标,可以用于筛选条件或排名条件中。

注意事项

(1)自定义指标中只能包含中文、英文、数字,不能包含空格标点符号、拆号、计算符号等。如指标名"5日MA(收盘价)""5日收盘价-10口收盘价"等,都是不合规则的指标名。当指标名不合规则时,后台计算很容易出错。

(2)向定义指标表达式里使用到的公共指标名称必须和界面上的指标名字一样,用户不能随便使用自己想到的指标名字。如5日均价在界面上是"5日复权均价",用户不能随使用其他名字表示5日均价,如"5日均价""5天均线"都不可以。

(3)表达式里不能有负数,如"-1"。用户可以用一个简单的表达式来表示负数,如用"(0-1)"来表示-1。

(4)向定义指标表达式现在既支持函数嵌套功能,也支持自定义指标之间的嵌套。如"1日前10天总成交额"可以用嵌套表达式"dateshift(sum(当日成交额,10),1)",也可以定义两个指标,并将第一个指标嵌入第二个指标:10天总成交额=sum(当日成交额,10);1日前10天总成交额=dateshift(10天总成交额,1)。