2019-08-23 day2

3、多因子策略

  • 股票量化策略
    • 趋势交易(技术分析)—— 趋势追踪:通过交易手段获取超额收益
    • 市场中性(基本面分析)—— 多因子选股:通过选股获取超额收益
多因子策略

特征:因子
目标值:股票收益(需要计算)

TTM: trailing twelve months(滚动市盈率)
LYR: last year ratio(静态市盈率)
LF: last file(最新公告)
PB (LF) : 每股净资产取自最新公告数据

3.4 多因子策略流程

  • 因子挖掘
    • 因子数据的处理
      • 去极值
      • 标准化
      • 中性化
    • 单因子有效性检测
      • 因子IC分析
      • 因子收益率分析
      • 因子的方向
    • 多因子相关性和组合分析
      • 因子相关性
      • 因子合成
  • 回测
    • 多因子选股的权重
    • 调仓周期
研究平台获取函数:

get_price() - 获取合约历史行情数据

get_price(order_book_ids, start_date='2013-01-04', end_date='2014-01-04', frequency='1d', fields=None, adjust_type='pre', skip_suspended =False, market='cn', expect_df=False)
返回 pandas Panel、DataFrame、Series 结构

get_trading_dates() - 获取交易日列表

get_trading_dates(start_date, end_date, markets='cn')
返回 datetime.date list

get_fundamentals - 查询财务数据

get_fundamentals(query, entry_date, interval=None, report_quarter=False, expect_df=False)
返回 pandas DataPanel - 财务数据查询结果。

3.5 因子数据处理 - 去极值

  • 去极值
    • 分位数去极值 ( 0.25 quantile = 25 percentile )
    • 中位数绝对偏差去极值
    • 正态分布去极值
3.5.1 分位数去极值

原理:

  • 将指定分位数区间以外的极值用分为点的值替换掉

API:

  • from scipy.stats.mstats import winsorize
  • scipy.stats.mstats.winsorize(a, limits=None)
    • Return a Winsorized version of the input array Parameters:
      • a : sequence Input array
      • limits : float 数据两端的 percentile 的值

案例:对 pe_ratio 进行去极值

  • 自实现分位数去极值:
def quantile(factor, up, down):
    """自实现分位数去极值
    大于(小于)分位值点 的 数据 用 分位值 替换"""
    # 求出分位数值:
    up_scale = np.percentile(factor, up)
    down_scale = np.percentile(factor, down)
    factor = np.where(factor > up_scale, up_scale, factor)
    factor = np.where(factor < down_scale, down_scale, factor)
    return factor
3.5.2 MAD 中位数绝对偏差去极值 ( Median Absolute Deviation )

原理:

  1. 找出因子的中位数 median = X_med
  2. 计算每个因子值与中位数的绝对偏差值 | x - median |
  3. 得到绝对偏差值的中位数, MAD,median( | x - median | )
  4. 计算 MAD_e = 1.4826 * MAD,然后确定参数 n(经常为3),做出调整

去极值判断:

if Xi > X_med + n * MAD_e:
    Xi = X_med + n * MAD_e
if Xi < X_med - n * MAD_e:
    Xi = X_med - n * MAD_e
if X_med - n * MAD_e < Xi < X_med + n * MAD_e:
    Xi = Xi
  • 自实现中位数绝对偏差去极值:
def mad(factor):
    """实现3倍中位数绝对偏差去极值"""
    # 1、找出因子的中位数
    me = np.median(factor)
    
    # 2、计算 | x - median |
    # 3、计算 MAD, median( | x - median| )
    mad = np.median(abs(factor - me))
    
    # 4、
    up = me + (3 * 1.4826 * mad)
    down = me - (3 * 1.4826 * mad)
    
    # 5、
    factor = np.where(factor > up,up,factor)
    factor = np.where(factor < down,down,factor)
    return factor
3.5.3 正态分布去极值

采取3sigma原则

  • 自实现正态分布去极值:
def threesigma(factor):
    """自实现正态分布去极值"""
    mean = factor.mean()
    std = factor.std()
    
    up = mean + 3*std
    down = mean - 3*std
    
    factor = np.where(factor > up,up,factor)
    factor = np.where(factor < down,down,factor)
    return factor 

【结论】中位数绝对偏差去极值

3.6 因子数据处理 - 标准化

from sklearn.preprocessing import StandardScaler
std = StandardScaler()
std.fit_transform(factor["pe_ratio2"])

  • 自实现标准化:
def stand(factor):
    """自实现标准化"""
    mean = factor.mean()
    std = factor.std()
    return (factor - mean)/std

3.7 因子数据处理 - 市值中性化

默认大部分因子都受市值影响,去除其他因子存在的市值影响

  • 原因:防止回测时选股集中
  • 原理:建立回归关系

某因子 对 市值 回归,去共线,取残差

回归法API:

from sklearn.linear_model import LinearRegression

你可能感兴趣的:(2019-08-23 day2)