-
Notifications
You must be signed in to change notification settings - Fork 107
5、因子工程
- finhack factor run [--task_list=] #开启因子计算
- finhack factor list #查看可用因子列表
- finhack factor show --factor=pe_0 #查看某个因子的信息
- finhack factor analys --factor=pe_0 #对目标因子进行分析(alphalens)
在本框架中,有因子(factor),指标(indicator)和Alpha的概念,其中:
- 指标(indicator):可以理解成传统技术指标,如MACD、BOLL、十字星等,需要复杂代码进行定义的技术指标。
- Alpha:类似alpha101或alpha191等公式化生成的生成的因子。
- 因子(factor):计算好的alpha因子或indicator指标,比如我定义了一个MACD指标,但是这个MACD是有参数的,比如MACD_12_26_9和MACD_5_34_5虽然是同一个指标,但确是不同的因子(严格的说,在MACD指标中,除MACD_xx因子外,我们还会得到DIF_xx因子和DEA_xx因子)。
- 对于已经定义好的因子,使用如下命令进行批量计算
- finhack factor run --task_list=aaa,bbb,ccc
- 其中,aaa,bbb,ccc为data/config/factorlist下对应的指标或alpha文件名
本框架支持自定义指标,所有自定义指标均放在factors/indicators目录下,定义指标的流程吐下:
-
在{project_path}/indicators 目录下建立任意py文件,如myfactors.py,(非必须)
-
定义指标实现函数,def xx123(df,p):
def xx123(df,p): df['xx1']=p[0] df['xx2']=p[1] df['xx3']=df['open'] return df
如上,我们定义了一个xx123指标,其中
- df为某支股票的历史行情数据,包括ts_code,trade_date,open,high,low,close,pre_close,change,returns,volume,amount,name,vwap,stop,upLimit,downLimit,adj_factor字段,
- p为指标所需的参数
如基本概念中MACD的例子,有时候一个指标将会返回多个因子,本框架中自动将函数体内,等号左侧 df['xxx'] 自动识别为待返回因子。此处理解较抽象,举例说明:
from finhack.core.core import Core
core = Core('/data/code/demo_project',args=False)
from finhack.factor.default.indicatorCompute import indicatorCompute
from finhack.factor.default.preCheck import preCheck
preCheck.checkIndicatorsChange() #包含自动寻径代码,首次必须执行
indicatorCompute.computeFactorByStock(ts_code='002624.SZ',factor_name="xx1_8_4_0")
在以上指标计算的例子中,我要计算xx1因子,参数是_8_4_0,
- 框架会自动寻找到xx1因子是在myfactors.py文件中定义的,并自动寻找到class myfactors下的xx123函数往下执行,
- 框架将002624.SZ的行情数据作为参数传入df,将p=[xx1,8,4,0]作为参数传入p
- 框架在函数体中识别df['xxx'],发现了xx1、xx2、xx3,在计算完xx1这个因子后,同时也认为xx2、xx3是需要计算的因子,因此将p参数拼接后,返回xx2_8_4_0和xx3_8_4_0
- 注:p参数最后一个值通常不参与计算,若计算xx1_8_4_1,则表示因子xx1_8_4前一天的数据。
alpha因子即公式化定义的因子,其具体实现在alphaEngine.py文件中定义,目前基本支持alpha101、alpha191中所定义的各种函数。
公式中所有的变量以$开头,基于data/factors/single_factors目录下的指标csv文件,如定义一个 alpha=$open+$pe_0的因子,框架会自动加载single_factors目录下的open.csv和pe_0.csv,并进行因子计算。
from finhack.core.core import Core
core = Core('/data/code/demo_project',args=False)
from finhack.factor.default.alphaEngine import alphaEngine
from finhack.factor.default.factorAnalyzer import factorAnalyzer
formula="-1 * rank($circMv_0) + ts_rank($high / $low, 10) + correlation($volume, $close, 5) - delta($ebitda_0, 3)"
df_alpha=alphaEngine.calc(formula)
因子读取使用factorManager下的getFactors:
from finhack.factor.default.factorManager import factorManager 中
factors=factorManager.getFactors(['open','close','ADOSC_0','AD_0','APO_0','AROONDOWN_0','ARRONUP_0'],start_date='20150101',end_date="20230101")
print(factors)
函数原型:getFactors(factor_list, stock_list=[], start_date='', end_date='')
除getFactors方法外,factorManager中还提供了如下方法:
- getAnalysedIndicatorsList(valid=True) 获取已经经过分析的指标列表,当valid=True时,check_type为11,即无未来函数的正常因子
- getTopAnalysedFactorsList(top=200,valid=True) 获取已经经过分析的指标列表,取TopN
- getFactorsList(valid=True,ignore=True) 获取因子列表,ignore=True时忽略ignore_list=['close','vol','volume','open','low','high','pct_chg','amount','pre_close','vwap','stop','lh']
- getFactors(factor_list, stock_list=[], start_date='', end_date='') 获取因子数据
- getAlphaLists() 获取alpha列表的列表,即CONFIG_DIR+"/factorlist/alphalist/"目录下的文件
- getAlphaList(listname) 根据alpha列表获取alpha,即读取即CONFIG_DIR+"/factorlist/alphalist/listname"目录下的文件的内容
框架自带了两种因子分析工具:
def analys(self):
stock300=self.args.stock300.split(',')
factor_name=self.args.factor
factorAnalyzer.analys(factor_name=factor_name,source='default',replace=True,stock_list=stock300)
factorAnalyzer.alphalens(factor_name)
两函数原型如下:
- def alphalens(factor_name='alpha',df=pd.DataFrame(),notebook=False)
- def analys(factor_name,df=pd.DataFrame(),days=[1,2,3,5,8,13,21],source='mining',start_date='20100101',end_date='20200101',formula="",replace=False,table='factors_analysis',ignore_error=False,stock_list=[])
说明:
- 当指定factor_name,不传入df时,会调用factorManager.getFactors读取对应factor_name的因子
- 调用alphalens时,notebook=True,表示在notebook中展示,会输出图表,否则只会输出文本
- analys方法是我随便写的评估工具,会计算ic、ir、shape、然后打个分,最后入库到table,主要用来因子挖掘
也可以使用命令,最已计算好的因子进行分析:
finhack factor mining --method=gplearn 使用gplearn进行因子挖掘,参数都是默认的,想修改可自己新建module,--method参数默认即gplearn
finhack factor mining --method=chatgpt --prompt=autoalpha --model=gpt-4-1106-preview
- 首先需要在ai.conf配置openai的token
- 不填写model的话,会使用gpt3
- prompt在project_path/prompt目录下