【历史文档】因子表达式
由qxiao创建,最终由small_q 被浏览 5282 用户
{{use_style}}
\
更新
本文内容已经过期,不再适合平台最新版本,请查看如下最新内容:
\
导语
基于基础数据和因子库,bigexpr让我们可以无需代码,快速构建新的因子。
因子表达式引擎
bigexpr是我们开发的表达式计算引擎,通过编写简单的表达式,就可以对数据做任何运算,而无需编写代码。
bigexpr在平台上被广泛使用,自动标注(股票) 和 衍生特征抽取 都已经由bigexpr驱动,您可以用表达式就可以定义标注目标和完成后特征抽取。
通过表达式,实现数据处理和计算。例如:
rank(rank(close_0 / close_1) / rank(close_0 / close_10))
\
常量
- <NaN: np.NaN>
- <Inf: np.Inf>
- <None: None>
\
支持的运算符
- 逻辑运算符: & (与), | (或), ~ (非)
- 比较运算符: <, <=, ==, !=, >=, >
- 一元算术运算符: - (负)
- 二元算术运算符: +, -, , /, ** (次方), % (取余), << (位运算:左移), >> (位运算:后移)
\
简单函数
- where(cond, x, y):#如果cond为True,则为 x, 否则 y #示例:where(a > b, c, d)* #示例:where(a > b, * where(a > c, c, d), e)
- if ,#where的别名
- {sin,cos,tan}(x) ,#三角函数正弦,余弦和正切
- {arcsin,arccos,arctan}(x), #反三角函数
- arctan2(x, y), #反三角函数,=arctan(x/y)
- {sinh,cosh,tanh}(x), #双曲正弦,余弦和正切
- {arcsinh,arccosh,arctanh}(x), #反双曲正弦,余弦和正切
- {log,log10,log1p}(x) #自然对数, 10为底的对数和log(1+x)
- {exp,expm1}(x), #指数和exp(x)-1
- sqrt(x), #平方根
- abs(x), #绝对值
- ceil(x), #向上取整
- floor(x), #向下取整
- sign(x), #取 x 的符号,如果 x > 0, 为1; x == 0,为0; 否则为-1
- signedpower(x, a), #等价于 sign(x) * (abs(x)**a)
- min(numer1, number2, number3, ..): number, #求最小值,2个或者更多个参数
- max(numer1, number2, number3, ..): number, #求最大值,2个或者更多个参数
- isnan(number): bool, #判断是否为NaN, e.g. where(isnan(a), 0, a)
- clip(s, lower, upper), #对s做裁剪,裁剪区间为[lower,upper],如果lower,则设置为lower,如果upper,则设置为upper
- all_quantile(s, q), #计算s的第q个百分位数, q属于[0, 1]。则 all_quantile(s, 0)得到s的最小值,all_quantile(s, 1)对应s的最大值。注意,这里计算的是全部s数据的百分位(而不是按天或者按股票处理的)
- all_wbins(s, bins), #按等宽做离散化,映射从0开始。bins可以是正整数,表示bins的数量;list,表示splits,e.g. [-2, 0, 2],小于-2的数据将被映射为0,大于2的被映射为3,中间的分别为1和2
- all_cbins(s, bins), #按等频做离散化,映射从0开始。bins可以是正整数,表示bins的数量;list,表示每个bin里的数据比例
\
按股票分组后的数据处理函数
- shift(x, d),#移动x值的函数。d的绝对值表示移动距离,正负号表述移动方向。例如,shift(x, -1)表示全部数据向上移动,得到(t+1)天的x值;shift(x,1)表示全部数据向下移动,得到一天前的x值
- delay,#shift的别名
- delta(x, d),#今天的 x 值减去 d 天以前的 x 值
- correlation(x, y, d),#在过去长度为 d 天, x 和 y 的相关性
- covariance(x, y, d),#在过去长度为 d 天, x 和 y 的协方差
- ols(result_type, y, x, d) #返回y与x的滚动回归所得到的result_type序列(result_type可为residual, intercept, coefficient三种(字符串);x可为列表,即多元回归)
- sum(x, d),#过去 d 天 x 的和
- product(x, d),#过去 d 天 x 的乘积
- std(x,d),#过去 d 天 x 的标准差
- nanstd(x, d), #过去 d 天 x 的标准差(去除NaN值)
- mean(x, d),#过去 d 天 x 的均值
- nanmean(x, d), #过去 d 天 x 的均值(去除NaN值)
- var(x, d), #过去 d 天 x 的方差
- skew(x, d), #过去 d 天 x 的偏度
- kurt(x, d), #过去 d 天 x 的峰度
- decay_linear(x, d),#过去 d 天的加权平均,权重是1,…,d-1,d
- stddev,#std的别名
- ts_min(x, d),#时间序列函数, d 天内的最小值
- ts_max(x, d),#时间序列函数, d 天内的最大值
- ts_argmax(x, d),#时间序列函数, d 天内的最大值发生在哪一天
- ts_argmin(x, d),#时间序列函数, d 天内的最小值发生在哪一天
- ts_rank(x, d),#时间序列函数, 当天的值在d天的内的排名百分比
\
按日期分组后的数据处理函数
- rank(x)x在当天的百分比排名, e.g. rank(close_0/close_1)
- scale(x, a=1),重新缩放x,使得 sum(abs(x)) = a (a的默认值为1)
\
按日期和自定义key分组的处理函数
- group_mean(key, x),#同时按日期和key做分组,求平均。 eg. 各行业的简单平均pe值: group_mean(industry_sw_level1_0, pe_ttm_0)
- group_sum(key, x),#同时按日期和key做分组,求和。 eg. 各行业的交易量:group_sum(industry_sw_level1_0, amount_0)
- group_rank(key, x),#同时按日期和key做分组,求当前值在分组内的排名百分比。 eg. pe值在对应行业的排名: group_rank(industry_sw_level1_0, pe_ttm_0)
\
TA-LIB部分技术指标
- ta_sma(x, timeperiod),#timeperiod周期的简单移动平均值
- ta_ema(x, timeperiod),#timeperiod周期的指数移动平均值
- ta_wma(x, timeperiod),#timeperiod周期的加权移动平均值
- ta_mom(x, timeperiod),#timeperiod周期的动量指标
- ta_roc(x, timeperiod),#timeperiod周期的变动率指标
- ta_rsi(x, timeperiod),#timeperiod周期的相对强弱指标
- ta_trix(x, timeperiod),#timeperiod周期的三重指数平滑平均线
- ta_willr(x, timeperiod),#timeperiod周期的威廉指标
- ta_atr(high, low, close, timeperiod),#timeperiod周期的均幅指标
- ta_adx(high, low, close, timeperiod),#timeperiod周期的平均趋向指数
- ta_adxr(high, low, close, timeperiod),#timeperiod周期的平均趋向指数
- ta_cci(high, low, close, timeperiod),#timeperiod周期的顺势指标
- ta_beta(x, y, timeperiod),#timeperiod周期的回归斜率
- ta_bbi(close, 'long', timeperiod_1=3, timeperiod_2=6, timeperiod_3=12, timeperiod_4=24),#多空指数,多头市场
- ta_bbi(close, 'short', timeperiod_1=3, timeperiod_2=6, timeperiod_3=12, timeperiod_4=24),#timeperiod多空指数,空头市场
- ta_ma(close, timeperiod=5),#timeperiod移动平均线
- ta_ma(close, derive='golden_cross', shorttimeperiod=5, longtimeperiod=10),#timeperiod移动平均线,金叉
- ta_ma(close, derive='death_cross', shorttimeperiod=5, longtimeperiod=10),#timeperiod移动平均线,死叉
- ta_ma(close, derive='long', shorttimeperiod=5, longtimeperiod=10),#timeperiod移动平均线,多头
- ta_ma(close, derive='short', shorttimeperiod=5, longtimeperiod=10),#timeperiod移动平均线,空头
- ta_dma(close, 'golden_cross', shorttimeperiod=5, longtimeperiod=60, ama=20),#平行线差,金叉
- ta_dma(close, 'death_cross', shorttimeperiod=5, longtimeperiod=60, ama=20),#平行线差,死叉
- ta_dma(close, 'long', shorttimeperiod=5, longtimeperiod=60, ama=20),#平行线差,多头
- ta_dma(close, 'short', shorttimeperiod=5, longtimeperiod=60, ama=20),#平行线差,空头
- ta_macd_dif(close, fastperiod=12, slowperiod=26, signalperiod=9),#指数平滑移动平均线
- ta_macd_dea(close, fastperiod=12, slowperiod=26, signalperiod=9),#DIF的N日(默认9日)指数平滑移动平均线
- ta_macd_hist(close, fastperiod=12, slowperiod=26, signalperiod=9),# 2*(DIF-DEA)
- ta_macd(close,'golden_cross', fastperiod=12, slowperiod=26, signalperiod=9),#指数平滑移动平均线,金叉
- ta_macd(close,'death_cross', fastperiod=12, slowperiod=26, signalperiod=9),#指数平滑移动平均线,死叉
- ta_macd(close,'long', fastperiod=12, slowperiod=26, signalperiod=9),#指数平滑移动平均线,多头
- ta_macd(close,'short', fastperiod=12, slowperiod=26, signalperiod=9),#指数平滑移动平均线,空头
- ta_kdj(high, low, close, N, M1, M2, 'golden_cross'),#随机指标,金叉
- ta_kdj(high, low, close, N, M1, M2, 'death_cross'),#随机指标,死叉
- ta_kdj(high, low, close, N, M1, M2, 'long'),#随机指标,多头
- ta_kdj(high, low, close, N, M1, M2, 'short'),#随机指标,空头
- ta_kdj(high, low, close, N, M1, M2, 'buy'),#随机指标,买入信号
- ta_kdj(high, low, close, N, M1, M2, 'sell'),#随机指标,卖出信号
- ta_kdj_k(high, low, close, N, M1),#指标的K值
- ta_kdj_d(high, low, close, N, M1),#指标的D值
- ta_kdj_j(high, low, close, N, M1),#指标的J值
- ta_bbands_u(close, timeperiod),#timeperiod布林线上线
- ta_bbands_m(close, timeperiod),#timeperiod布林线中线
- ta_bbands_l(close, timeperiod),#timeperiod布林线下线
- ta_bias(close, timeperiod),#timeperiod乖离率
- ta_trix(close, derive='golden_cross', timeperiod=60, matrix_timeperiod=5),#timeperiod三重平滑平均线,金叉
- ta_trix(close, derive='death_cross', timeperiod=60, matrix_timeperiod=5),#timeperiod三重平滑平均线,死叉
- ta_trix(close, derive='long', timeperiod=60, matrix_timeperiod=5),#timeperiod三重平滑平均线,多头
- ta_trix(close, derive='short', timeperiod=60, matrix_timeperiod=5),#timeperiod三重平滑平均线,空头
- ta_3red_soldiers(high, low, close, open),#红三兵
- ta_hammer(high, low, close, open),#锤
- ta_inverted_hammer(high, low, close, open),#倒锤
- ta_2crows(high, low, close, open),#两只乌鸦
- ta_3black_crows(high, low, close, open),#三只乌鸦
- ta_morning_star(high, low, close, open),#早晨之星
- ta_evening_star(high, low, close, open),#黄昏之星
- ta_dark_cloud_cover(high, low, close, open),#乌云盖顶
- ta_shooting_star(high, low, close, open),#流星线
\
自定义表达式
0) 实现时序最大值
https://bigquant.com/experimentshare/056ac63220f44e2baab37db2bc50fc0f
1)平台虽然提供了不少表达式,但实际策略究时研究员希望扩展更多表达式,比如抽取一个按日期横截面排序的收益因子
https://bigquant.com/experimentshare/248fb6dac2b9443587b4a23c393277c0
2)希望抽取某个大盘基准的数据作为因子。例如,想实现以下复杂的衍生因子:sum( where( (close/open-benchmark_close/benchmark_open) <0 , (close/open-benchmark_close/benchmark_open)**2, 0) , 5)
https://bigquant.com/experimentshare/9153de8277354f0abc1bbca3fbe4268b
通过talib库和自定义表达式构建因子
https://bigquant.com/experimentshare/8500b5976eac4f59baa6249ba4094f7e
\
参考因子
参考以下研报构建因子:申万技术指标测试大全