Python 执行np.dot时获取ValueError
我必须找到投资组合的年回报率和波动率。 我有一个数据框,有5列,每列包含一只股票的收盘价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
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)