来自WorldQuant的101个Alpha

文章转自来自WorlQuant的101个Alpha

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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值