# 本代码由可视化策略环境自动生成 2021年6月8日15:09
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m5_run_bigquant_run(input_1, input_2, input_3):
'''
input_1 数据输入
input_2 空
input_3 参数输入
'''
# 参数
params = input_3.read_pickle()
# 输入
df = input_1.read_df()
# 过滤
df = df[(df.date>=params["start_date"]) & (df.date<=params["end_date"])]
# 输出
data_1 = DataSource.write_df(df)
return Outputs(data_1=data_1, data_2=None, data_3=None)
# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m5_post_run_bigquant_run(outputs):
return outputs
m1 = M.input_features.v1(
features="""# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
return_5
return_10
return_20
avg_amount_0/avg_amount_5
avg_amount_5/avg_amount_20
rank_avg_amount_0/rank_avg_amount_5
rank_avg_amount_5/rank_avg_amount_10
rank_return_0
rank_return_5
rank_return_10
rank_return_0/rank_return_5
rank_return_5/rank_return_10
pe_ttm_0
"""
)
m2 = M.instruments.v2(
start_date='2016-01-01',
end_date='2018-01-01',
market='CN_STOCK_A',
instrument_list='',
max_count=0
)
m6 = M.advanced_auto_labeler.v2(
instruments=m2.data,
label_expr="""# #号开始的表示注释
# 0. 每行一个,顺序执行,从第二个开始,可以使用label字段
# 1. 可用数据字段见 https://bigquant.com/docs/data_history_data.html
# 添加benchmark_前缀,可使用对应的benchmark数据
# 2. 可用操作符和函数见 `表达式引擎 <https://bigquant.com/docs/big_expr.html>`_
# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
shift(close, -5) / shift(open, -1)
# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
# 将分数映射到分类,这里使用20个分类
all_wbins(label, 20)
# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)
""",
start_date='',
end_date='',
benchmark='000300.SHA',
drop_na_label=True,
cast_label_int=True
)
m9 = M.general_feature_extractor.v7(
instruments=m2.data,
features=m1.data,
start_date='',
end_date='',
before_start_days=120
)
m10 = M.derived_feature_extractor.v3(
input_data=m9.data,
features=m1.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m5 = M.cached.v3(
input_1=m10.data,
input_3=m2.data,
run=m5_run_bigquant_run,
post_run=m5_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
m7 = M.join.v3(
data1=m6.data,
data2=m5.data_1,
on='date,instrument',
how='inner',
sort=False
)
m11 = M.dropnan.v2(
input_data=m7.data
)
[2021-06-08 11:30:37.032395] INFO: moduleinvoker: input_features.v1 开始运行..
[2021-06-08 11:43:34.787426] INFO: moduleinvoker: 命中缓存
[2021-06-08 11:43:34.789057] INFO: moduleinvoker: input_features.v1 运行完成[777.756678s].
[2021-06-08 11:43:34.792120] INFO: moduleinvoker: instruments.v2 开始运行..
[2021-06-08 11:43:34.807239] INFO: moduleinvoker: 命中缓存
[2021-06-08 11:43:34.808526] INFO: moduleinvoker: instruments.v2 运行完成[0.016405s].
[2021-06-08 11:43:34.812244] INFO: moduleinvoker: advanced_auto_labeler.v2 开始运行..
[2021-06-08 11:43:34.835464] INFO: moduleinvoker: 命中缓存
[2021-06-08 11:43:34.898535] INFO: moduleinvoker: advanced_auto_labeler.v2 运行完成[0.086289s].
[2021-06-08 11:43:38.742354] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2021-06-08 11:43:39.841904] INFO: grpcclientutils: 将在1.25s后尝试重新连接服务bigjupyteruserservice.bigquant:37111 (错误:StatusCode.UNAVAILABLE) ..
[2021-06-08 11:43:41.094895] INFO: grpcclientutils: 将在2.5s后尝试重新连接服务bigjupyteruserservice.bigquant:37111 (错误:StatusCode.UNAVAILABLE) ..
[2021-06-08 11:43:46.648177] INFO: 基础特征抽取: 年份 2015, 特征行数=190352
[2021-06-08 11:43:50.497604] INFO: 基础特征抽取: 年份 2016, 特征行数=641546
[2021-06-08 11:43:54.862053] INFO: 基础特征抽取: 年份 2017, 特征行数=743233
[2021-06-08 11:43:57.281606] INFO: 基础特征抽取: 年份 2018, 特征行数=0
[2021-06-08 11:43:57.601717] INFO: 基础特征抽取: 总行数: 1575131
[2021-06-08 11:43:57.606916] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[18.864589s].
[2021-06-08 11:43:57.744822] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2021-06-08 11:44:02.630788] INFO: derived_feature_extractor: 提取完成 avg_amount_0/avg_amount_5, 0.017s
[2021-06-08 11:44:02.637070] INFO: derived_feature_extractor: 提取完成 avg_amount_5/avg_amount_20, 0.005s
[2021-06-08 11:44:02.641548] INFO: derived_feature_extractor: 提取完成 rank_avg_amount_0/rank_avg_amount_5, 0.003s
[2021-06-08 11:44:02.645518] INFO: derived_feature_extractor: 提取完成 rank_avg_amount_5/rank_avg_amount_10, 0.003s
[2021-06-08 11:44:02.649466] INFO: derived_feature_extractor: 提取完成 rank_return_0/rank_return_5, 0.003s
[2021-06-08 11:44:02.653136] INFO: derived_feature_extractor: 提取完成 rank_return_5/rank_return_10, 0.003s
[2021-06-08 11:44:15.713948] INFO: derived_feature_extractor: /y_2015, 190352
[2021-06-08 11:44:17.967040] INFO: derived_feature_extractor: /y_2016, 641546
[2021-06-08 11:44:21.821565] INFO: derived_feature_extractor: /y_2017, 743233
[2021-06-08 11:44:23.220281] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[25.475452s].
[2021-06-08 11:44:23.309851] INFO: moduleinvoker: cached.v3 开始运行..
[2021-06-08 11:44:27.642103] INFO: moduleinvoker: cached.v3 运行完成[4.332265s].
[2021-06-08 11:44:27.693271] INFO: moduleinvoker: join.v3 开始运行..
[2021-06-08 11:44:48.506039] INFO: join: /data, 行数=1358603/1384779, 耗时=14.901778s
[2021-06-08 11:44:48.992478] INFO: join: 最终行数: 1358603
[2021-06-08 11:44:49.046070] INFO: moduleinvoker: join.v3 运行完成[21.352811s].
[2021-06-08 11:44:49.158027] INFO: moduleinvoker: dropnan.v2 开始运行..
[2021-06-08 11:44:55.802737] INFO: dropnan: /data, 1351152/1358603
[2021-06-08 11:44:57.513744] INFO: dropnan: 行数: 1351152/1358603
[2021-06-08 11:44:57.587110] INFO: moduleinvoker: dropnan.v2 运行完成[8.429111s].
data = m11.data.read_df()
df = data.groupby('date').apply(lambda x: x.sort_values('instrument').set_index("instrument"))
import pandas as pd
import numpy as np
from alphalens.tears import (create_returns_tear_sheet,
create_information_tear_sheet,
create_turnover_tear_sheet,
create_summary_tear_sheet,
create_full_tear_sheet,
create_event_returns_tear_sheet,
create_event_study_tear_sheet)
from alphalens.plotting import plot_quantile_statistics_table
from alphalens.utils import get_clean_factor_and_forward_returns
import warnings
warnings.filterwarnings('ignore')
以开盘价+因子pe_ttm为例
#
# 准备价格数据
#
prices = df["m:open"]
prices = prices.unstack()
#
# 准备因子数据
#
factor = df["pe_ttm_0"]
#
#
# 准备行业分组数据
#
m2_dict = m2.data.read_pickle()
industry_data = D.history_data(m2_dict['instruments'],m2_dict['start_date'],m2_dict['end_date'],['industry_sw_level1'])
industry_data = industry_data.drop('date',axis=1).drop_duplicates()
ticker_sector = dict(zip(industry_data['instrument'],industry_data['industry_sw_level1']))
获取清洗后的因子及其未来收益(可以包含行业,也可以不包含行业),并将它们的收益对齐.
将因子数据、价格数据以及行业分类按照索引对齐地格式化到一个数据表中,这个数据表的索引是包含日期和资产的多重索引.
# 格式化因子数据
factor_data = get_clean_factor_and_forward_returns(
factor, # 因子
prices, # 价格
groupby=ticker_sector, # 分组
quantiles=7, # 分组个数 (bins 直方图个数)
periods=(1, 3), # 因子换手周期
filter_zscore=None) # 异常值阈值设定
factor_data.head(10)
plot_quantile_statistics_table(factor_data)
因子收益部分包括了因子分组超额收益分布直方图和琴型图、因子的累计收益曲线、超额收益曲线、因子加权收益、因子收益分布琴型图,因子spread 等结果。
create_returns_tear_sheet(factor_data,
long_short=False, # 是否计算多空组合的收益
group_neutral=False, # 是否按照行业调整或者行业中性后的收益
by_group=False) # 是否按照行业分组展示
因子IC 部分包括了因子IC 表、因子IC 时间序列、因子IC 分布图和QQ 图、因子IC 热力图等结果。
create_information_tear_sheet(factor_data,group_neutral=False,by_group=False)
因子换手部分包括了因子分组平均换手率、因子换手率时间序列及因子排序自相关性等结果。
# create_turnover_tear_sheet(factor_data) # index有问题
create_event_returns_tear_sheet(factor_data, prices, avgretplot=(3, 11),
long_short=False, group_neutral=False, by_group=False)