我目前有一个 4024 x 10 数组 - 其中第 0 列代表股票 1 的 4024 个不同回报,第 1 列代表股票 2 的 4024 个回报等等 - 用于我的主人的作业,我被要求计算熵和联合不同随机变量的熵(每个随机变量显然是股票收益)。但是,这些熵计算都需要计算 P(x) 和 P(x,y)。到目前为止,我已经成功地使用以下代码计算了各个经验概率:
def entropy(ret,t,T,a,n):
returns=pd.read_excel(ret)
returns_df=returns.iloc[t:T,:]
returns_mat=returns_df.as_matrix()
asset_returns=returns_mat[:,a]
hist,bins=np.histogram(asset_returns,bins=n)
empirical_prob=hist/hist.sum()
entropy_vector=np.empty(len(empirical_prob))
for i in range(len(empirical_prob)):
if empirical_prob[i]==0:
entropy_vector[i]=0
else:
entropy_vector[i]=-empirical_prob[i]*np.log2(empirical_prob[i])
shannon_entropy=np.sum(entropy_vector)
return shannon_entropy, empirical_prob
PS忽略代码的整个熵部分
如您所见,我只是简单地完成了 1d 直方图,然后将每个计数除以直方图结果的总和,以找到各个概率。但是,我真的很想知道如何计算 P(x,y) 使用
np.histogram2d()
现在,显然 P(x,y)=P(x)*P(y) 如果随机变量是独立的,但在我的情况下它们不是,因为这些股票属于同一个指数,因此具有一些正相关,即它们是依赖的,所以取两个个体概率的乘积不成立。我试过听从教授的建议,他说:
“我们已经讨论过如何获得单变量分布的经验 pdf:定义箱,然后简单地计算相应箱中的观察数(相对于观察总数)。对于双变量分布,您可以这样做,但现在你进行二维分箱(例如检查 matlab 中的 histogram2 命令)”
如您所见,他指的是 MATLAB 的 2d histogram 函数,但我决定在 Python 上执行此任务,到目前为止,我已经详细说明了以下代码:
def jointentropy(ret,t,T,a,b,n):
returns=pd.read_excel(ret)
returns_df=returns.iloc[t:T,:]
returns_mat=returns_df.as_matrix()
assetA=returns_mat[:,a]
assetB=returns_mat[:,b]
hist,bins1,bins2=np.histogram2d(assetA,assetB,bins=n)
但我不知道从这里做什么,因为
np.histogram2d()
返回一个 4025 x 4025 数组以及两个单独的 bin,所以我不知道我可以做些什么来为我的两个因随机变量计算 P(x,y)。
我已经尝试了几个小时来解决这个问题,但没有任何运气或成功,所以任何形式的帮助都将不胜感激!非常感谢您!