互信息的概念来自概率论和信息论,常用于度量两个随机变量之间的关联程度。不同于相关系数仅能捕捉两个随机变量之间的线性相关性,互信息可以捕捉两个变量之间的任何统计依赖性。两个离散随机变量 X 和 Y 的互信息定义为:
其中,p(x, y) 是 X 和 Y 的联合概率分布函数,p(x) 和 p(y) 分别是 X 和 Y 的边缘概率分布函数。
在连续随机变量的情形下,求和替换为二重定积分:
其中,p(x, y) 是 X 和 Y 的联合概率密度函数,p(x) 和 p(y) 分别是 X 和 Y 的边缘概率密度函数。
# 本代码由可视化策略环境自动生成 2020年11月20日 18:30
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
def ts_mi(df, x, y, window):
from sklearn.metrics import mutual_info_score as mis
def group_func(df1, window):
a = x[df1.index].values
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
try:
c_x = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
c_y = np.lib.stride_tricks.as_strided(y[df1.index].values, shape=shape, strides=strides)
except:
return pd.Series([np.nan] * len(df), index=df1.index)
d = []
for i, j in zip(c_x, c_y):
d.append(mis(i, j))
return pd.Series([np.nan] * (window - 1) + d, index=df1.index)
return df.groupby("instrument", as_index=False, group_keys=False).apply(group_func, window=window)
m16_user_functions_bigquant_run = {
"ts_mi": ts_mi
}
m1 = M.instruments.v2(
start_date='2010-01-01',
end_date='2015-01-01',
market='CN_STOCK_A',
instrument_list="""000001.SZA
000002.SZA""",
max_count=0
)
m3 = M.input_features.v1(
features="""# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
ts_mi(close_0, return_0, 20)"""
)
m15 = M.general_feature_extractor.v7(
instruments=m1.data,
features=m3.data,
start_date='',
end_date='',
before_start_days=90
)
m16 = M.derived_feature_extractor.v3(
input_data=m15.data,
features=m3.data,
date_col='date',
instrument_col='instrument',
drop_na=True,
remove_extra_columns=True,
user_functions=m16_user_functions_bigquant_run
)
[2020-11-19 16:09:30.175986] INFO: moduleinvoker: instruments.v2 开始运行..
[2020-11-19 16:09:40.428311] INFO: moduleinvoker: 命中缓存
[2020-11-19 16:09:40.429430] INFO: moduleinvoker: instruments.v2 运行完成[10.253433s].
[2020-11-19 16:09:40.430798] INFO: moduleinvoker: input_features.v1 开始运行..
[2020-11-19 16:09:40.442035] INFO: moduleinvoker: 命中缓存
[2020-11-19 16:09:40.442885] INFO: moduleinvoker: input_features.v1 运行完成[0.012082s].
[2020-11-19 16:09:40.450273] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2020-11-19 16:09:40.460624] INFO: moduleinvoker: 命中缓存
[2020-11-19 16:09:40.461532] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[0.01126s].
[2020-11-19 16:09:40.464514] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2020-11-19 16:09:40.779163] INFO: moduleinvoker: 命中缓存
[2020-11-19 16:09:40.780400] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.31588s].
df = DataSource("bar1d_CN_STOCK_A").read("000001.SZA", start_date="2015-01-01", end_date="2020-03-01", fields=["turn", "close"])
df["return"] = df["close"].pct_change()
df.dropna(inplace=True)
from sklearn.metrics import mutual_info_score
mutual_info_score(df["turn"].values, df["return"].values)