Skip to content

5、因子工程

woldy edited this page Mar 4, 2024 · 14 revisions

一、基本应用

1.1、常用命令

  • finhack factor run [--task_list=] #开启因子计算
  • finhack factor list #查看可用因子列表
  • finhack factor show --factor=pe_0 #查看某个因子的信息
  • finhack factor analys --factor=pe_0 #对目标因子进行分析(alphalens)

1.2、基本概念

在本框架中,有因子(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因子)。

1.3、因子计算

  • 对于已经定义好的因子,使用如下命令进行批量计算
  • finhack factor run --task_list=aaa,bbb,ccc
  • 其中,aaa,bbb,ccc为data/config/factorlist下对应的指标或alpha文件名

二、自定义因子

2.1、自定义指标(indicator)

本框架支持自定义指标,所有自定义指标均放在factors/indicators目录下,定义指标的流程吐下:

  1. 在{project_path}/indicators 目录下建立任意py文件,如myfactors.py,(非必须)

  2. 定义指标实现函数,def xx123(df,p):

     def xx123(df,p):
         df['xx1']=p[0]
         df['xx2']=p[1]
         df['xx3']=df['open']
         return df
    

image

如上,我们定义了一个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,

  1. 框架会自动寻找到xx1因子是在myfactors.py文件中定义的,并自动寻找到class myfactors下的xx123函数往下执行,
  2. 框架将002624.SZ的行情数据作为参数传入df,将p=[xx1,8,4,0]作为参数传入p
  3. 框架在函数体中识别df['xxx'],发现了xx1、xx2、xx3,在计算完xx1这个因子后,同时也认为xx2、xx3是需要计算的因子,因此将p参数拼接后,返回xx2_8_4_0和xx3_8_4_0
  4. 注:p参数最后一个值通常不参与计算,若计算xx1_8_4_1,则表示因子xx1_8_4前一天的数据。

image

2.2、自定义alpha

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)

image

image

三、因子工具

3.1、因子读取

因子读取使用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)

image

函数原型: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"目录下的文件的内容

3.2、因子分析

框架自带了两种因子分析工具:

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,主要用来因子挖掘

image

也可以使用命令,最已计算好的因子进行分析:

image

3.3、因子挖掘

3.3.1 使用gplearn进行因子挖掘

finhack factor mining --method=gplearn 使用gplearn进行因子挖掘,参数都是默认的,想修改可自己新建module,--method参数默认即gplearn

image

3.3.1 使用chatgpt进行因子挖掘

finhack factor mining --method=chatgpt --prompt=autoalpha --model=gpt-4-1106-preview

  • 首先需要在ai.conf配置openai的token
  • 不填写model的话,会使用gpt3
  • prompt在project_path/prompt目录下

image