1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 自己做量化交易软件(40)小白量化实战13--Alpha101及自编因子公式

自己做量化交易软件(40)小白量化实战13--Alpha101及自编因子公式

时间:2020-06-24 15:17:23

相关推荐

自己做量化交易软件(40)小白量化实战13--Alpha101及自编因子公式

自己做量化交易软件(40)小白量化实战13–Alpha101及自编因子公式

底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 npimport pandas as pdfrom scipy.stats import rankdataimport 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()是因子计算公式。

#购买<零基础搭建量化投资系统>正版书,送小白量化软件源代码。# /61567375505.html#独狼荷蒲qq:2775205#通通python量化群:524949939#电话微信:18578755056#微信公众号:独狼股票分析import numpy as npimport pandas as pdfrom scipy.stats import rankdataimport 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.00return 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.00return RSI1#mRSI因子公式mR=mRSI()print('mR',mR)#RSI个股仿通达信公式计算结果mR2=mdf.to_df('rsi')print('mR2',mR2)

程序运行结果如下:

因子公式mRSI计算结果mR :0000010005196000290000890004020 100.000000 100.000000 -0.000000 100.000000 100.0000001 100.000000 100.000000 -0.000000 100.000000 100.0000002 100.000000 25.531915 20.987654 70.000000 34.5679013 100.000000 13.793103 17.708333 52.913386 22.903885480.181200 10.865874 15.019326 70.935601 67.784661..... ... ... ... ...795 80.769225 65.814169 32.217581 30.173070 15.959343796 85.634577 71.838955 28.265217 24.833588 13.536974797 89.161924 33.311967 49.085419 30.591114 9.442198798 92.929160 28.064610 56.903150 17.972153 6.736044799 73.629923 35.498982 67.739026 44.151432 6.335506[800 rows x 5 columns]个股公式RSI计算结果mR2 :0000010005196000290000890004020 100.000000 100.000000 0.000000 100.000000 100.0000001 100.000000 100.000000 0.000000 100.000000 100.0000002 100.000000 25.531915 20.987654 70.000000 34.5679013 100.000000 13.793103 17.708333 52.913386 22.903885480.181200 10.865874 15.019326 70.935601 67.784661..... ... ... ... ...795 80.769225 65.814169 32.217581 30.173070 15.959343796 85.634577 71.838955 28.265217 24.833588 13.536974797 89.161924 33.311967 49.085419 30.591114 9.442198798 92.929160 28.064610 56.903150 17.972153 6.736044799 73.629923 35.498982 67.739026 44.151432 6.335506

从上面比较结果来看,个股单独计算与因子公式计算一致。但是因子公式计算的速度更快,使用更简单。

最后给出全部因子公式的演示程序。

#购买<零基础搭建量化投资系统>正版书,送小白量化软件源代码。# /61567375505.html#独狼荷蒲qq:2775205#通通python量化群:524949939#电话微信:18578755056#微信公众号:独狼股票分析import numpy as npimport pandas as pdfrom scipy.stats import rankdataimport 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.00return 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.00return 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)) * 100K = mEMA(RSV, (M1 * 2 - 1))D = mEMA(K, (M2 * 2 - 1))J = K * 3 - D * 2return K, D, JmK,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.00return RSI1mR2=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 = mCLOSEinner[mRTN < 0] = stddev(mRTN, 20)alpha = rank(ts_argmax(inner ** 2, 5))return alphaprint(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 alphaprint(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 alphaprint(alpha005())print('alpha006')# alpha006: (-1 * correlation(open, volume, 10))def alpha006():alpha = -1 * correlation(mOPEN, mVOL, 10)return alphaprint(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 alphaprint(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) > 0cond_2 = ts_max(delta_close, 5) < 0alpha = -1 * delta_closealpha[cond_1 | cond_2] = delta_closereturn alphaprint(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) > 0cond_2 = ts_max(delta_close, 4) < 0alpha = -1 * delta_closealpha[cond_1 | cond_2] = delta_closereturn alphaprint(alpha010())print('alpha041,由仿通达信公式单独计算的结果:')print(alpha041)

上面程序给出一些Alpha101因子公式及代码实现。输出结果就省略了,自己去尝试了。

后面文章将介绍因子量化投资及利用因子公式的神经网络量化投资分析文章。

请持续关注我的博客,我的进步,就是你的进步!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。