python - 如何设置数据结构以使 pandas 和 numpy 合作?
问题描述
编译基于 pandas 和 numpy 的代码时遇到问题。我将尝试通过提供问题所在的缩小工作示例来解释这些问题。
我基本上想要做的是 Markowitz 投资组合优化,方法如下。
首先,我有一个 pandas.Dataframe,它以下列方式具有给定股票代码的收盘价。
df = pd.DataFrame()
df['AAPL'] = [1.2,1.4,1.5]
df['GOOGL'] = [2.1,2.4,2.6]
df['DATE'] = ['2017-01-01', '2017-01-02','2017-01-03']
df = df.set_index('DATE')
接下来我想创建一些基本的统计数据来传递一些函数,我通过以下方式进行:
returns = df.pct_change()
mean_returns = returns.mean()
cov_matrix = returns.cov()
num_portfolios = 10
risk_free_rate = 0.0178
这些统计的类型是:
pandas.core.series.Series
pandas.core.frame.DataFrame
以下功能是问题开始出现的地方:
def portfolio_annualised_performance(weights, mean_returns, cov_matrix):
returns = np.sum(mean_returns*weights ) *252
std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) * np.sqrt(252)
return std, returns
def random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate):
results = np.zeros((3,num_portfolios))
print('results:',type(results))
weights_record = []
for i in range(num_portfolios):
weights = np.random.random(12)
weights /= np.sum(weights)
weights_record.append(weights)
portfolio_std_dev, portfolio_return = portfolio_annualised_performance(weights, mean_returns, cov_matrix)
results[0,i] = portfolio_std_dev
results[1,i] = portfolio_return
results[2,i] = (portfolio_return - risk_free_rate) / portfolio_std_dev
#print('results[2,0]:',type(results[2,0]))
#print('std', type(portfolio_std_dev))
#print(portfolio_return)
return results, weights_record
def display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate):
results, weights = random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate)
max_sharpe_idx = np.argmax(np.array(results[2]))
sdp, rp = results[0,max_sharpe_idx], results[1,max_sharpe_idx]
max_sharpe_allocation = pd.DataFrame(weights[max_sharpe_idx],index=df.columns,columns=['allocation'])
max_sharpe_allocation.allocation = [round(i*100,2)for i in max_sharpe_allocation.allocation]
max_sharpe_allocation = max_sharpe_allocation.T
min_vol_idx = np.argmin(results[0])
sdp_min, rp_min = results[0,min_vol_idx], results[1,min_vol_idx]
min_vol_allocation = pd.DataFrame(weights[min_vol_idx],index=df.columns,columns=['allocation'])
min_vol_allocation.allocation = [round(i*100,2)for i in min_vol_allocation.allocation]
min_vol_allocation = min_vol_allocation.T
尝试运行时:
display_simulated_ef_with_random(cov_matrix,mean_returns,num_portfolios,risk_free_rate)
出现以下错误
----> 2 results, weights = random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate)
---> 15 results[0,i] = portfolio_std_dev
ValueError: setting an array element with a sequence.
我做错了什么,我该如何解决?
解决方案
您以错误的顺序使用参数调用您的函数。交换前两个,它工作正常:
display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate)
推荐阅读
- sql-server - 在 SSIS 中显示 foreach 循环迭代次数
- java - 我可以用方括号声明一个变量吗?
- r - 在R中没有for循环的情况下获取重叠数据帧值的计数
- modelica - 将模型实例化为参数时的固定属性
- css - 更改属性样式,删除项目符号列表
- c++ - 一个数组,其中每个元素都是数字的除数和下一个数字的除数
- mysql - 编写 SQL 查询,列出出现在 cd 表中所有 cd 上的所有录音的录音 id 和录音日期
- json - 使用 json4s 将嵌套的序列化 json 提取到 Scala 中的案例类中
- javascript - p5 js中的多个绘图
- python - 如何在不按 Python3 中的按钮的情况下更改 tkinter 标签的文本?