发现了。
不知道为什么,在lowdin_orthogonal()里面,
'''python
def lowdin_orthogonal(data:pd.DataFrame)->pd.DataFrame:
data_ = data.copy() # 创建副本不影响原数据
col = [col for col in data_.columns if col not in ['INDUSTRY_CODE','market_cap']]
F = np.mat(data_[col]) # 除去行业指标,将数据框转化为矩阵
M = F.T @ F # 等价于 (F.shape[0] - 1) * np.cov(F.T)
a,U = np.linalg.eig(M) # a为特征值,U为特征向量
D_inv = np.linalg.inv(np.diag(a))
S = U @ np.sqrt(D_inv) @ U.T
display(np.sqrt(D_inv))
data_[col] = data_[col].dot(S)
return data_
'''
计算出来的 `D_inv` 会有负数,所以造成np.sqrt(D_inv) 里面会有NaN.
奇怪的是,同样的代码,前几天我跑起来没问题,今天跑了就出现同样的问题。
可能是
1. kernal的问题,
2. 下面某些参数影响了这个函数的运算。
2021-01-24