@Channelchan
2018-10-23T15:59:02.000000Z
字数 14669
阅读 75445
如须调用该因子,将add_data=False改为True.可自行将因子名字value更改.收盘价在部分数据没有close_adj的情况下,使用close即可,其他high、low同理.其中N为参数,可自行设置。
ARC E010001A
因子描述:变化率指数均值(Average Rate of Change)。股票的价格变化率RC指标的均值,用以判断前一段交易周期内股票的平均价格变化率。
计算方法:
ARC=EMA(RC, N, 1/N) RC=close(t)/close(t-N)
其中N=50, 1/N为指数移动平均的加权系数α
def EMA(A, n):
alpha = 1.0 / n
return A.apply(lambda x: x.dropna().ewm(alpha=alpha, adjust=False).mean())
def Dropnapct(df, n):
return df.apply(lambda x: x.dropna().pct_change(n) + 1)
def close2na(close, trade_status):
return close[trade_status == 1]
# 存入的数据命名要带来源(XXX_A or XXX_B)
dv.add_formula('rc', 'Dropnapct(Close2Na(close,trade_status),50)' ,
is_quarterly=False, add_data=True,
register_funcs={"Dropnapct": Dropnapct, "Close2Na": close2na})
ARC_J = dv.add_formula('ARC_J', 'EMA(rc,50)' ,
is_quarterly=False, add_data=False, register_funcs={"EMA": EMA})
APBMA E010002A
因子描述:绝对谝差移动平均(Absolute Price Bias Moving Average)。考察一段时期内价格偏离均线的移动平均。
计算方法:
APBMA = MA(abs(close - MA(close, N)), N)
其中N=5
dv.add_formula('a_1', "Abs(close-Ta('MA',0,0,0,0,close,0,5))",
is_quarterly=False,add_data=True)
APBMA = dv.add_formula('APBMA_J', "Ta('MA',0,0,0,0,a_1,0,5)",
is_quarterly=False,add_data=False)
BBIC E010003A
因子描述:因子BBI除以收盘价得到(BBI/Close price)
计算方法:
BBIC=BBI/close
dv.add_formula('MA3', 'Ts_Mean(close_adj,3)', is_quarterly=False, add_data=True)
dv.add_formula('MA6', 'Ts_Mean(close_adj,6)', is_quarterly=False, add_data=True)
dv.add_formula('MA12', 'Ts_Mean(close_adj,12)', is_quarterly=False, add_data=True)
dv.add_formula('MA24', 'Ts_Mean(close_adj,24)', is_quarterly=False, add_data=True)
dv.add_formula('BBI_J', '((MA3+MA6+MA12+MA24)/4)', is_quarterly=False, add_data=True)
BBIC=dv.add_formula('BBIC_J', 'BBI_J/close_adj', is_quarterly=False, add_data=True)
MA10Close E010004A
因子描述:均线价格比(10-day moving average to close price ratio)。由于股票的成交价格有响起均线回归的趋势,计算均线价格比可以预测股票在末来周期的运动趋势。
计算方法:
MA10Close = MA(close, N) / close
N取10.
MA10Close = dv.add_formula("MA10Close_J", "Ts_Sum(close,10)/close", is_quarterly=False, add_data=False)
BIAS10 E010005A
因子描述:乖离率(10-day Bias Ratio/BIAS) , 简称Y值,是移动平均原理派生的一项技术指标,表示股价偏离趋向指标斩百分比值。
计算方法:
BIAS = (close/ MA(close, N) - 1) * 100
一般N取10、20、5和60等等。
BIAS10 = dv.add_formula('BIAS10', "(close/Ta('MA',0,0,0,0,close,0,10)-1)*100",
is_quarterly=False, add_data=False)
CCI10 E010009A
因子描述:
10日顺势指标(10-day Commodity Channel Index),专门测量股价是否已超出常态分布范围。
CCI指标波动于正无穷大到负无穷大之间,不会出现指标钝化现象,有利于投资者更好地研判行情,
特别是那些短期内暴涨暴跌的非常态行情。
计算方法:
计算典型价格:TYP=(close+highest+lowest)/3
计算典型价格的移动平均:MATYP=MA(TYP, N)
计算典型价格的偏差:
CCI=(TYP-TYPMA)/0.015/DEV
Ta('CCI',0,open_adj,high_adj,low_adj,close_adj,volume,N)
N取10、20、5和88
value = dv.add_formula("CCI10_J","Ta('CCI',0,open_adj,high_adj,low_adj,close_adj,volume,10)" ,is_quarterly=False,add_data=False)
ROC6 E010013A
因子描述: 6日变动速率(6-day Price Rate of Change). 是一个动能指标,其以当日的收盘价和N天前的收盘价比较,通过计算股价某一段时间内收盘价变动的比例,应用价格的移动比较来测量价位动量,属于反趋向的指标之一。
计算方法:
((close_adj/Delay(close_adj, N))-1)*100
N=6、20
ROC6 = dv.add_formula('ROC6', '((close_adj/Delay(close_adj, 6))-1)*100' , add_data=False,is_quarterly=False)
SRMI E010015A
因子描述:修正动量指标(Modified IMomentom Index)。
计算方法:
在当日收盘价小于前—交易日时,以前—交易日作为衡量基准;当日收盘价大于前一交易日时,以当日作为衡量基准。N = 10。
SRMI=(close-close(t-N))/max(close,close(t-N))
SRMI = dv.add_formula('SRMI_J', "(close_adj-Delay(close_adj,10))/Max(close_adj,Delay(close_adj,10))" ,is_quarterly=False, add_data=False)
ChandeSD E010016A
因子描述:计算CMO因子的中间变量,SD是今日收盘价与昨日收盘价(下跌日)差值的绝对值加总。若当日上涨,则增加值为0。
计算方法:
N=20
ChandeSD = dv.add_formula('ChandeSD_J',"Ts_Sum(Max(Delay(close,1)-close,0),20)"
, is_quarterly=False, add_data=False)
ChandeSU E010017A
因子描述:计算CMO因子的中间变量(mediator in calculating CMO)。SU是今日收盘价与昨日收盘价(上涨日)差值加总。若当日下跌, 则增加值为0。
计算方法:
N取20
ChandeSU = dv.add_formula("ChandeSU_J","Ts_Sum(Max(close-Delay(close,1),0),20)" ,
is_quarterly=False,add_data=False)
CMO E010018A
因子描述:钱德动量摆动指标(Chande Momentum Osciliator),与其他动量指标摆动指标如相对强弱指标(RSI)和随机指标(KDJ)不同,钱德动量指标在计算公式的分子中采用上涨日和下跌日的数据。
计算方法:
1、SU是今日收盘价与昨日收盘价(上涨日)差值加总。若当日下跌,则增加值为0;
2、SD是今日收盘价与昨日收盘价(下跌日)差值的绝对值加总。若当日上涨,则增加值为0。
3、CMO = (SU - SD)/ (SU + SD) * 100.
N取20。
dv.add_formula('SU', "Ts_Sum(If(Delta(close,1)>0,close-Delay(close, 1),0),20)" , is_quarterly=False,add_data=True)
dv.add_formula('SD', "Ts_Sum(If(Delta(close,1)<0,Delay(close, 1)-close,0),20)", is_quarterly=False,add_data=True)
CMO_J = dv.add_formula('CMO_J', "(SU-SD)/(SU+SD)*100", is_quarterly=False, add_data=False)
revs5 E010019A
因子描述:过去5天的价格动量
计算方法:
close_adj/Delay(close_adj,N)
N可以取5、10、20、60、120、250、750等等
注1:若公司在过去5天有停牌,停牌日也计算在统计天数中。
注2:若公司在今天停牌,不计算该因子的值。
value = dv.add_formula('revs5_A',"close_adj/Delay(close_adj,5)"
, is_quarterly=False, add_data=False)
REVS5M20 E010026A
因子描述:5日动量和20日动量的差
REVS5M20_J = dv.add_formula('REVS5M20_A','close_adj/Delay(close_adj,5)-close_adj/Delay(close_adj,20)',is_quarterly=False, add_data=False)
REVS5M60 E010027A
因子描述:5日动量和60日动量的差
dv.add_formula("revs5", "close_adj/Delay(close_adj,5)", is_quarterly=False, add_data=True)
dv.add_formula("revs60", "close_adj/Delay(close_adj,60)", is_quarterly=False, add_data=True)
REVS5M60=dv.add_formula("REVS5M60_A", "revs5-revs60", is_quarterly=False, add_data=False)
REVS5Indu1 E010028A
因子描述:过去一个月收益率与行业均值比较,行业均值等于所有个股5日收益率的等权平均,行业分类按照申万一级
计算方法:REVS5INDU1 = REVS5-Mean(REVS5)
REVS20Indu1、REVS60Indu1等皆可
注:由于个股当日停牌是取不到REVSS的值,所以直接从数据库中读取当日所有REVS5, 然后按行业groupby取Mean就可以得到平均值;下同。
dv.add_field('sw1')
sw1 = dv.get_ts('sw1')
aa = set(sw1.iloc[1])
sw = list(aa)
revs5 = dv.add_formula("revs5", "close_adj/Delay(close_adj,5)", is_quarterly=False,
add_data=True)
revs_mean = revs5
for i in range(len(sw)):
revs_sw_stock = revs_mean[sw1 == sw[i]].dropna(axis=1, how='all').columns
revs_stock_mean = revs_mean[sw1 == sw[i]].mean(1)
for j in revs_sw_stock:
revs_mean[j] = revs_stock_mean
dv.append_df(revs_mean, 'revs_mean')
revs5indu_j = dv.add_formula("revs5indu_j", "revs5 - revs_mean", is_quarterly=False, add_data=False)
Fiftytwoweekhigh E010030A
因子描述:当前价格处于过去1年股价的位置(Price level during the pasted 52 weeks)。
计算方法:
Fiftytwoweekhigh=(Price-minPrice)/maxPrice-minPrice
其中:
Price=
T = (t: all trading days in the passed 365 days)
r=日收益
import pandas as pd
def CalPos(price, n):
result = []
for col in price.columns:
data = price[col].dropna()
data = (data - data.rolling(n).min()) / (data.rolling(n).max() - data.rolling(n).min())
result.append(data)
return pd.concat(result, axis=1)
Fiftytwoweekhigh = dv.add_formula("Fiftytwoweekhigh","CalPos(close,252)",
is_quarterly=False,add_data=False,
register_funcs={"CalPos": CalPos})
Price1M E010031A
当前股价除以过去1个月股价均值再减1
({}*close_adj)/(Ts_Sum(close_adj,{}))-1".format(N,N)
N可以为20、60、250等
Price1M = dv.add_formula('Price1M_J', "({}*close_adj)/(Ts_Sum(close_adj,{}))-1".format(20,20),
is_quarterly=False, add_data=False)
Rank1M E010034A
因子描述:1减去过去一个月收益率排名与股票总数的比值
计算方法:
Rank1M=1-rank_value/N
注1:N为所有参与排名的股票数,剔除掉当日停牌的股票;
注2: 计算时,直接取出当日所有的REVS20, 然后按照REVS20的值进行排名。
rank_value=过去1个月收益率的排名值(收益最高排名为1, 最小为N)
N为参与排名的所有A股数量
Rank1M = dv.add_formula('Rank1M_J', "Rank(close_adj/Delay(close_adj,20))" ,
is_quarterly=False, add_data=False)
BearPower E010035A
因子描述:空头力道(Mediator in calculating Elder, Bear power indicator) , 是计算Elder因子的中间变量。
计算方法:
BearPower = lowest - EMA(close, N), 其中N取13。
BearPower_J = dv.add_formula('BearPower_J', "low-Ta('EMA',0,0,0,0,close,0,13)",
is_quarterly=False, add_data=False)
BullPower E010036A
因子描述:多头力道(Mediator in calculatiing Elder, Bull power indicator) , 是计算Elder因子的中间变量。
计算方法:
Bull Power = highest - EMA(close, N), 其中N取13.
BULLPOWER_J = dv.add_formula('BULLPOWER_J', "high-Ta('EMA',0,0,0,0,close,0,13)",
is_quarterly=False,add_data=False)
RC12 E010037A
因子描述: 12日变化率指数(12-day Rate of Change) , 类似于动力指数。如果价格始终是上升的,则变化率指数始终在100%线以上,且如果变化速度指数在向上发展时,说明价格上升的速度在加快。
计算方法:
RC="close_adj/Delay(close_adj,%s)"%(N-1)"
N=12、24等
RC12 = dv.add_formula('RC12_A', "close_adj/Delay(close_adj,11)" ,
is_quarterly=False,add_data=False)
rstr24 E010039A
因子描述: 24月相对强势(Relative strength for the last 24 months)。
计算方法:
N取24,计算中将每日无风险收益r_rf,t按0处理。因总收益和日收益满足, 代码计算时使用了总收益,若当月数值缺失则使用上月数值填补。
r是日收益,volume是成交量
N可以取24、12等
N=24
rstr24_J = dv.add_formula('rstr24_A',
'Log(close_adj/Delay(close_adj,%s))' % (21 * N),
is_quarterly=False, add_data=False)
Rstr504 E010041A
因子描述:504天相对强势
计算方法:
其中L代表延迟21个交易日,r_t是股票的收益,r_ft是无风险收益,这里用FR007代替。W为指数衰减权重,半衰期为126天。
def WeightSum(df, halflife, count, delay=21):
SumValue = df.rolling(halflife).sum().shift(delay)
value = SumValue.copy()
w = 1
for i in range(count):
w = w / 2
value += w * SumValue.shift(halflife * (i + 1))
return value
dv.add_formula("LnRi", "Log(1+Return(close,1))", is_quarterly=False, add_data=True)
Rstr504 = dv.add_formula("Rstr504",
"WeightSum(LnRi,126,(504 /126) - 1,21)",
is_quarterly=False,add_data=False,
register_funcs={"WeightSum": WeightSum})
CoppockCurve E010042A
因子描述:估波指标(Coppock Curve) , 又称“估波曲线' 。该指标通过计算月度价格的变化速率的加权平均值来测量市场动量,属于长线指标。这里我们改为日间的指标。
计算方法:
1.
2.Coppock=WMA(RC,M)
通常取N1=14,N2=11,M=10
dv.add_formula("RC_J", "100*(close/Delay(close,{})+close/Delay(close,{}))".format(14,11),
is_quarterly=False, add_data=True)
CoppockCurve_A = dv.add_formula("CoppockCurve_A", "Ta('WMA',0,0,0,0,RC_J,0,{})".format(10),
is_quarterly=False, add_data=False)
Aroon E010043A
因子描述: Aroon (Aroon oscillator)通过计算自价格达到近期最高值和最低值以来所经过的期间数,帮助投资者预测证券价格从趋势到区域区域或反转的变化。Aroon指标分为Aroon, AroonUp和AroonDown3个具体指标。
计算方法:
若考察一段长度为N ( 一般取26个交易曰)的区间,以x表示该区间最离价出现日距离当前交易日的天数,以y表示该区间最低价出现日距离当前交易日的天数。
Aroon=AroonUp-AroonDown
AroonUp=(N-x)/N*100
AroonDown=(N-y)/N*100
Aroon_A = dv.add_formula("Aroon_A", "100*(Ts_Argmax(close_adj,{0})-Ts_Argmin(close_adj,{0}))/{0}".format(26 - 1), is_quarterly=False, add_data=False)
AroonDown E010044A
因子描述:计算Aroon因子的中间变量(Mediator in calculating Aroon,)。
最低价出现日占该交易区间的百分位
计算方法:
若考察一段长度为N (一般取26个交易日)的区间,以y表示该区间最低价出现日距离当前交易日的天数。
AroonDown=(N-y)/N*100
AroonDown = dv.add_formula('AroonDown_J', "100*(Ts_Argmin(close_adj,25))/25",
is_quarterly=False,add_data=False)
AroonUp E010045A
因子描述:计算Aroon因子的中间变是(Mediator in calculating Aroon)。
计算方法:
若考察一段长度为N (一般取26个交易日)的区间,以x 表示该区间最低价出现日距离当前交易日的天数。
AroonUp=(N-x)/N*100
AroonUp_J = dv.add_formula('AroonUp_J', "Ts_Argmax(close_adj,25)/25*100" ,
is_quarterly=False, add_data=False)
DEA E010046A
因子描述: 计算MACD因子的中间变量(Difference in Exponential Average (mediator in calculating MACD))。
计算方法:
DEA = EMA(EMA12-EMA26,9)
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)
DEA_J = dv.add_formula('DEA_J', "Ta('EMA',0,0,0,0,Diff_J,0,9)", add_data=False, is_quarterly=False)
DIFF E010047A
因子描述:计算MACD因子的中间变量(Difference (mediator in calculating MACD))。
计算方法:
1.DIFF (Difference)为收盘价短期、长期指数平滑移动平均线间的差。
2.DIFF = EMA(close, 12) - EMA(close, 26)。
3.DIFF = EMA12 - EMA26
DIFF = dv.add_formula('DIFF_A',"Ta('EMA',0,0,0,0,close,0,12)-Ta('EMA',0,0,0,0,close,0,26)"
, is_quarterly=False, add_data=True)
DDI E010048A
因子描述:方向标准离差指数(Directional Divergence Index)。观察一段时间内股价相对于前一天向上波动和向下波动的比例,并对其进行移动平均分析。DDI指标倾向于显示一种长波段趋势的方向改变。
计算方法:
取N = 13。
DMZ_j = dv.add_formula('DMZ_j',
'If((high+low <= (Delay(high,1)+Delay(low,1))),0,Max(Abs(high-Delay(high,1)),Abs(low-Delay(low,1))))',
is_quarterly=False, add_data=True)
DMF_j = dv.add_formula('DMF_j',
'If((high+low >= (Delay(high,1)+Delay(low,1))),0,Max(Abs(high-Delay(high,1)),Abs(low-Delay(low,1))))',
is_quarterly=False, add_data=True)
DIZ_j = dv.add_formula('DIZ_j',
'Ts_Sum(DMZ_j,13)/(Ts_Sum(DMZ_j,13)+Ts_Sum(DMF_j,13))',
is_quarterly=False,add_data=True)
DIF_j = dv.add_formula('DIF_j',
'Ts_Sum(DMF_j,13)/(Ts_Sum(DMZ_j,13)+Ts_Sum(DMF_j,13))',
is_quarterly=False,add_data=True)
DDI_j = dv.add_formula('DDI_j', 'DIZ_j - DIF_j', is_quarterly=False, add_data=False)
DIZ E010049A
因子描述:计算DDI因子的中间变量(Mediator in calculating DDI).
计算方法:
N=13
DMZ = dv.add_formula('DMZ',
'If((high_adj+low_adj)<=(Delay(high_adj,1)+Delay(low_adj,1)),0,Max(Abs(high_adj-Delay(high_adj,1)),Abs(low_adj-Delay(low_adj,1))))',
is_quarterly=False, add_data=True)
DMF = dv.add_formula('DMF',
'If((high_adj+low_adj)>=(Delay(high_adj,1)+Delay(low_adj,1)),0,Max(Abs(high_adj-Delay(high_adj,1)),Abs(low_adj-Delay(low_adj,1))))',
is_quarterly=False, add_data=True)
DIZ_J = dv.add_formula('DIZ_J', ' Ts_Sum(DMZ,13)/(Ts_Sum(DMZ,13)+Ts_Sum(DMF,13))' , is_quarterly=False, add_data=False)
DIF E010050A
因子描述:计算DDI因子的中间变量(Mediator in calculating DDI)。
计算方法:
N=13
DMZ = dv.add_formula('DMZ',
'If((high_adj+low_adj)<=(Delay(high_adj,1)+Delay(low_adj,1)),0,Max(Abs(high_adj-Delay(high_adj,1)),Abs(low_adj-Delay(low_adj,1))))',
is_quarterly=False, add_data=True)
DMF = dv.add_formula('DMF',
'If((high_adj+low_adj)>=(Delay(high_adj,1)+Delay(low_adj,1)),0,Max(Abs(high_adj-Delay(high_adj,1)),Abs(low_adj-Delay(low_adj,1))))',
is_quarterly=False, add_data=True)
DIF_J = dv.add_formula('DIF_J', ' Ts_Sum(DMF,13)/(Ts_Sum(DMZ,13)+Ts_Sum(DMF,13))' ,
is_quarterly=False, add_data=False)
PVT E010051A
因子描述:价量趋势(Price and Volume Trend)指标.把能量变化与价格趋势有机地联系到了一起,从而构成了量价趋势指标。
计算方法:
PVT = (close - prev_close) / prev_close * volume
1日的累计PVT。最后入库数值除以le6.
PVT = dv.add_formula('PVT','Return(close,1) * volume * 0.000001',
is_quarterly=False,add_data=False)
PVT6 E010052A
因子描述:因子PVT的6日均值(6-day average price and volume trend)。
计算方法:
PVT = (close - prev_close) / prev_close * volume
6日的累计PVT。最后入库数值除以le6.
Ta('MA',0,0,0,0,Return(close,1) * volume, 0, N) * 0.000001
N可以取6、12等
PVT6 = dv.add_formula('PVT6',"Ta('MA',0,0,0,0,Return(close,1) * volume, 0, 6) * 0.000001",
is_quarterly=False,add_data=False)
TRIX5 E010054A
因子描述: 5日三重指数平滑移动平均指标变化率(5-day percent rate of change of triple exponetially smoothed moving average)。TRIX根据移动平均线理论,对一条平均线进行三次平滑处理,再根据这条移动平均线的变动清况来预测股价的长期走势。
计算方法:
N取5、10等
EMA = dv.get_ts('close').ewm(span=5, adjust=False).mean()
EMA2 = EMA.ewm(span=5, adjust=False).mean()
EMA3 = EMA2.ewm(span=5, adjust=False).mean()
dv.append_df(EMA3, 'EMA3')
TRIX5 = dv.add_formula('TRIX5_J','EMA3/Delay(EMA3,1)-1',is_quarterly=False,add_data=False)
MA10RegressCoeff12 E010056A
因子描述:10日价格平均线N日线性回归系数(regression coefficient of 10-day moving average ( in predicting 12-day moving average))。取近N个交易日的对应MA值,对N个周期的序数进行普通最小二乘线性回归,取股价关于周期序数的系数。
计算方法:
MA(close, N)=a+βt+e
β即为MA10RegressCoeff。
Ta('LINEARREG_SLOPE',0,0,0,0,Ts_Mean(close,10),0,N)
N取12、6日等皆可。
MA10RegressCoeff12 = dv.add_formula('MA10RegressCoeff12_J',"Ta('LINEARREG_SLOPE',0,0,0,0,Ts_Mean(close,10),0,12)", is_quarterly=False, add_data=False)
PLRC6 E010058A
六天收盘价对于日期序数的回归系数
Ta('LINEARREG_SLOPE',0,0,0,0,close,0,N)
N=6、12等
PLRC6 = dv.add_formula('PLRC6_A',"Ta('LINEARREG_SLOPE',0,0,0,0,close,0,6)", is_quarterly=False, add_data=False)