Python 3.x .descripe()在表中返回错误的列值
查看图1的Python 3.x .descripe()在表中返回错误的列值,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,查看图1的gld_weight列。它抛弃了完全错误的价值观。btc\u权重+gld\u权重的总和应始终为1。但是当我使用descripe函数时,为什么gld_weight列与返回的行值不对应 图1: 图2: 图3: 这是我的源代码: import numpy as np import pandas as pd from pandas_datareader import data as wb import matplotlib.pyplot as plt assets = ['BTC-USD',
gld_weight
列。它抛弃了完全错误的价值观。btc\u权重+gld\u权重
的总和应始终为1。但是当我使用descripe函数时,为什么gld_weight
列与返回的行值不对应
图1:
图2:
图3:
这是我的源代码:
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
assets = ['BTC-USD', 'GLD']
mydata = pd.DataFrame()
for asset in assets:
mydata[asset] = wb.DataReader(asset, data_source='yahoo', start='2015-1-1')['Close']
cleandata = mydata.dropna()
log_returns = np.log(cleandata/cleandata.shift(1))
annual_log_returns = log_returns.mean() * 252 * 100
annual_log_returns
annual_cov = log_returns.cov() * 252
annual_cov
我不能100%确定我是否正确回答了您的问题,但问题可能是,您没有将输出重新分配给新变量,因此没有保存它。 尝试在这方面调整您的代码:
new_portfolio = new_portfolio.sort_values(by="Returns")
或者将inplace参数设置为True-简短回答:
当初始权重值标准化完成时,在for循环中发现了手头的问题。如何修复:请参见下面答案中的更新1
获取解决方案的背景信息:
乍一看,OP的代码似乎是有序的,数组中的值按照OP通过书面代码发出的请求进行了拟合。从测试中可以看出,使用范围(1000)
是在自找麻烦,因为大量的“随机性”结果导致价值结果疏忽。特别是当这个问题被写成一个转化问题时。因此,x/y轴值混合或其他类型的转换误差很难研究
annual\u log\u returns
和annual\u cov
所示weights[0]=weights[0]/np.sum(weights)
替换新weights[0]
的原始列表value,该列表随后用作weights[1]=weights[1]/np.sum(weights)
的新输入,因此永远无法达到sum=1
在创建权重[0]和[1]值后,变量名权重[0]
和权重[1]
在两个位置直接更改为“a”和“b”,以防止覆盖初始权重值。那么结果就是“计划的”
问题解决了
将numpy作为np导入
作为pd进口熊猫
pfolio_返回=[]
pfolio_波动率=[]
btc_重量=[]
gld_重量=[]
年度收益率=[0.69,0.71]
年平均值=0.73
游骑兵=5
对于范围内的x(ranger):
权重=np.随机。随机(2)
权重[0]=权重[0]/np.和(权重)
权重[1]=权重[1]/np.和(权重)
权重/=np.和(权重)
btc_weight.append(权重[0])
gld_weight.append(权重[1])
pfolio_returns.append(np.dot(年度_log_returns,权重))
pfolio_volatility.append(np.sqrt(np.dot(weights.T,np.dot(annual_cov,weights)))
打印(权重[0])
打印(权重[1])
打印(重量)
#打印(pfolio_返回)
#打印(pfolio_挥发性)
npfolio_returns=np.array(pfolio_returns)
npfolio\u volatility=np.数组(pfolio\u volatility)
#数据帧(数组,索引=行名称,列=列名称,数据类型=数据类型)
新的投资组合=pd.DataFrame({'Returns':npfolio\u Returns,'Volatility':npfolio\u Volatility,'btc\u weight':btc\u weight,'gld\u weight':gld\u weight})
打印(新的\u公文包,“\n”)
排序=新的\u投资组合。排序\u值(按='Returns')
sort_max_gld_weight=sort.loc[ranger-1,'gld_weight']
打印('排序:\n',排序'\n')
打印('sort max\u gld\u weight:“%s”\n'%sort\u max\u gld\u weight)#如果“999”包含最高gld\u weight。。。但在大多数情况下,情况并非如此!
sort_max_gld_weight=sort.max(axis=0)[3]#返回第4列的“gld_weight”值。
打印('sort max\u gld\u weight:“%s”\n'%sort\u max\u gld\u weight)#这将返回第4列的'gld\u weight'值。
desc=新的投资组合。descripe()
desc_max_gld_weight=desc.loc['max','gld_weight']
打印('description:\n',desc',\n')
打印('desc max\u gld\u weight:“%s”\n“%desc max\u gld\u weight”)
max_val_gld=new_portfolio.loc[new_portfolio['gld_weight']==sort_max_gld_weight]
打印('max-val-gld:\n',max-val-gld',\n')
地点=新组合。loc[新组合['gld\U权重']>0.99]
打印('位置:\n',位置)
结果可以是,例如:
0.9779586087178525
0.02204139128214753
[0.97795861 0.02204139]
返回波动率btc_权重gld_权重
0 0.702820 0.627707 0.359024 0.640976
1 0.709807 0.846179 0.009670 0.990330
2 0.708724 0.801756 0.063786 0.936214
3 0.702010 0.616237 0.399496 0.600504
4 0.690441 0.835780 0.977959 0.022041
排序:
返回波动率btc_权重gld_权重
4 0.690441 0.835780 0.977959 0.022041
3 0.702010 0.616237 0.399496 0.600504
0 0.702820 0.627707 0.359024 0.640976
2 0.708724 0.801756 0.063786 0.936214
1 0.709807 0.846179 0.009670 0.990330
排序最大总重量:“0.02204139128214753”
最大分拣重量:“0.9903330036638084”
描述:
返回波动率btc_权重gld_权重
计数5.000000 5.000000 5.000000 5.000000
平均值0.702760 0.745532 0.361987 0.638013
标准0.007706 0.114057 0.385321 0.385321
最小值0.690441 0.616237 0.009670 0.022041
25% 0.702010 0.627707 0.063786 0.600504
50% 0.702820 0.801756 0.359024 0.640976
75% 0.708724 0.835780 0.399496 0.936214
最大值0.709807 0.846179 0.977959 0.990330
描述最大总重量:“0.9903330036638084”
最大值gld:
返回波动率btc_权重gld_权重
1 0.709807 0.846179
npfolio_returns = np.array(pfolio_returns)
npfolio_volatility = np.array(pfolio_volatility)
new_portfolio = pd.DataFrame({
'Returns': npfolio_returns,
'Volatility': npfolio_volatility,
'btc_weight': btc_weight,
'gld_weight': gld_weight
})
new_portfolio = new_portfolio.sort_values(by="Returns")