系列文章
量价特征因子的量化分析
量价因子之前言
量价因子之alpha001
量价因子之alpha002
量价因子之alpha003
说明
关于本系列文章的背景、引用报告、因子表达式中的变量、函数、回测等说明,请参考:量价因子之前言
一、alpha004因子逻辑表达式
((((SUM(CLOSE, 8) / 8) + STD(CLOSE, 8)) < (SUM(CLOSE, 2) / 2)) ? (-1 * 1) : (((SUM(CLOSE, 2) / 2) <
((SUM(CLOSE, 8) / 8) - STD(CLOSE, 8))) ? 1 : (((1 < (VOLUME / MEAN(VOLUME,20))) || ((VOLUME /
MEAN(VOLUME,20)) == 1)) ? 1 : (-1 * 1))))
理解:
1.考虑价格,根据近2日平均收盘价,是否介于近8日平均收盘价的正负一个标准差之间,来设计。
2.考虑量,当日成交量是否大于等于近20日成交量的均值,来设计。
3.价格,大于一个标准差,取-1,小于负一个标准差取+1,介于之间且满足成交量大于等于近20日成交量的均值,取+1,小于,取-1;
3.因子返回值为+1或者-1,两个值;
4.可以理解成,超跌了(小于负一个标准差)会反弹(+1),超涨了(大于一个标准差)会下跌(-1),正常涨跌(介于正负一个标准差之间)看成交量,放量(成交量大于等于近20日成交量的均值)则看涨(-1),缩量(成交量小于近20日成交量的均值)看跌(-1)。
二、因子Python实现
Python代码如下(示例):
import numpy as np
import pandas as pd
def alpha191_004(data,roll_close_long=8, roll_close_short=2, roll_vol=20):
# 价格
roll_close_long_mean = data['close'].rolling(roll_close_long).mean()
roll_close_long_std = data['close'].rolling(roll_close_long).std()
roll_close_short_mean = data['close'].rolling(roll_close_short).mean()
# 成交量
roll_vol_ratio = data['volume'] / data['volume'].rolling(roll_vol).mean()
# nan处理
na_map = roll_close_long_mean.isna().astype(float).replace(1., np.nan) + roll_vol_ratio.isna().astype(float).replace(1., np.nan)
# 大于一个正标准差
condition1 = (roll_close_long_mean + roll_close_long_std) < roll_close_short_mean
# 小于一个负标准差
condition2 = (roll_close_long_mean - roll_close_long_std) > roll_close_short_mean
# 放量
condition3 = roll_vol_ratio >= 1
# 根据condition取值
alpha = (~data['close'].isna()).astype(float).replace(0,np.nan) # 初始化 非nan为1,nan仍为nan
alpha[condition1] = -1
alpha[(~condition1)&(~condition2)&(~condition3)] = -1
return alpha + na_map
三、因子回测
因子和收益之间的相关系数
简单以某只股票的量价回测alpha004因子和收益gain之间的相关系数。
data['gain'].corr(alpha191_004(data))
0.09117828062406358
四、总结
alpha004量价因子,不过它先考虑价,后考虑量。价考虑超涨转跌,超跌反弹,是均值回归的思想。价格合理波动放量则涨,缩量则跌。回测结果为正值,表示正相关,有合理性。