掘金社区

单因子分析Pinned highlighted

fang 发表在策略分享 2021-09-10 13:32:29

策略分享
96
0
0

一、概述

单因子模型最早由威廉·夏普提出,  
单因子模型的基本思路是:证券收益只受一个因素影响。市场模型便是这种模型的典型例子。如果我们观察证券市场,就会发现,当市场股价指数上涨时,大部分股票价格也同时上涨;反之亦然。这说明,各种证券对一个因子,即市场对一个因子,即市场股价指数的变化具有联动的反应。

二、模型公式

$$R_i=\alpha_i+\beta_i* F+e_i$$
其中F是共同因子的预测值,beta为证券i对因子的灵敏度。

三、单因子测试

常使用以下三种方法:分组回测、信息系数评价、回归测试,以下内容将讲解这三种方法的内容,其中会给出信息系数评价和回归测试的代码,分组回测测试交由读者完善。


分组回测

回测方法—分位数
1、对股票按因子大小排序,将股票池均分为N个组合,或者对每个行业内进行均分。
2、个股权重一般选择等权,行业间权重一般与基准(例如沪深300)的行业配比相同,此时的组合为行业中性。
3、通过分组累计收益图,就可以简单的知道因子是否和收益率有着单调递增或递减的关系。


信息系数评价

  • 1、信息系数(Information Coefficient,简称IC) ,表示所选股票的因子值与股票下期收益率的截面相关系数,通过IC值可以判断因子值对下期收益率的预测能力。
  • 2、IC值能够很好地反映因子的预测能力, IC越高,就表明该因子在该期对股票收益的预测能力越强。
  • 3、通常IC大于3%或者小于-3%,则认为因子比较有效。
  • 4、常见的IC有两种,一是Normal IC (类比皮尔森相关系数概念) ,另一个是Rank IC (类比斯皮尔曼相关系数)

Normal IC:即某时点某因子在全部股票的暴露值与其下期回报的截面相关系数;
$$Normal IC =corr(f_{t-1},r_t)$$

$$f_{t-1}:上一期的股票因子值 $$

$$ r_t:当期的收益率 $$

Rank IC:某时点某因子在全部股票暴露值排名与其下期回报排名的截面相关系数:
$$ Rank IC =corr(rank^f_{t-1},rank^r_t) $$

$$ rank^f_{t-1}:上一期的股票因子排序值 $$

$$ rank^r_t:当期的收益率排序值 $$

比如我们需要计算当前时间的因子Normal IC值,其代码如下:

import datetime
#获取当前日期和时间
now_time = datetime.datetime.now()
#格式化
now_time=now_time.strftime('%Y-%m-%d')
# 获取上证50成分股
symbols = get_history_constituents(index='SHSE.000016',
                                   start_date=now_time,
                                   end_date=now_time)[0].get('constituents').keys()

# 获取当前日期上证50构成的成分股,并提取其因子数据
DF = get_fundamentals_n(table='trading_derivative_indicator',
                        symbols=symbols,
                        end_date=now_time,
                        count=1,
                        fields='PB',
                        df=True)
# 计算账面市值比,为P/B的倒数
#2021.8.25的因子暴露值
yz=DF['PB']
#2021.8.25的股票收益,8.25的股票收益-8.24的收盘价/8.24的收盘价
a=[]
for i in DF['symbol']:    
    history_n_data = history_n(symbol=str(""+i+""), frequency='1d', count=2, end_time='2021-10-25', fields='close', adjust=ADJUST_PREV, df=True)
    a.append((history_n_data['close'][1]-history_n_data['close'][0])/history_n_data['close'][0])
np.corrcoef(a,yz) 
#得到结果如下:
#array([[1.        , 0.17563877],
#       [0.17563877, 1.        ]])   

IR 信息比率
概念: IR信息比率是IC的均值除以标准差,也就是IC值在回测时间段内的信息比率。可以评估因子的Alpha超额收益获取能力,并且是更稳定的获取能力。
$$IR信息比率=IC_{mean}/IC_{std} $$

应用:鉴于IC的重要性,在多因子的因子加权中常采用因子最近N个月(默认为12)的IC均值加权,通常结果会优于等权法。

# 计算一组数据的IC绝对值均值、正向比例、均值/标准差
def ics_return(l):

    # 信息系数绝对值均值
    a = [abs(i) for i in l]
    avr_ic = sum(a) / len(l)

    # 信息比例
    b = np.array(l)
    if b.std() != 0:
        ir = b.mean() / b.std()
    else:
        ir = 0

    # 正向比例
    c = [i for i in l if i > 0]
    pr = len(c) / len(l)
    return avr_ic, ir, pr

回归测试

概念逻辑:
1、具体做法是将第T期的因子暴露度向量与T+1期的股票收益向量进行线性回归,所得到的回归系数即为因子在T期的因子收益率,同时还能得到该因子收益率在本期回归中的显著度性水平t值。一般t值绝对值要大于2时因子比较有效。
2、在某截面期上的个股的因子暴露度(Factor Exposure)即指当前时刻个股在该因子上的因子值。
计算方法
$$r^{T+1}=x^Ta^T+\sum_j Indus^T_j b^T_j+Inmkt^Tb^T+\varepsilon^T $$

$$r^{T+1}:所有个股在第T+1期的收益率向量$$

$$x^T:所有个股第T期在被测单因子上的暴露度向量$$

$$Indus^T_j :所有个股第T期在第j个行业因子上的暴露度向量(0/1哑变量)$$

$$Inmkt^T:所有个股第T期在对数市值因子上的暴露度向量$$

$$a^T,b^T:对应因子收益率,待拟合常数,通常比较关注a^T$$

$$varepsilon:残差向量$$

回归因子评价
a)t值序列绝对值均值-因子显著性的重要判据;.
b)值序列绝对值大于2的占比-判断因子的显著性是否稳定;
c)t值序列均值一与a)结合,能判断因子t值正负方向是否稳定;
d)因子收益率序列均值-判断因子收益率的大小

# 线性回归方程系数t检验值
def t_value(x, y):
    x2 = sum((x - np.mean(x)) ** 2)
    xy = sum((x - np.mean(y)) * (y - np.mean(y)))

    #回归参数的最小二乘估计
    beta1 = xy / x2
    beta0 = np.mean(y) - beta1 * np.mean(x)
    #输出线性回归方程
    # print('y=',beta0,'+',beta1,'*x')

    #方差
    sigma2 = sum((y - beta0 - beta1 * x) ** 2) / len(x)
    #标准差
    sigma = np.sqrt(sigma2)
    #求t值
    t = beta1 * np.sqrt(x2) / sigma
    return t

最后,实现一个小策略

策略思想:
取上证50的股票作为股票池,手动选择一个因子,对股票按因子的数值大小进行排序,买入排序在前面的股票,每一周进行调仓。
代码如下:

暂无评论

Looks like your connection to 掘金量化社区 - 量化交易者的交流社区 was lost, please wait while we try to reconnect.