1. 数据准备
1.1 计算因子IC重要函数
def get_clean_factor_and_forward_returns(factor,
prices,
groupby=None,
binning_by_group=False,
quantiles=5,
bins=None,
periods=(1, 5, 10),
filter_zscore=20,
groupby_labels=None,
max_loss=0.35,
zero_aware=False,
cumulative_returns=True)
- factor: pd.Series – MultiIndex 因子数据
- prices:pd.DataFrame 价格数据,注意避免使用未来函数,例如可以使用第二天的开盘价
- groupby : pd.Series – MultiIndex or dict 分组,如行业分组
- binning_by_group : bool 是否分组进行计算
- quantiles : int or sequence[float] 将股票按数量等分
- bins : int or sequence[float] 按因子值等宽进行划分
- periods : sequence[int] 收益计算周期/调仓周期
- filter_zscore : int or float, optional 异常阈值的倍数,用来过滤掉涨跌幅特别大的股票,会导致前视偏差
- groupby_labels : dict 分组标签
- max_loss : float, optional 允许丢弃的最多的的数据的比例
- zero_aware : bool, optional是否正负信号分开算
- cumulative_returns : bool, optional 是否计算单利
- 返回值 merged_data : pd.DataFrame – MultiIndex
1.2 准备因子数据
code = ["IC9999.CCFX", "IH9999.CCFX", "IF9999.CCFX"]
start_date = "2022-1-18"
end_date = "2023-1-18"
fre = "1d"
period = 5
# Todo: 循环获取因子数据
factor_df = pd.DataFrame()
for future in code:
df = get_price(future, start_date=start_date, end_date=end_date, frequency=fre, panel=False)
df["mom"] = momentum_factor(df, time_period=period)
df["code"] = [future] * len(df)
factor_df = pd.concat([factor_df, df[["code", "mom"]]])
factor_df = factor_df.reset_index()
factor_df = factor_df.sort_values(by="index")
factor_df = factor_df.set_index(["index", "code"])
print(factor_df)
factor_series = factor_df["mom"]
print(factor_series)
1.3 行情数据准备
code = ["IC9999.CCFX", "IH9999.CCFX", "IF9999.CCFX"]
df = get_price(code, start_date=start_date, end_date=end_date, frequency=fre, panel=False, fields=["close"])
df = df.set_index(["time", "code"])
df = df.close.unstack()
- 运行结果
1.4 注意点
需要修改 alphalens.utils.compute_forward_returns中源码(342行)
# df.index.levels[0].name = "date"
# df.index.levels[1].name = "asset"
df.index.set_names(["date", "asset"], inplace=True)
2. 计算
2.1 IC 计算以及结果展示
# Todo: 生成alphalens通用结构
factor_return = utils.get_clean_factor_and_forward_returns(factor_series, df)
print(factor_return)
# 获取每天的IC结果
res_ic = performance.factor_information_coefficient(factor_return)
print(res_ic)
alphalens.plotting.plot_ic_ts(res_ic)
alphalens.plotting.plot_ic_hist(res_ic)
alphalens.plotting.plot_ic_qq(res_ic)
plt.show()
2.2 因子收益率
factor_pnl = tears.create_returns_tear_sheet(factor_return)
- 分组因子的累积收益(一期)
2.3 统计指标
因子名称 | 因子平均收益 | IC mean | IC std | IC > 0.02 | IR |
---|---|---|---|---|---|
0.0004 | -0.017 | 0.192 | 0.425 | -0.0885 |
|
- 第三列数据:在筛选因子的时候,会考虑某段时间的平均值大小。判断平均值大于某个数字,IC的值一般根据筛选严格程度取值,这个值可以自定义0.06意味筛选严格,大于 0.02会放松筛选(可以用在对开始很多因子的海选中) IC 大于 0.02 的比例
- IR = IC mean / IC std IR值越大越稳定
- 期货分层回测计算因收益
2.3 打分依据
- 因子平均收益 > 0.002
- IC mean > 0.03
- IC > 0.02(50%)
- IR > 0.3
2.4 研报统计结果
2.5 注意点
-
传递给Alphalens的价格数据需要包含资产的进入价格,也就是在某个时间点观察到因子取值后,下一个可买入的价格。这个价格一定不能用于此次因子的计算。这一点一定要反复检查,以免在研究中引入前视偏差。
-
当因子IC超过0.1时,要注意检查
-
用到19号的期货数据计算得到的因子值,是20号的因子值
-
传递给Alphalens的价格数据需要包含资产的进入价格,也就是在某个时间点观察到因子取值后,下一个可买入的价格。这个价格一定不能用于此次因子的计算。这一点一定要反复检查,以免在研究中引入前视偏差。
-
当因子IC超过0.1时,要注意检查
原文地址:https://blog.csdn.net/xu624735206/article/details/129162947
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_44956.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。