技术因子 类别一常用技术指标 - ChannelCMT/OFO GitHub Wiki
技术因子-类别一常用技术指标
如须调用该因子,将add_data=False改为True.可自行将因子名字value更改.收盘价在部分数据没有close_adj的情况下,使用close即可,其他high、low同理.其中N为参数,可自行设置。
1.1均线型
EMA10 A010001A
Ta('EMA',0,0,0,0,close,0,N) N=10、12、120、20、26、5和60等等 十日的移动指数平均
EMA10_J = dv.add_formula('EMA10_J', "Ta('EMA',0,0,0,0,close,0,10)",
is_quarterly=False,add_data=False)
MA120 A010008A
Ta('MA',0,0,0,0,close,0,N) N=120、20、10、5和60等等 120日的移动平均
value = dv.add_formula('MA120_A',"Ta('MA',0,0,0,0,close,0,120)",is_quarterly=False,add_data=False)
BBI A010013A
因子描述:多空指数(Bull and Bear Index)。是一种将不同日数移动平均线加权平均之后的综合指标,属于均线型指标。
计算方法:BBI = (MA3 + MA6 + MA12 + MA24) / 4
dv.add_formula('MA_3',"Ta('MA',0,0,0,0,close,0,3)",is_quarterly=False,add_data=True)
dv.add_formula('MA_6',"Ta('MA',0,0,0,0,close,0,6)",is_quarterly=False,add_data=True)
dv.add_formula('MA_12',"Ta('MA',0,0,0,0,close,0,12)",is_quarterly=False,add_data=True)
dv.add_formula('MA_24',"Ta('MA',0,0,0,0,close,0,24)",is_quarterly=False,add_data=True)
value = dv.add_formula('BBI_J',"(MA_3+MA_6+MA_12+MA_24)/4",is_quarterly=False,add_data=False)
TEMA10 A010014A
因子描述:10日三重指数移动平均线(10-day Triple Exponential Moving Average)。取时间N内的收盘价分别计算其一至三 重指数加权平均。
计算方法:
TEMA = 3一重指数加权平均- 3二重指数加权平均+三重指数加权平均 = 3 * EMA(close, N) - 3 * EMA(EMA(close, N), N) + EMA(EMA(EMA(close, N), N), N)
N取10、5等
EMA10 = dv.add_formula('EMA10_J',"Ta('EMA',0,0,0,0,close,0,10)",is_quarterly=False,add_data=True)
DEMA10 = dv.add_formula('DEMA10_J',"Ta('EMA',0,0,0,0,EMA10_J,0,10)",is_quarterly=False,add_data=True)
TEMA10_j = dv.add_formula('TEMA10_j',"Ta('EMA',0,0,0,0,DEMA10_J,0,10)",is_quarterly=False,add_data=True)
TEMA10 = dv.add_formula('TEMA10_A',"3*EMA10_J-3*DEMA10_J+TEMA10_j",is_quarterly=False,add_data=False)
1.2超买超卖
BollDown A020001A
布林下轨线指标
中轨线为N日的移动平均线,上轨线为中轨线-两倍标准差。计算时暂取N=5,可自行调整N。
MA_j = dv.add_formula('MA_j', "Ts_Mean(close,5)", is_quarterly=False, add_data=True)
MD_j = dv.add_formula('MD_j', 'StdDev(close,5)', is_quarterly=False, add_data=True)
BollDown_j = dv.add_formula('BollDown_j', 'MA_j-2*MD_j', is_quarterly=False, add_data=False)
BollUp A020002A
布林上轨线指标
中轨线为N日的移动平均线,上轨线为中轨线+两倍标准差。计算时暂取N=5,可自行调整N。
MA_j = dv.add_formula('MA_j', "Ts_Mean(close,5)", is_quarterly=False, add_data=True)
MD_j = dv.add_formula('MD_j', 'StdDev(close,5)', is_quarterly=False, add_data=True)
BollUp_j = dv.add_formula('BollUp_j', 'MA_j+2*MD_j', is_quarterly=False, add_data=False)
KDJ_K A020003A
因子描述:随机指标(K Stochastic Oscillator)。他综合了动量观念、强弱指标以及移动平均线的优点,用来度量股价脱离价格正常的范围的变异程度。
计算方法:
-
计算N日内的未成熟随机值RSV ( Raw Stochastic Value) :
RSV = (close - lowest)/ (highest - lowest) * 100
其中N = 9.
-
当日k值= ( 2 *前日K值+当日RSV)/ 3, 若前日K值缺失使用50代替。
def SMA(A,n,m):
# 设置alpha的比例
alpha = m/n
#通过ewm计算递归函数
return A.ewm(alpha=alpha, adjust=False).mean()
RSV = dv.add_formula('RSV',"(close_adj-Ts_Min(low_adj,9))/(Ts_Max(high_adj,9)-Ts_Min(low_adj,9))",is_quarterly=False,add_data=True)
KDJ_K_A = dv.add_formula('KDJ_K_A',"SMA(RSV,{},{})".format(3,1), is_quarterly=False, add_data=True,register_funcs={"SMA":SMA})
KDJ_D A020004A
因子描述:随机指标(D Stochastic Oscillator).它综合了动量观念、强弱指标及移动平均线的优点,用来度量股价脱离价格正常范围的变异程度
计算方法:
-
计算N日内的未成熟随机值RSV (Raw Stochastic Value) :
RSV = (close - lowest)/ (highest - lowest) * 100
其中N = 9.
-
当日D值= (2 *前日D值+当日k值) /3, 若前日D值缺失使用50 代替。
KDJ_D_J=dv.add_formula('KDJ_D_J',"Sma(Sma((close-Ts_Min(low,9))/(Ts_Max(high,9)-Ts_Min(low,9))*100,3,1),3,1)",is_quarterly=False,add_data=False)
KDJ_J A020005A
因子描述:随机指标(J Stochastic Oscillator)。他综合了动量观念、强弱指标以及移动平均线的优点,用来度量股价脱离价格正常的范围的变异程度。
计算方法:
- 计算N 日内的未成熟随机值RSV(Raw Stochastic Value ) : RSV =( close - lowest) /( highest - lowest) * 100 其中N=9。
- 当日J值=3当日K值-2当日D值。
def SMA(A,n,m):
# 设置alpha的比例
alpha = m/n
#通过ewm计算递归函数
return A.ewm(alpha=alpha, adjust=False).mean()
RSV = dv.add_formula('RSV',"(close_adj-Ts_Min(low_adj,9))/(Ts_Max(high_adj,9)-Ts_Min(low_adj,9))",is_quarterly=False,add_data=True)
KDJ_K_A = dv.add_formula('KDJ_K_A',"SMA(RSV,{},{})".format(3,1), is_quarterly=False, add_data=True,register_funcs={"SMA":SMA})
KDJ_D_A = dv.add_formula('KDJ_D_A',"SMA(KDJ_K_A,{},{})".format(3,1), is_quarterly=False, add_data=True,register_funcs={"SMA":SMA})
KDJ_J_A = dv.add_formula('KDJ_J_A', "{}*KDJ_K_A - {}*KDJ_D_A".format(3,2) , is_quarterly=False, add_data=True)
UpRVI A020006A
因子描述:计算RVI因子的中间变量,对于向上运动的收盘价的方差做EMA平均
计算方法:
- 计算每日收盘价标准差SD, Dorsey建议向前取10个交易日区间计算。
- 若当日收盘价大于昨日收盘价,当日记为上升日,USD = SD , DSD = 0 ; 若当日收盘价小于昨日收盘价,当日记为下降日,USD = 0 , DSD = SD.
- 对过去一段时间内的上升日和下降日的标准差求N日Wilder' s Smoothing , Dorsey建议向前取14个交易日(计算2N-1日的EMA将得到相同结果,但是速度更快). UpRVI= EMA(USD, 2N-1)
USD = dv.add_formula('USD',"If(Return(close,1)>0,StdDev(close,10),0)",is_quarterly=False,add_data=True)
UpRVI = dv.add_formula('UpRVI_simu', "Ta('EMA',0,0,0,0,USD,0,14)",is_quarterly=False,add_data=False)
DownRVI A020007A
因子描述:计算RVI因子的中间变量,对于向下运动的收盘价的方差做EMA平均
计算方法:
- 计算每日收盘价标准差SD, Dorsey建议向前取10个交易日区间计算。
- 若当日收盘价大于昨日收盘价,当日记为上升日,USD = SD , DSD = 0 ; 若当日收盘价小于昨日收盘价,当日记为下降日,USD = 0 , DSD = SD。
- 对过去一段时间内的上升日和下降日的标准差求N日Wilder' s Smoothing , Dorsey建议向前取14个交易日(计算2N-1日的EMA将得到相同结果,但是速度更快). DownRVI =EMA(DSD, 2N-1)
dv.add_formula('SD','StdDev(close, 10)',is_quarterly=False,add_data=True)
dv.add_formula('DSD','If(close>Delay(close, 1), 0, SD)',is_quarterly=False,add_data=True)
DownRVI = dv.add_formula('DownRVI_J',"Ta('EMA', 0, 0, 0, 0, DSD, 0, 14)",is_quarterly=False,add_data=False)
RVI A020008A
因子描述:相对离散指数(Relative Volatility In dex). 又称“相对波动由旨标” ,用于测量价格的发散趋势,其原理与相对强弱指标(RSI )类似,但它是以价格的方差而不是简单的升跌来测量价格变化的强度。主要用作辅助的确认指标,即配合均线系统、动量指标或其它趋势指标使用。
计算方法:
- 计算每日收盘价标准差SD, Dorsey建议向前取10个交易日区间计算。
- 若当日收盘价大于昨日收盘价,当日记为上升日,USO = SD , DSD = 0 ; 若当日收盘价小于昨日收盘价,当日记为下降日,USD = 0 , DSD = SD.
- 对过去一段时间内的上升日和下降日的标准差求N日Wilder's Smoothfng , Dorsey建议向前取14个交易日(计算2N-1日的EMA将得到相同结果,但是速度更快).
- UpRVI = EMA(USD, 2N-1) , DownRVI = EMA(DSD, 2N-1) ;
- RVI = 100 * UpRVI / (UpRVI + DownRVI)。
USD = dv.add_formula('USD',"If(Return(close,1)>0,StdDev(close,10),0)",is_quarterly=False,add_data=True)
DSD = dv.add_formula('DSD',"If(Return(close,1)<0,StdDev(close,10),0)",is_quarterly=False,add_data=True)
UpRVI = dv.add_formula('UpRVI_J', "Ta('EMA',0,USD,USD,USD,USD,USD,14)",is_quarterly=False,add_data=True)
DownRVI = dv.add_formula('DownRVI_J',"Ta('EMA',0,DSD,DSD,DSD,DSD,DSD,14)",is_quarterly=False,add_data=True)
RVI_J = dv.add_formula('RVI_J',"100 * UpRVI_J/(UpRVI_J + DownRVI_J)",is_quarterly=False,add_data=False)
DBCD A020009A
因子描述:异同离差乖离率(Bias convergence divergence)。先计算乖离率BIAS, 然后计算不同日的乖离率之间的离差,最后对离差进行指数移动平滑处理。优点是能够保持指标的紧密同步,并且线条光滑,信号明确,能够有效的过滤掉伪信号。
计算方法:
- BIAS = (close/ MA(close, N) - 1) * 100
- DIF = BIAS(t) - BIAS(t - M)
- DBCD = EMA(DIF, T, 1) 取N = 5, M = 16, T = 17。
BIAS = dv.add_formula('BIAS_J',"(close/Ta('MA',0,0,0,0,close,0,5)-1)*100", is_quarterly=False, add_data=True)
DIF = dv.add_formula('DIF_J','BIAS_J-Delay(BIAS_J,16)', is_quarterly=False, add_data=True)
value = dv.add_formula('DBCD_J',"Ta('EMA',0,0,0,0,DIF_J,0,17)", is_quarterly=False, add_data=False)
Illiquidity A020010A
因子描述:收益相对金额比,是指过去20个交易日收益相对成交金额的比例,结果乘以10亿。
计算方法: Illiquidity=sum(return(close,20)/sum(turnover,20)*100000000
def DropnaSum(df, window):
return df.apply(lambda x: x.dropna().rolling(window).sum()).reindex(df.index)
def DropnaRet(df):
return df.apply(lambda x: x.dropna().pct_change(1)).reindex(df.index)
ret = dv.add_formula('ret','Abs(DropnaRet(close))',is_quarterly=False,add_data=True,
register_funcs={"DropnaRet": DropnaRet})
ILLIQUIDITY = dv.add_formula('ILLIQUIDITY_J','100000000*DropnaSum(ret,20)/DropnaSum(turnover,20)' ,is_quarterly=False,add_data=False,register_funcs={"DropnaSum": DropnaSum})
Mfi A020011A
因子描述:资金流量指标,通过反映股价变动的四个元素:上涨的天数、下跌的天数、成交量增加幅度、成交量减少幅度来研判量能的趋势,预测市场供求关系和买卖力道。其中TYP为典型价格,MF为当日现金流,MR为资金比率,最后再得出Mfi.
计算方法:
- 计算典型价格: TYP = (close + highest + lowest)/ 3 。
- 当日现金流为典型价格和当日成交盘的乘积:MF= TYP * volume.
- 若当日典型价格高于前日典型价格,定义当日现金流为正;若当日典型价格低于前日典型价格,定义当日现金流为负;若当日典型价格等于前日典型价格, 当日被舍去。资金比率(Money Ratio)可如下计算:
- MFI = 100 - 100 / (1 + MR) N取14.
dv.add_formula('TYP', "(close_adj+high_adj+low_adj)/3", is_quarterly=False, add_data=True)
dv.add_formula('MF', "TYP*volume", is_quarterly=False, add_data=True)
dv.add_formula('MR',"Ts_Sum(If(Delta(TYP,1)>0,TYP*MF,0),14)/Ts_Sum(If(Delta(TYP,1)<0,TYP*MF,0),14)" ,is_quarterly=False,add_data=True)
Mfi_J = dv.add_formula('Mfi_A', "100-100/(1+MR)",is_quarterly=False,add_data=False)
1.3能量型
CR20 A030001A
因子描述:CR指标以上一个计算周期(如N El)的中间价比较当前周期(如日)的最高价(price movement indicator, compar buying power and selling power to previous mid price (20 days)) 、 最低价, 计算出一段时期内股价的“强弱”。
计算方法:
- TYP = (highest + lowest + close)/ 3.
- CR = sum(max(highest - prev_typical , 0), N) / sum(max(prev_typical - lowest, 0), N) * 100 取N = 20 。
dv.add_formula('TYP', "(close_adj+high_adj+low_adj)/3", is_quarterly=False, add_data=True)
value = dv.add_formula('CR20_A',"Ts_Sum(Max(high_adj-Delay(TYP,1),0),20)/Ts_Sum(Max(Delay(TYP,1)-low_adj,0),20)*100",is_quarterly=False,add_data=False)
MassIndex A030002A
因子描述:梅斯线(Mass Index)本指标是Donald Dorsey累积股价波幅宽度之后所设计的霞荡曲线。其最主要的作用, 在于寻找飙涨股或者极度弱势股的重要趋势反转点.
计算方法:
- EMAHL = EMA(highest - lowest, 9)。
- EMA Ratio= EMAHL / EMA(EMAHL, 9)。
- Masslndex = EMA Ratio的25天的累加值。
def DropnaSum(df, window):
return df.apply(lambda x: x.dropna().rolling(window).sum()).reindex(df.index)
EMAHL = dv.add_formula("EMAHL", "Ta('EMA',0,0,0,0,high_adj-low_adj,0,9)", is_quarterly=False, add_data=True)
EMA_Ratio_ = dv.add_formula('EMA_Ratio_', "Ta('EMA',0,0,0,0,EMAHL,0,9)", is_quarterly=False, add_data=True)
EMA_Ratio = dv.add_formula('EMA_Ratio', 'EMAHL/EMA_Ratio_', is_quarterly=False, add_data=True)
MassIndex_J = dv.add_formula('MassIndex_J', "DropnaSum(EMA_Ratio,25)",is_quarterly=False, add_data=False,register_funcs={"DropnaSum": DropnaSum})
Elder A030003A
因子描述:艾达透视指标(Elder-ray Index 1 交易者可以经由该指标,观察市场表面之下的多头与空头力道。
计算方法:
- BullPower = highest - EMA(close, N)。
- BearPower = lowest - EMA{close, N)。
- Elder = (Bull Power - BearPower) / close N取13
BullPower = dv.add_formula('BullPower_J',
"high_adj-Ta('EMA',0,0,0,0,close,0,13)"
, is_quarterly=False, add_data=True)
BearPower = dv.add_formula('BearPower_J',
"low_adj-Ta('EMA',0,0,0,0,close,0,13)"
, is_quarterly=False, add_data=True)
Elder = dv.add_formula('Elder_J',
"((BullPower_J-BearPower_J)/close_adj)"
, is_quarterly=False, add_data=False)
1.4趋势型
ASI A040001A
因子描述:累计振动升降指标(Accumulation Swing Index) , 又称实质线。ASI企图以开盘、最高、最低、收盘价构筑成一条幻想线,以便取代目前的走势,形成最能表现当前市况的真实市场线(Real Market)。
计算方法:
- A = abs(close - prev_close) B = abs(lowest - prev_close) C = abs(highest - prev_lowest) D = abs(prev_close - prev_open)
- E = close - prev_close F = close - open G = prev_close - prev_open
- X = E + F / 2 + G
- K = max(A, B)
- 比较A, B, C三者数值,若A最大,R=A + B / 2 + D / 4; 若B最大,R=A / 2 + B + D / 4 ; 若C最大,R = C + D / 4
- SI = 16 * X / R * K
- ASI=sum(SI,20)
dv.add_formula('AA',"Abs(Delta(close,1))", is_quarterly=False, add_data=True)
dv.add_formula('BB',"Abs(low-Delay(close,1))", is_quarterly=False, add_data=True)
dv.add_formula('CC',"Abs(high-Delay(low,1))", is_quarterly=False, add_data=True)
dv.add_formula('DD',"Abs(Delay(close,1)-Delay(open,1))", is_quarterly=False, add_data=True)
dv.add_formula('EE',"Delta(close,1)", is_quarterly=False, add_data=True)
dv.add_formula('FF',"close-open", is_quarterly=False, add_data=True)
dv.add_formula('GG',"Delay(close,1)-Delay(open,1)", is_quarterly=False, add_data=True)
dv.add_formula('XX',"EE+FF/2+GG", is_quarterly=False, add_data=True)
dv.add_formula('KK',"Max(AA,BB)", is_quarterly=False, add_data=True)
dv.add_formula('RR',"If(AA>Max(BB,CC),AA+BB/2+DD/4,If(BB>Max(AA,CC),AA/2+BB+DD/4,CC+DD/4))", is_quarterly=False, add_data=True)
dv.add_formula('SI',"16*XX/RR*KK", is_quarterly=False, add_data=True)
ASI_J = dv.add_formula('ASI_J', "Ts_Sum(SI,20)", is_quarterly=False, add_data=False)
Chaikinoscillator A040002A
因子描述:佳庆指标(Chaikin Oscillator)。该指标基于AD曲线的指数移动均线而计算得到。
计算方法: ChaikinOscillator = EMA(AD, 3) - EMA(AD, 10) , 最后入库数值除以le6.
dv.add_formula('AD_J', "Ta('AD',0,0,high_adj,low_adj,close_adj,volume)", is_quarterly=False, add_data=True)
value=dv.add_formula('Chaikinoscillator',"(Ta('EMA',0,0,0,0,AD_J,0,3)-Ta('EMA',0,0,0,0,AD_J,0,10))/Pow(10,6)", is_quarterly=False,add_data=True)
ChaikinVolatility A040003A
因子描述.佳庆离散指标(Chaikin Volatility , 简称CVLT , VCI , CV)'又称“佳庆变异率指数” ,是通过测量一段时间内价格幅度平均值的变化来反映价格的离散程度。
计算方法:
- HLEMA = EMA(highest - lowest, 10)
- ChaikinVolatility = 100 * (HLEMA (t) - HLEMA (t-10)) / HLEMA (t-10)
def DropnaPct(df, t):
return df.apply(lambda x: x.dropna().pct_change(t)).reindex(df.index)
HLEMA = dv.add_formula('HLEMA', "Ta('EMA',0,0,0,0,high_adj-low_adj,0,{})".format(10),is_quarterly=False, add_data=True)
ChaikinVolatility = dv.add_formula('ChaikinVolatility_J',"100*DropnaPct(HLEMA,10)" ,is_quarterly=False, add_data=False,register_funcs={"DropnaPct": DropnaPct})
EMV14 A040004A
因子描述:使用平均值代替了EMA加权平均。
简易波动指标(Ease of Movement Value),EMV将价格与成交量的变化结合成一个波动指标来反映股价或指数的变动状况,由于股价的变化和成交量的变化都可以引发该指标数值的变动,EMV实际上也是一个量价合成指标。
计算方法: EMV =EMA(((highest + lowest)/ 2 - (prev_highest + prev_lowest) / 2) * (highest - lowest)/ volume, N)
N:14、等6皆可
EMV14 = dv.add_formula('EMV14_J',"Ts_Sum(((high+low)/2-(Delay(high,1)+Delay(low,1))/2)*(high-low)/volume,14)", is_quarterly=False, add_data=False)
PlusDI A040006A
因子描述:上升指标(Plus directional indicator) , DMI因子的构成部分。
计算方法: plusDI = EMA(plusDM, N) / EMA(TR, N)
N = 14.
PlusDI_J = dv.add_formula('PlusDI_J',"Ta('PLUS_DI',0,open_adj,high_adj,low_adj,close_adj,volume,{})".format(14),is_quarterly=False, add_data=False)
minusDI A040007A
因子描述:下降指标(Minus directional indicator) , DMI因子的构成部分.
计算方法: minusDI = EMA(minusDM, N) / EMA(TR, N)
N = 14。
minusDI_A = dv.add_formula("minusDI_A","Ta('MINUS_DI',0,open,high,low,close,volume,{})".format(14),
is_quarterly=False,add_data=False)
ADX A040008A
因子描述: 平均动向指数(Average directional index) , DMI因子的构成部分。
计算方法: ADX = EMA(DX, N)
N = 14。
ADX_J = dv.add_formula('ADX_J', "Ta('EMA',0,0,0,0,Ta('DX',0,open,high,low,close,volume),14)",
is_quarterly=False,add_data=False)
ADXR A040009A
因子描述:相对平均动向指数{Relative average directional index) , DMI因子的构成部分。
计算方法: ADXR = (ADX(t) + ADX(t-N)) / 2
N = 14.
ADX_J = dv.add_formula('ADX_J', "Ta('EMA',0,0,0,0,Ta('DX',0,open,high,low,close,volume),14)",
is_quarterly=False,add_data=True)
ADXR_J = dv.add_formula('ADXR_J', "(ADX_J+Delay(ADX_J,%s))/2",
is_quarterly=False,add_data=False)
MACD A040010A
因子描述:平滑异同移动平均线(Moving Average Convergence Divergence) , 又称移动平均聚散指标。
计算方法:
- DIFF (Difference)为收盘价短期长期指数平滑移动平均线间的差: DIFF = EMA(close, 12) - EMA(close, 26)。
- DEA为(Difference Exponential Average) DIFF的M日指数移动平均: DEA= EMA(DIFF, M) , 通常M = 9。
- MACD为DIFF和DEA之差,按照国内的处理标准,最终结果乘以2。
补充部分:Talib中macd概念理解 TA-lib的macd函数计算macd值,函数输出3个值,
macd(对应diff),macdsignal(对应dea),macdhist(对应macd)。
然后按照下面的原则判断买入还是卖出。
1.DIFF、DEA均为正,DIFF向上突破DEA,买入信号。
2.DIFF、DEA均为负,DIFF向下跌破DEA,卖出信号。
3.DEA线与K线发生背离,行情反转信号。
4.分析MACD柱状线,由正变负,卖出信号;由负变正,买入信号。
dv.add_formula('Diff_J',
"Ta('EMA',0,0,0,0,close,0,12)-Ta('EMA',0,0,0,0,close,0,26)",
add_data=True,is_quarterly=False)
dv.add_formula('Dea_J',"Ta('EMA',0,0,0,0,Diff_J,0,9)",
add_data=True,is_quarterly=False)
MACD_J = dv.add_formula('MACD_J',"(Diff_J-Dea_J)*2",add_data=False,is_quarterly=False)
MTM A040011A
因子描述:动量指标(Momentom Index)。动量指数以分析股价波动的速度为目的,研究股价在波动过程中各种加速,减速,惯性作用以及股价由静到动或由动转静的现象。
计算方法: MTM = close(t) - close(t-N)
N = 10.
MTM_J = dv.add_formula('MTM_J', 'close-Delay(close,10)' ,
is_quarterly=False, add_data=False)
MTMMA A040012A
因子描述: 因子mtm的10日均值(10-day averagie momentum index).
计算方法: MTMMA: MA(MTM, N)
N = 10.
dv.add_formula("mtm", "(close-Delay(close,{}))".format(10), is_quarterly=False, add_data=True)
MTMMA_A = dv.add_formula("MTMMA_A", "Ts_Mean(mtm,{})".format(10), is_quarterly=False)
UOS A040013A
因子描述:终极指标(Ultimate Oscillator)。现行使用的各种振荡指标,对于周期参数的选择相当敏感。不同市况、不同参数设定的振荡指标,产生的结果截然不同。因此,选择最佳的参数组合,成为使用振荡指标之前最里要的一道手续。
计算方法:
- TH = max(highest, prev_close)
- TL = min(lowest, prev_close)
- TR= TH -TL
- XR =close-TL
- XRM = M日XR之和/M日TR之和
- XRN = N日XR之和/N日TR之和
- XRO = 0日XR之和JO日TR之和
- UOS = 100 * (XRMNO + XRNMO + XROMN) / (MN + MO+ N*O)
—般M = 7, N = 14, O = 28
M = 7
N = 14
O = 28
TR = dv.add_formula('TR_J',
"Max(high,Delay(close,1))-Min(low,Delay(close,1))",
is_quarterly=False, add_data=True)
XR = dv.add_formula('XR_J',
"close-Min(low,Delay(close,1))",
is_quarterly=False, add_data=True)
XRM = dv.add_formula('XRM_J',
"Ts_Sum(XR_J,%s)/Ts_Sum(TR_J,%s)" % (M, M),
is_quarterly=False, add_data=True)
XRN = dv.add_formula('XRN_J',
"Ts_Sum(XR_J,%s)/Ts_Sum(TR_J,%s)" % (N, N),
is_quarterly=False, add_data=True)
XRO = dv.add_formula('XRO_J',
"Ts_Sum(XR_J,%s)/Ts_Sum(TR_J,%s)" % (O, O),
is_quarterly=False, add_data=True)
UOS = 100 * (XRM * N * O + XRN * M * O + XRO * M * N) / (M * N + M * O + N * O)
dv.append_df(UOS, 'UOS_A')
SwingIndex A040014A
因子描述:振动升降指标。计算ASI因子的中间变昼(Swing Index)。
计算方法:
- A = abs(close - prev_close) B = abs(lowest - prev_close) C = abs(highest - prev_lowest) D = abs(prev_close - prev_open)
- E = close - prev_close F = close - open G = prev_close - prev_open
- X = E + F / 2 + G
- K = max(A, B)
- 比较A, B、C三者数值,若A最大,R=A + B / 2 + D / 4; 若B最大, R=A / 2 + B + D / 4 ; 若C最大,R = C +D/ 4.
- SI = 16 * X / R * K
dv.add_formula('AA',"Abs(Delta(close,1))", is_quarterly=False, add_data=True)
dv.add_formula('BB',"Abs(low-Delay(close,1))", is_quarterly=False, add_data=True)
dv.add_formula('CC',"Abs(high-Delay(low,1))", is_quarterly=False, add_data=True)
dv.add_formula('DD',"Abs(Delay(close,1)-Delay(open,1))", is_quarterly=False, add_data=True)
dv.add_formula('EE',"Delta(close,1)", is_quarterly=False, add_data=True)
dv.add_formula('FF',"close-open", is_quarterly=False, add_data=True)
dv.add_formula('GG',"Delay(close,1)-Delay(open,1)", is_quarterly=False, add_data=True)
dv.add_formula('XX',"EE+FF/2+GG", is_quarterly=False, add_data=True)
dv.add_formula('KK',"Max(AA,BB)", is_quarterly=False, add_data=True)
dv.add_formula('RR',"If(AA>Max(BB,CC),AA+BB/2+DD/4,If(BB>Max(AA,CC),AA/2+BB+DD/4,CC+DD/4))", is_quarterly=False, add_data=True)
SI = dv.add_formula('SI',"16*XX/RR*KK", is_quarterly=False, add_data=False)
Ulcer10 A040015A
因子描述:(10-day UI index) 由Peter Martin 于1987年提出,1989年发表于Peter Martin和Byron McCann 的著作 The Inverstors Guide to Fedelity Funds。用于考察向下的波动性.
计算方法: Ri= (close-max(close,n))/max(close,n)
N=10、5等
Ulcer10 = dv.add_formula("Ulcer10_J", "Sqrt(Ts_Mean((((close - Ts_Max(close,10))/Ts_Max(close,10))*100)^2,10))",is_quarterly=False,add_data=False)
DHILO A040017A
因子描述:波幅中位数(median of volatility)'每日对数最高价和对数最低价差值的3月内中位数。
计算方法:DHILO=median(log(highest)-log(lowest)) 最高价和最低价缺失时用收盘价填补。
import numpy as np
import pandas as pd
high = dv.get_ts('high')
low = dv.get_ts('low')
dhilo = np.log(high) - np.log(low)
dhilome = dhilo.apply(lambda x:x.dropna().rolling(60).median())
dv.append_df(dhilome, 'DHILO_J')
Hurst A040018A
因子描述:赫斯特指数(Hurstexponent)。是由英国水文专家H . E . Hurst提出了用重标极差(R/5)分析方法来建立赫斯特指数(H) , 作为判断时间序列数据遵从随机游走还是有偏的随机游走过程的指标。当H > 0.5时,时间序列呈现出持续性;当H = 0.5时,序列呈现出随机游走;当H < 0.5时,表现出反持续性。
计算方法:
计算对数收益率: X = log(close)- log(close(t-1)); 计算n日内X 的均值μ和标准差σ; 计算中心化的收盘价之和,即n日价格累计偏差Z=sum(close-μ); 计算价格累计偏差范围: R= max(Z(t-N+1), ... , Z ) - min(Z(t-N+1), ..., Z ); y=log(R/σ),其中n=N, N/2, N/4, ...; 对y和时间序列n取log后进行线性回归,时间序列的系数为Hurst指数。 N=60,n取4、7、15、30和60日。
default_params = {'n1': 5, 'n2': 10, 'n3': 20, 'n4': 40, 'n5': 80}
global j
j = 0
import numpy as np
def func(df):
global j
print(j)
rn_1 = np.log10(df.rolling(default_params['n5']).apply(func_x, (default_params['n1'],)))
rn_2 = np.log10(df.rolling(default_params['n5']).apply(func_x, (default_params['n2'],)))
rn_3 = np.log10(df.rolling(default_params['n5']).apply(func_x, (default_params['n3'],)))
rn_4 = np.log10(df.rolling(default_params['n5']).apply(func_x, (default_params['n4'],)))
rn_5 = np.log10(df.rolling(default_params['n5']).apply(func_x, (default_params['n5'],)))
rn_mean = (rn_1 + rn_2 + rn_3 + rn_4 + rn_5)
x = np.log10(np.array([default_params['n1'], default_params['n2'], default_params['n3'], default_params['n4'],
default_params['n5']]))
x_mean = x.mean()
y_weight = (x - x_mean) / np.sqrt(np.sum(np.square(x - x_mean)))
Hurst_A = (y_weight[0] * (rn_1 - rn_mean) + y_weight[1] * (rn_2 - rn_mean) + y_weight[2] * (rn_3 - rn_mean) +
y_weight[3] * (rn_4 - rn_mean) + y_weight[4] * (rn_5 - rn_mean))
j += 1
return Hurst_A
def func_x(df, n):
data_dict = dict()
data_mean_dict = dict()
data_cumsum_dict = dict()
data_r_dict = dict()
data_std_dict = dict()
sum_ = 0
len_ = default_params['n5'] // n
for i in range(1, len_ + 1):
data_dict[i] = df[n * (i - 1):n * i]
data_mean_dict[i] = data_dict[i].mean()
data_std_dict[i] = data_dict[i].std()
data_cumsum_dict[i] = (data_dict[i] - data_mean_dict[i]).cumsum()
data_r_dict[i] = (data_cumsum_dict[i].max() - data_cumsum_dict[i].min()) / data_std_dict[i]
sum_ += data_r_dict[i]
return sum_ / len_
def Log10(df):
return np.log10(df)
# log_ret = dv.add_formula('log_ret',"Log10(close_adj)-Log10(Delay(close_adj,1))",is_quarterly=False,add_data = True,register_funcs={"Log10":Log10})['000001.SZ','000002.SZ','000006.SZ','000008.SZ'](/ChannelCMT/OFO/wiki/'000001.SZ','000002.SZ','000006.SZ','000008.SZ')
log_ret = dv.add_formula('log_ret', "Log10(close_adj)-Log10(Delay(close_adj,1))", is_quarterly=False, add_data=True,
register_funcs={"Log10": Log10})
Hurst_J = log_ret.apply(func)
# dv.append_df(Hurst_A(dv),"Hurst_A")
# Hurst = pd.read_excel("HURST.xlsx",index_col='trade_date')
dv.append_df(Hurst_J, 'Hurst_J')