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 的值
- Return a Winsorized version of the input array Parameters:
案例:对 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 )
原理:
- 找出因子的中位数 median = X_med
- 计算每个因子值与中位数的绝对偏差值 | x - median |
- 得到绝对偏差值的中位数, MAD,median( | x - median | )
- 计算 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
网友评论