某些我需要的,并且计算比较麻烦的衍生财务因子, 平台没有提供. 我只好根据平台提供财务数据计算出我的目标因子.
下面以营业总收入复合年增长率的计算为例, 展示如何生成因子.
实际上,我是在衍生特征抽取模块中,实现了一个自定义表达式:
#最近的营业总收入复合年增长率(利用最近3年的年报数据)
fu_gross_revenues_cagr(fs_quarter_year_0,fs_quarter_index_0)
# 本代码由可视化策略环境自动生成 2018年2月3日 13:33
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
m1 = M.instruments.v2(
start_date='2018-01-01',
end_date='2018-01-31',
market='CN_STOCK_A',
instrument_list='',
max_count=0
)
m2 = M.input_features.v1(
features="""# 最近的营业总收入复合年增长率(利用最近3年的年报数据)
fu_gross_revenues_cagr(fs_quarter_year_0,fs_quarter_index_0)
"""
)
m3 = M.general_feature_extractor.v6(
instruments=m1.data,
features=m2.data,
start_date='',
end_date='',
before_start_days=0
)
def fu_gross_revenues_cagr(df,fs_quarter_year_0,fs_quarter_index_0):
end_date = max(df.date).strftime('%Y-%m-%d')
instruments = D.instruments(start_date='2005-01-01', end_date=end_date)
dff = D.financial_statements(instruments, start_date='2005-01-01', end_date=end_date,
fields=['instrument','fs_quarter_year','fs_quarter_index','fs_gross_revenues'])
# 仅保留年报
dff = dff[dff.fs_quarter_index==4]
# 对年报数据进行双索引化
tmp_df = dff.set_index(["fs_quarter_year","instrument"])
# 对营业总收入, 双索引化 => 行索引fs_quarter_year + 列索引instrument
gross_revenues = tmp_df["fs_gross_revenues"].unstack().astype(np.float64)
# 计算最近3年区间的营业总收入复合年增长率
gross_revenues_cagr= ((gross_revenues/gross_revenues.shift(3))**(1/3)-1)*100
# 将算出的营业总收入复合年增长率合并到双索引化的年报数据中
tmp_df["u_gross_revenues_cagr"] = gross_revenues_cagr.stack()
# 恢复成无双索引的年报数据
dff = tmp_df.reset_index(["fs_quarter_year","instrument"])
# 最近的年报
last_quarter_year = (df["fs_quarter_year_0"] - (df["fs_quarter_index_0"]<4))
# 根据最新年报查询营业总收入复合年增长率
tmp_df = df[["date","instrument"]]
tmp_df["fs_quarter_year"] = last_quarter_year
tmp_df = pd.merge(tmp_df,dff[['instrument','fs_quarter_year','u_gross_revenues_cagr']],
on=['instrument','fs_quarter_year'],
how='left')
# 目标因子
return tmp_df['u_gross_revenues_cagr']
m4_user_functions_bigquant_run = {
'fu_gross_revenues_cagr': fu_gross_revenues_cagr
}
m4 = M.derived_feature_extractor.v2(
input_data=m3.data,
features=m2.data,
date_col='date',
instrument_col='instrument',
user_functions=m4_user_functions_bigquant_run
)
m4.data.read_df().head()