2015年底World Quant发表了论文《101 Formulaic Alpha》,论文中给出了101个现实中的alpha。
We emphasize that the 101 alphas we present here are not “toy” alphas but real-life trading alphas used in production. In fact, 80 of these alphas are in production as of this writing.—-其中强调80%都仍在使用
使用的函数的定义和解释
- rank(x) 排名函数
- abs(x) ,log(x) 取绝对值,对数
- sign(x) 信号函数
- delay(x,d) 在d天前的x值
- delta(x,d) 今天的x值减去d天前的x值
- correlation(x,y,d) 在过去d天,x和y的相关性
- covariance(x,y,d) 在过去d天,x和y的协方差
- ts_min(x,d),ts_max(x,d) 时间序列函数,d天内的最小值和最大值
- ts_argmax(x,d),ts_argmin(x,d) 计算ts_min(x,d)和ts_max(x,d)发生在哪一天
需要输入的数据
- returns 每日收盘后的收益
- open,close,high,low,volume 开收高低成交量
- vwap 成交量加权平均价
- cap 市值
- adv(d) d天的平均成交额
Alpha分类
- 趋势跟随型(trend-following)
- 均值回归型(mean-reverting)
- 混合型(trend-following and mean-reverting mixed)
(-1 * correlation(open, volume, 10)) #Alpha6 趋势跟随型
(((sum(high, 20) / 20) < high) ? (-1 * delta(high, 2)) : 0) #Alpha23 混合型
scale(((correlation(adv20, low, 5) + ((high + low) / 2)) - close)) #Alpha28 趋势跟随型
((-1 * ((low - close) * (open^5))) / ((low - high) * (close^5))) #Alpha54 趋势跟随型
((close - open) / ((high - low) + .001)) #Alpha101 趋势跟随型
Alpha实现
Alpha2: (-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open) / open)), 6))
- 相关系数x:是成交量的rank(delta(log(volume),2)) 也就是当天成交量的对数和2天前的成交量对数的差值的排名
- 相关系数的y:是rank(((close-open)/open)),收盘价减去开盘价的差去除以开盘价的一个排名
#计算alpha时会使用的函数
def ts_num(df,window=10):
return df.rolling(window).sum()
def sma(df,window=10):
return df.rolling(window).mean()
def stddev(df,window=10):
return df.rolling(window).std()
def correlation(x,y,window=10):
return x.rolling(window).corr(y)
def covariance(x,y,window=10):
return x.rolling(window).cov(y)
def rolling_rank(na):
return rankdata(na)[-1]
def ts_rank(window=10):
return rolling(window).apply(rolling_rank)
def rolling_prod(na):
return na.prod(na)
def product(df,window=10):
return df.rolling(window).apply(rolling_prod)
def ts_min(df,window=10):
return df.rolling(window).min()
def ts_max(df,window=10):
return df.rolling(window).max()
def delta(df,period=1):
return df.diff(period)
def delay(df,period=1):
return df.shift(period)
def rank(df):
return df.rank(axis=1,pct=True)
def scale(df,k=1):
return df.mul(k).div(np.abs(df).sum())
def ts_argmax(df,window=10):
return df.rolling(window).apply(np.argmax)+1
def ts_argmin(df,window=10):
return df.rolling(window).apply(np.argmin)+1
# 定义计算alpha值的类
class Alphas(object):
def __init__(self, pn_data):
# 获取历史数据
self.open = pn_data['OpeningPx']
self.high = pn_data['HighPx']
self.low = pn_data['LowPx']
self.close = pn_data['ClosingPx']
self.volume = pn_data['TotalVolumeTraded']
self.returns = self.close.pct_change()
# alpha002:(-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open) / open)), 6))
def alpha002(self):
df = -1 * correlation(rank(delta(log(self.volume), 2)), rank((self.close - self.open) / self.open), 6)
return df.replace([-np.inf, np.inf], 0).fillna(value=0)
# 在交易前计算所有股票alpha因子值,取最高的10组进行买入,这里也可以取最低的10组进行卖空操作
def before_trading(context):
# 获取当前交易日日期
date=str(context.now)[0:10]
# 获取10个交易日前信息,根据选取因子所需计算的日期决定
for i in range(1,10):
date=get_previous_trading_date(date)
# 获取股票历史数据
pn_data=get_price(context.stock, start_date=date, end_date=None, frequency='1d', fields=None, adjust_type='pre', skip_suspended=False)
# 实例化Alpha对象
alpha=Alphas(pn_data)
# 用户所选取的因子,返回所有股票的该因子值,这里选取001作为示范,用户可修改为其他自己感兴趣的因子
alpha_use=alpha.alpha002()
# 取得交易日前一天的因子值
result=alpha_use.tail(1)
# 将空值赋为0
result[np.isnan(result)] = 0
result=result.T
# 获取上一交易日日期
today=str(context.now)[0:10]
yesterday=get_previous_trading_date(today)
# 将前一天因子值排序后取出因子值最高的前10只股股票
stock=result.sort(columns=yesterday,ascending=True)[-5:]
# 将前一天因子值排序后取出因子值最低的前10只股股票
stock_short=result.sort(columns=yesterday,ascending=True)[0:10]
context.short_weight=stock_short.values/sum(stock.values)
# 计算每只股票的权重,按照因子大小计算权重
context.weight=stock.values/sum(stock.values)
# 将选出的股票加入到待买股票池中
context.stock_pool=stock.index
# 将选出来的卖空股票加入带卖空股票池
context.stock_short=stock_short.index