@Channelchan
2018-10-23T18:14:42.000000Z
字数 13225
阅读 74763
如须调用该因子,将add_data=False改为True.可自行将因子名字value更改.收盘价在部分数据没有close_adj的情况下,使用close即可,其他high、low同理.其中N为参数,可自行设置。
AR G010001A
因子描述:人气指标(price movement indicator, compare buying power with selling power to open price)。是以当天开市价为基础,即以当天市价分别比较当天最高,最低价,通过一定时期内开市价在股价中的地位,反映市场买卖人气。
计算方法:
AR=sum((highest-open),N)/sum((open-lowest),N)
N=26
AR = dv.add_formula("AR_J", "Ts_Sum(high_adj-open_adj,26)/Ts_Sum(open_adj-low_adj,26)",
is_quarterly=False, add_data=False)
BR G010002A
因子描述:意愿指标(price movement indicator, compare buying power with selling power to last day close price)。是以昨日收市价为基础,分别与当日最高,最低价相比,通过—定时期收市收在股价中的地位,反映市场买卖意愿的程度。
计算方法:
BR=sum(max(highest - Delay(close,1),0),N)/sum(max(Delay(close,1) - lowest,0),N)
N=26
BR_j = dv.add_formula('BR_j','Ts_Sum(Max((high_adj-Delay(close_adj,1)),0),26)/Ts_Sum(Max((Delay(close_adj,1)-low_adj),0),26)' ,is_quarterly=False, add_data=False)
ARBR G010003A
因子描述:人气指标(AR )和意愿指标(BR)都是以分析历史股价为手段的技术指标(Difference between AR and BR)。人气指标是以当天开市价为基础,即以当天市价分别比较当天最高,最低价,通过—定时期内开市价在股价中的地位,反映市场买卖人气;意愿指标是以昨日收市价为基础,分别与当日最高,最低价相比,通过一定时期收市收在股价中的地位,反映市场买卖意愿的程度。
计算方法:
ARBR=AR-BR
N = 26。
AR = dv.add_formula("AR_J", "Ts_Sum(high_adj-open_adj,26)/Ts_Sum(open_adj-low_adj,26)",
is_quarterly=False, add_data=True)
BR_j = dv.add_formula('BR_J', 'Ts_Sum(Max((high_adj-Delay(close_adj,1)),0),26)/Ts_Sum(Max((Delay(close_adj,1)-low_adj),0),26)',is_quarterly=False, add_data=True)
ARBR_j = dv.add_formula('ARBR_j', 'AR_J-BR_J',is_quarterly=False, add_data=True)
Psy G010004A
因子描述:心里线指标,是一定时期内投资者趋向买方或卖方的心理事实转的数值度量,用于判断股价的未来趋势。
计算方法:定义上涨日为当日收盘价高于前日收盘价,N日内的PSY可以表示为上涨日占分析周期的比例。
N 为12,II()为示性函数。N通常不超过24.
psy_j = dv.add_formula("psy_j", "Ts_Sum(close_adj>Delay(close_adj,1),12)/12",
is_quarterly=False, add_data=False)
JDQS20 G010007A
因子描述:阶段强势指标(20-day relative strength to market)。该指标计算一定周期N日 内,大盘下跌时,个股上涨的比例。
计算方法:
N = 20。
hs300, msg = dv.data_api.daily("000300.SH", dv.extended_start_date_d, dv.end_date, fields='trade_date,close')
hs300_benchmark = hs300[['trade_date', 'close']].set_index('trade_date')
dv.add_field("close")
hs300_c = 0 * dv.get_ts('close')
for i in range(hs300_c.shape[1]):
hs300_c.iloc[:, i] = hs300_benchmark
dv.append_df(hs300_c, 'hs300_c')
hs300, msg = dv.data_api.daily("000300.SH", dv.extended_start_date_d, dv.end_date, fields='trade_date,open')
hs300_benchmark_open = hs300[['trade_date', 'open']].set_index('trade_date')
hs300_op = 0 * dv.get_ts('close')
for i in range(hs300_op.shape[1]):
hs300_op.iloc[:, i] = hs300_benchmark_open
dv.append_df(hs300_op, 'hs300_op')
dv.add_formula('A', 'Ts_Sum((hs300_c<hs300_op)&&(close_adj>open_adj),20)'
, is_quarterly=False, add_data=True)
dv.add_formula('B', 'Ts_Sum(hs300_c<hs300_op,20)'
, is_quarterly=False, add_data=True)
JDQS20_j = dv.add_formula('JDQS20_j', 'A/B', is_quarterly=False, add_data=False)
ADTM G010008A
因子描述:动态买卖气指标(Moving dynamic indicator) , 用开盘价的向上波动幅度和向下波动幅度的距离差值来描述人气高低的指标。
计算方法:
DTM = dv.add_formula('DTM_J',"If(open_adj>Delay(open_adj,1),Max(high_adj-open_adj,open_adj-Delay(open_adj,1)),0)",is_quarterly=False, add_data=True)
DBM = dv.add_formula('DBM_J',"If(open_adj<Delay(open_adj,1),Max(open_adj-low_adj,open_adj-Delay(open_adj,1)),0)",is_quarterly=False, add_data=True)
STM = dv.add_formula('STM_J',"Ts_Sum(DTM_J,20)" ,is_quarterly=False, add_data=True)
SBM = dv.add_formula('SBM_J',"Ts_Sum(DBM_J,20)" ,is_quarterly=False, add_data=True)
ADTM = dv.add_formula('ADTM_A',"(STM_J-SBM_J)/Max(STM_J,SBM_J)",is_quarterly=False, add_data=False)
ATR14 G010009A
因子描述: 14日均幅指标(14-day Average True Range)取—定时间周期内的股价波动幅度的移动平均值,是显示市场变化率的指标,主要用于研判买卖时机。
Ta('ATR',0,open,high,low,close,volume,N)
N=14
ATR14 = dv.add_formula('ATR14_J', "Ta('ATR',0,open,high,low,close,volume,14)"
, is_quarterly=False, add_data=False)
ATR6 G010010A
因子描述:6日均幅指标(6-day Average True Range)。取一定时间周期内的股价波动幅度的移动平均值,是显示市场变化率的指标,主要用于研判买卖时机。
def SMA(A, n, m):
# 设置alpha的比例
alpha = m / n
# 通过ewm计算递归函数
return A.ewm(alpha=alpha, adjust=False).mean()
dv.add_formula('TR_J', "Max(Max(high-low,Abs(high-Delay(close,1))),Abs(low-Delay(close,1)))",is_quarterly=False,add_data=True)
ATR6 = dv.add_formula('ATR6_J', "SMA(TR_J,1,6)" ,is_quarterly=False,
add_data=False, register_funcs={"SMA": SMA})
SBM G010011A
因子描述:计算ADTM因子的中间变量(mediator in calculating ADTM)。
计算方法:
1.若当日开盘价小于昨日开盘价,则DBM = max(open - lowest,open- prev_open) , 否则DBM=0。
2.SBM为N日内DBM之和。N =20。
SBM = dv.add_formula('SBM_J', "Ts_Sum(If((open<Delay(open,1)),Max(open-low,open-Delay(open,1)),0),20)",is_quarterly=False, add_data=True)
STM G010012A
因子描述:计算ADTM因子的中间变量(mediator in calculating ADTM).
计算方法:
1.若当日开盘价大于昨日开盘价,则DBM = max(open - lowest,open- prev_open) , 否则DBM=0.
2.STM为N日内DTM之和。N =20.
STM = dv.add_formula('STM_J', "Ts_Sum(If((open>Delay(open,1)),Max(high-open,open-Delay(open,1)),0),20)",is_quarterly=False,add_data=True)
RSI G010013A
因子描述:相对强弱指标(Relative Strength Index) , 通过比较一段时期内的平均收盘涨数和平均收盘跌数来分析市场买沽盘的意向和实力,据此预测趋势的持续或者转向。
计算方法:
N取12。
dv.add_formula('Ui', """If(close_adj>Delay(close_adj, 1),close_adj-Delay(close_adj, 1),If(close_adj<Delay(close_adj, 1), 0, 0))""",is_quarterly=False, add_data=True)
dv.add_formula('Di',"""If(close_adj>Delay(close_adj, 1),0,If(close_adj<Delay(close_adj, 1), Delay(close_adj, 1)-close_adj, 0))""",is_quarterly=False, add_data=True)
RSI = dv.add_formula('RSI_J',
"100-100/(1+(Ta('MA',0,Ui,Ui,Ui,Ui,Ui,12)/Ta('MA',0,Di,Di,Di,Di,Di,12)))" ,
is_quarterly=False, add_data=False)
Volatility G010014A
因子描述:换手率相对波动率(Volatility of daily turnover during the last 20 days)。
计算方法:
Volatility=sd(TORate)/mean(TORate)
其中
Volatility_J = dv.add_formula('Volatility_J',"StdDev(turnover_ratio,20)/Ts_Mean(turnover_ratio,20)"
,is_quarterly=False, add_data=False)
Wvad G010015A
因子描述:威廉变异离散量(William'svariable accumulation distribution) , 是—种将成交量加权的量价指标。用于测量从开盘价至收盘价期间,买卖双方各自爆发力的程度。
计算方法:
(收盘价减去开盘价)除以(最高价减去最低价)乘以成交量的过去24天的加总
Wvad_j = dv.add_formula('Wvad_j', "Ts_Sum(((close-open)/(high-low))*volume,24)" ,
is_quarterly=False, add_data=False)
Mawvad G010016A
wvad的24日均值
Wvad_j = dv.add_formula('Wvad_j','Ts_Sum(((close_adj - open_adj)/(high_adj - low_adj)) * volume ,24)',is_quarterly=False, add_data=True)
Mawvad_j = dv.add_formula('Mawvad_j', 'Ts_Mean(Wvad_j,6)', is_quarterly=False, add_data=False)
Volumn1M G010017A
因子描述:当前交易量相比过去1个月日均交易量与过去一个月的收益率乘积
计算方法:
Volumn1M=20*volume/Sum(volume,20)-1)*revs20
注:上式为个股在过去20天内不发生停牌的情况下,若个股有停牌,则成交量为0,那么在计算成交量的均值时需要去掉停牌日;下同。
dv.add_formula('revs20_J','close_adj/Delay(close_adj,20)',is_quarterly=False, add_data=True)
VOLUMN1M_J = dv.add_formula('VOLUMN1M_J','(20*volume/Ts_Sum(volume,20)-1)*revs20_J',is_quarterly=False, add_data=False)
Volumn3M G010018A
因子描述:过去5天成交量相比过去三个月里五日成交量均值与过去三个月的收益率乘积
计算方法:
Volumn3M=12*Sum(volume,5)/Sum(volume,60)-1)*revs60
dv.add_formula('revs60_J','close_adj/Delay(close_adj,60)',is_quarterly=False, add_data=True)
VOLUMN3M_J=dv.add_formula('VOLUMN3M_J','(12*Ts_Sum(volume,5)/Ts_Sum(volume,60)-1)*revs60_J',is_quarterly=False, add_data=False)
Acd6 G010019A
因子描述:6日收集派发指标(6-day Accumulation/Distribution ) 。将市场分为两股收集(买入)及派发(估出)的力量。
计算方法:
Ts_Sum(power_j,N)
N=6、20等
dv.add_formula('power_j',"If(close_adj>=Delay(close_adj,{}),close_adj-Min(low_adj,Delay(close_adj,{})),close_adj-Max(high_adj,Delay(close_adj,{})))/adjust_factor".format(1, 1, 1), is_quarterly=False, add_data=True)
ACD6_J = dv.add_formula('ACD6_J', "Ts_Sum(power_j,6)",is_quarterly=False, add_data=False)
OBV G010021A
因子描述:能量潮指标(On Balance Volume , OBV ) 。以股市的成交量变化来衡量股市的推动力,从而研判股价的走势。
计算方法:
计算累积成交量如果本日收盘价或指数高于前—日收盘价或指数,本日值则为正如果本日的收盘价或指数低于前—日的收盘价,本日值则为负值;如果本日值与前一日的收盘价或指数持平, 本日值则不予计算,然后计算累积成交量。这里的成交量是指成交股票的手数。
OBV_J = dv.add_formula('OBV_J', "Ta('OBV',0,open,high,low,close,volume)", is_quarterly=False, add_data=False)
OBV6 G010022A
因子描述:6日能量潮指标(6-dayOn Balance Volume , OBV ) 。以股市的成交量变化来衡量股市的推动力,从而研判股价的走势。
计算方法:
计算6日累积成交量的均值。如果本日收盘价或指数高于前一日收盘价或指数,本日值则为正;如果本日的收盘价或指数低于前一日的收盘价,本日值则为负值;如果本日值与前一日的收盘价或指数持平,本日值则不予计算,然后计算6日累积成交量。这里的成交量是指成交股票的手数。
Ts_Mean(OBV_J,N)
N=6、20等
OBV_J = dv.add_formula('OBV_J', "Ta('OBV',0,open,high,low,close,volume)", is_quarterly=False, add_data=False)
OBV6_J = dv.add_formula('OBV6_J', "Ts_Mean(OBV_J,6)", is_quarterly=False, add_data=False)
TVMA20 G010024A
因子描述: 20日成交金额的移动平均值(20-day Turnover Value Moving Average)。
计算方法:
TVMA = MA(value, N)
N=20. 入库除以le6。
Ts_Mean(turnover,N)
或者
Ta('MA',0,0,0,0,turnover,0,N)
N=20、6等
value = dv.add_formula("TVMA20_J", "Ts_Mean(turnover,20)" ,
is_quarterly=False, add_data=False)
TVSTD20 G010026A
因子描述: 20日成交金额的标准差(20-day Turnover Value Standard Deviation)
计算方法:
TVSTD = sd(value, N)
N=20。入库除以le6.
StdDev(turnover,N)/Pow(10,6)
N=20、6等
dv.add_field('turnover')
TVSTD20_j = dv.add_formula('TVSTD20_j', 'StdDev(turnover,20)/Pow(10,6)'
, is_quarterly=False, add_data=False)
VDEA G010028A
因子描述:计算VMACD因子的中间变量( Volume Difference Exponential Average ) 。
计算方法:
VDIFF = EMA(volume, 12) - EMA(volume, 26)
DEA为VDIFF的M日指数移动平均: DEA = EMA(VDIFF, M) , 通常M = 9.
dv.add_field("volume")
EMA12 = dv.get_ts('volume').ewm(span=12, adjust=False).mean()
EMA26 = dv.get_ts('volume').ewm(span=26, adjust=False).mean()
VDIFF = EMA12 - EMA26
vdeas = VDIFF.ewm(span=9, adjust=False).mean()
dv.append_df(vdeas, 'vdeas')
VDIFF G010029A
因子描述:计算VMACD因子的中间变量(Volume difference)。
计算方法:
VDIFF = EMA(volume, 12) - EMA(volume, 26)
dv.add_field("volume")
EMA12 = dv.get_ts('volume').ewm(span=12, adjust=False).mean()
EMA26 = dv.get_ts('volume').ewm(span=26, adjust=False).mean()
VDIFF = EMA12 - EMA26
dv.append_df(VDIFF, 'VDIFF_J', is_quarterly=False)
VEMA10 G010030A
因子描述:成交量的指数移动平均(10-day Exponential moving average of volume)。
计算方法:
VEMA = EMA(volume, N)
N取10。
Ta('EMA',0,0,0,0,volume,0,N)
N=10、12、26、5等皆可
VEMA10_X = dv.add_formula('VEMA10_X', "Ta('EMA',0,0,0,0,volume,0,10)" ,
is_quarterly=False, add_data=False)
VMACD G010034A
因子描述:量指数平滑异同移动平均线( VolumeMoving Average Convergence and Divergence)。是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线VMACD的意义和MACO基本相同,但VMACD取用的数据源是成交量,MACO取用的数据源是成交价格。
计算方法:
dv.add_formula('VDIFF_',"Ta('EMA',0,0,0,0,volume,0,12)-Ta('EMA',0,0,0,0,volume,0,26)",
is_quarterly=False, add_data=True)
dv.add_formula('VDEA_',"Ta('EMA',0,0,0,0,VDIFF_,0,9)",
is_quarterly=False, add_data=True)
VMACD_J = dv.add_formula('VMACD_J',"VDIFF_-VDEA_", is_quarterly=False, add_data=False)
VOL10 G010035A
因子描述: 10日平均换手率(10-day Turnover Rate)。
计算方法:
最近10个交易日的平均换手率
Ts_Mean(turnover_ratio,N)
N=10、120、20、240、5、60等皆可
value = dv.add_formula('VOL10_J', "Ts_Mean(turnover_ratio,10)" ,
is_quarterly=False, add_data=False)
VOSC G010041A
因子描述:成交量震荡(Volume Oscilltaor) , 又称移动平均成交量指标,但它并非仅仅计算成交量的移动平均线,而是通过对成交量的长期移动平均线和短期移动平均线之间的比较,分析成交量的运行趋势和及时研判趋势转变方向。
计算方法:
VOSC = 100 * (MA(volume, 12) - MA(volume, 26 )) / MA(volume, 12)
VOSC = dv.add_formula('VOSC_J',"100*(Ta('MA',0,0,0,0,volume,0,12)-Ta('MA',0,0,0,0,volume,0,26))/(Ta('MA',0,0,0,0,volume,0,12))",is_quarterly=False, add_data=False)
VR G010042A
因子描述:成交量比率(Volume Rtaio) 。 通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值,从而掌握市场买卖气势的中期技术指标。
计算方法:
对任一交易日,若close > prev_close , 当日成交量为AV, 否则AV=0。将N日内AV加和后记为AVS.
对任一交易日,若close< prev_close , 当日成交量为BV , 否则BV= 0。 将N日内BV加和后记为BVS。
对任一交易日,若close= prev_close , 当日成交量为CV, 否则CV= 0。 将N 日内CV加和后记为CVS。
VR = (AVS + CVS / 2) / (BVS + CVS / 2)。
N取24, 即24个交易日。
BVS = dv.add_formula('BVS','Ts_Sum(If(close_adj<Delay(close_adj, 1), volume, 0), 24)' ,
add_data=True, is_quarterly=False)
AVS = dv.add_formula('AVS','Ts_Sum(If(close_adj>Delay(close_adj, 1), volume, 0), 24)' ,
add_data=True, is_quarterly=False)
CVS = dv.add_formula('CVS', 'Ts_Sum(If(close == Delay(close, 1), volume, 0), 24)',
add_data=True, is_quarterly=False)
VR = dv.add_formula('VR1', '(AVS+CVS/2)/(BVS+CVS/2)', add_data=False, is_quarterly=False)
VROC12 G010043A
因子描述: 12日量变动速率指标(12-day Volume Rate of Change)。以今天的成交量和N天前的成交量比较,通过计算某一段时间内成交量变动的幅度,应用成交进的移动比较来测足成交量运动趋向,达到事先探测成交量供需的强弱,进而分析成交量的发展趋势及其将来是否有转势的意愿,属于成交量的反趋向指标。
计算方法:
(volume/volume(t-N)-1)*100
N=12、6等皆可
VROC12 = dv.add_formula('VROC12_J', "(volume/Delay(volume,12)-1)*100",
is_quarterly=False, add_data=False)
VSTD10 G010045A
因子描述: 10日成交量标准差(10-day Volume Standard Deviation)。考察成交量的波动程度。
计算方法:
VSTD = sd(volume, N)
N取10、20等皆可
VSTD10_J = dv.add_formula('VSTD10_J',"StdDev(volume,10)", is_quarterly=False, add_data=False)
MoneyFlow20 G010048A
因子描述:资金流量(20-day money flow)。用收盘价,最高价及最低价的均值乘以当日成交量即可得到该交易日的资金流量。
计算方法:
MoneyFlow=Sum((close+high+low)*volume/3,N)
N=20
MoneyFlow20 = dv.add_formula('MoneyFlow20_J', "Ts_Sum((close+high+low)*volume/3,20)",
is_quarterly=False, add_data=False)
DAVOL5 G010049A
因子描述:相对5日相对120日平均换手率(Difference between 5-day average turnover rate and 120 -day average turnover rate)。
计算方法:
DAVOLS = VOL5 - VOL 120
最近一段时间的日平均换手率相对于120个交易日的变化。计算了5个交易日的结果。
Ts_Mean(turnover_ratio,N)-Ts_Mean(turnover_ratio,120)
其中N取5、10、20等皆可
DAVOL5 = dv.add_formula('DAVOL5_J', "Ts_Mean(turnover_ratio,5)-Ts_Mean(turnover_ratio,120)",
is_quarterly=False, add_data=False)
STOM G010052A
因子描述:月度换手率对数
计算方法:
STOM=Log(Ts_Mean(turnover_ratio/100,21)*21)
或者STOM=ln(sum(turnover_ratio/100,21))
使用近一个月的换手率的累加和的对数
STOM = dv.add_formula('STOM_A', "Log(Ts_Mean(turnover_ratio/100,21)*21)",
is_quarterly=False, add_data=False)
STOQ G010053A
因子描述:3个月换手率对数平均
计算方法:
STOQ=ln(sum(exp(STOM),T)/T)
其中,T=3个月,这里每个月按照21个交易日计算。
stoq_j = dv.add_formula("STOQ_J","Log(Ts_Sum(turnover_ratio, 63)/3/100)",
is_quarterly=False, add_data=False)
STOA G010054A
因子描述: 12个月换手率对数平均
计算方法:
STOA=ln(sum(exp(STOM),T)/T)
其中,T=12个月,每个月按照21个交易日计算。
stoa_j = dv.add_formula("STOA_J","Log(Ts_Sum(turnover_ratio, 21*12)/12/100)",
is_quarterly=False, add_data=False)