自己做量化交易软件(40)小白量化实战13–Alpha101及自编因子公式
2015年底World Quant发表了论文《101 Formulaic Alpha》。论文中给出了101个现实中的alpha。初期因子数据挖掘量化投资取得了不错的收益,后来实战效果并不理想。不过我们可以根据因子公式原理来设计自己的自编因子公式。
首先我们要实现Alpha101因子公式的计算。
Alpha101因子公式的函数的定义和解释:
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)发生在哪一天
Alpha101因子公式需要输入的数据:
returns 每日收盘后的收益
open,close,high,low,volume 开收高低成交量
vwap 成交量加权平均价
我们下面给出一些Alpha101因子公式:
因子名称 因子公式 发明者量化注释
Alpha#1 (rank(tsargmax(signedpower(((returns < 0) ? stddev(returns, 20) : close), 2.), 5)) - 0.5) 趋势
Alpha#4 (-1 * ts_rank(rank(low), 9)) 反转
Alpha#5 (rank((open - (sum(vwap, 10) / 10))) * (-1 _ abs(rank((close - vwap))))) 反转
Alpha#8 (-1 _ rank(((sum(open, 5) _ sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)), 10)))) 反转
Alpha#9 ((0 < tsmin(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ? delta(close, 1) : (-1 * delta(close, 1)))) 反转或趋势
Alpha#41 (((high * low)^0.5) - vwap) 反转
Alpha#42 (rank((vwap - close)) / rank((vwap + close))) 反转
从上面介绍,我们可以看出这些因子公式的数学算法。
我们利用小白量化因子公式库HP_formula2,可以方便实现这些公式算法以及实现自编因子公式。
前面博客主要介绍仿通达信和大智慧等软件公式计算,我们利用类似手段来实现因子计算。
import numpy as np
import pandas as pd
from scipy.stats import rankdata
import HP_tdx as htdx #小白量化通达信行情库
from HP_formula2 import * #小白量化仿通达信公式及因子公式函数库
# 小白量化仿通达信公式数据格式化
mydf=stock.reset_index(level=None, drop=True ,col_level=0, col_fill='')
CLOSE=mydf['close']
LOW=mydf['low']
HIGH=mydf['high']
OPEN=mydf['open']
VOL=mydf['volume']
C=mydf['close']
L=mydf['low']
H=mydf['high']
O=mydf['open']
V=mydf['volume']
mydf['rtn']=100*(C-REF(C,1))/C #收益率,又称回报率
mydf['vwap']=SUM(C*V, 10)/SUM(V, 10) #成交量加权平均价
#仿通达信公式计算
mydf['rsi']=RSI() #rsi指标
#计算单个股票的alpha因子值
#Alpha#41 (((high * low)^0.5) - vwap) 反转
mydf['alpha041']=(((HIGH * LOW)**0.5) - mydf['vwap'])
上面程序alpha041因子值就可以计算出来。结果不显示了,看后面综合代码输出结果。
我们创建因子公式的原理,就采用仿通达信公式的原理实现。不过要使用升级版的公式库模块,除了支持原先仿通达信公式库外,增加了因子公式函数计算。
仿通达信公式计算,是对单只股票计算。因子公式是对一组股票进行计算,HP_formula2.py模块,兼容网上因子公式,可以直接复制来计算,例如alpha002的计算公式。
print('alpha002')
# alpha002:(-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open) / open)), 6))
def alpha002():
alpha = -1 * correlation(rank(delta(np.log(mVOL), 2)), rank((mCLOSE - mOPEN) / mOPEN), 6)
return alpha.replace([-np.inf, np.inf], np.nan)
print(alpha002())
也可以利用仿通达信公式模式设计新的因子公式。我们以RSI指标为例。数据处理流程如下:
1、首先要建立股票池或板块。
2、获取行情数据。
3、建立小白量化数据池。
4、小白量化因子数据初始化。
5、因子公式计算。
为了区分仿通达信公式数据,我们对因子数据和因子函数前加上小写“m”,例如:mCLOSE,mMA()等等。
下面比较个股计算与因子计算RSI指标值的计算程序。RSI()是个股计算公式,mRSI()是因子计算公式。
#购买<零基础搭建量化投资系统>正版书,送小白量化软件源代码。
# https://item.jd.com/61567375505.html
#独狼荷蒲qq:2775205
#通通python量化群:524949939
#电话微信:18578755056
#微信公众号:独狼股票分析
import numpy as np
import pandas as pd
from scipy.stats import rankdata
import HP_tdx as htdx #小白量化通达信行情库
from HP_formula2 import * #小白量化仿通达信公式函数库
#连接行情主站
htdx.TdxInit(ip='183.60.224.178',port=7709)
#股票池或板块
codes = ['000001', '000519', '600029', '000089', '000402']
#RSI指标,只能个股计算
def RSI(N1=5):
LC = REF(CLOSE, 1)
RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100.00
return RSI1
#小白量化数据池
stocks_dict = {
} #小白量化数据池
for c in codes:
#nCategory -> K 线种类
#0 5 分钟K 线
#1 15 分钟K 线
#2 30 分钟K 线
#3 1 小时K 线
#4 日K 线
#5 周K 线
#6 月K 线
#7 1 分钟
#8 1 分钟K 线
#9 日K 线
#10 季K 线
#11 年K 线
#获取行情
stock =htdx. get_security_bars(nCategory=5,nMarket = 0,code=c,nCount=800)
# 小白量化仿通达信公式数据格式化
mydf=stock.reset_index(level=None, drop=True ,col_level=0, col_fill='')
CLOSE=mydf['close']
LOW=mydf['low']
HIGH=mydf['high']
OPEN=mydf['open']
VOL=mydf['volume']
C=mydf['close']
L=mydf['low']
H=mydf['high']
O=mydf['open']
V=mydf['volume']
mydf['rtn']=100*(C-REF(C,1))/C #收益率,又称回报率
mydf['vwap']=SUM(C*V, 10)/SUM(V, 10) #成交量加权平均价
#仿通达信公式计算
mydf['rsi']=RSI() #rsi指标
#计算单个股票的alpha因子值
mydf['alpha041']=(((HIGH * LOW)**0.5) - mydf['vwap'])
#加入小白量化数据池
stocks_dict[c] = mydf
#创建小白量化股票数据池,以股票代码为key的字典
mdf=MDF(stocks_dict)
#小白量化因子数据初始化
mCLOSE=mdf.to_df('close')
mLOW=mdf.to_df('low')
mHIGH=mdf.to_df('high')
mOPEN=mdf.to_df('open')
mVOL=mdf.to_df('volume')
mVOL=mdf.to_df('volume')
mRTN=mdf.to_df('rtn')
mVWAP=mdf.to_df('vwap')
alpha041=mdf.to_df('alpha041')
#mRSI指标
def mRSI(N1=5):
LC = mREF(mCLOSE, 1)
RSI1 = mdf.mSMA(mdf.mMAX(mCLOSE - LC, 0), N1, 1) / mdf.mSMA(mABS(mCLOSE - LC), N1, 1) * 100.00
return RSI1
#mRSI因子公式
mR=mRSI()
print('mR',mR)
#RSI个股仿通达信公式计算结果
mR2=mdf.to_df('rsi')
print('mR2',mR2)
程序运行结果如下:
因子公式mRSI计算结果mR :
000001 000519 600029 000089 000402
0 100.000000 100.000000 -0.000000 100.000000 100.000000
1 100.000000 100.000000 -0.000000 100.000000 100.000000
2 100.000000 25.531915 20.987654 70.000000 34.567901
3 100.000000 13.793103 17.708333 52.913386 22.903885
4 80.181200 10.865874 15.019326 70.935601 67.784661
.. ... ... ... ... ...
795 80.769225 65.814169 32.217581 30.173070 15.959343
796 85.634577 71.838955 28.265217 24.833588 13.536974
797 89.161924 33.311967 49.085419 30.591114 9.442198
798 92.929160 28.064610 56.903150 17.972153 6.736044
799 73.629923 35.498982 67.739026 44.151432 6.335506
[800 rows x 5 columns]
个股公式RSI计算结果mR2 :
000001 000519 600029 000089 000402
0 100.000000 100.000000 0.000000 100.000000 100.000000
1 100.000000 100.000000 0.000000 100.000000 100.000000
2 100.000000 25.531915 20.987654 70.000000 34.567901
3 100.000000 13.793103 17.708333 52.913386 22.903885
4 80.181200 10.865874 15.019326 70.935601 67.784661
.. ... ... ... ... ...
795 80.769225 65.814169 32.217581 30.173070 15.959343
796 85.634577 71.838955 28.265217 24.833588 13.536974
797 89.161924 33.311967 49.085419 30.591114 9.442198
798 92.929160 28.064610 56.903150 17.972153 6.736044
799 73.629923 35.498982 67.739026 44.151432 6.335506
从上面比较结果来看,个股单独计算与因子公式计算一致。但是因子公式计算的速度更快,使用更简单。
最后给出全部因子公式的演示程序。
#购买<零基础搭建量化投资系统>正版书,送小白量化软件源代码。
# https://item.jd.com/61567375505.html
#独狼荷蒲qq:2775205
#通通python量化群:524949939
#电话微信:18578755056
#微信公众号:独狼股票分析
import numpy as np
import pandas as pd
from scipy.stats import rankdata
import HP_tdx as htdx #小白量化通达信行情库
from HP_formula2 import * #小白量化仿通达信公式函数库
#连接行情主站
htdx.TdxInit(ip='183.60.224.178',port=7709)
#股票池或板块
codes = ['000001', '000519', '600029', '000089', '000402']
#RSI指标,只能个股计算
def RSI(N1=5):
LC = REF(CLOSE, 1)
RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100.00
return RSI1
#小白量化数据池
stocks_dict = {
} #小白量化数据池
for c in codes:
#nCategory -> K 线种类
#0 5 分钟K 线
#1 15 分钟K 线
#2 30 分钟K 线
#3 1 小时K 线
#4 日K 线
#5 周K 线
#6 月K 线
#7 1 分钟
#8 1 分钟K 线
#9 日K 线
#10 季K 线
#11 年K 线
#获取行情
stock =htdx. get_security_bars(nCategory=5,nMarket = 0,code=c,nCount=800)
# 小白量化仿通达信公式数据格式化
mydf=stock.reset_index(level=None, drop=True ,col_level=0, col_fill='')
CLOSE=mydf['close']
LOW=mydf['low']
HIGH=mydf['high']
OPEN=mydf['open']
VOL=mydf['volume']
C=mydf['close']
L=mydf['low']
H=mydf['high']
O=mydf['open']
V=mydf['volume']
mydf['rtn']=100*(C-REF(C,1))/C #收益率,又称回报率
mydf['vwap']=SUM(C*V, 10)/SUM(V, 10) #成交量加权平均价
#仿通达信公式计算
mydf['rsi']=RSI() #rsi指标
#计算单个股票的alpha因子值
mydf['alpha041']=(((HIGH * LOW)**0.5) - mydf['vwap'])
#加入小白量化数据池
stocks_dict[c] = mydf
#创建小白量化股票数据池,以股票代码为key的字典
mdf=MDF(stocks_dict)
#小白量化因子数据初始化
mCLOSE=mdf.to_df('close')
mLOW=mdf.to_df('low')
mHIGH=mdf.to_df('high')
mOPEN=mdf.to_df('open')
mVOL=mdf.to_df('volume')
mVOL=mdf.to_df('volume')
mRTN=mdf.to_df('rtn')
mVWAP=mdf.to_df('vwap')
alpha041=mdf.to_df('alpha041')
#mRSI指标
def mRSI(N1=5):
LC = mREF(mCLOSE, 1)
RSI1 = mdf.mSMA(mdf.mMAX(mCLOSE - LC, 0), N1, 1) / mdf.mSMA(mABS(mCLOSE - LC), N1, 1) * 100.00
return RSI1
#mRSI因子公式
mR=mRSI()
print('因子公式mRSI计算结果mR :\n',mR)
#RSI个股仿通达信公式计算结果
mR2=mdf.to_df('rsi')
print('个股公式RSI计算结果mR2 :\n',mR2)
##下面是Alpha101及自编因子公式的演示
def mKDJ(N=9, M1=3, M2=3):
"""
KDJ 随机指标
"""
RSV = (mCLOSE - mLLV(mLOW, N)) / (mHHV(mHIGH, N) - mLLV(mLOW, N)) * 100
K = mEMA(RSV, (M1 * 2 - 1))
D = mEMA(K, (M2 * 2 - 1))
J = K * 3 - D * 2
return K, D, J
mK,mD,mJ=mKDJ()
print(mK)
#mRSI指标
def mRSI(N1=5):
LC = mREF(mCLOSE, 1)
RSI1 = mdf.mSMA(mdf.mMAX(mCLOSE - LC, 0), N1, 1) / mdf.mSMA(mABS(mCLOSE - LC), N1, 1) * 100.00
return RSI1
mR2=mdf.to_df('rsi')
print('mR2',mR2)
mR=mRSI()
print('mR',mR)
print('alpha001')
# alpha001:(rank(Ts_ArgMax(SignedPower(((returns < 0) ? stddev(returns, 20) : close), 2.), 5)) -0.5)
def alpha001():
inner = mCLOSE
inner[mRTN < 0] = stddev(mRTN, 20)
alpha = rank(ts_argmax(inner ** 2, 5))
return alpha
print(alpha001())
print('alpha002')
# alpha002:(-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open) / open)), 6))
def alpha002():
alpha = -1 * correlation(rank(delta(np.log(mVOL), 2)), rank((mCLOSE - mOPEN) / mOPEN), 6)
return alpha.replace([-np.inf, np.inf], np.nan)
print(alpha002())
print('alpha003')
# alpha003:(-1 * correlation(rank(open), rank(volume), 10))
def alpha003():
alpha = -1 * correlation(rank(mOPEN), rank(mVOL), 10)
return alpha.replace([-np.inf, np.inf], np.nan)
print(alpha003())
print('alpha004')
# alpha004: (-1 * Ts_Rank(rank(low), 9))
def alpha004():
alpha = -1 * ts_rank(rank(mLOW), 9)
return alpha
print(alpha004())
print('alpha005')
# alpha005:(rank((open - (sum(vwap, 10) / 10))) * (-1 * abs(rank((close - vwap)))))
def alpha005():
alpha = (rank((mOPEN - (ts_sum(mVWAP, 10) / 10))) * (-1 * np.abs(rank((mCLOSE - mVWAP)))))
return alpha
print(alpha005())
print('alpha006')
# alpha006: (-1 * correlation(open, volume, 10))
def alpha006():
alpha = -1 * correlation(mOPEN, mVOL, 10)
return alpha
print(alpha006())
print('alpha008')
# alpha008: (-1 * rank(((sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)),10))))
def alpha008():
alpha = -1 * (rank(((ts_sum(mOPEN, 5) * ts_sum(mRTN, 5)) -
delay((ts_sum(mOPEN, 5) * ts_sum(mRTN, 5)), 10))))
return alpha
print(alpha008())
print('alpha009')
# alpha009:((0 < ts_min(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ?delta(close, 1) : (-1 * delta(close, 1))))
def alpha009():
delta_close = delta(mCLOSE, 1)
cond_1 = ts_min(delta_close, 5) > 0
cond_2 = ts_max(delta_close, 5) < 0
alpha = -1 * delta_close
alpha[cond_1 | cond_2] = delta_close
return alpha
print(alpha009())
print('alpha010')
# alpha010: rank(((0 < ts_min(delta(close, 1), 4)) ? delta(close, 1) : ((ts_max(delta(close, 1), 4) < 0)? delta(close, 1) : (-1 * delta(close, 1)))))
def alpha010():
delta_close = delta(mCLOSE, 1)
cond_1 = ts_min(delta_close, 4) > 0
cond_2 = ts_max(delta_close, 4) < 0
alpha = -1 * delta_close
alpha[cond_1 | cond_2] = delta_close
return alpha
print(alpha010())
print('alpha041,由仿通达信公式单独计算的结果:')
print(alpha041)
上面程序给出一些Alpha101因子公式及代码实现。输出结果就省略了,自己去尝试了。
后面文章将介绍因子量化投资及利用因子公式的神经网络量化投资分析文章。
请持续关注我的博客,我的进步,就是你的进步!