概述
相关性 (Correlation) 在统计中是与独立性 (Independence) 对立的概念. 泛指两随机变量之间存在的一切关系.
研报分析结果
下图是某大类因子下的一些因子 IC 值变化图. 我们能从中看出大概相关性.
比如说 OPM 和 OPM_TTM 相关性较强, 变化趋势类似.
某研报最终相关性最终结果:
代码实现
导包
# 使用alphalens计算因子的IC分析
# 分析的区间2020-01-01到2021-01-01
import numpy as np
import pandas as pd
import datetime
from alphalens import performance
from alphalens import plotting
from alphalens import tears
from alphalens import utils
总资产回报率 IC
factor = "return_on_asset_net_profit"
# ----------------1. 准备因子数据----------------
# 1.1 获取因子数据
# 获取这一年的交易日期
date_data = get_trading_dates(start_date="2020-01-01", end_date="2021-01-01")
# 定义df数据集
all_data = pd.DataFrame()
for date in date_data:
# 获取当天因子数据
q = query(
fundamentals.financial_indicator.return_on_asset_net_profit
)
# 获取截面数据
fund = get_fundamentals(q, entry_date=date).iloc[:, 0, :]
# 创建日期列
fund["date"] = date
# 拼接
all_data = pd.concat([all_data, fund])
# 设置双重索引, 变成一个MultiIndex DataFrame
multiindex_df = all_data.set_index(["date", all_data.index])
# 1.2 处理因子数据 (去极值, 标准化)
def mad(factor):
"""3倍中位数去极值"""
# 求出因子值的中位数
median = np.median(factor)
# 求出因子值与中位数的差值, 进行绝对值
mad = np.median(abs(factor - median))
# 定义几倍的中位数上下限
high = median + (3 * 1.4826 * mad)
low = median - (3 * 1.4826 * mad)
# 替换上下限
factor = np.where(factor > high, high, factor)
factor = np.where(factor < low, low, factor)
return factor
def stand(factor):
"""数据标准化"""
mean = factor.mean()
std = factor.std()
return (factor - mean) / std
multiindex_df[factor] = mad(multiindex_df[factor])
multiindex_df[factor] = stand(multiindex_df[factor])
# ----------------2. 准备收盘价数据----------------
# 转换为Series
singlefactor_series = multiindex_df[factor]
# 获取所有股票基础信息
stocks = all_instruments("CS")
# 得到合约代码
stocks_list = stocks["order_book_id"]
# 获取收盘价
price = get_price(stocks_list ,start_date="2020-01-01", end_date="2021-01-01", fields="close")
# ----------------3. 生成通用Alphalens数据----------------
factor_return = utils.get_clean_factor_and_forward_returns(singlefactor_series.astype(float), price.astype(float))
# ----------------4. 生成通用Alphalens数据----------------
# IC 值, 默认每天的IC结构
return_on_asset_net_profit_IC = performance.factor_information_coefficient(factor_return)
资本回报率 IC
factor = "return_on_invested_capital"
# ----------------1. 准备因子数据----------------
# 1.1 获取因子数据
# 获取这一年的交易日期
date_data = get_trading_dates(start_date="2020-01-01", end_date="2021-01-01")
# 定义df数据集
all_data = pd.DataFrame()
for date in date_data:
# 获取当天因子数据
q = query(
fundamentals.financial_indicator.return_on_invested_capital
)
# 获取截面数据
fund = get_fundamentals(q, entry_date=date).iloc[:, 0, :]
# 创建日期列
fund["date"] = date
# 拼接
all_data = pd.concat([all_data, fund])
# 设置双重索引, 变成一个MultiIndex DataFrame
multiindex_df = all_data.set_index(["date", all_data.index])
# 1.2 处理因子数据 (去极值, 标准化)
def mad(factor):
"""3倍中位数去极值"""
# 求出因子值的中位数
median = np.median(factor)
# 求出因子值与中位数的差值, 进行绝对值
mad = np.median(abs(factor - median))
# 定义几倍的中位数上下限
high = median + (3 * 1.4826 * mad)
low = median - (3 * 1.4826 * mad)
# 替换上下限
factor = np.where(factor > high, high, factor)
factor = np.where(factor < low, low, factor)
return factor
def stand(factor):
"""数据标准化"""
mean = factor.mean()
std = factor.std()
return (factor - mean) / std
multiindex_df[factor] = mad(multiindex_df[factor])
multiindex_df[factor] = stand(multiindex_df[factor])
# ----------------2. 准备收盘价数据----------------
# 转换为Series
singlefactor_series = multiindex_df[factor]
# 获取所有股票基础信息
stocks = all_instruments("CS")
# 得到合约代码
stocks_list = stocks["order_book_id"]
# 获取收盘价
price = get_price(stocks_list ,start_date="2020-01-01", end_date="2021-01-01", fields="close")
# ----------------3. 生成通用Alphalens数据----------------
factor_return = utils.get_clean_factor_and_forward_returns(singlefactor_series.astype(float), price.astype(float))
# ----------------4. 生成通用Alphalens数据----------------
# IC 值, 默认每天的IC结构
return_invested_capital_IC = performance.factor_information_coefficient(factor_return)
计算相关性
from scipy import stats as st
# 斯皮尔曼相关系数
st.spearmanr(return_on_asset_net_profit_IC.iloc[:, 0], return_invested_capital_IC.iloc[:, 0])
输出结果:
SpearmanrResult(correlation=0.977877642558714, pvalue=5.866171447988381e-159)