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)
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)
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()
需要修改 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)
# 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()
factor_pnl = tears.create_returns_tear_sheet(factor_return)
因子名称 | 因子平均收益 | IC mean | IC std | IC > 0.02 | IR |
---|---|---|---|---|---|
0.0004 | -0.017 | 0.192 | 0.425 | -0.0885 |
|
用到19号的期货数据计算得到的因子值,是20号的因子值
用到19号的期货数据计算得到的因子值,不能用于19号价格的预测,存在未来函数
传递给Alphalens的价格数据需要包含资产的进入价格,也就是在某个时间点观察到因子取值后,下一个可买入的价格。这个价格一定不能用于此次因子的计算。这一点一定要反复检查,以免在研究中引入前视偏差。
可以使用19号close价格计算因子,20号的open价格计算IC值
当因子IC超过0.1时,要注意检查
用到19号的期货数据计算得到的因子值,是20号的因子值
用到19号的期货数据计算得到的因子值,不能用于19号价格的预测,存在未来函数
传递给Alphalens的价格数据需要包含资产的进入价格,也就是在某个时间点观察到因子取值后,下一个可买入的价格。这个价格一定不能用于此次因子的计算。这一点一定要反复检查,以免在研究中引入前视偏差。
可以使用19号close价格计算因子,20号的open价格计算IC值
当因子IC超过0.1时,要注意检查