调用Series.cov()报错:缺少必填参数'other',求问题排查
问题解决:TypeError: Series.cov() missing 1 required positional argument: 'other'
错误原因
你在代码里执行portifolioReturns = portifolioReturns.dot(portifolioWeight)后,portifolioReturns从多列的DataFrame(每列对应一只股票的日收益)变成了单列的Series(加权后的投资组合日收益)。而Pandas的Series.cov()方法需要传入另一个Series来计算协方差,单独调用就会触发这个参数缺失的错误。
更关键的是,你要生成的是资产间的协方差矩阵,这一步应该在计算加权投资组合收益之前完成,而不是之后。
修正后的代码
def portifolioOptimalization(inputStocks): import yfinance as yf import random stocks = inputStocks portifolioData = yf.download(stocks, '2020-1-1')['Close'] portifolioReturns = portifolioData.pct_change().dropna() # 去掉首日空值 # 先计算资产协方差矩阵(这才是你需要的) varianceMatrix = portifolioReturns.cov() numberOfStocks = len(inputStocks) portifolioWeight = [] weightSum = 1 # 不需要用global,函数内定义即可 for i in range(numberOfStocks-1): stockWeight = round(random.uniform(0.0, weightSum), 2) weightSum -= stockWeight portifolioWeight.append(stockWeight) portifolioWeight.append(weightSum) # 计算加权后的投资组合收益 portifolioDailyReturns = portifolioReturns.dot(portifolioWeight) # 后续可以用协方差矩阵和权重计算投资组合方差/标准差 portifolioVariance = portifolioWeight @ varianceMatrix @ portifolioWeight portifolioStd = portifolioVariance ** 0.5 return varianceMatrix, portifolioDailyReturns, portifolioStd
关键修正点
- 把协方差矩阵的计算
varianceMatrix = portifolioReturns.cov()移到dot()加权操作之前,此时portifolioReturns是多列DataFrame,调用cov()会直接生成资产间的协方差矩阵。 - 去掉不必要的
global weightSum,函数内的变量不需要全局声明。 - 添加
dropna()去掉收益数据的首日空值(因为pct_change()会让第一行变成NaN)。 - 补充了投资组合方差和标准差的计算(这是投资组合优化常用的指标)。
内容的提问来源于stack exchange,提问作者Halvor Johnsen
相关产品推荐
相关产品推荐

