Python 执行np.dot时获取ValueError

Python 执行np.dot时获取ValueError,python,pandas,numpy,Python,Pandas,Numpy,我必须找到投资组合的年回报率和波动率。 我有一个数据框,有5列,每列包含一只股票的收盘价 ABC FINE GAYA RITES LEMON 0 98.00 1203.70 1.00 260.30 69.00 1 98.25 1200.45 1.00 263.10 69.55 2 99.25 1202.55 1.05 267.50 71.15 3 100.10 1212.05 1.05 271.35 74.30

我必须找到投资组合的年回报率和波动率。 我有一个数据框,有5列,每列包含一只股票的收盘价

    ABC FINE    GAYA    RITES   LEMON
0   98.00   1203.70 1.00    260.30  69.00
1   98.25   1200.45 1.00    263.10  69.55
2   99.25   1202.55 1.05    267.50  71.15
3   100.10  1212.05 1.05    271.35  74.30
4   100.00  1188.00 1.00    274.00  73.60

为了计算收益率和波动率,我必须计算每日收益率和协方差矩阵

daily_return = port.pct_change().dropna()
port_cov = daily_return.cov()
当我使用

pf_returns, pf_volatility, pf_sharpe_ratio, pf_port_weights=([] for i in range(4))
num_portfolios = 10000
for portfolio in range(num_portfolios):
    weights = np.full((332,5),0.2)
    returns = np.array(np.dot(weights,daily_return))
    volatility = np.sqrt(np.dot(weights.T,np.dot(port_cov,weights)))
    sharpe = returns / volatility
    pf_port_weights.append(weights)
    pf_returns.append(returns)
    pf_volatility.append(volatility)
    pf_sharpe_ratio.append(sharpe)
我发现了错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-666-31789f69fbed> in <module>()
      3 for portfolio in range(num_portfolios):
      4     weights = np.full((332,5),0.2)
----> 5     returns = np.array(np.dot(weights,daily_return))
      6     volatility = np.sqrt(np.dot(weights.T,np.dot(port_cov,weights)))
      7     sharpe = returns / volatility

ValueError: shapes (332,5) and (332,5) not aligned: 5 (dim 1) != 332 (dim 0)
我尝试使用

cov = np.asarray(port_cov)
cov.reshape(332,5)
我发现了错误

ValueError: cannot reshape array of size 25 into shape (332,5)

两个矩阵权重日收益的点积定义如下:

weights.daily_return=权重转置*daily_return

weights.shape
需要有shape
(5332)

weights=np.full((5332),0.2)
在点积中,两个结构的内部尺寸必须一致,例如,考虑行向量v’1x5,能够点积它,另一个结构必须是S5xx(其中<代码> x < /代码>是任何维度)。那么,你的台词是: 必须是:

weights = np.full((5,332),0.2)
或者使用
.T
属性预先将其转换为
操作,如中所示:

returns = np.array(np.dot(weights.T,daily_return))

  • 以下两行是错误的,因为很明显,
    port\u conv
    只有
    25个
    元素(如
    port\u cov.shape
    中所示)。您将如何将这些元素转换为
    332x5
    ,即
    1660
    元素 有两种可能的方法将
    权重
    乘以
    端口cov

    np.dot(weights, port_cov)
    


    你是对的,你的解决方案有效!我如何使用cov使其可以乘以重量?对不起,可以。
    weights = np.full((332,5),0.2)
    
    weights = np.full((5,332),0.2)
    
    returns = np.array(np.dot(weights.T,daily_return))
    
    cov = np.asarray(port_cov)
    cov.reshape(332,5)
    
    np.dot(weights, port_cov)
    
    np.dot(port_cov, weights.T)