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

112 篇文章 44 订阅
106 篇文章 119 订阅

自己做量化交易软件(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 < ts
min(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因子公式及代码实现。输出结果就省略了,自己去尝试了。
后面文章将介绍因子量化投资及利用因子公式的神经网络量化投资分析文章。

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

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷蒲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值